pax_global_header00006660000000000000000000000064125624364000014514gustar00rootroot0000000000000052 comment=1b0fa6f8188a89da7fd6d591d13d94e2a44b698f funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/000077500000000000000000000000001256243640000204765ustar00rootroot00000000000000funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/.gitignore000066400000000000000000000006171256243640000224720ustar00rootroot00000000000000*.[oa] *~ *.so *.bak *.pyc *-orig *-sav foo* goo* node.log Makefile conf.h config.status config.log config.cache debug.html js9 js9helper.pc .DS_Store funcalc funcen funcnts funcnts.plot funcnts.sed funcone fundisp funds9 funhead funhist funhist.plot funimage funindex funjoin funmerge funsky funtable funtbl funtools.ds9 funtools.pc gcat configure gnu/_funsort util/NaN.h autom4te.cache a.out.dSYM funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/COPYING000066400000000000000000000634761256243640000215510ustar00rootroot00000000000000 GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, 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 and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, 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 library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete 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 distribute a copy of this License along with the Library. 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 Library or any portion of it, thus forming a work based on the Library, 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) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, 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 Library, 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 Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you 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. If distribution of 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 satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be 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. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library 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. 9. 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 Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library 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 with this License. 11. 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 Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library 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 Library. 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. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library 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. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser 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 Library 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 Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, 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 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "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 LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. 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 LIBRARY 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 LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), 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 Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. 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 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. This 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 this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/INSTALL000066400000000000000000000306641256243640000215400ustar00rootroot00000000000000Quick Summary ============= To build and install the Funtools package, simply execute: ./mkconfigure # generate all configure scripts ./configure # site-specific configuration make # build the software make install # install it make clean # clean up unneeded temp files The configure scripts are not part of the GitHub repository, so you must generate them for your site (you might need to install autoconf for this purpose): ./mkconfigure You might want to install in a directory other than /usr/local, so as not to require root access. To do this, configure for a different install directory: ./configure --prefix= e.g., ./configure --prefix=/soft/saord Programs will be installed in /soft/saord/bin, libraries in /soft/saord/lib, and include files in /soft/saord/include. Indeed, we do this at SAO and recommend it as a general rule, in order to keep SAORD software in one place that does not conflict with other installations. Note that you will need to add the bin directory to your path. The build ("make") takes only a minute or so on modern machines. To monitor its progress and/or check for errors, redirect output to a file and use the 'tail' command: make >& foo.log &; tail -f foo.log # csh or make 1>foo.log 2>&1 &; tail -f foo.log # sh, bash NB: Windows users ================= To build funtools on a Windows platform, you first need to install the Cygwin package from: http://cygwin.com/ From the Web page: Cygwin is a Linux-like environment for Windows. It consists of two parts: A DLL (cygwin1.dll) which acts as a Linux API emulation layer providing substantial Linux API functionality. A collection of tools which provide Linux look and feel. When installing cygwin, make sure you install 'gcc' and 'make' from the Development package. I think that's all you need ... Details of Installation ======================= NB: These are generic installation instructions, modified for Funtools. 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, a file `config.cache' that saves the results of its tests to speed up reconfiguring, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). 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 at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.in' is used to create `configure' by a program called `autoconf'. You only need `configure.in' if you want to change it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: `./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. 1. `cd' to the directory containing the package's source code and type "./configure". This runs a configuration script created by GNU autoconf, which configures Funtools for your system and creates a Makefile. The configure script allows you to customize the Funtools configuration for your site; for details on how you can do this, type "./configure -help" or refer to the autoconf documentation (not included here). The Funtools "configure" script supports the following special switch(es) in addition to the standard ones: --enable-shared=yes|link|no Build shared libraries in addition to the default static library. There are two options: If the value is "yes", shared libraries are built but not used to link xpa programs. If the value is "link", shared libraries are used to link xpa programs. If therefore becomes your responsibility to put the shared library where it can be found (or use LD_LIBRARY_PATH). --enable-dl=yes|no With gcc available, perform on-the-fly filtering by compiling a shared object and dynamically loading it into the executable. The default is to compile and link a separate slave program. (Surprisingly, processing speed is about the same for both methods.) --enable-mainlib=yes|no Build funtools mainlib support, which allows user programs to call funtools as subroutines. This is an experimental interface. Standard options are listed below. the most important of which is --prefix (to specify where to install) and --exec-prefix (where to install executables, if the top level is different from where libraries and include files are being installed. At SAO, we just use --prefix. We recommend --prefix be set to a directory that will hold saord software (e.g., --prefix=/soft/saord) in order to make management of our software easier. NB: be sure to use only absolute path names (those starting with "/") in the --prefix and --exec_prefix options. (The configure options we use at SAO for various machines are given as examples in the script file called "saoconfig" in this directory.) NB: Please avoid use of --prefix with 'make install' to change the install directory. We use the original value of --prefix to determine where compiled objects are located for linking slave filter programs. The slave will look in that directory for imregions.o and evregions.o. If you change the install directory, you will not be able to use these precompiled objects. Instead, each filter will have to recompile the region code. Compiler flags can be placed on the configure command line after the switches. For example, to use the icc compiler under Linux, you can configure this way: ./configure --prefix=... CC=icc CFLAGS="..." If you are going to be dealing with data files larger than 2Gb, you will need to build in large file support. For gcc and many other compilers, this is done using the following CFLAGS: ./configure CFLAGS="-D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64" Of course, you can put other switches into CFLAGS as needed: ./configure CFLAGS="-D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -Wall -g" 2. Type `make' to compile the package. This will create the libfuntools.a library and the Funtools utility programs (funcnts, fundisp, etc.) 3. You can build the libxpa.so shared library manually by executing: make shlib at this point. 4. Type "make install" to install Funtools libraries and binaries in standard places. You'll need write permission on the installation directories to do this. The installation directories are determined by the "configure" script and may be specified with the --prefix option to "configure". See the Makefile for information on what directories were chosen. 5. There are .html help files in the doc directory. You can copy these files to a more convenient location, if you like. We did not automate this step because we did not know where to copy these files by default. (NB: The help.html file is the top level index file.) 6. 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'. The latter also removes all Makefiles (except the one at the top level). Compilers and Options ===================== Some systems require unusual options for compilation or linking that the `configure' script does not know about. You can give `configure' initial values for variables by setting them in the environment: ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix You also can use this facility to specify a compiler other than the default gcc (if it exists). Installation Names ================== By default, `make install' will install the package's files in `/usr/local/bin', `/usr/local/lib', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PATH': e.g., ./configure --prefix=/soft/saord Programs will be installed in /soft/saord/bin, libraries in /soft/saord/lib, and include files in /soft/saord/include. We recommend this as a general rule, in order to keep SAORD software in one place that does not conflict with other installations. Note that you will need to add the bin directory to your 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. Specifying the System Type ========================== There may be some features `configure' can not figure out automatically, but needs to determine by the type of host the package will run on. Usually `configure' can figure that out, but if it prints a message saying it can not guess the host type, give it the `--host=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name with three fields: CPU-COMPANY-SYSTEM 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 host type. If you are building compiler tools for cross-compiling, you can also use the `--target=TYPE' option to select the type of system they will produce code for and the `--build=TYPE' option to select the type of system on which you are compiling the package. 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. Operation Controls ================== `configure' recognizes the following options to control how it operates. `--cache-file=FILE' Use and save the results of the tests in FILE instead of `./config.cache'. Set FILE to `/dev/null' to disable caching, for debugging `configure'. `--help' Print a summary of the options to `configure', and exit. `--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. `--version' Print the version of Autoconf used to generate the `configure' script, and exit. `configure' also accepts some other, not widely useful, options. If you have questions, please contact us at: saord@cfa.harvard.edu. Eric Mandel funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/Makefile.in000066400000000000000000000523761256243640000225600ustar00rootroot00000000000000# # This file is a Makefile for Funtools. If it has the name "Makefile.in" # then it is a template for a Makefile; to generate the actual Makefile, # run "./configure", which is a configuration script generated by the # "autoconf" program (constructs like "@foo@" will get replaced in the # actual Makefile. # PACKAGE = @PACKAGE_NAME@ VERSION = @PACKAGE_VERSION@ DISTNAME = funtools-${VERSION} DISTDIR = ../export/${DISTNAME} FTPDIR = ../ftp #---------------------------------------------------------------- # Things you can change to personalize the Makefile for your own # site (you can make these changes in either Makefile.in or # Makefile, but changes to Makefile will get lost if you re-run # the configuration script). #---------------------------------------------------------------- # Default top-level directories in which to install architecture- # specific files (exec_prefix) and machine-independent files such # as scripts (prefix). The values specified here may be overridden # at configure-time with the --exec-prefix and --prefix options # to the "configure" script. prefix = @prefix@ exec_prefix = @exec_prefix@ # The following definition can be set to non-null for special systems # like AFS with replication. It allows the pathnames used for installation # to be different than those used for actually reference files at # run-time. INSTALL_ROOT is prepended to $prefix and $exec_prefix # when installing files. INSTALL_ROOT = $(DESTDIR) # Directory in which to install the .a or .so binary for the FUNTOOLS library: LIB_INSTALL_DIR = $(INSTALL_ROOT)$(exec_prefix)/lib # Directory in which to install the program wish: BIN_INSTALL_DIR = $(INSTALL_ROOT)$(exec_prefix)/bin # Directory in which to install the funtools.h include file: INCLUDE_INSTALL_DIR = $(INSTALL_ROOT)$(prefix)/include/funtools # Top-level directory for manual entries: MAN_INSTALL_DIR = $(INSTALL_ROOT)$(prefix)/share/man # Top-level directory for share entries: MAN_SHARE_DIR = $(INSTALL_ROOT)$(prefix)/share/funtools # util files are in the util subdirectory UTIL_INC = -I./util # UTIL_LIBS = -L./util -lutil # fitsy files are in the fitsy subdirectory FITSY_INC = -I./fitsy # FITSY_LIBS = -L./fitsy -lfitsy # wcs files are in the wcs subdirectory WCS_INC = -I./wcs # WCS_LIBS = -L./wcs -lwcs # filter files are in the filter subdirectory FILTER_INC = -I./filter # FILTER_LIBS = -L./filter -lfilter # extra includes for compiling INCLUDES = $(UTIL_INC) $(FILTER_INC) $(WCS_INC) $(FITSY_INC) # extra libs EXTRA_LIBS = @EXTRA_LIBS@ # the full set of libraries for linking LIBS = $(UTIL_LIBS) $(FILTER_LIBS) $(WCS_LIBS) $(FITSY_LIBS) \ $(EXTRA_LIBS) -lm # To change the compiler switches, for example to change from -O # to -g, change the following line: CFLAGS = @CFLAGS@ # To add ld switches, change the following line: LDFLAGS = @LDFLAGS@ # whether to set the FPU in double round mode USE_FPU_DOUBLE = @USE_FPU_DOUBLE@ # Some versions of make, like SGI's, use the following variable to # determine which shell to use for executing commands: SHELL = /bin/sh # extra modules added by configure.in to fix OS bugs EXTRA_OBJS = @EXTRA_OBJS@ # special definitions for funcalc (based on filter configuration) FUNCALC_CC = @FILTER_CC@ FUNCALC_CFLAGS = @FILTER_CFLAGS@ # if enabled-shared was specified, this will exand to "shlib" and trigger # building of the shared library DOSHARED = @DOSHARED@ DOMAINLIB = @DOMAINLIB@ # There are just too many different versions of "install" around; # better to use the install-sh script that comes with the distribution, # which is slower but guaranteed to work. INSTALL = @srcdir@/install-sh -c INSTALL_PROGRAM = ${INSTALL} INSTALL_DATA = ${INSTALL} -m 644 # which awk-like program do we have? PRE= @PRE@ POST= @POST@ AWK = @AWK@ PIPEGLUE = @PIPEGLUE@ GUNZIP = @GUNZIP@ GNUPLOT = @GNUPLOT@ #---------------------------------------------------------------- # The information below is modified by the configure script when # Makefile is generated from Makefile.in. You shouldn't normally # modify any of this stuff by hand. #---------------------------------------------------------------- AC_FLAGS = @DEFS@ RANLIB = @RANLIB@ EXE = @EXEEXT@ #---------------------------------------------------------------- # The information below should be usable as is. The configure # script won't modify it and you shouldn't need to modify it # either. #---------------------------------------------------------------- CC = @CC@ CC_SWITCHES = -I. ${CFLAGS} ${CPPFLAGS} @USE_DL@ ${INCLUDES} ${AC_FLAGS} DEPEND_SWITCHES = -I. ${CFLAGS} ${INCLUDES} ${AC_FLAGS} SRCS = funcol.c funcopy.c funtab.c funim.c funinfo.c \ funopen.c funopenp.c funparam.c funtext.c funwcs.c \ funview.c funutil.c OBJS = funcol.o funcopy.o funtab.o funim.o funinfo.o \ funopen.o funopenp.o funparam.o funtext.o funwcs.o \ funview.o funutil.o # these are all the modules going into the "normal" funtools library LIBOBJS = ${OBJS} # the default library for this package DEFLIB = @DEFLIB@ # the actual library we are building (if this is a subpackage) LIB = @LIB@ # this is used in the link line # LLIB = $(LIB) LLIB = @LLIB@ # libraries containing main as subroutines MAINLIB = lib$(PACKAGE)MainLib.a PROGS = funcalc funcen funcnts funcone fundisp funhead funhist \ funimage funjoin funmerge funsky funtable MAINLIBOBJS = funcalc_main.o funcen_main.o funcnts_main.o funcone_main.o \ fundisp_main.o funhead_main.o funhist_main.o \ funimage_main.o funmerge_main.o funsky_main.o funtable_main.o \ funjoin_main.o PROGS2 = _sort TEMPLATES = funcnts_plot.tmpl funhist_plot.tmpl funcnts_sed.tmpl \ funtools_ds9.tmpl funds9.tmpl funtbl.tmpl funindex.tmpl SCRIPTS = funcnts.plot funhist.plot funcnts.sed funds9 funtbl funindex DS9HELPERS = funtools.ds9 FILES = funcalc.sed DEVEL = # Subdirectories to run make in for the primary targets. SUBLIBS = util fitsy wcs filter SUBDIRS = $(SUBLIBS) gnu funtest faq all: lib progs progs2 scripts ds9helpers progs: $(PROGS) progs2: $(PROGS2) scripts: $(SCRIPTS) ds9helpers: $(DS9HELPERS) devel: $(DEVEL) libutil: FORCE @(echo Making libutil.a in util ...; \ cd util; $(MAKE) libutil; mv libutil.a ..) sublib: FORCE @for dir in $(SUBLIBS); do \ echo " "; \ echo Making library in $$dir ...; \ (cd $$dir; $(MAKE)) ; \ done lib: $(LIB) $(DOMAINLIB) $(DOSHARED) $(LIB): sublib $(LIBOBJS) ar cruv $(LIB) $(LIBOBJS) $(RANLIB) $(LIB) funmainlib.c: $(MAINLIBOBJS) mkfunmainlib echo $(PROGS) | ./mkfunmainlib > funmainlib.c; shlib: sublib $(LIBOBJS) @(rm -rf $(PACKAGE)tmp; mkdir $(PACKAGE)tmp; \ (cd $(PACKAGE)tmp && ar x ../$(LIB)); \ CC='$(CC)' CXX=$(CXX) \ ./mklib -o $(PACKAGE) $(PACKAGE)tmp/*.o; \ rm -rf $(PACKAGE)tmp;) mainlib: $(MAINLIBOBJS) funmainlib.o lex.calc.o @(ar cruv lib$(PACKAGE)MainLib.a \ $(MAINLIBOBJS) funmainlib.o lex.calc.o; \ $(RANLIB) lib$(PACKAGE)MainLib.a) shmainlib: mainlib @(rm -rf $(PACKAGE)tmp; mkdir $(PACKAGE)tmp; \ (cd $(PACKAGE)tmp && ar x ../lib$(PACKAGE)MainLib.a); \ CC='$(CC)' CXX='$(CXX)' \ ./mklib -o $(PACKAGE)MainLib -L. -lfuntools $(PACKAGE)tmp/*.o;\ rm -rf $(PACKAGE)tmp;) tclfun: $(LIB) tclmainlib.o tclfun.o @(ar cruv libtclfun.a tclmainlib.o tclfun.o; \ $(RANLIB) libtclfun.a) shtclfun: tclfun @(rm -rf $(PACKAGE)tmp; mkdir $(PACKAGE)tmp; \ (cd $(PACKAGE)tmp && ar x ../$(LIB) && ar x ../libtclfun.a); \ CC='$(CC)' CXX='$(CXX)' \ ./mklib -o tclfun $(PACKAGE)tmp/*.o; \ rm -rf $(PACKAGE)tmp; \ test -r pkgIndex.tcl && mv pkgIndex.tcl pkgIndex.tcl-old; \ SHLIB=libtclfun.so; \ test -r libtclfun.dylib && SHLIB=libtclfun.dylib; \ echo "pkg_mkIndex -direct . $${SHLIB}; exit" | tclsh;) tclfun.c: FORCE echo $(PROGS) | ./mkfunmainlib -tcl > tclfun.c tclmainlib.o: util/tclmainlib.c $(CC) -c $(CC_SWITCHES) util/tclmainlib.c funcalc: funcalc.o lex.calc.o lib $(CC) $(LDFLAGS) funcalc.o lex.calc.o -o funcalc \ $(LLIB) $(LIBS) funcen: funcen.o lib $(CC) $(LDFLAGS) funcen.o -o funcen $(LLIB) $(LIBS) funcnts: funcnts.o lib $(CC) $(LDFLAGS) funcnts.o -o funcnts $(LLIB) $(LIBS) funcone: funcone.o lib $(CC) $(LDFLAGS) funcone.o -o funcone $(LLIB) $(LIBS) fundisp: fundisp.o lib $(CC) $(LDFLAGS) fundisp.o -o fundisp $(LLIB) $(LIBS) funhist: funhist.o lib $(CC) $(LDFLAGS) funhist.o -o funhist $(LLIB) $(LIBS) funhead: funhead.o lib $(CC) $(LDFLAGS) funhead.o -o funhead $(LLIB) $(LIBS) funimage: funimage.o lib $(CC) $(LDFLAGS) funimage.o -o funimage $(LLIB) $(LIBS) funjoin: funjoin.o lib $(CC) $(LDFLAGS) funjoin.o -o funjoin $(LLIB) $(LIBS) funmerge: funmerge.o lib $(CC) $(LDFLAGS) funmerge.o -o funmerge $(LLIB) $(LIBS) funsky: funsky.o lib $(CC) $(LDFLAGS) funsky.o -o funsky $(LLIB) $(LIBS) funtable: funtable.o lib $(CC) $(LDFLAGS) funtable.o -o funtable $(LLIB) $(LIBS) _sort: FORCE @(echo " "; echo "Making in gnu ..."; cd gnu; $(MAKE)) funcalc_main.o: funcalc.c $(CC) -c $(CC_SWITCHES) -Dmain="funcalc_main" \ -o funcalc_main.o funcalc.c funcen_main.o: funcen.c $(CC) -c $(CC_SWITCHES) -Dmain="funcen_main" \ -o funcen_main.o funcen.c funcnts_main.o: funcnts.c $(CC) -c $(CC_SWITCHES) -Dmain="funcnts_main" \ -o funcnts_main.o funcnts.c funcone_main.o: funcone.c $(CC) -c $(CC_SWITCHES) -Dmain="funcone_main" \ -o funcone_main.o funcone.c fundisp_main.o: fundisp.c $(CC) -c $(CC_SWITCHES) -Dmain="fundisp_main" \ -o fundisp_main.o fundisp.c funhist_main.o: funhist.c $(CC) -c $(CC_SWITCHES) -Dmain="funhist_main" \ -o funhist_main.o funhist.c funhead_main.o: funhead.c $(CC) -c $(CC_SWITCHES) -Dmain="funhead_main" \ -o funhead_main.o funhead.c funimage_main.o: funimage.c $(CC) -c $(CC_SWITCHES) -Dmain="funimage_main" \ -o funimage_main.o funimage.c funjoin_main.o: funjoin.c $(CC) -c $(CC_SWITCHES) -Dmain="funjoin_main" \ -o funjoin_main.o funjoin.c funmerge_main.o: funmerge.c $(CC) -c $(CC_SWITCHES) -Dmain="funmerge_main" \ -o funmerge_main.o funmerge.c funsky_main.o: funsky.c $(CC) -c $(CC_SWITCHES) -Dmain="funsky_main" \ -o funsky_main.o funsky.c funtable_main.o: funtable.c $(CC) -c $(CC_SWITCHES) -Dmain="funtable_main" \ -o funtable_main.o funtable.c funcnts.plot: funcnts_plot.tmpl sed -e 's#AWK#$(AWK)#g' funcnts_plot.tmpl > funcnts.plot chmod +x funcnts.plot funhist.plot: funhist_plot.tmpl sed -e 's#AWK#$(AWK)#g' funhist_plot.tmpl > funhist.plot chmod +x funhist.plot funds9: funds9.tmpl sed -e 's#AWK#$(AWK)#g;s#GNUPLOT#$(GNUPLOT)#g' funds9.tmpl > funds9 chmod +x funds9 funtbl: funtbl.tmpl sed -e 's#AWK#$(AWK)#g;' funtbl.tmpl > funtbl chmod +x funtbl funindex: funindex.tmpl cp -p funindex.tmpl funindex chmod +x funindex funcnts.sed: funcnts_sed.tmpl cp funcnts_sed.tmpl funcnts.sed chmod +x funcnts.sed funtools.ds9: funtools_ds9.tmpl sed -e 's#PRE#$(PRE)#g;s#POST#$(POST)#g;s#GUNZIP#$(GUNZIP)#g' funtools_ds9.tmpl > funtools.ds9 diff: @-(for file in "`ls *.c`"; \ do \ echo $$file; \ diff /soft/saord/funtools-*/$$file .; \ done;) install:: install-binaries install:: $(DOSHARED)_install install:: @for dir in $(SUBDIRS); do \ echo " "; \ echo Installing in $$dir ...; \ (cd $$dir; $(MAKE) INSTALL_ROOT=$(INSTALL_ROOT) INCLUDE_INSTALL_DIR=$(INCLUDE_INSTALL_DIR) $@) ; \ done install:: install-man install:: install-share install:: install-data FORCE: # Note: before running ranlib below, must cd to target directory because # some ranlibs write to current directory, and this might not always be # possible (e.g. if installing as root). # this nop-op gets executed if we are not building shared libraries _install: shlib_install: @-(for i in `ls *.so* *.dylib *.sl 2>/dev/null` ; \ do \ if [ -h $$i ] ; then \ echo "Installing link $$i" ; \ tar cf - $$i | (cd $(LIB_INSTALL_DIR); tar xf -) ; \ else \ echo "Installing $$i" ; \ $(INSTALL_DATA) $$i $(LIB_INSTALL_DIR)/$$i ; \ chmod 555 $(LIB_INSTALL_DIR)/$$i; \ fi; \ done;) install-binaries: lib $(PROGS) $(SCRIPTS) $(DS9HELPERS) @for i in $(LIB_INSTALL_DIR) $(INCLUDE_INSTALL_DIR) $(BIN_INSTALL_DIR) ; \ do \ if [ ! -d $$i ] ; then \ echo "Making directory $$i"; \ mkdir -p $$i; \ chmod 755 $$i; \ else true; \ fi; \ done; @if [ "$(LIB)" ] ; then \ XLIB=`basename $(LIB)`; \ echo "Installing $$XLIB"; \ $(INSTALL_DATA) $$XLIB $(LIB_INSTALL_DIR)/$$XLIB; \ (cd $(LIB_INSTALL_DIR); $(RANLIB) $$XLIB); \ chmod 555 $(LIB_INSTALL_DIR)/$$XLIB; \ fi; @echo "Installing funtools.h" @$(INSTALL_DATA) funtools.h $(INCLUDE_INSTALL_DIR)/funtools.h @echo "Installing funtoolsP.h" @$(INSTALL_DATA) funtoolsP.h $(INCLUDE_INSTALL_DIR)/funtoolsP.h @for i in $(PROGS) ; \ do \ echo "Installing $$i$(EXE)" ; \ $(INSTALL_PROGRAM) $$i$(EXE) $(BIN_INSTALL_DIR)/$$i$(EXE) ; \ done; @for i in $(SCRIPTS) ; \ do \ echo "Installing $$i" ; \ $(INSTALL_PROGRAM) $$i $(BIN_INSTALL_DIR)/$$i ; \ done; @for i in $(DS9HELPERS) ; \ do \ echo "Installing $$i" ; \ $(INSTALL_DATA) $$i $(BIN_INSTALL_DIR)/$$i ; \ done; @for i in $(FILES) ; \ do \ echo "Installing $$i" ; \ $(INSTALL_DATA) $$i $(BIN_INSTALL_DIR)/$$i ; \ done; install-man: @if [ ! -d $(MAN_INSTALL_DIR) ] ; then \ echo "Making directory $(MAN_INSTALL_DIR)"; \ mkdir $(MAN_INSTALL_DIR); \ chmod 755 $(MAN_INSTALL_DIR); \ else true; \ fi; @-(for i in `ls ./man/man?/*.?` ; \ do \ B=`basename $$i`; \ E=`echo $$i | awk -F. '{print $$NF}'`; \ M="$(MAN_INSTALL_DIR)/man$$E"; \ if [ ! -d $$M ] ; then \ echo "Making directory $$M"; \ mkdir $$M; \ chmod 755 $$M; \ else true; \ fi; \ echo "Installing $$B" ; \ $(INSTALL_DATA) $$i $$M/$$B; \ done;) install-share: @if [ ! -d $(MAN_SHARE_DIR) ] ; then \ echo "Making directory $(MAN_SHARE_DIR)"; \ mkdir -p $(MAN_SHARE_DIR); \ chmod 755 $(MAN_SHARE_DIR); \ else true; \ fi; @-(for i in `ls ./doc/sman/fun?.*` ; \ do \ B=`basename $$i`; \ echo "Installing $$B" ; \ $(INSTALL_DATA) $$i $(MAN_SHARE_DIR)/$$B; \ done;) install-data: install-pkgconfig install-pkgconfig: @-(mkdir -p $(LIB_INSTALL_DIR)/pkgconfig; \ echo "Installing funtools.pc" ; \ $(INSTALL_DATA) funtools.pc $(LIB_INSTALL_DIR)/pkgconfig;) Makefile: Makefile.in $(SHELL) config.status RM = rm -f topclean: $(RM) *.a *.so *.so.? *.so.?.? *.o *.dylib \ $(PROGS) tmain \ $(SCRIPTS) $(DS9HELPERS) \ $(DEVEL) *.exe \ core core.[0-9]* errs *pure* .nfs* \ foo* *~ *.log \#* TAGS *.E a.out errors \ gmon.out *.pg *.bak \ config.info config.log \ doc/*~ doc/*.bak $(RM) -r autom4te.cache binclean: $(RM) ./lib/* ./include/* ./bin/* subclean: for dir in $(SUBDIRS); do \ echo making clean in subdir $$dir ; \ (cd $$dir; if [ -f Makefile ]; then $(MAKE) clean; fi); \ done clean: topclean binclean subclean pclean: $(RM) $(PROGS) $(DEVEL) distclean: clean $(RM) config.status config.cache config.log funtools.pc Distclean: distclean for dir in $(SUBDIRS); do \ echo making clean in $$dir ; \ (cd $$dir; if [ -f Makefile ]; then $(MAKE) distclean; fi); \ done depend: makedepend -- $(DEPEND_SWITCHES) -- $(SRCS) .c.o: $(CC) -c $(CC_SWITCHES) $< funopen.o: funopen.c funtools.h funtoolsP.h funparam.o: funparam.c funtools.h funtoolsP.h funim.o: funim.c funtools.h funtoolsP.h funtab.o: funtab.c funtools.h funtoolsP.h funcol.o: funcol.c funtools.h funtoolsP.h funcopy.o: funcopy.c funtools.h funtoolsP.h funutil.o: funutil.c funtools.h funtoolsP.h funview.o: funview.c funtools.h funtoolsP.h funwcs.o: funwcs.c funtools.h funtoolsP.h funinfo.o: funinfo.c funtools.h funtoolsP.h funimage.o: funimage.c funtools.h funtoolsP.h funhist.o: funhist.c funtools.h funtoolsP.h fundisp.o: fundisp.c funtools.h funtoolsP.h funhead.o: funhead.c funtools.h funtoolsP.h funcnts.o: funcnts.c funtools.h funtoolsP.h funcen.o: funcen.c funtools.h funtoolsP.h funcone.o: funcone.c funtools.h funtoolsP.h funjoin.o: funjoin.c funtools.h funtoolsP.h funmerge.o: funmerge.c funtools.h funtoolsP.h funsky.o: funsky.c funtools.h funtoolsP.h funtable.o: funtable.c funtools.h funtoolsP.h chandra.h funcalc.o: funcalc.c calc.h funtools.h funtoolsP.h $(CC) -c $(CC_SWITCHES) $< \ -DFUN_INCLUDE="\"-I${prefix}/include\"" \ -DFUNCALC_CC="$(FUNCALC_CC)" \ -DFUNCALC_CFLAGS="$(FUNCALC_CFLAGS)" \ -DFUN_LIB="\"-L${exec_prefix}/lib -lfuntools ${EXTRA_LIBS} -lm\"" lex.calc.o: lex.calc.c tabcalc_c.h headers: tabcalc_c.h tabcalc_c.h: tabcalc.c $(RM) tabcalc_c.h ./inc.sed TABCALC_C < tabcalc.c > tabcalc_c.h # remake the parser LEX = flex -Pcalc parser: calc.l @($(LEX) calc.l; \ sed "s/yytext_ptr/calctext_ptr/g" < lex.calc.c > nlex.calc.c; \ mv nlex.calc.c lex.calc.c) funtools.h: configure.ac @($(RM) -r ofuntools.h; \ MAJOR=`echo "${VERSION}" | awk -F. '{print $$1}'`; \ MINOR=`echo "${VERSION}" | awk -F. '{print $$2}'`; \ PATCH=`echo "${VERSION}" | awk -F. '{print $$3}'`; \ sed "s/^#define FUN_VERSION.*/#define FUN_VERSION \"$(VERSION)\"/;s/^#define FUN_MAJOR_VERSION.*/#define FUN_MAJOR_VERSION $${MAJOR}/;s/^#define FUN_MINOR_VERSION.*/#define FUN_MINOR_VERSION $${MINOR}/;s/^#define FUN_PATCH_LEVEL.*/#define FUN_PATCH_LEVEL $${PATCH}/;" < funtools.h > nfuntools.h; \ mv funtools.h ofuntools.h; \ mv nfuntools.h funtools.h) # # Target to create a proper FUNTOOLS distribution from information in the # master source directory. DISTDIR must be defined to indicate where # to put the distribution. DISTDIR must be an absolute path name. # configure: configure.ac autoconf Configure: FORCE @for dir in $(SUBDIRS); do \ if [ -x $$dir/configure ]; then \ echo " "; \ echo Autoconf in $$dir ...; \ (cd $$dir; autoconf) ; \ fi; \ done Confiles: @(for dir in $(SUBDIRS); do \ echo " "; \ echo Copying configure files to $$dir ...; \ cp -p aclocal.m4 tcl.m4 gcc33.m4 \ conf.h.in config.sub config.guess install-sh $$dir; \ done) dist: configure ($(RM) -r $(DISTDIR); \ mkdir $(DISTDIR); \ cp -p README INSTALL COPYING $(DISTDIR)/.; \ cp -p *.c *.h *.l $(DISTDIR)/.; \ cp -p Makefile.in $(DISTDIR)/.; \ chmod 664 $(DISTDIR)/Makefile.in; \ cp -p conf.h.in $(DISTDIR)/.; \ chmod 664 $(DISTDIR)/conf.h.in; \ cp -p configure.ac $(DISTDIR)/.; \ chmod 644 $(DISTDIR)/configure.ac; \ cp -p *.m4 $(DISTDIR)/.; \ chmod 644 $(DISTDIR)/*.m4; \ cp -p configure $(DISTDIR)/.; \ chmod 755 $(DISTDIR)/configure; \ cp -p config.sub config.guess $(DISTDIR)/.; \ chmod 755 $(DISTDIR)/config.sub $(DISTDIR)/config.guess; \ cp -p saoconfig $(DISTDIR)/.; \ chmod 775 $(DISTDIR)/saoconfig; \ cp -p install-sh $(DISTDIR)/.; \ chmod +x $(DISTDIR)/install-sh; \ cp -p funtools.pc.in $(DISTDIR)/.; \ chmod +x $(DISTDIR)/funtools.pc.in; \ cp -p inc.sed $(DISTDIR)/.; \ chmod +x $(DISTDIR)/inc.sed; \ cp -p mklib $(DISTDIR)/.; \ chmod +x $(DISTDIR)/mklib; \ cp -p mkfunmainlib $(DISTDIR)/.; \ chmod +x $(DISTDIR)/mkfunmainlib; \ cp -pR util filter fitsy wcs gnu $(DISTDIR)/.;\ cp -pR funtest txt faq $(DISTDIR)/.;\ cp -p $(TEMPLATES) $(DISTDIR)/.; \ cp -p $(FILES) $(DISTDIR)/.; \ mkdir $(DISTDIR)/doc; \ cp -p ./doc/*.html ./doc/*.c $(DISTDIR)/doc/.; \ cp -p ./doc/*.ps ./doc/*.pdf $(DISTDIR)/doc/.; \ cp -p ./doc/Makefile $(DISTDIR)/doc/.; \ cp -p ./doc/szlong.c $(DISTDIR)/doc/.; \ mkdir $(DISTDIR)/doc/sman; \ cp -p ./doc/sman/* $(DISTDIR)/doc/sman/.; \ mkdir $(DISTDIR)/man; \ cp -p -R ./man/* $(DISTDIR)/man/.) release: dist (cd $(DISTDIR); cd ..; \ tar cf - $(DISTNAME) | \ gzip -9 -c > $(FTPDIR)/$(DISTNAME).tar.gz) tar: ($(RM) -r config.cache; \ cd ..; \ tar cf - $(DISTNAME) | gzip -9 -c > $(DISTNAME).tar.gz) errcheck: @-egrep 'error|warning|ld:|collect2:|make:' foo | egrep -v "^lex.*but not used" itar: (cd doc/sman; \ tar cf - . | gzip -9 -c > ../../../$(DISTNAME)-iman.tar.gz) sman: @(cd doc && $(MAKE) index) docs: @(cd doc; $(MAKE)) untar: (make clean; cd ..; \ $(RM) -r o$(DISTNAME); mv $(DISTNAME) o$(DISTNAME); \ tar xfz $(DISTNAME).tar.gz) pure: funcalc.pure funcen.pure funcnts.pure funcone.pure \ fundisp.pure funhead.pure funimage.pure funhist.pure \ funmerge.pure funsky.pure funtable.pure \ funjoin.pure funcen.pure: lib funcen.o purify $(CC) $(LDFLAGS) funcen.o -o funcen.pure \ $(LLIB) $(LIBS) funcnts.pure: lib funcnts.o purify $(CC) $(LDFLAGS) funcnts.o -o funcnts.pure \ $(LLIB) $(LIBS) funcone.pure: lib funcone.o purify $(CC) $(LDFLAGS) funcone.o -o funcone.pure \ $(LLIB) $(LIBS) fundisp.pure: lib fundisp.o purify $(CC) $(LDFLAGS) fundisp.o -o fundisp.pure \ $(LLIB) $(LIBS) funhead.pure: lib funhead.o purify $(CC) $(LDFLAGS) funhead.o -o funhead.pure \ $(LLIB) $(LIBS) funsky.pure: lib funsky.o purify $(CC) $(LDFLAGS) funsky.o -o funsky.pure \ $(LLIB) $(LIBS) funtable.pure: lib funtable.o purify $(CC) $(LDFLAGS) funtable.o -o funtable.pure \ $(LLIB) $(LIBS) funimage.pure: lib funimage.o purify $(CC) $(LDFLAGS) funimage.o -o funimage.pure \ $(LLIB) $(LIBS) funhist.pure: lib funhist.o purify $(CC) $(LDFLAGS) funhist.o -o funhist.pure \ $(LLIB) $(LIBS) funjoin.pure: lib funjoin.o purify $(CC) $(LDFLAGS) funjoin.o -o funjoin.pure \ $(LLIB) $(LIBS) funmerge.pure: lib funmerge.o purify $(CC) $(LDFLAGS) funmerge.o -o funmerge.pure \ $(LLIB) $(LIBS) funcalc.pure: lib funcalc.o lex.calc.o purify $(CC) $(LDFLAGS) funcalc.o lex.calc.o \ -o funcalc.pure $(LLIB) $(LIBS) # DO NOT DELETE THIS LINE -- make depend depends on it. funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/README000066400000000000000000000026011256243640000213550ustar00rootroot00000000000000Funtools is a "minimal buy-in" FITS library and utility package originally developed at the the High Energy Astrophysics Division of SAO. Although no longer actively supported at SAO, it is still widely used within the astronomical community, especially among X-ray astronomers. The Funtools library provides simplified access to a wide array of file types: standard astronomical FITS images and binary tables, raw arrays and binary event lists, and even tables of ASCII column data. A sophisticated region filtering library (compatible with ds9) filters images and tables using Boolean operations between geometric shapes, support world coordinates, etc. Funtools also supports advanced capabilities such as optimized data searching using index files. Because Funtools consists of a library and a set of user programs, it is most appropriately built from source. Funtools has been ported to Solaris, Linux, Mac OSX (Darwin) and Windows 98/NT/2000/XP. Once the source code tar file is retrieved, Funtools can be built and installed easily using standard commands: ./mkconfigure # generate all configure scripts ./configure --prefix=[installdir] # configuration make # build the software make install # install in [installdir] See the INSTALL instructions (which are based on standard instructions for building software using GNU configure) for more information about building Funtools. funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/ac_c_long_long.m4000066400000000000000000000015641256243640000236710ustar00rootroot00000000000000##### http://autoconf-archive.cryp.to/ac_c_long_long.html # # SYNOPSIS # # AC_C_LONG_LONG # # DESCRIPTION # # Provides a test for the existance of the long long int type and # defines HAVE_LONG_LONG if it is found. # # LAST MODIFICATION # # 2006-10-30 # # COPYLEFT # # Copyright (c) 2006 Caolan McNamara # # Copying and distribution of this file, with or without # modification, are permitted in any medium without royalty provided # the copyright notice and this notice are preserved. AC_DEFUN([AC_C_LONG_LONG], [AC_CACHE_CHECK(for long long int, ac_cv_c_long_long, [if test "$GCC" = yes; then ac_cv_c_long_long=yes else AC_TRY_COMPILE(,[long long int i;], ac_cv_c_long_long=yes, ac_cv_c_long_long=no) fi]) if test $ac_cv_c_long_long = yes; then AC_DEFINE(HAVE_LONG_LONG, 1, [compiler understands long long]) fi ]) funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/aclocal.m4000066400000000000000000000000731256243640000223360ustar00rootroot00000000000000builtin(include,tcl.m4) builtin(include,ac_c_long_long.m4) funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/bsearch.c000066400000000000000000000026021256243640000222510ustar00rootroot00000000000000/* http://www.tbray.org/ongoing/When/200x/2003/03/22/Binary */ /* returns first target if more than one have same value */ static public int search(int [] array, int target) { int high = array.length, low = -1, probe; while (high - low > 1) { probe = (high + low) / 2; if (array[probe] < target) low = probe; else high = probe; } if (high == array.length || array[high] != target) return -1; else return high; } /* returns last target if more than one have same value */ static public int search2(int [] array, int target) { int high = array.length, low = -1, probe; while (high - low > 1) { probe = (high + low) / 2; if (array[probe] > target) high = probe; else low = probe; } if (low == -1 || array[low] != target) return -1; else return low; } static public int [] range(int [] array, int floor, int ceiling) { int [] answer = new int[2]; int high, low, probe; // work on floor high = array.length; low = -1; while (high - low > 1) { probe = (high + low) / 2; if (array[probe] < floor) low = probe; else high = probe; } answer[0] = low; // work on ceiling high = array.length; low = -1; while (high - low > 1) { probe = (high + low) / 2; if (array[probe] > ceiling) high = probe; else low = probe; } answer[1] = high; return answer; } funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/calc.h000066400000000000000000000011771256243640000215570ustar00rootroot00000000000000/* * Copyright (c) 1999-2003 Smithsonian Astrophysical Observatory */ /* * * calc.h * */ #ifndef __funcalc_h #define __funcalc_h #include #ifndef FUNCALC_CC #define FUNCALC_CC NULL #endif #ifndef FUNCALC_CFLAGS #define FUNCALC_CFLAGS NULL #endif /* places to look for the compiler other than user's path */ #define FUNCALC_PATH "/opt/SUNWspro/bin:/bin:/usr/bin:/usr/local/bin/:/opt/local/bin:" #define DEFAULT_FUNCALC_TMPDIR "/tmp" #define FUNCALC_SED "funcalc.sed" /* library declarations */ _PRbeg void _CalcCat _PRx((char *str, char **ostr, int *olen)); _PRend #endif /* __funtools.h */ funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/calc.l000066400000000000000000000430401256243640000215560ustar00rootroot00000000000000%option caseless %array %{ #include #include #include #include #include /* define the types of event records we have to handle */ #define REC_CUR 1 #define REC_PREV 2 #define REC_NEXT 4 /* misc */ #define MAX_INCLUDE_DEPTH 100 #define SEGINC 1024 #define MAXCODE 4 /* symbols for each column we encounter */ typedef struct calccoltab { struct calccoltab *next; char *name; char *sname; char *cname; char *tdim; int type; int n; double tlmin; double tlmax; double binsiz; double tscale; double tzero; int scaled; int exists; int settype; } *CalcCols, CalcColRec; static YY_BUFFER_STATE include_stack[MAX_INCLUDE_DEPTH]; static int include_stack_ptr = 0; static Fun ifun; static CalcCols columns; static int laststart; static char *prog; static char *command; static char *autodeclare; static char *mbuf; static int mlen; static int n; static int var; static int rectype; static int args; static int doreplace=0; static char *code[MAXCODE]; static char *expr; static char **strptr=&expr; static int ncode[MAXCODE]; static int nexpr; static int xnl; static int *lenptr=&nexpr; static void setn _PRx((int newn)); static char *_CalcMake _PRx((void)); static int _CalcColProc _PRx((char *s, int expl)); static int _CalcColName _PRx((char *sname)); static CalcCols _CalcColNew _PRx((Fun fun, char *name, char *sname, char *cname, int type, int n, double tlmin, double tlmax, double binsiz, double tscale, double tzero, int scaled, int exists, int settype)); static CalcCols _CalcColLookup _PRx((char *cname)); int _calcerror _PRx((char *msg)); %} DIG [0-9] DIG2 [0-9a-fA-F] BINARY 0[bB][01]+ INT1 [-+]?{DIG}+L? INT2 [-+]?0[xX]{DIG2}+L? INT ({INT1}|{INT2}) FLOAT1 [-+]?{DIG}+\.?([eE][-+]?{DIG}+)? FLOAT2 [-+]?{DIG}*\.{DIG}+([eE][-+]?{DIG}+)? FLOAT ({FLOAT1}|{FLOAT2}) NUM ({INT}|{FLOAT}) SNAME (cur|prev|next) NAME [A-Za-z~_][0-9A-Za-z~_]*(\[[0-9]+\])? TYPE (\[{INT}\])?(:{NUM}?[a-z]?){1,4} COL {SNAME}->{NAME}{TYPE}? ECOL explicit FILE @[0-9A-Za-z~_/\-\.]*(\[.*\])? VAR [ \t]*(char|short|int|float|double) INCL ^#[\t ]*include[ \t]*(\".*\"|<.*>) DEF ^#[\t ]*define[ \t]+.* XCOM # BCOM "/*" ECOM "*/" %x INCLUDE %x VAR %x COM %x XCOM %x ECOL %% global { setn(0); var = 0; } local { setn(1); var = 0; } before { setn(2); var = 0; } after { setn(3); var = 0; } end { setn(-1); var = 0; } {FILE} { char *s; if ( include_stack_ptr >= MAX_INCLUDE_DEPTH ) _calcerror("include files are nested too deeply"); if( !(s = (char *)FileContents(yytext+1, 0, NULL)) ) _calcerror("can't access include file"); else { include_stack[include_stack_ptr++] = YY_CURRENT_BUFFER; BEGIN INITIAL; yy_scan_string(s); BEGIN INITIAL; if( s ) xfree(s); } } {VAR} { if( var ){ BEGIN VAR; setn(1); } _CalcCat(yytext, strptr, lenptr); } ; { _CalcCat(yytext, strptr, lenptr); _CalcCat("\n", strptr, lenptr); if( var ){ BEGIN INITIAL; setn(-1); } } . { _CalcCat(yytext, strptr, lenptr); } {INCL} { _CalcCat(yytext, strptr, lenptr); } {DEF} { _CalcCat(yytext, strptr, lenptr); } ^[ \t]*{XCOM} { laststart = YY_START; xnl=0; BEGIN XCOM; } {XCOM} { laststart = YY_START; xnl=1; BEGIN XCOM; } \n { BEGIN laststart; if( xnl ) unput('\n'); } . { /* ignore comments up to eol */ ; } {BCOM} { _CalcCat(yytext, strptr, lenptr); laststart = YY_START; BEGIN COM; } {ECOM} { _CalcCat(yytext, strptr, lenptr); BEGIN laststart; } \n { _CalcCat(yytext, strptr, lenptr); } . { _CalcCat(yytext, strptr, lenptr); } {COL} { _CalcColProc(yytext, 0); var=0;} {ECOL} { laststart = YY_START; BEGIN ECOL; } {NAME} { _CalcColProc(yytext, 1); var=0; } [, \t] { ; } \n { BEGIN laststart; } \n { _CalcCat(yytext, strptr, lenptr);} [ \t]* { _CalcCat(yytext, strptr, lenptr);} . { _CalcCat(yytext, strptr, lenptr); var=0;} <> { if ( --include_stack_ptr < 0 ){ prog = _CalcMake(); yy_delete_buffer( YY_CURRENT_BUFFER ); yyterminate(); } else { yy_delete_buffer( YY_CURRENT_BUFFER ); yy_switch_to_buffer(include_stack[include_stack_ptr] ); } } %% /* * * Private Routines * * */ /* setn -- set pointer to where expression is stored */ #ifdef YY_USE_PROTOS static void setn(int newn) #else static void setn(newn) int newn; #endif { if( newn >=0 ){ n = newn; strptr = &code[n]; lenptr = &ncode[n]; } else{ strptr = &expr; lenptr = &nexpr; } } /* * * _CalcDatatype -- return C data type as a string * */ #ifdef YY_USE_PROTOS static char * _CalcDatatype(int type) #else static char *_CalcDatatype(type) int type; #endif { switch ( type ) { case 'A': return "char"; case 'X': return "char"; case 'B': return "unsigned char"; case 'I': return "short"; case 'U': return "unsigned short"; case 'J': return "int"; case 'K': return "long long"; case 'V': return "unsigned int"; case 'L': return "char"; case 'E': return "float"; case 'D': return "double"; } _calcerror("unknown/illegal data type for new column"); return "???"; } /* * * _CalcColName -- see if sname is a recognized column name * */ #ifdef YY_USE_PROTOS static int _CalcColName(char *sname) #else static int _CalcColName(sname) char *sname; #endif { if( !strcasecmp(sname, "prev") ){ strcpy(sname, "prev"); rectype |= REC_PREV; return REC_PREV; } if( !strcasecmp(sname, "cur") ){ strcpy(sname, "cur"); rectype |= REC_CUR; return REC_CUR; } if( !strcasecmp(sname, "next") ){ strcpy(sname, "next"); rectype |= REC_NEXT; return REC_NEXT; } else{ return 0; } } /* * * _CalcCB -- macro expansion callback * */ #ifdef YY_USE_PROTOS static char * _CalcCB(char *name, void *client_data) #else static char *_CalcCB(name, client_data) char *name; void *client_data; #endif { CalcCols cur; char tbuf[SZ_LINE]; char tbuf2[SZ_LINE*2]; char tbuf3[SZ_LINE]; int i, got, ip; /* avoid -W unused parameter warning */ if( 0 ) client_data = client_data; /* start at beginning of macro buffer */ /* allocate the macro buffer */ if( mbuf ) xfree(mbuf); mbuf = NULL; mlen = SZ_LINE; if( !strcmp(name, "MEMBERS") ){ if( !columns ){ _CalcCat("int dummy;\n", &mbuf, &mlen); return mbuf; } for(cur=columns; cur!=NULL; cur=cur->next){ snprintf(tbuf, SZ_LINE, "%s %s", _CalcDatatype(cur->type), cur->cname); _CalcCat(tbuf, &mbuf, &mlen); if( cur->n > 1 ){ /* if there is no tdim, just make it a simple array */ /* (also, do the simple thing for bit-fields) */ if( (cur->tdim == NULL) || (cur->type == 'X') ){ switch(cur->type){ case 'X': i = (cur->n+7)/8; break; default: i = cur->n; break; } snprintf(tbuf, SZ_LINE, "[%d]", i); } /* tdim exists, so use it to declare a multidimensional array */ else{ newdtable(",()"); /* I hear tdim is in Fortran order, so reverse it for C order */ for(*tbuf = '\0', ip=0, got=0; word(cur->tdim, tbuf3, &ip); got++){ snprintf(tbuf2, SZ_LINE, "[%s]", tbuf3); if( *tbuf ) strcat(tbuf2, tbuf); strcpy(tbuf, tbuf2); } freedtable(); /* but if we got nothing out of it, go back to simplicity */ if( !got ) snprintf(tbuf, SZ_LINE, "[%d]", cur->n); } _CalcCat(tbuf, &mbuf, &mlen); } _CalcCat(";", &mbuf, &mlen); if( cur->next ) _CalcCat("\n", &mbuf, &mlen); } return mbuf; } else if( !strcmp(name, "SELECT") ){ if( !columns ){ return ""; } for(cur=columns; cur!=NULL; cur=cur->next){ *tbuf2 = '\0'; if( (cur->tlmin != 0.0) || (cur->tlmax != 0.0) ){ snprintf(tbuf2, SZ_LINE, "%f:%f", cur->tlmin, cur->tlmax); if( cur->binsiz != 1.0 ){ snprintf(tbuf3, SZ_LINE, ":%f", cur->binsiz); strncat(tbuf2, tbuf3, SZ_LINE); } if( (cur->tscale != 1.0) || (cur->tzero != 0.0) ){ snprintf(tbuf3, SZ_LINE, ";%f", cur->tscale); strncat(tbuf2, tbuf3, SZ_LINE); snprintf(tbuf3, SZ_LINE, ":%f", cur->tzero); strncat(tbuf2, tbuf3, SZ_LINE); } } if( *tbuf2 ){ snprintf(tbuf, SZ_LINE, "\"%s\", \"%d%c:%s\", ", cur->cname, cur->n, cur->type, tbuf2); } else{ snprintf(tbuf, SZ_LINE, "\"%s\", \"%d%c\", ", cur->cname, cur->n, cur->type); } _CalcCat(tbuf, &mbuf, &mlen); if( cur->exists ) _CalcCat("\"rw\", ", &mbuf, &mlen); else _CalcCat("\"w\", ", &mbuf, &mlen); snprintf(tbuf, SZ_LINE, "FUN_OFFSET(Row, %s),", cur->cname); _CalcCat(tbuf, &mbuf, &mlen); if( cur->next ) _CalcCat("\n", &mbuf, &mlen); } return mbuf; } else if( !strcmp(name, "RECTYPE") ){ snprintf(tbuf, SZ_LINE, "%d", rectype); _CalcCat(tbuf, &mbuf, &mlen); return mbuf; } else if( !strcmp(name, "EXPR") ){ if( expr && *expr ) return(expr); else return ""; } else if( !strcmp(name, "COMMAND") ){ if( command && *command ) return(command); else return ""; } else if( !strcmp(name, "ARGS") ){ if( args == 1 ) return "1"; else return "2"; } else if( !strcmp(name, "AUTO") ){ if( autodeclare && *autodeclare ) return autodeclare; else return ""; } else if( !strcmp(name, "GLOBAL") ){ if( code[0] && *code[0] ) return(code[0]); else return ""; } else if( !strcmp(name, "LOCAL") ){ if( code[1] && *code[1] ) return(code[1]); else return ""; } else if( !strcmp(name, "BEFORE") ){ if( code[2] && *code[2] ) return(code[2]); else return ""; } else if( !strcmp(name, "AFTER") ){ if( code[3] && *code[3] ) return(code[3]); else return ""; } else if( !strcmp(name, "MERGE") ){ if( doreplace ) strncpy(tbuf, "replace", SZ_LINE); else strncpy(tbuf, "update", SZ_LINE); _CalcCat(tbuf, &mbuf, &mlen); return mbuf; } else{ _CalcCat("$", &mbuf, &mlen); _CalcCat(name, &mbuf, &mlen); return mbuf; } } /* * * _CalcMake -- create the string containing the program by macro expansion * */ #ifdef YY_USE_PROTOS static char * _CalcMake(void) #else static char *_CalcMake() #endif { char *s; /* make sure we have something */ if( !expr || !*expr ) expr = xstrdup(";"); s = xstrdup(expr); nowhite(s, expr); if( s ) xfree(s); /* add final ';' is necessary (but not if there is any compund statement) */ if( !strchr(expr,';') && !strchr(expr,'{') ) _CalcCat(";", &expr, &nexpr); /* expand program body to add specifics of the expression */ s = ExpandMacro(TABCALC_C, NULL, NULL, 0, _CalcCB, NULL); return s; } /* look up a column entry, add if not present */ #ifdef YY_USE_PROTOS CalcCols _CalcColLookup(char *cname) #else CalcCols _CalcColLookup(cname) char *cname; #endif { CalcCols cur; for(cur=columns; cur!=NULL; cur=cur->next){ if( !strcasecmp(cname, cur->cname) ) return cur; } return NULL; } /* look up a symbol table entry, add if not present */ #ifdef YY_USE_PROTOS CalcCols _CalcColNew(Fun fun, char *name, char *sname, char *cname, int type, int n, double tlmin, double tlmax, double binsiz, double tscale, double tzero, int scaled, int exists, int settype) #else CalcCols _CalcColNew(fun, name, sname, cname, type, n, tlmin, tlmax, binsiz, tscale, tzero, scaled, exists, settype) Fun fun; char *name, *sname, *cname; int type, n; double tlmin, tlmax, binsiz; double tscale, tzero; int scaled, exists, settype; #endif { CalcCols sym, cur; int got; int enter=1; if( (sym=_CalcColLookup(cname)) ){ if( !settype ) return sym; enter=0; } else{ /* allocate a new symbol record */ if( !(sym = (CalcCols)xcalloc(1, sizeof(CalcColRec))) ) return NULL; } /* fill in the blanks */ if( sym->name ) xfree(sym->name); sym->name = xstrdup(name); if( sym->sname ) xfree(sym->sname); sym->sname = xstrdup(sname); if( sym->cname ) xfree(sym->cname); sym->cname = xstrdup(cname); sym->type = type; sym->n = n; sym->tlmin = tlmin; sym->tlmax = tlmax; sym->binsiz = binsiz; sym->tscale = tscale; sym->tzero = tzero; sym->scaled = scaled; sym->exists = exists; sym->settype = settype; /* get tdim value, if there is one */ if( sym->exists && (sym->n>1) ) sym->tdim = FunParamGets(fun, "TDIM", exists, NULL, &got); /* add to list, maintaining order */ if( enter ){ if( !columns ){ columns = sym; } else{ for(cur=columns; cur->next!=NULL; cur=cur->next) ; cur->next = sym; } } return sym; } /* process a column */ #ifdef YY_USE_PROTOS static int _CalcColProc(char *s, int expl) #else static int _CalcColProc(s, expl) char *s; int expl; #endif { char *e; char *t; char name[SZ_LINE]; char sname[SZ_LINE]; char cname[SZ_LINE]; char aname[SZ_LINE]; char fname[SZ_LINE]; int ptype; int poff; int exists; int dims; int settype=0; int type=0; int n=0; int scaled=0; double tlmin=0.0, tlmax=0.0, binsiz=1.0; double tscale=1.0, tzero=0.0; /* save expression */ e = s; /* gather struct name */ for(t=sname; *s && (*s != '-');) *t++ = *s++; *t = '\0'; /* skip past "->" */ if( *s && (*s == '-') ) s += 2; /* if this is not a special name, just append it and exit */ if( !_CalcColName(sname) ){ if( !expl ){ _CalcCat(e, &expr, &nexpr); return 1; } } /* gather column name */ for(t=cname; *s && (*s != '[') && (*s != ':');) *t++ = *s++; *t = '\0'; /* explicit columns don't have the prefix */ if( expl && *sname && !*cname ){ strncpy(cname, sname, SZ_LINE); strncpy(sname, "cur", SZ_LINE); } /* gather array part */ if( *s && (*s == '[') ){ for(t=aname; *s && (*s != ':');) *t++ = *s++; *t = '\0'; } else *aname = '\0'; if( *aname ) snprintf(fname, SZ_LINE, "%s->%s%s", sname, cname, aname); else snprintf(fname, SZ_LINE, "%s->%s", sname, cname); /* the expression name is the combination of sname (which we will set to a struct we know about) and cname (which is a struct member name) */ snprintf(name, SZ_LINE, "%s->%s", sname, cname); /* see if this column exists or if its new */ exists = FunColumnLookup(ifun, cname, 0, NULL, &type, NULL, NULL, &n, NULL); /* gather up specifier info */ for(; *s; s++){ if( *s == ':' ){ _FunColumnType(s+1, &type, &n, &tlmin, &tlmax, &binsiz, &dims, &tscale, &tzero, &scaled, &ptype, &poff); settype = 1; break; } } if( !exists && !settype && !_CalcColLookup(cname) ) _calcerror("new column requires a type"); if( exists && settype ) doreplace=1; /* add this column to the list */ if(_CalcColNew(ifun, name, sname, cname, type, n, tlmin, tlmax, binsiz, tscale, tzero, scaled, exists, settype)){ if( !expl ) _CalcCat(fname, &expr, &nexpr); return 1; } else{ return _calcerror("could not enter new funcalc column"); } } /* * * Semi-public Routines * * */ /* * * _CalcCat -- add a string to the filter string buffer * */ #ifdef YY_USE_PROTOS void _CalcCat(char *str, char **ostr, int *olen) #else void _CalcCat(str, ostr, olen) char *str; char **ostr; int *olen; #endif { int blen; int slen; if( (str == NULL) || (*str == '\0') ) return; else slen = strlen(str) + 1; if( (*ostr == NULL) || (**ostr == '\0') ) blen = 0; else blen = strlen(*ostr); while( (blen + slen) >= *olen ){ *olen += SEGINC; } if( blen == 0 ) *ostr = (char *)xcalloc(*olen, sizeof(char)); else *ostr = (char *)xrealloc(*ostr, *olen); strcat(*ostr, str); } #ifdef YY_USE_PROTOS char * FunCalcParse(char *iname, char *oname, char *cmd, char *ex, char *autod, int narg) #else char *FunCalcParse(iname, oname, cmd, ex, autod, narg) char *iname; char *oname; char *cmd; char *ex; char *autod; int narg; #endif { int i; /* avoid -W unused parameter warning */ if( 0 ) oname = oname; /* initialize global variables */ n = 0; rectype = REC_CUR; var = 1; args = narg; /* save command */ if( command ) xfree(command); command = xstrdup(cmd); /* save autodeclare */ if( autodeclare ) xfree(autodeclare); autodeclare = xstrdup(autod); /* open the input FITS file */ if( !(ifun = FunOpen(iname, "rc", NULL)) ) gerror(stderr, "can't FunOpen input file (or find extension): %s\n", iname); /* parse expression */ yy_scan_string(ex); yylex(); /* done with input FITS file */ FunClose(ifun); /* free up space */ if( expr ){ xfree(expr); expr = NULL; } nexpr = 0; for(i=0; i. # # 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. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # # Originally written by Per Bothner; maintained since 2000 by Ben Elliston. # # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD # # Please send patches to . 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 1992-2015 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 ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # 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 "$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 ; set_cc_for_build= ;' # 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 case "${UNAME_SYSTEM}" in Linux|GNU|GNU/*) # If the system lacks a compiler, then just pick glibc. # We could probably try harder. LIBC=gnu eval $set_cc_for_build cat <<-EOF > $dummy.c #include #if defined(__UCLIBC__) LIBC=uclibc #elif defined(__dietlibc__) LIBC=dietlibc #else LIBC=gnu #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC' | sed 's, ,,g'` ;; esac # 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 tuples: *-*-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=`(uname -p 2>/dev/null || \ /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 ;; sh5el) machine=sh5le-unknown ;; earmv*) arch=`echo ${UNAME_MACHINE_ARCH} | sed -e 's,^e\(armv[0-9]\).*$,\1,'` endian=`echo ${UNAME_MACHINE_ARCH} | sed -ne 's,^.*\(eb\)$,\1,p'` machine=${arch}${endian}-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*|earm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ 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 # Determine ABI tags. case "${UNAME_MACHINE_ARCH}" in earm*) expr='s/^earmv[0-9]/-eabi/;s/eb$//' abi=`echo ${UNAME_MACHINE_ARCH} | sed -e "$expr"` ;; 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}${abi}" exit ;; *:Bitrig:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE} exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; *:SolidBSD:*:*) echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; 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'` # Reset EXIT trap before exiting to avoid spurious non-zero exit code. exitcode=$? trap '' 0 exit $exitcode ;; 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 ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm*:riscos:*:*|arm*:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; 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 ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; s390x:SunOS:*:*) echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) echo i386-pc-auroraux${UNAME_RELEASE} exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) eval $set_cc_for_build SUN_ARCH="i386" # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH="x86_64" fi fi echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; 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 ;; 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 ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; 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 ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # 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 ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; 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 && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; 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 ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????: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 ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; 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 ;; *: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 if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi 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 ;; *:AIX:*:[4567]) 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/lslpp ] ; then IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 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 eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit ;; 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 && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; 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 ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; 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 ;; 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 ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) UNAME_PROCESSOR=`/usr/bin/uname -p` case ${UNAME_PROCESSOR} in amd64) echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; *:MINGW64*:*) echo ${UNAME_MACHINE}-pc-mingw64 exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; *:MSYS*:*) echo ${UNAME_MACHINE}-pc-msys exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; *:Interix*:*) case ${UNAME_MACHINE} in x86) echo i586-pc-interix${UNAME_RELEASE} exit ;; authenticamd | genuineintel | EM64T) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; IA64) echo ia64-unknown-interix${UNAME_RELEASE} exit ;; esac ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; 8664:Windows_NT:*) echo x86_64-pc-mks exit ;; 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 ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *: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/[-(].*//'`-${LIBC} exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; aarch64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; 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 -q ld.so.1 if test "$?" = 0 ; then LIBC="gnulibc1" ; fi echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arc:Linux:*:* | arceb:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arm*:Linux:*:*) eval $set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then echo ${UNAME_MACHINE}-unknown-linux-${LIBC} else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi else echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf fi fi exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; cris:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; crisv32:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; frv:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; hexagon:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; i*86:Linux:*:*) echo ${UNAME_MACHINE}-pc-linux-${LIBC} exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; mips:Linux:*:* | mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef ${UNAME_MACHINE} #undef ${UNAME_MACHINE}el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=${UNAME_MACHINE}el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=${UNAME_MACHINE} #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-${LIBC}"; exit; } ;; openrisc*:Linux:*:*) echo or1k-unknown-linux-${LIBC} exit ;; or32:Linux:*:* | or1k*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; padre:Linux:*:*) echo sparc-unknown-linux-${LIBC} exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-${LIBC} exit ;; 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-${LIBC} ;; PA8*) echo hppa2.0-unknown-linux-${LIBC} ;; *) echo hppa-unknown-linux-${LIBC} ;; esac exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-${LIBC} exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-${LIBC} exit ;; ppc64le:Linux:*:*) echo powerpc64le-unknown-linux-${LIBC} exit ;; ppcle:Linux:*:*) echo powerpcle-unknown-linux-${LIBC} exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux-${LIBC} exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; tile*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-${LIBC} exit ;; x86_64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; xtensa*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; 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 ;; 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 ;; 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 ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; 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 ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. 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 ;; 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 ;; 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 i586. # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configury will decide that # this is a cross-build. echo i586-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; 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 ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) 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; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' 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; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *: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 ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; 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 ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku exit ;; x86_64:Haiku:*:*) echo x86_64-unknown-haiku exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux${UNAME_RELEASE} exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux${UNAME_RELEASE} exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown eval $set_cc_for_build if test "$UNAME_PROCESSOR" = unknown ; then UNAME_PROCESSOR=powerpc fi if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then case $UNAME_PROCESSOR in i386) UNAME_PROCESSOR=x86_64 ;; powerpc) UNAME_PROCESSOR=powerpc64 ;; esac fi fi elif test "$UNAME_PROCESSOR" = i386 ; then # Avoid executing cc on OS X 10.9, as it ships with a stub # that puts up a graphical alert prompting to install # developer tools. Any system running Mac OS X 10.7 or # later (Darwin 11 and later) is required to have a 64-bit # processor. This is not true of the ARM version of Darwin # that Apple uses in portable devices. UNAME_PROCESSOR=x86_64 fi echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *: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 ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NEO-?:NONSTOP_KERNEL:*:*) echo neo-tandem-nsk${UNAME_RELEASE} exit ;; NSE-*:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *: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 ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos exit ;; i*86:AROS:*:*) echo ${UNAME_MACHINE}-pc-aros exit ;; x86_64:VMkernel:*:*) echo ${UNAME_MACHINE}-unknown-esx exit ;; esac 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: funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/config.sub000066400000000000000000001062521256243640000224640ustar00rootroot00000000000000#! /bin/sh # Configuration validation subroutine script. # Copyright 1992-2015 Free Software Foundation, Inc. timestamp='2015-02-22' # 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 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # 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. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # Please send patches to . # # 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. # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD # 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 1992-2015 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 ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # 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 ;; * ) 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-android* | linux-dietlibc | linux-newlib* | \ linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ knetbsd*-gnu* | netbsd*-gnu* | netbsd*-eabi* | \ kopensolaris*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; android-linux) os=-linux-android basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown ;; *) 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 | -microblaze*) os= basic_machine=$1 ;; -bluegene*) os=-cnk ;; -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 ;; -sco6) os=-sco5v6 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -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/'` ;; -sco5v6*) # 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*178) os=-lynxos178 ;; -lynx*5) os=-lynxos5 ;; -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 \ | aarch64 | aarch64_be \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arceb \ | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ | avr | avr32 \ | be32 | be64 \ | bfin \ | c4x | c8051 | clipper \ | d10v | d30v | dlx | dsp16xx \ | epiphany \ | fido | fr30 | frv | ft32 \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | hexagon \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | k1om \ | le32 | le64 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64octeon | mips64octeonel \ | mips64orion | mips64orionel \ | mips64r5900 | mips64r5900el \ | mips64vr | mips64vrel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa32r6 | mipsisa32r6el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64r6 | mipsisa64r6el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipsr5900 | mipsr5900el \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nds32 | nds32le | nds32be \ | nios | nios2 | nios2eb | nios2el \ | ns16k | ns32k \ | open8 | or1k | or1knd | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle \ | pyramid \ | riscv32 | riscv64 \ | rl78 | rx \ | score \ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu \ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ | ubicom32 \ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ | visium \ | we32k \ | x86 | xc16x | xstormy16 | xtensa \ | z8k | z80) basic_machine=$basic_machine-unknown ;; c54x) basic_machine=tic54x-unknown ;; c55x) basic_machine=tic55x-unknown ;; c6x) basic_machine=tic6x-unknown ;; leon|leon[3-9]) basic_machine=sparc-$basic_machine ;; m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip) basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-unknown ;; strongarm | thumb | xscale) basic_machine=arm-unknown ;; xgate) basic_machine=$basic_machine-unknown os=-none ;; xscaleeb) basic_machine=armeb-unknown ;; xscaleel) basic_machine=armel-unknown ;; # 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-* \ | aarch64-* | aarch64_be-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | be32-* | be64-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* \ | c8051-* | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | hexagon-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | k1om-* \ | le32-* | le64-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ | microblaze-* | microblazeel-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64octeon-* | mips64octeonel-* \ | mips64orion-* | mips64orionel-* \ | mips64r5900-* | mips64r5900el-* \ | mips64vr-* | mips64vrel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa32r6-* | mipsisa32r6el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64r6-* | mipsisa64r6el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipsr5900-* | mipsr5900el-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nds32-* | nds32le-* | nds32be-* \ | nios-* | nios2-* | nios2eb-* | nios2el-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | open8-* \ | or1k*-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ | pyramid-* \ | rl78-* | romp-* | rs6000-* | rx-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ | tahoe-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tile*-* \ | tron-* \ | ubicom32-* \ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ | vax-* \ | visium-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* \ | xstormy16-* | xtensa*-* \ | ymp-* \ | z8k-* | z80-*) ;; # Recognize the basic CPU types without company name, with glob match. xtensa*) basic_machine=$basic_machine-unknown ;; # 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 ;; aros) basic_machine=i386-pc os=-aros ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; blackfin) basic_machine=bfin-unknown os=-linux ;; blackfin-*) basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; bluegene*) basic_machine=powerpc-ibm os=-cnk ;; c54x-*) basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c55x-*) basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c6x-*) basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c90) basic_machine=c90-cray os=-unicos ;; cegcc) basic_machine=arm-unknown os=-cegcc ;; 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 ;; cr16 | cr16-*) basic_machine=cr16-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; 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 ;; dicos) basic_machine=i686-pc os=-dicos ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; 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*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 ;; leon-*|leon[3-9]-*) basic_machine=sparc-`echo $basic_machine | sed 's/-.*//'` ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; microblaze*) basic_machine=microblaze-xilinx ;; mingw64) basic_machine=x86_64-pc os=-mingw64 ;; mingw32) basic_machine=i686-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; 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 ;; moxiebox) basic_machine=moxie-unknown os=-moxiebox ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; msys) basic_machine=i686-pc os=-msys ;; mvs) basic_machine=i370-ibm os=-mvs ;; nacl) basic_machine=le32-unknown os=-nacl ;; 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 ;; neo-tandem) basic_machine=neo-tandem ;; nse-tandem) basic_machine=nse-tandem ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; 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 ;; parisc) basic_machine=hppa-unknown os=-linux ;; parisc-*) basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ;; 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 | ppcbe) basic_machine=powerpc-unknown ;; ppc-* | ppcbe-*) 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 ;; rdos | rdos64) basic_machine=x86_64-pc os=-rdos ;; rdos32) basic_machine=i386-pc os=-rdos ;; 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 ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh5el) basic_machine=sh5le-unknown ;; 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 ;; strongarm-* | thumb-*) basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` ;; 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 ;; tile*) basic_machine=$basic_machine-unknown os=-linux-gnu ;; 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 ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; xscale-* | xscalee[bl]-*) basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; z80-*-coff) basic_machine=z80-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 ;; sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) 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. -auroraux) os=-auroraux ;; -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* | -cnk* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ | -sym* | -kopensolaris* | -plan9* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* | -aros* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | -bitrig* | -openbsd* | -solidbsd* \ | -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* | -cegcc* \ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ | -linux-newlib* | -linux-musl* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \ | -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* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* | -tirtos*) # 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* | -haiku* \ | -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 ;; -zvmoe) os=-zvmoe ;; -dicos*) os=-dicos ;; -nacl*) ;; -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 score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; c8051-*) os=-elf ;; hexagon-*) os=-elf ;; tic54x-*) os=-coff ;; tic55x-*) os=-coff ;; tic6x-*) 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 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; 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 ;; *-haiku) os=-haiku ;; *-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 ;; -cnk*|-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 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/configure.ac000066400000000000000000000170451256243640000227730ustar00rootroot00000000000000# This file is an input file used by the GNU "autoconf" program to # generate the file "configure", which is run during XPA installation # to configure the system for the local environment. AC_INIT(funtools, 1.4.6, saord@cfa.harvard.edu, funtools) AC_CONFIG_HEADERS([conf.h ./gnu/conf.h ./funtest/conf.h]) AC_CONFIG_SRCDIR([./funtools.h]) AC_CANONICAL_HOST # # checks that we use in most projects # AC_PROG_CC AC_EXEEXT if test x"${EXEEXT}" = "xno"; then EXEEXT="" fi AC_C_LONG_LONG AC_PROG_RANLIB AC_HEADER_STDC AC_CHECK_HEADERS(malloc.h) AC_CHECK_HEADERS(getopt.h) AC_CHECK_HEADERS(values.h) AC_CHECK_HEADERS(dlfcn.h) AC_CHECK_HEADERS(sys/un.h) AC_CHECK_HEADERS(sys/ipc.h) AC_CHECK_HEADERS(sys/mman.h) case $host_os in *cygwin*|*Cygwin* ) ;; * ) AC_CHECK_HEADERS(sys/shm.h) ;; esac AC_CHECK_TYPES([socklen_t], [], [], [#include ]) AC_C_CONST AC_CHECK_FUNCS(strchr memcpy snprintf) AC_CHECK_FUNC(connect) if test $ac_cv_func_connect = no; then AC_CHECK_LIB(socket, connect, EXTRA_LIBS="$EXTRA_LIBS -lsocket") fi AC_CHECK_FUNC(gethostbyname) if test $ac_cv_func_gethostbyname = no; then AC_CHECK_LIB(nsl, gethostbyname, EXTRA_LIBS="$EXTRA_LIBS -lnsl") fi # AC_CHECK_LIB(db, snprintf, EXTRA_LIBS="$EXTRA_LIBS -ldb") # # checks specific to this project # AC_MSG_CHECKING(for filter cc) AC_ARG_WITH(filter-cc, [ --with-filter-cc=CC compiler], FILTER_CC=\\\"$withval\\\", FILTER_CC=NULL) AC_MSG_RESULT($FILTER_CC) AC_SUBST(FILTER_CC) AC_MSG_CHECKING(for filter cflags) AC_ARG_WITH(filter-cflags, [ --with-filter-cflags=CFLAGS compiler flags], FILTER_CFLAGS=\\\"$withval\\\", FILTER_CFLAGS=NULL) AC_MSG_RESULT($FILTER_CFLAGS) AC_SUBST(FILTER_CFLAGS) DEFLIB="libfuntools.a" AC_MSG_CHECKING(for alternate target library) AC_ARG_WITH(altlib, [ --with-altlib=LIB library name], alt_lib=yes LIB=$withval, alt_lib=no LIB=$DEFLIB) AC_MSG_RESULT($alt_lib ($LIB)) AC_SUBST(LIB) AC_SUBST(DEFLIB) AC_MSG_CHECKING(for external zlib) AC_ARG_WITH(zlib, [ --with-zlib=LIB library name], zlib=yes EXTRA_LIBS="$EXTRA_LIBS $withval", zlib=no) AC_MSG_RESULT($zlib) AC_MSG_CHECKING(for external wcslib) AC_ARG_WITH(wcslib, [ --with-wcslib=LIB library name], wcslib=yes EXTRA_LIBS="$EXTRA_LIBS $withval", wcslib=no) AC_MSG_RESULT($wcslib) AC_MSG_CHECKING(for shared library build) AC_ARG_ENABLE(shared, [ --enable-shared build shared libraries], [fun_ok=$enableval], [fun_ok=no]) if test "$fun_ok" != "no"; then fpic="yes" DOSHARED=shlib AC_SUBST(DOSHARED) if test "$fun_ok" = "link"; then AC_CHECK_LIB(dl, dlopen, have_dl=yes, have_dl=no) if test "$have_dl" = yes; then using_shlib="yes" fpic="yes" EXTRA_LIBS="$EXTRA_LIBS -ldl" if test `$CC -v -rdynamic 2>&1 | grep -c unrecognized` = "0" ; then LDFLAGS="$LDFLAGS -rdynamic" fi else AC_CHECK_LIB(c, dlopen, have_dl=yes, have_dl=no) if test "$have_dl" = yes; then using_shlib="yes" fpic="yes" if test `$CC -v -rdynamic 2>&1 | grep -c unrecognized` = "0" ; then LDFLAGS="$LDFLAGS -rdynamic" fi else using_shlib="no" fi fi LLIB="-L. -l$PACKAGE_NAME" else LLIB='$(LIB)' fi else LLIB='$(LIB)' fi AC_SUBST(LLIB) AC_MSG_RESULT($fun_ok) AC_MSG_CHECKING([for dynamic loading of filters ]) AC_ARG_ENABLE(dl, [ --enable-dl allow use of dynamic loading if available], [fun_ok=$enableval], [fun_ok=no]) if test "$fun_ok" = "yes"; then if test "$CC" = "gcc" -o `$CC -v 2>&1 | grep -c gcc` != "0" ; then using_dl="yes" if test x"$using_shlib" != xyes; then AC_CHECK_LIB(dl, dlopen, have_dl=yes, have_dl=no) if test "$have_dl" = yes; then USE_DL="-DUSE_DL=1" fpic="yes" EXTRA_LIBS="$EXTRA_LIBS -ldl" if test `$CC -v -rdynamic 2>&1 | grep -c unrecognized` = "0" ; then LDFLAGS="$LDFLAGS -rdynamic" fi else AC_CHECK_LIB(c, dlopen, have_dl=yes, have_dl=no) if test "$have_dl" = yes; then USE_DL="-DUSE_DL=1" fpic="yes" if test `$CC -v -rdynamic 2>&1 | grep -c unrecognized` = "0" ; then LDFLAGS="$LDFLAGS -rdynamic" fi else using_dl="no" fi fi fi else using_dl="no" fi else using_dl="no" fi AC_MSG_RESULT([$using_dl ($CC)]) AC_SUBST(USE_DL) AC_ARG_ENABLE(fpu_double, [ --enable-fpu_double set FPU in double round mode], [fun_ok=$enableval], [fun_ok=no]) if test "$fun_ok" = "yes"; then AC_MSG_CHECKING([for setting fpu in double rounding mode (with gcc) ]) if test "$CC" = "gcc" -o `$CC -v 2>&1 | grep -c gcc` != "0" ; then using_fpu_double="yes" USE_FPU_DOUBLE="1" else using_fpu_double="no" USE_FPU_DOUBLE="0" fi AC_MSG_RESULT([$using_fpu_double]) else USE_FPU_DOUBLE="0" fi AC_SUBST(USE_FPU_DOUBLE) AC_MSG_CHECKING(for mainlib build) DOMAINLIB="" AC_ARG_ENABLE(mainlib, [ --enable-mainlib build funtools mainlib support], [fun_ok=$enableval], [fun_ok=no]) if test "$fun_ok" = "yes"; then DOMAINLIB=mainlib elif test "$fun_ok" = "shared"; then DOMAINLIB=shmainlib fi AC_SUBST(DOMAINLIB) AC_MSG_RESULT($fun_ok) SC_PATH_TCLCONFIG if test x"${no_tcl}" = x ; then AC_DEFINE([HAVE_TCL], [1], [Define if tcl is used.]) fi AC_PROG_AWK AC_CHECK_PROG(gzip, gzip, gzip, none) if test "$gzip" = "none"; then GUNZIP="cat" else GUNZIP="$gzip -dcf" fi AC_CHECK_PROG(gnuplot, gnuplot, gnuplot, none) if test "$gnuplot" = "none"; then GNUPLOT="NONE" else GNUPLOT="$gnuplot" fi AC_MSG_CHECKING([$host_os configuration]) PRE="" POST="|\& cat" case $host_os in *cygwin*|*Cygwin* ) CFLAGS="$CFLAGS -enable-auto-import" AC_DEFINE([HAVE_CYGWIN], [], [Define if the cygwin compiler is used.]) AC_MSG_RESULT(flagging Cygwin) PRE="sh -c {" POST="}" ;; *mingw32*|*Mingw32*) CFLAGS="$CFLAGS -mconsole -D_WSTRING_DEFINED=1" EXTRA_LIBS="$EXTRA_LIBS -lwsock32" AC_DEFINE([HAVE_MINGW32], [], [Define if the mingw32 compiler is used.]) AC_MSG_RESULT(flagging MinGW) ;; *osf*|*Osf*) AC_CHECK_LIB(db, snprintf, EXTRA_LIBS="$EXTRA_LIBS -ldb") ;; *darwin*|*Darwin*) LDFLAGS="$LDFLAGS $CFLAGS" G=`$CC -v 2>&1 | grep version | awk '{print $3}' | awk -F. '{print $1$2}'` if test x"$G" != x -a "$G" -lt 42; then CFLAGS="$CFLAGS -no-cpp-precomp" fi if test x"$fpic" = x"yes" ; then CFLAGS="$CFLAGS -fPIC" AC_MSG_RESULT([adding -fno-common, -fPIC to CFLAGS]) else AC_MSG_RESULT([adding -fno-common to CFLAGS]) fi ;; * ) if test x"$fpic" = x"yes" ; then if test "$CC" = "gcc" -o `$CC -v 2>&1 | grep -c gcc` != "0" ; then CFLAGS="$CFLAGS -fPIC" AC_MSG_RESULT(adding -fPIC to gcc) else AC_MSG_RESULT(none) fi else AC_MSG_RESULT(none) fi ;; esac AC_SUBST(EXTRA_LIBS) AC_SUBST(EXTRA_OBJS) AC_SUBST(PRE) AC_SUBST(POST) AC_SUBST(AWK) AC_SUBST(GUNZIP) AC_SUBST(GNUPLOT) AC_SUBST(PIPEGLUE) AC_CONFIG_FILES(Makefile ./gnu/Makefile ./funtest/Makefile ./faq/Makefile) # generate pkg-config meta-data file AC_CONFIG_FILES(funtools.pc) # for individual package that create libraries, we must run configure again, # faking the subdirs into using the funtools library as their library # this will run faster with --config-cache ac_configure_args="--with-altlib=`pwd`/$LIB $ac_configure_args" # AC_CONFIG_SUBDIRS(util fitsy filter wcs) AC_CONFIG_SUBDIRS(util) AC_CONFIG_SUBDIRS(fitsy) AC_CONFIG_SUBDIRS(filter) AC_CONFIG_SUBDIRS(wcs) AC_OUTPUT funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/copyright000066400000000000000000000020031256243640000224240ustar00rootroot00000000000000Unless otherwise indicated, all source is: Copyright (C) 1999-2007 Smithsonian Astrophysical Observatory, Cambridge, MA, USA Funtools is free software; you can 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 Correspondence concerning Funtools should be addressed as follows: Eric Mandel Smithsonian Astrophysical Observatory MS 3 60 Garden St. Cambridge, MA 02138 USA eric@cfa.harvard.edu http://hea-www.harvard.edu/saord/funtools/ funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/000077500000000000000000000000001256243640000212435ustar00rootroot00000000000000funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/asc2fits.c000066400000000000000000000040061256243640000231250ustar00rootroot00000000000000/* * * asc2fits foo.fits < foo.ascii * * This is an example of generating a binary table from specific ASCII input. * The more general case is much harder. * */ #include #include #include #include #define SZ_LINE 1024 #define MAXREC 30 typedef struct EvStruct{ int x, y, pha; double time; } *Event, EventRec; int main(int argc, char **argv) { int got, put; char tbuf[SZ_LINE]; Fun fun; EventRec events[MAXREC]; Event ev; /* exit on gio errors */ setgerror(2); if( argc < 2 ){ fprintf( stderr, "usage: %s oname\n", argv[0]); exit(1); } /* open output file */ if( !(fun = FunOpen(argv[1],"w", NULL)) ) gerror(stderr, "Could not open the output file: %s\n", argv[1]); /* set up the (hardwired) columns */ FunColumnSelect( fun, sizeof(EventRec), NULL, "x", "J", "w", FUN_OFFSET(Event, x), "y", "J", "w", FUN_OFFSET(Event, y), "pha", "J", "w", FUN_OFFSET(Event, pha), "time", "D", "w", FUN_OFFSET(Event, time), NULL); /* ignore first line, which is the header */ fgets(tbuf, SZ_LINE, stdin); /* process data lines */ got = 0; /* get next line */ while( fgets(tbuf, SZ_LINE, stdin) ){ /* ignore comments */ if( (*tbuf == '\n') || (*tbuf == '#') ) continue; /* point to next buffer to fill */ ev = &events[got]; /* parse data record */ if(sscanf(tbuf, "%d %d %d %lf", &ev->x, &ev->y, &ev->pha, &ev->time) != 4) break; /* got another record */ got++; /* flush this batch of records if necessary */ if( got == MAXREC ){ if( (put=FunTableRowPut(fun, events, got, 0, NULL)) != got ){ gerror(stderr, "expected to write %d rows; only wrote %d\n", got, put); } /* reset record counter */ got = 0; } } /* final flush */ if( got ){ if( (put=FunTableRowPut(fun, events, got, 0, NULL)) != got ){ gerror(stderr, "expected to write %d rows; only wrote %d\n", got, put); } } FunClose(fun); return(0); } funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/changelog.html000066400000000000000000001043311256243640000240620ustar00rootroot00000000000000 Funtools ChangeLog

Funtools ChangeLog

This ChangeLog covers both the Funtools library and the suite of applications. It will be updated as we continue to develop and improve Funtools. The up-to-date version can be found here. [The changelog for the initial development of Funtools, covering the beta releases, can be found here.]

Patch Release 1.4.6 (internal ds9 release)

  • Upgrade wcssubs to version 3.8.7

  • Port to mingw (Windows)

Patch Release 1.4.5 (internal ds9 release)

  • Fixed bug in funim.c which broke vcol functionality.

  • Removed permission checking from Find() on cygwin systems. This was broken by Windows 7.

  • Removed addition of -no-cpp-precomp flag from gcc 4.2 and beyond.

Patch Release 1.4.4 (internal ds9 release)

  • Fixed -J funcone, which was not properly outputting all rows.

  • Filter: when an image is flipped, the rotation angle must be reversed.

  • Filter: add support for windows-based ipc communication when using tcc compiler.

Patch Release 1.4.3 (internal ds9 release)

  • Filter: improve checks for existence of compiler, even if CC is set.

  • Change launch.h to xlaunch.h to avoid conflict with OS X.

  • handle flipped images in filtering

Patch Release 1.4.2 (internal ds9 release)

  • Port to gcc 4.2.

  • Fix 1-byte filters on intel machines (missing SW1 no-op).

  • Remove ambiguity from filt.l (and calc.l) using [A-z] in a case-insensitive lexer.

  • In funsky, the default unit for RA was changed from hours to degrees.

  • Fixed bug in funtable in which TCRVL header values were output as strings.

  • Added support for running funtools filters in Rosetta (i.e. running PPC executables on an Intel Mac) by sensing and handling data swap requirements. Only works with FILTER_PTYPE set to 'c' (can't link against wrong architecture libraries).

  • Fixed bug in FITS library to allow "-" in extension names.

  • Code and documentation now agree that the copy extension specifier ('+') comes after the extension name.

Patch Release 1.4.1 (internal ds9 release)

  • Modified internal Launch() routine to use posix_spawn(), if necessary. This is required for OS X 10.5 (leopard), which frowns upon use of fork() and exec(). Also modified zprocess routines to use Launch().

Public Release 1.4.0 (15 August 2007)

  • Public release of production-quality code, incorporating changes and improvements from previous beta releases, including:
    • Support for access to ASCII text column files.
    • Support for fast indexed access of binary tables.
    • Support for database views of tables, i.e. pre-set values for the filter specification, the columns to activate, and display format.
    • New programs include funcone (cone search), funindex (create index files), and funcen (calculate centroids within regions).

Release 1.3.0b[n] (mainly internal SAO beta releases)

  • Added -F[c] switch to change the column delimiter to the specified character.

  • Extended fundisp's format switch (-f) so that it can now handle complex formats such as 'x=sometext%3d- y=othertest%3d.ext'.

  • Added support for creating and processing 1D FITS images.

  • Added vcol=colname and vcol=/colname to filter specifications to support use of a third value column when binning 2D images.

  • Added switches to funcone to write out data rows are not within any cone (-J, -X) and centers which have no close data rows (-L).

  • In funjoin, added ability to specify a numeric tolerance for when joining two files.

  • shared memory support in gio now can create a shared segment if w+ is specified as the open mode.

  • Changed reggeometry man page so that examples correctly show angles going counter-clockwise from the x-axis instead of from the y-axis.

  • Added checks to funmerge to ensure that all files have the same columns.

  • Fixed bug in text support that prevented header-less files from being processed properly.

  • Added support for 64-bit images (bitpix=64) and table columns (TFORM=K).

  • Filter code was not applying bscale/bzero to columns.

  • Fixed funimage bug that caused a .5/block error in WCS CRPIX values generated from binary tables.

  • Added feq(a,b) and div(a,b) macros to funcalc.

  • Added support for single-line #define to funcalc.

  • Updated wcs library to 3.6.6

  • Fix bug in funcen in which ra,dec was not being calculated correctly if physical and image coords did not match up.

  • The filter syntax "col1 = col2" now explicitly generates an error (you really want to do "col1 == col2").

  • Added -o switch to include offset from the nominal target position.

  • Fundisp now displays multi-dimensional vector columns properly.

  • Documented support for lists of files processed as a single file using "list: file1 ... filen" syntax.

  • Fixed bugs in support for pipe file type (i.e. ability to pass commands as a filename using "pipe: cmd arg1 ... argn" syntax).

  • Fixed bug in funhist processing of image-based pixel histograms (i.e using "xy" for columns) where a region was specified. All pixels outside the region were erroneously being added to the bin containing the 0 value.

  • Disabled multi-file processing in funds9, which was breaking support for pathnames containing spaces and is not used by ds9 anyway.

  • Added support for Views of tables, i.e. pre-set values for the filter specification, the columns to activate, and display format (though the latter is for fundisp only).

  • Added -l switch to funimage to read x, y, val columns from a list.

  • Removed useless and meaningless section syntax foo'[*]' because it breaks pointer de-referencing on string columns (i.e. foo'[*xxx=='a']'). Use foo'[*,*]' instead, as documented.

  • String variables were not always being terminated properly in the filter code because FITS 'A' data is not necessarily null-terminated.

  • Added funtools version number to all usage() displays.

  • Added explanation of switch arguments to many usage() displays.

  • The filter keyword row# now supports single row selection as well as range selection, i.e., "row#=100" along with previous "row#=100:200".

  • fundisp now outputs "0x" before hex values.

  • Fixed bug in filter parser which processed rangelists incorrectly if spaces were put into the rangelist (i.e. "pha= 1 : 3" instead of pha=1:3).

  • Fixed a bug in funindex which created a wrongly named index file if more than one "." was in the input file name.

  • Added support to funcone to take ra, dec, radius from a list (i.e. columns in a FITS file or a text file).

  • Fixed a bug in FunColumnActivate so that if some columns are explicitly activated while others are de-activated, only the explicitly activated columns are activated (code was activating all columns in this case).

  • Fixed a bug in funindex which prevented indexing tables containing a column named N.

  • fundisp now encloses ASCII column values in single quotes (unless -T is specified to output RDB format).

  • If a filter specification only involves indexed columns, then the compiled filter is not used.

  • Funmerge can now be given a list of files to merge using @list syntax. Also removed the restriction on how many files can be merged (was limited to the max number of open files).

  • Added ability to edit (add, delete, modify) header parameters in funhead by specifying an output file (editing acts as a filter) and an edit command file (which can be stdin).

  • Funtools now contains preliminary code to support (fast) indexed access of binary tables. See idx.html or "man funidx" for more details.

  • Funtools now contains preliminary code supporting access to ASCII column files. See text.html or "man funtext" for more details.

  • Fixed bug in funcalc in which columns used in an expression were always being replaced by new columns, with all associated parameters (e.g. WCS) were being deleted. Now this only happens if the column explicitly changes its data type.

  • Fixed bug in funcalc in which the raw data and user data became out of sync for one row after every 8192 (FUN_MAXROW) rows.

  • Fixed bug in gio in which gseek returned 0 instead of the current byte offset for disk files.

  • Added funcone program to perform cone search on RA, Dec columns in a FITS binary table.

  • Fixed bug in polygon, pie and rotated box region filtering for tables (nearby rows exactly in line between two non-vertical or non-horizontal vertices were being accepted incorrectly).

  • Fixed pie and panda regions so that the angles now start from positive x axis == 0 degrees and run counter-clockwise, as documented. They were going from positive y. NB: a similar change was made to ds9 release 4.0b3. You must be using ds9 4.0b3 or later in order to have the correct behavior when generating regions in ds9 and using them in funtools.

  • Added -p [prog] switch to funcalc to save the generated program. instead of executing (and deleting) it.

  • Upgraded zlib to 1.2.3.

Patch Release 1.2.4 (internal SAO and beta release only)

  • In funcalc, added support for user-specified arguments via the -a [argstr] switch. These arguments are accessed in the compiled program using the supplied ARGC and ARGV(n) macros.

  • Added -n (no header display) to fundisp to skip outputting header.

  • Added checks for various types of blank filters.

  • Added macros NROW (current row number) and WRITE_ROW (write current row to disk) to funcalc.

  • funcalc no longer requires that at least one data column be specified in the compiled expression.

  • Added FUN_NROWS to FunInfoGet() to return the total number of rows in an input table (i.e. value of NAXIS2).

  • The compiled funcalc program now includes stdlib.h and unistd.h.

  • The util/NaN.h header file is now modified at configure time to contain endian status for the target architecture. References to specific platforms have been removed.

  • Added -m switch to funtable to output multiple files, one for each input region (and a separate file for events that pass the filters but are not in any region).

  • Added ability to add new parameters (FunParamPutx) after writing data if space is previously reserved in the form of a blank parameter whose value is the name of the param to be updated. (Also requires the append argument of FunParamPutx be set to 2).

  • Added ability to build shared libraries. With --enable-shared=yes, shared library is built but not used. With --enable-shared=link, shared library is linked against (requires proper installation and/or use of LD_LIBRARY_PATH).

  • Added -v [column] support to funcnts so that counts in a table can be accumulated using values from a specified column (instead of the default case where an integral count is accumulated for each event in a region).

  • Added funcen program to calculate centroids within regions (binary tables only). Also added support for a funcen-based centroid tool to funtools.ds9.

  • Fixed bug which prevented successful filtering of columns containing arrays.

  • Added filter check to ensure that a column is not incorrectly used as an array.

  • Fundisp now displays column arrays indexed from 0, not 1.

  • Added -i [interval] support to funcnts so that multiple intervals can be processed in a single pass through the data. For example, specifying -i "pha=1:5;pha=6:10;pha=11:15" will generate results in each of 3 pha bands.

  • Fixed calculation of LTV quantities when binning floating point column data (value was off by 0.5).

  • Added support for 'D' in floating point header values.

  • Added -a switch to funimage and funtable to append output image or table to an existing FITS file (as an IMAGE or BINTABLE extension).

  • Added support for column scaling (TSCAL and TZERO) on input columns. Note that the default column type is changed to accommodate scaling (e.g. a column of type 'I' is changed to 'J', 'J' is changed to 'D') so that the scaled values can be handled properly by programs such as fundisp (which utilize default types).

  • Added support to FunColumnSelect() for handling structs of arrays (i.e. where returned columns are contiguous) instead of the default array of structs (returned row are contiguous). This is done by specifying "org=structofarrays" in the plist and passing a single struct containing the arrays.

  • When writing an rdb/starbase file, fundisp now outputs the full column name, regardless of the width of the column (which ordinarily is truncated to match).

  • Fixed support for large files by changing all file positions variables from "long" declarations to "off_t.

  • Fixed bug in funcalc incorrectly processed multiple array references (e.g. cur->foo[0]=cur->x;cur->foo[1]=cur->y;) within a single line of code.

  • Added FILTER_CFLAGS environment variable for all filtering. Also added --with-filter-cc and --with-filter-cflags options on configure to allow specification of a default C compiler and associated CFLAGS for filtering. All of this is necessary in order to support 64-bit libraries under Solaris.

  • Added the funtbl script to extract a table from Funtools ASCII output.

  • Added code to funimage to update IRAF DATASEC keyword.

  • Added checks to ensure that image dimensions are positive.

  • Fixed a bug in funimage where int data was being scaled using BSCALE and BZERO but these keywords also were being retained in the output image header. Now the data are not scaled unless the output data type is float (in which case the scaling parameters are removed).

  • Fixed a bug in funmerge which prevented merging of files unless one of the -f, -w, or -x switches were used.

  • Fixed a bug in funtable and fundisp which caused the special '$n' column to be output incorrectly.

  • Fixed sort option in funtable, which previously worked only if the record size was an even divisor of 8192 (and returned garbage otherwise).

  • Fixed bug in filters involving FITS data type 'X' (bitfield).

  • Fixed bug in funcnts in which the output angles and radii were being displayed incorrectly when multiple panda shapes were specified.

  • Fixed bug in pandas and pies using n= syntax when first angle specified was greater than second. The resulting mask was of the correct shape but contained only a single region.

  • Table row access routines will now decrease maxrows if memory cannot be allocated for maxrows*sizeof(row), i.e. if the size of a row is so large that space for maxrows cannot be allocated.

  • The FUN_MAXBUFSIZE environment variable was added to limit the max buffer size that will be allocated to hold table row data. The default is 5Mb.

  • Generated PostScript and PDF versions of the help pages.

  • Moved OPTIONS section before (often-lengthy) DESCRIPTION section in man pages.

  • All memory allocation now does error checking on the result (except wcs library, which is external code).

  • Removed some compiler warnings that surfaced when using gcc -O2.

  • Updated wcs library to 3.5.5.

  • Upgraded zlib to 1.2.1.

Patch Release 1.2.3 (12 January 2004)

  • Generated man pages from the html pages. These are installed automatically at build time.

  • Changed instances of sprintf() to snprintf() to protect against buffer overflow.

  • Fixed a number of compiler warnings in non-ANSI compilers.

  • Increased SZ_LINE parameter value from 1024 to 4096.

Patch Release 1.2.3b1 (19 August 2003)

  • The rule for using comma to separate a table filter expression and a region expression has been changed. The rule now states:
    • if both expressions contain a region, the operator used is or.
    • if one (or both) expression(s) does not contain a region, the operator used is and.
    This rule handles the cases of pure regions and pure column filters properly. It unambiguously assigns the boolean and to all mixed cases. Thus:
      foo.fits[circle(10,10,3),pi=1:5]
    
    and
      foo.fits[pi=1:5,circle(10,10,3)]
    
    both are equivalent to:
      foo.fits[circle(10,10,3) && pi=1:5]
    

  • When include files are used in filters, they now have implied parentheses surrounding them. Thus, if a region file foo.reg contains two regions (e.g. circle 1 2 3 and circle 4 5 6), the syntax:
        pha=4:5&&@foo.reg
    
    is equivalent to:
        pha=4:5 && (circle 1 2 3 || cir 4 5 6)
    
    instead of:
        pha=4:5 && circle 1 2 3 || cir 4 5 6
    
    and the pha filter is applied to both regions.

  • Filters and comments now can be terminated with the string literal "\n" as well as ";" and the new-line character. This means that a region can have comments embedded in it:
        funcnts foo.fits "circle 512 512 10 # color=red\n circle 512 512 20"
    

  • Added capability to update the value of an existing parameter after writing the table or image (assuming the output image is a disk file or is being redirected into a file).

  • Improved handling of parentheses in filter expressions.

  • Fixed a bug in image (not event) regions in which circles and annuli with radius of 1 pixel were not being processed. No counts and no area would be found in such regions.

  • Fixed a bug in funcnts in which the radii column values for out of sync if multiple annuli were specified (instead of a single varargs or accel annulus).

  • By default, fundisp will display integer image data as floats if the BSCALE and BZERO header parameters are present.

  • Added -L switch to funhead to output starbase list format.

  • Changed the name of the routine _FunColumnSelect to FunColumnSelectArr, in order to emphasize that it is not a private routine.

  • Funcalc now checks to ensure that a column was specified as part of the expression.

  • Funcalc local variables in the compiled program now use a "__" prefix to avoid conflicts with user-defined variables.

  • Unofficial unsigned short (bitpix=-16) image data now is scaled correctly using BSCALE and BZERO header parameters.

  • Ported to Intel icc and gcc 3.3 compilers.

  • Updated wcs library to 3.5.1.

  • Changed license from public domain to GNU GPL.

Patch Release 1.2.2 (18 May 2003)

  • Fixed funcalc so that it now actually compiles an expression and runs it, instead of getting a "filter compilation error". Oops!

  • Fixed bug in FunOpen in which the bracket specification was being removed from the filename if a disk file was opened for "w" or "a".

  • Fixed bug in FunFlush which prevented two successive calls to FunImagePut from writing the second extension header properly.

  • All filter routines now use gerror(stderr, ...) call instead of fprintf(stderr, ...) so that output to stderr can be turned off (via setgerror(level) or GERROR environment variable).

  • All standard Funtools programs check for GERROR environment variable before setting gerror flag.

  • Some error messages about invalid region arguments were not being printed.

  • FITS parameters/headers now conform more closely to FITS standard:
    • Blank keywords are treated in the same way as COMMENTS and HISTORY cards
    • XTENSION keywords are now exactly 8 characters long
    • 'E' is output instead of 'e' in floating point param values
    • PCOUNT and GCOUNT are output correctly for image extensions
    • EXTEND=T is output in primary header
    • COMMENTS and HISTORY start in column 9

Patch Release 1.2.1 (24 April 2003)

  • Varargs ellipse and box annular regions were being processed incorrectly when the following conditions all were met:
    • the region was specified in physical or wcs coordinates
    • the data file contained LTM/LTV keywords, i.e., it was blocked with respect to the original data file
    • the program being run was an image program (e.g. funcnts, funimage)
    Varargs ellipse and boxes are regions of the form:
      ellipse x y a1 b1 a2 b2 ... an bn [angle]
      box x y l1 w1 l2 w2 ... ln wn [angle]
    
    where at least 2 sets of axis (length) values were specified to form an annulus (i.e. simple ellipses and boxes worked properly). With all of the above conditions met, a region in physical coordinates saw its second length argument converted incorrectly from physical coordinates to image coordinates. In simple terms, this means that funcnts did not process elliptical or box regions in physical coords on blocked images properly. Note that blocking on the command line (e.g. foo.fits[*,*,2]) did work when no LTM/LTV keywords existed in the file.

  • The fundisp -f switch now supports specification of column-specific display formats as well as a more convenient way to specify datatype-specific display formats. Both use keyword=value specifiers. For columns, use:
        fundisp -f "colname1=format1 colname2=format2 ..." ...
    
    e.g.
        fundisp -f "time=%13.2f pha=%3d" ...
    
    You also can specify display formats for individual datatypes using the FITS binary table TFORM variables as the keywords:
        fundisp -f "D=double_format E=float_format J=int_format etc."
    
    e.g.
        fundisp -f "D=%13.2f I=%3d" ...
    
    The old position-dependent syntax is deprecated.

  • Fundisp will now print out a single 16-bit (or 32-bit) unsigned int for a column whose data format is 16X (or 32X), instead of printing 2 (or 4) unsigned chars.

  • Fixed bug in which fundisp was not able to display bitfield data for raw event lists.

  • Previously, when binning columns used implicitly in a region and explicitly in a filter could suffer from a case sensitivity problem. This has been fixed.

  • Fixed internal mask=all switch on fundisp.

  • Filter include files now simply include text without changing the state of the filter. They therefore can be used in expression. That is, if foo1 contains "pi==1" and foo2 contains "pha==2" then the following expressions are equivalent:
        "[@foo1&&@foo2]" is equivalent to "[pi==1&&pha==2]"
        "[pha==1||@foo2]"  is equivalent to "[pi==1||pha==2]"
        "[@foo1,@foo2]" is equivalent to "[pi==1,pha==2]"
    

  • Fixed bug in filter specification which caused a SEGV if a varargs-style region was enclosed in parens.

  • Updated wcs library to 3.3.2.

Public Release 1.2.0 (24 March 2003)

  • BSCALE and BZERO are now always applied to int pixel data, instead of only being applied if the desired output is floating point.

Beta Release 1.2.b3 (4 February 2003)

  • In FunColumnSelect, added the ability to specify an offset into an array in the type specification, using the extended syntax:
     [@][n]<type>[[poff]][:[tlmin[:tlmax[:binsiz]]]]
    
    The [poff] string specifies the offset. For example, a type specification such as "@I[2]" specifies the third (i.e., starting from 0) element in the array pointed to by the pointer value. A value of "@2I[4]" specifies the fifth and sixth values in the array.

  • Added a non-varargs version of FunColumnSelect called _FunColumnSelect:
    int _FunColumnSelect(Fun fun, int size, char *plist, 
                         char **names, char **types, char **modes, int *offsets,
                         int nargs);
    

  • Added support for sorting binary tables by column name using: funtable -s "col1 col2 ... coln" ...

  • Added the FUN_RAW macro which, when applied to the "name" parameter of FunParamGets(), returns the 80-character raw FITS card instead of only the value.

  • Added support for comparing column values with binary masks of the form 0b[01]+, e.g.:
      (status&0b111)==0b001
    
    Previously, such masks had to be specified in decimal, octal, or hex.

  • Completed support for type 'L' (logical) in fundisp and in filtering of binary tables.

  • Fixed bug in funhist that was improperly setting the number of bins when the data was of type float.

  • Fixed bug in filter/Makefile where the filter OBJPATH #define was being passed to the wrong module.

Beta Release 1.2.b2 (7 October 2002)

  • Updated wcs library to 3.1.3.

  • Added support for reading gzip'ed files via stdin.

Beta Release 1.2.b1 (24 September 2002)

  • Added the following accelerators to region filtering:
      shape:      arguments:
      -----       ---------
      BOX         xcenter ycenter xw1 yh1 xw2 yh2 ... xwn yhn (angle)
      BOX         xcenter ycenter xwlo yhin xwout yhhi n=[number] (angle)
      CIRCLE      xcenter ycenter r1 r2 ... rn              # same as annulus
      CIRCLE      xcenter ycenter rinner router n=[number]  # same as annulus
      ELLIPSE     xcenter ycenter xw1 yh1 xw2 yh2 ... xwn yhn (angle)
      ELLIPSE     xcenter ycenter xwlo yhin xwout yhhi n=[number] (angle)
    

  • Added the following new pandas (Pie AND Annulus) to region filtering:
      shape:    arguments:
      -----     ---------
      CPANDA    xcen ycen ang1 ang2 nang irad orad nrad  # same as panda
      BPANDA    xcen ycen ang1 ang2 nang ixlo iylo ixhi iyhi nrad (ang) # box
      EPANDA    xcen ycen ang1 ang2 nang ixlo iylo ixhi iyhi nrad (ang) # ellipse
    

  • Added support for filtering images using simple FITS image masks, i.e. 8-bit or 16-bit FITS images where the value of a pixel is the region id number for that pixel (and therefore must be greater than 0). The image section being filtered must either be the same size as the mask dimensions or else be an even multiple of the mask. This works with image-style filtering, i.e., funcnts can utilize a mask on both images and binary tables.

  • Added '$n' to fundisp column specification to allow display of ordinal value of each row passing the filter.

  • Added code to support region filtering on image sections.

  • Fixed bugs which prevented filtering more than one ASCII region file.

  • Fixed bug occasionally causing filter slave processes to become zombies.

  • Fixed bugs in event filtering: annulus with inner radius of 0 (i.e., a circle) was rejecting events with coordinates xcen, ycen. Also, pie with angles of 0 and 360 was rejecting some events. Image filtering (e.g. funcnts) did not have these problems.

  • Filters now accept global exclude regions without an include region. In such a case, the field region is implied. That is, "-circle(x,y,r)" is equivalent to "field; -circle(x,y,r)", etc.

  • Fixed panda so that it can be used as a global exclude.

  • Allow empty ds9 region file (comments and globals only) to be a valid filter. Totally ignore zero length region or include file.

  • Fixed funcnts bug that was displaying 0 value as inner radius of a circle, instead of just one radius value.

Public Release 1.1.0 (22 April 2002)

New features include:

  • Funtools programs now accept gzip'ed files as valid input.

  • Improved security via replacement of system() function.

  • fundisp, funcnts, funhist can output starbase/rdb format (tabs between columns, form-feeds between tables).

  • Improved support for Windows platform, as well as new support for Mac OSX.

Pre-Release 1.1.0e (10 April 2002)

  • Added enough support to skip over variable length arrays in BINTABLES. We will add full support if this non-standard construct becomes more widely used.

  • Fixed bug in underlying fitsy _gread() routine that was returning an arbitrary bytes-read value if the input fd was invalid.

Pre-Release 1.1.0e (19 March 2002)

  • Added additional check for Windows/PC to filter/Nan.h.

  • Upgraded zlib library to 1.1.4 (fix double free security hole).

Pre-Release 1.1.0e (27 February 2002)

  • Changed filter/process.[ch] to filter/zprocess.[ch] to avoid name collision with Cygwin include file.

  • Added -a switch to funhead to display all headers in a FITS file.

Pre-Release 1.1.0e (11 February 2002)

  • Fixed filter parser so that it ignores ds9 "ruler" and "text" markers only up to the first \n or ; (was ignoring to last \n).

  • The NBLOCK parameter in fitsy/headdata.c was too large for Mac OS X (max size of a declared char buf seems to be about .5 Mb).

Beta Release 1.0.1b5 (31 January 2002)

  • Fixed bug introduced in calculated IRAF LTM values in 1.0.1b3.

  • Fixed bug in filter parser giving wrong answers when two range lists were combined with and explicit boolean operator:
      $ fundisp $S"[x=512&&y=511,512]" 
    
    incorrectly acted like:
      fundisp $S"[(x=512&&y=511)||(y=512)]" 
    
    instead of:
      fundisp $S"[x=512&&(y=511||y=512)]"
    
    In general, we recommend use of explicit parentheses.

  • Fixed filter/NaN.h to recognize Compaq Alpha again (broken by their last change to cc).

  • Removed redundant varargs definitions that conflicted with Alpha compiler definitions.

  • Added blank line to inc.sed to work around Apple Mac OS X bug in which the "i" (insert) command was treating final \\ as continuation \ in the text.

  • Added include of mkrtemp.h to mkrtemp.c to get conditional compilation for Mac OSX.

  • Added support for --with-zlib to fitsy so that ds9 could use its own copy of zlib (and not build the copy in fitsy).

  • Removed config.cache and Makefile files from distribution tar file.

Beta Release 1.0.1b4 (26 January 2002)

  • Make explicit that column filters are not permitted in an image expression (such as the funcnts region arguments).

  • Fix bug in region parser in which a region (without parens), followed immediately by an operator:
      circle 512 512 .5&&pi==1
    
    was not processing the final argument of the region correctly.

  • Ignore new "tile" directive in filters (used by ds9).

Beta Release 1.0.1b3 (4 January 2002)

  • Made modifications to Makefile.in to make releases easier.

  • Added instructions Makefile.in so that funtools.h will always have correct #defines for FUN_VERSION, FUN_MAJOR_VERSION, FUN_MINOR_VERSION, and FUN_PATCH_LEVEL.

  • Allow #include statements in funcalc program files.

  • funimage now updates all 4 CDX_Y values by the block factor.

  • Minor changes to make funtools work under darwin (Mac OS X).

Beta Release 1.0.1b2 (14 November 2001)

  • Fixed FunOpen() bug (introduced in b1) in which filenames without extensions SEGV'ed on open. Yikes!

  • Funmerge now extends the tlmin/tlmax values of the output binning columns so that merged events from widely separated files are valid in the output table.

  • In funhist, added -w switch to specify bin width (lo:hi:width) instead of number of bins (lo:hi:num). Added support for this new width option in funtools.ds9.

  • If a tdbin value was set using bincols=(name:tlmin:tlmax:tdbin, ...), the WCS parameters were not being updated properly.

  • Cleaned up build support for zlib.

Beta Release 1.0.1b1 (6 November 2001)

  • Added support for gzip'ed files to the underlying fitsy/gio library. This means that all funtools programs now accept gzip'ed files as valid input:
      funcnts foo.fits.gz "circle 504 512 10"
    
    It is no longer necessary to run gunzip and pipe the results to stdin of a funtools program.

  • Funtools tasks are now placed in a sub-menu in the DS9 Analysis menu, instead of at the top level.

  • Fixed a bug in funcnts in which the bottom-most pixel of a small circle or annulus region could be missed when the region is only one pixel wide for that value of y.

  • Added -n switch to funhist so that table histograms could be normalized by the width of the bin (val/(hi_edge-lo_edge)).

  • Added -T switch to fundisp, funcnts, funhist to output in starbase/rdb format (uses tabs instead of spaces between columns, form-feeds between tables, etc.)

  • Fixed a bug in which the field() region was not being properly processed in combination with an image section. This could affect funcnts processing of image data where an image section was specified (though it usually resulted in a funcnts error).

  • Fixed bug in display of binary table header for vector columns.

  • Filters now recognize hex constants (starting with 0x) and long constants (ending with L).

  • Filenames containing a ':' are now only treated as sockets if they actually are in the form of a valid ip:port.

  • Replaced funtools.ds9 with a new version that calls a new funds9 script, instead of calling funcnts or funhist directly. The new script supports gzip'ed files and bracket specifications on filenames at the same time, which the direct call could not. Also the new script has better error reporting.

  • Replaced system() call used to compile filter and funcalc expression with a special launch() call, which performs execvp() directly without going through sh. (launch() works under DOS and has fewer security problems.)

  • Fixed image filter code in which the field() region was being ignored if it was combined with one or more exclude regions (and no other include regions), resulting in no valid pixels.

  • Changed use of getdtable() to FD_SETSIZE in calls to select().

  • Added code to guard against FITS binary tables without proper TFORMx parameters.

  • Added support to FunParamGets so that it returns the raw FITS card if the specified input name is NULL and the input n value is positive.

  • Fixed bug in underlying fitsy code that set the comment in a header parameter.

Public Release 1.0.0 (31 July 2001)

  • "a new day with no mistakes ... yet"

Index to the Funtools Help Pages
Last updated: 22 April 2002
funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/changelog_beta.html000066400000000000000000000751721256243640000250670ustar00rootroot00000000000000 Funtools ChangeLog

Funtools ChangeLog

This ChangeLog covers both the Funtools library and the suite of applications. It will be updated as we continue to develop and improve Funtools. The up-to-date version can be found here.

Beta release 1.0.b28 (06/26/01)

  • In funcnts, removed extra new-lines from the primary table, inadvertently added in cases where zero-area rows are skipped.

  • Added code to support columns in binary tables that do not have names.

  • Changed the ds9 radial plot so that the radius (x value) for each plotted point is taken to be the middle of the annulus, (Rin+Rout)/2, instead of just the inner annulus, Rin.

Beta release 1.0.b27 (06/21/01)

  • Added missing new-lines in funcnts primary tables that did not have -r switch.

  • Filtering with dynamic shared objects (gcc only) now links the region code into the shared object, instead of relying on finding the region code in global space.

  • A few minor changes to column headers in funcnts.

Beta release 1.0.b26 (05/21/01)

  • Fixed funcnts to work properly when the background region overlaps the source and therefore explicitly excludes the source. It was simply ignoring the source regions in such a case.

    Added a second DS9 init file, funcnts2.ds9, which contains funcnts and radial profile routines that work from the image stored in DS9's memory, rather than the original FITS file. This is useful in cases where no original FITS file exists (e.g., a temp file was created by a program and sent to DS9).

  • Fixed funcnts so that region specified with a variable number of arguments must come last (as is the case with panda and the n= accelerator). Thus, a region specification such as "pie 504 512 10 20 30 & circle 504 512 10" is now properly an error. Using "circle 504 512 10 & pie 504 512 10 20 30" instead ensures that the circle is applied to each pie.

  • Fixed funcnts output of radii/angles when boolean expressions such as "pie & annulus" are specified.

  • Enhanced funcnts so that -r outputs valid radii for circular regions.

Beta release 1.0.b25 (4/19/01)

  • Added support to funtable to generate a FITS binary table from an image. By default, a 3-column table is generated, where the columns are "X", "Y", and "VALUE". For each pixel in the image, a single row (event) is generated with the "X" and "Y" columns assigned the dim1 and dim2 values of the image pixel, respectively and the "VALUE" column assigned the value of the pixel. If the -i ("individual" rows) switch is specified, then only the "X" and "Y" columns are generated. However the number of rows (events) are written out for each image pixel is equal to the value of that image pixel(or 1, whichever is larger).

  • Added -z switch to funcnts to display shapes in primary table that have no area. This is useful when automatic processing assumes that there are a set number of rows.

  • Reworked how the "$region" column is handled. A "$region" column can now be added to a table already having a "region" column. If a "region" column already exists, the new column will be "region1". If that exists, we try "region2", etc.

  • Added the header parameters EXTNAME="IMAGE" and EXTVER=1 when an image extension of created automatically.

  • When funcnts is run with -r, the rad1, rad2, ang1, and ang2 columns are filled in with "NA" if the shape is not annulus, pie, or panda (instead of being left blank).

  • Changed funcnts to display arc-sec/pixel instead of degrees/pixel in the output header.

  • Fixed bug in FunColumnSelect() that prevented a new table from being created that consists only of new columns.

  • Fixed processing of blank values in FunImageRowGet() (was a SEGV).

  • Fixed fundisp processing of images (SEGV upon completion, trying to free space only used by tables).

  • Fixed bug in funcalc which left executable in /tmp space if -n (no execute) was specified.

  • Fixed various bugs processing raw event files, especially on little-endian machines and reading these files via stdin.

  • Changed rad1, rad2 columns to radius1, radius2 in funcnts.

  • Purified dynamically loaded filter code (since purify now can work with gcc).

Beta release 1.0.b24 (03/26/01)

  • First release of funcalc, the Funtools table calculator. funcalc is a calculator program that allows arbitrary expressions to be constructed, compiled, and executed on columns in a Funtools table (FITS binary table or raw event file). It works by integrating user-supplied expression(s) into a template C program, then compiling and executing the program. funcalc expressions are valid C statements, although some important simplifications (such as automatic declaration of variables) are supported. Within a funcalc expression, reference is made to a column of the current row using the C syntax cur->[colname], e.g. cur->x, cur->pha, etc. Local scalar variables can either be defined using C syntax at very the beginning of the expression, or else they can be defined automatically by funcalc (to be of type double). Thus, for example, a swap of columns x and y in a table can be performed using either of the following equivalent funcalc expressions:
      double temp;
      temp = cur->x;
      cur->x = cur->y;
      cur->y = temp;
    
    or:
      temp = cur->x;
      cur->x = cur->y;
      cur->y = temp;
    
    When this expression is executed using a command such as:
      funcalc -f swap.expr itest.ev otest.ev
    
    the resulting file will have values of the x and y columns swapped. Many other features are available in funcalc to make table manipulation easy. See the Funtools program.html documentation.

  • First release of the funtools.ds9 set-up file for adding Funtools analysis programs to the DS9 Analysis menu. This set-up file is installed in the same bin directory where Funtools programs are installed and can be loaded into DS9 from the Load Analysis Commands ... option of the Analysis menu. Alternatively, you can tell DS9 to load this file each time it starts by adding the file to the Edit->Preferences->Analysis Menu->Analysis File menu option.

  • Added support for non-integral binning of binary tables. The bincols specifier on the command line now can take the form:
      bincols=([xname[:tlmin[:tlmax:[binsiz]]]],[yname[:tlmin[:tlmax[:binsiz]]]])
    
    where the tlmin, tlmax, and binsiz specifiers determine the image binning dimensions:
      dim = (tlmax - tlmin)/binsiz     (floating point data)
      dim = (tlmax - tlmin)/binsiz + 1 (integer data)
    
    These tlmin, tlmax, and binsiz specifiers can be omitted if TLMIN, TLMAX, and TDBIN header parameters (respectively) are present in the FITS binary table header for the column in question. Note that if only one parameter is specified, it is assumed to be tlmax, and tlmin defaults to 1. If two parameters are specified, they are assumed to be tlmin and tlmax.

  • Added "mask=transparent" support to the plist argument in FunTableRowGet(). If this string is passed in the call's plist argument, then all events are passed back to the user. This is useful when FunColumnSelect() specifies "$region" as a column in order to return the regionid value for each event. In such a case, events found in a region have regionid >0, events passing the filter but not in a region have regionid == -1, events not passing the filter have regionid ==0.

  • Added FUN_WCS0 to the FUN_WCS option available to FunInfoGet(). The original FUN_WCS option returns WCS Library handle (for use with Doug Mink's wcssubs library) suitable for use with images, regardless of whether the data are images or tables. For this structure, the WCS reference point (CRPIX) has been converted to image coordinates if the underlying file is a table (and therefore in physical coordinates). The new FUN_WCS0 structure has not had its WCS reference point converted to image coordinates. It therefore is useful when passing processing physical coordinates from a table.

  • Added -G switch to funcnts to print out floating point values with maximum %.14g precision.

  • Added -l switch to fundisp, which displays the pixels of an image as a list with X, Y, VAL columns.

  • Added support for images to funhist. The program will create a histogram of the values found in each pixel, or it can perform a projection over either axis.

  • All Funtools programs now accept "-" to mean "stdin" or "stdout", when the io mode is "r" or "w", respectively.

  • Changed behavior of the prec (precision) argument in FunParamPutd() (and the underlying fitsy routine ft_cardfmt()) so that if the double value being put is less than 0.1 or greater than or equal to 10**(20-2-prec), then %20.[prec]e format is used, otherwise %20.[prec]f format is used.

  • Fixed behavior of "merge=replace" in FunColumnSelect() so that if tlmin/tlmax values are not specified in the replacing column, but are specified in the replaced column, then the original tlmin/tlmax values are used in the replacing column.

  • Improved funcnts error-handling when no valid region is specified.

  • Fixed region parsing of '#' comment character so that comments are terminated by new-lines, but not ';'. This is more intuitive behavior.

  • Fixed region parser so that a region (without parens), followed by a column expression (e.g., "circle 5 5 1,pha==4") is processed correctly.

  • Fixed funcnts so that the timecorr parameter specified by -t [timecorr] can be in lower case.

  • Fixed panda region shapes when processing a blocked image. The number of pies and number of annuli (args 5 and 8) were incorrectly being divided by the block factor (i.e., they were being treated as sizes).

  • Fixed bug in funcnts that resulted in slightly smaller integerized pixel boundaries being used when filtering events. This does not affect ordinary event filtering(in fundisp, funtable, etc.). In funcnts (which filters binary table events using image-style pixel filtering), this bug could result in fewer photons being counted than is the case when the equivalent image is used.

  • Fixed funcnts to work with raw event files on little-endian machines.

  • Fixed funhist so that it will read data from a pipe.

  • Fixed region parser (and funcnts) so that an include file ending with a comment stops the comment at the end of the include file.

  • Clarified the meaning of the "," operator (should it be "or" or "and") between a region and a non-region expression in a filter: if the second operand in the expression contains a region, the operator is "or", otherwise it is "and".

  • Fixed bug in funmerge, which was not handling integerization of negatively-valued physical pixels properly (not actually used in any known application).

Beta release 1.0.b23 (02/16/01)

  • Fixed funcnts to report area correctly in arc-seconds.

  • Fixed funcnts to report radii correctly when summing.

  • Fixed bug in fundisp: a SEGV when trying to display an ASCII column from a binary table.

Beta release 1.0.b22 (02/15/01)

  • Funcnts now will automatically output appropriate columns from the primary table in units of arc-seconds instead of pixels if WCS info is present. Use -p to force the output to be in pixels.

  • Added qualitative exposure correction to funcnts by means of the switch "-e source_exp[;background_exp]". For each region, the average exposure is calculated and net counts (and background) are divided by the average exposure. See programs.html for more info.

  • Added qualitative time correction to funcnts by means of the switch "-t source_time[;background_time]". The net counts (and background) are divided by this time. See programs.html for more info.

  • Improved funcnts output. For example, column units are displayed (since surf_bri units now can be cnts/pix**2, cnts/arcsec**2, etc.)

  • Changed funcnts.gnuplot and funhist.gnuplot scripts to funcnts.plot and funhist.plot, respectively. The new scripts take an argument such as "gnuplot" or "ds9" and output data appropriate for each target. Also enhanced funcnts.plot so that it senses the axis units automatically.

  • Fixed bug in funcnts when handling regions whose centers are out of the image. Processing often resulted in BUS ERROR or zero counts, and it took forever to reach those results

  • Fixed bug in FunImagePut() when outputting float data on little-endian machines (PCs/Dec Alpha) -- an erroneous error was signaled trying to convert from native to IEEE before writing.

  • Fixed bug in fundisp when displaying the mask of a double/float image using the mask=all option.

  • Fixed bug in fitsy/headimage/ft_imageloadhead(fits), in which the default value for LTV[1,2] was incorrectly set to 1.0, not 0.0. This means that region physical coordinates applied to FITS images and arrays that did not have LTM/LTV keywords were 1 pixel off.

  • Fixed obscure bug in region circle processing when a block factor is specified in the section command but the circle has radius less than the block.

  • Fixed bug in FunImageGet which was returning the full image in cases where a region was specified but no image pixels were in the region. An empty image is now returned.

Beta release 1.0.b21 (02/01/01)

  • In funcnts, added ability to specify a separate background file. When using a separate background file, the background area will be normalized by the ration of the pixel sizes of the two files, if requisite WCS info is available.

  • In funcnts, added -r switch to output radii (and angle) information. This is useful with annulus and panda shapes when plotting radial profiles. An example plot script, funcnts.gnuplot, is available for use with gnuplot (3.7 and higher):
      funcnts ... | funcnts.gnuplot
    

  • First version of the funhist program, which creates a 1D histogram by binning the specified column in a binary table. The tabular output can be plotted using funhist.gnuplot:
      funhist snr.ev x | funhist.gnuplot
    

  • Added additional error messages to funcnts when invalid binning parameters are found for one or more binary table binning columns.

  • Fixed bug in FunImagePut() which sometimes occurred when dimensions were passed in the calling sequence. If, in addition, a reference handle was passed in the FunOpen() call, then the output dimensions are erroneously taken from the reference file, not the passed dimensions.

  • Fixed bug in filter lex code (filt.l) in which yyrestart was being called incorrectly with the string to be parsed as the argument (should be NULL).

  • Fixed bug in filter code in which the Sun cc compiler was creating a useless .o file in the working directory.

  • Fixed bug in region parser which made it impossible to specify angles with a 'd' or 'r' suffix unless WCS info was in the file. (The use of 'd' or 'r' with angle is independent of WCS but the check was there anyway.)

Beta release 1.0.b20 (11/29/00)

  • Fixed a serious bug in which exclude regions were being ignored when multiple annuli were specified. That is, in a region specification such as:
      annulus 512 512 0 100 n=4; -circle 510 510 20
    
    or
      annulus 512 512 0 25 50 75 100; -circle 510 510 20
    
    the excluded region was not being sensed properly. Note that single regions did work properly with exclude regions.

  • Optimized funcnts so that the time for processing an event list (binary table) is no longer proportional to the number of pixels in the image. The unoptimized code was taking forever with Chandra ACIS images (8192**2 pixels), even with relatively few events.

  • Fixed bugs that gave incorrect answers when image regions were combined with image sections.

  • Fixed bug in parsing image section of the form: "foo.fits[*,6:9,2]", i.e. the default ("*") x dimensions, followed by specified y dimensions.

  • Added -g option to funcnts to change some output formats from 12.3f to 12.3g to accommodate display of very small numbers.

Beta release 1.0.b19 (11/21/00)

  • Fixed bug in filter code that caused a SEGV on Solaris machines when the first specified spatial region is an exclude region. Our user-supplied qsort/compare algorithm was confusing the Solaris qsort() routine, causing it to SEGV by trying to process a record prior to the beginning of the passed array of records.

Beta release 1.0.b18 (11/13/00)

  • Fixed bug in handling bitpix=-32 (single float) images.

  • Fixed gio gskip routine to better handle skip of 0 bytes.

Beta release 1.0.b17 (11/10/00)

  • Fixed working of $REGION keyword in funtable.

  • Removed FunFlush() from end of funtable (it was redundant).

  • Fixed bug in gopen() handling of "pipe:".

  • Fixed bug in gseek() where pipes, streams, and sockets were not skipping bytes properly (that can do skips, but cannot do other sorts of seek).

Beta release 1.0.b16 (10/23/00)

  • Added -s switch to funcnts to support display of summed results (as well as individual results for each region), i.e. each row in the summed bkgd-subtracted table contains the sum of counts and areas from previous rows.

  • Added -f [format] switch to fundisp to allow control over the display format for each data type.

  • Fixed bug in which regions could be incorrectly re-ordered. This was a problem with annular ellipses and rectangles created by ds9 and then used in funcnts (the only program where the order of the regions is important).

Beta release 1.0.b15 (10/11/00)

  • Changed the names of routines FunEventsGet() and FunEventsPut() to FunTableRowGet() and FunTableRowPut(), respectively. The old names are still valid (using #define in funtools.h), so no code change is required.

  • Changed funevents program name to funtable, in line with API changes.

  • Renamed FunInfoGet/Put() parameter FUN_EVSIZE to FUN_ROWSIZE, in order to reflect change from use of "events" to use of "row" in funtools binary table support. The old name is still supported as an alias.

  • Completed first version of funmerge program to merge FITS binary tables.

  • Fixed bug in line region shape that was causing a SEGV with event data.

  • Fixed minor compiler warnings using "gcc-Wall".

  • Added the ability for FunOpen() to open a list of event files and read events from this list synchronously or asynchronously. This facility is part of an experimental set of parallel processing techniques that are being added to funtools. Documentation will be forthcoming when we know which techniques have value!

Beta release 1.0.b14 (9/22/00)

  • Added first version of funmerge program to merge FITS binary tables.

  • Changed the output format of funcnts so that the main results (background-subtracted table) are displayed first. This means that the result columns always start at line 4 in the file (after a 1-line comment and a 2-line header) and end at the first blank line. The fixed format makes it easier for programs such as sed to extract results for further processing. For example:
     csh> cat fun.sed
     1,/---- .*/d
     /^$/,$d
    
     csh> funcnts snr.ev[pha==1] "annulus 512 512 0 200 n=8" | sed -f fun.sed
       1       49.000     7.000        0.000     0.000      1941    0.025    0.004
       2       91.000     9.539        0.000     0.000      5884    0.015    0.002
       3      129.000    11.358        0.000     0.000      9820    0.013    0.001
       4      159.000    12.610        0.000     0.000     13752    0.012    0.001
       5      176.000    13.266        0.000     0.000     17652    0.010    0.001
       6      183.000    13.528        0.000     0.000     21612    0.008    0.001
       7      137.000    11.705        0.000     0.000     25528    0.005    0.000
       8      198.000    14.071        0.000     0.000     29420    0.007    0.000
    

  • Fixed bug in row# processing in which all range was ignored if lo range value was 1 (e.g., row#=1:7).

  • Fixed bug in event header processing in which the multiple instances of keywords HISTORY, COMMENT, and CONTINUE were not all being copied from the old to the new header (e.g. in funevents).

  • Fixed processing of ARRAY() and EVENTS() specifiers in FunOpen().

  • Fixed 'make clean' directive so that it also cleans funtools subdirs.

Beta release 1.0.b12 (9/5/00)

  • Improved the performance of panda regions so that the funcnts "wall time" now is proportional to the size of the panda region, not the size of the image. (The latter is the case with the pie shape; use of panda is recommended over pie.) This means that it is possible to run funcnts on an ACIS file at zoom 1 (8192x8192) in seconds rather than (tens of) minutes.

  • Added support for INET sockets to gio and hence, to funtools. This means that you can read/write from/to sockets on other machines, creating a distributed pipeline. For example:
      on m1:  funevents foo.ev m2:1428
      on m2:  funevents :1428 m3:1428
      on m3:  funevents :1428 ...
    
    etc. Tests indicate that this is faster than pipes on a single machine, once the CPU is saturated on that machine. (But note that it is not faster until the CPU is saturated, due to the efficiency of Unix pipes and the I/O wait time on non-saturated CPUs.) This new facility implements the parallel processing technique called "process decomposition" for pipelines, in which a pipeline process is run on several machines at once, with different machines handling separate parts of the pipeline process.

    NB: socket support requires that the libraries:

      -lsocket  -lnsl
    
    be added to the Solaris link line.

  • Added support for the row#=lo:hi keyword to process specific rows in a FITS binary table. For example:
      funevents "test.ev[row#=3:8]" stdout ...
    or
      funevents "test.ev[row#=(3,8)]" stdout ...
    
    will only process rows 3 to 8 (inclusive) of the test.ev file. Along with image section specification, use of the row#= keyword implements the parallel processing technique called "data decomposition", in which several copies of a single program operate on different parts of a single data file.

  • Added guard code to image region processing to catch illegal event values.

  • Fixed bug when writing FITS image extensions in which dim1, dim2, and bitpix were being output as 0.

  • reversed the y row order of displayed images in fundisp, so that pixel (1,1) is in the lower left corner, as is the case for ds9 image display.

Beta release 1.0.b11 (8/10/00)

  • Fixed annulus accelerators and panda regions -- again. Old problems (from the original implementation) were uncovered related to the use of these shapes in boolean expressions. Documented an old restriction that panda and accelerators must be put last in a boolean expression and added code to signal an error if they are not placed last.

  • The behavior of the point shape was changed so that multiple x,y pairs in a single shape specifier now are assigned different region ids. This makes the behavior of points and annuli consistent with one another.

Beta release 1.0.b10 (8/08/00)

  • Fixed annulus accelerators and panda regions. These were broken when dynamic loading was implemented.

  • Fixed a bug in the event filter body code (i.e., the basis for the slave filter program). Reading the data sometimes incorrectly calculated the number of events being passed -- which only showed up occasionally on the Alpha!

Beta release 1.0.b9 (8/03/00)

  • Removed compilation of some extraneous routines from wcs library. Also renamed wcssubs directory to wcs.

  • Added calls to hlength() before wcsinit(). This is necessary in ds9 (and is a safeguard in other programs) because once hlength() is called before any invocation of wcsinit(), it must always be used.

  • Fixed bug in filter code in which CTYPE1 and CTYPE2 param values were not being passed to wcsinit() as valid FITS strings: the single quotes were missing.

  • Fixed a bug in fitsy in which the card buffer was not being null-terminated properly when a "card insert" call reallocated space for more cards.

  • Added protective code so that one cannot set FILTER_PTYPE to "dynamic" if dynamic filter objects are not available.

  • Ported to Debian Linux, which (believe it or not) required removal of extraneous strdup() and strstr() declarations in the code (apparently these are macros in that version of Debian gcc, so you cannot declare them).

Beta release 1.0.b8 (8/01/00)

  • Added new filter ptype ("contained"), which builds a separate process by compiling both the main routine and the region code. This is different from the "process" ptype, which compiles the main routine, but links in pre-compiled region code (in order to make the program build more quickly). It is needed by ds9 so that the latter does not have to keep track of the compiled region code module.

Beta release 1.0.b7 (7/25/00)

  • Changed filter code so that, in simple cases, we can access the contents of a file. This is needed so that funcnts can work properly in one oft-used case, i.e., if the file foo contains:
      circle 5 5 1
      circle 4 4 1
    
    then:
      funcnts foo.fits @foo
    
    now will display the 2 regions in its output, instead of displaying the near useless "@foo". This only works for simple cases where only a file is input, not in odd combinations like:
      funcnts foo.fits "@foo,circle 1 1 1"
    

  • Added programming tutorial and enhanced the programming reference documentation.

  • Ported to Windows via the Cygwin environment from RedHat. We tested on an NT box, which has decent multi-tasking support. Whether it works on Windows95 is unknown.

  • Upgraded WCS libraries to 2.8.3.

  • Ported to new and strict SGI C compiler, which uncovered lots of unused variables, etc.

  • Fixed FunParamPut status return.

Beta release 1.0.b6 (7/15/00)

  • Ran Purify with each high level program and each funtest program.

  • Changed behavior of merge=update option of FunColumnSelect() so that the update of the user column value only takes place if the user mode has "w" in it. Previously, merge=update overrode the mode flag and always updated the user value. Note that all calls to FunColumnSelect with merge=update must change "r" to "rw" in order to have that user column merged. (The merge=replace already was checking the mode flag -- the fact that they were doing different things is a bug.)

  • Added ability to FunOpen extensions by HDU name. (I thought I had already done this!)

  • Fixed bug that was adding a NULL table at the end of most binary table files (i.e., those that were not copying the rest of the input file).

  • Re-ported to Alpha. The problem found most often was the casting of pointers to ints when doing pointer calculations, i.e.:
      char *s, *t;
      n = ((int)s - (int)t);
    
    which is invalid on the 64-bit Alpha. Instead use:
      char *s, *t;
      n = (s - t);
    
    Also broadened the check for use of dlopen in configure to match Alpha's library configurations (On Alpha, dlopen is in libc).

  • Changed FunColumnActivate() so that funtools will process columns in the sorted order specified by that routine. Thus:
      fundisp foo.ev "time y x"
    
    will display columns in that order.

    Sorting does not take place if the activate list contains only exclude columns (since there is nothing to sort). Also, you can turn off sorting altogether (mimicking the old behavior) by calling FunColumnActivate() with a "sort=false" in the plist argument:

      FunColumnActivate(fun, "y x", "sort=false");
    
    or by adding "sort=false" to the activate string itself:
      # by default, its sorted
      fundisp $E "time y x"
                   TIME       Y       X
       ---------------- ------- -------
                 6.8500      -7      -7
                 6.8600      -7      -7
    
    while:
      # turn off sorting
      ./fundisp $E "time y x sort=false"
             X       Y             TIME
       ------- ------- ----------------
            -7      -7           6.8500
            -7      -7           6.8600
            -7      -7           6.8700
    

Beta release 1.0.b5 (7/8/00)

  • Changed all FunParamSet calls to FunParamPut, to make the naming consistent with FunImagePut, FunEventsPut, etc.

  • Fixed bugs preventing tlmin/tlmax from being changed by the user in binary tables. Also tlmin/tlmax are now written out using a data type that matches the data type of the respective column.

  • Extended filter syntax to allow "," as separator between filename and filters (as well as brackets), i.e.:
      foo.fits,events  # event extension
      foo.fits,pha==1  # filter on default extension
      foo.fits,1       # first extension
    
    Note that all but simple expressions will need to be quoted because of the shell:
      foo.fits,pha==1&&pi==2  # & tells shell to run in bkgd
      foo.fits,pha==1||pi==2  # similar problems with pipes
      foo.fits,circle(1,2,3)  # parens are grabbed by shell
    

  • Fixed configure so that --with-lib is no longer necessary to generate a single funtools.a library. Removed this argument from saoconfig. Note that:
      ./configure
    
    now works properly again, so saoconfig should not be used.

  • Changed FunFlush() mode argument (single characters) to a plist argument (keyword arguments). In particular,
      FunFlush(fun, "C");
    
    is now:
      FunFlush(fun, "copy=remaining");
    (or FunFlush(fun, "copy=remainder"); )
    
    This syntax extension allows FunFlush to support the copy of the extension associated with the reference handle, which allows one to copy any extension from an input file to an output file:
      /* open a new input extension */
      ifun = FunOpen(...);
      /* make this new extension the output reference extension */
      FunInfoPut(ofun, FUN_IFUN, &ifun, 0);
      /* copy the current reference extension to output */
      FunFlush(ofun, "copy=reference");
    

  • Fixed bugs in region parser that caused pure floating point positions (i.e., numbers w/o format characters) always to be interpreted as pixels. Also fixed galactic and ecliptic conversions.

Index to the Funtools Help Pages


Index to the Funtools Help Pages
Last updated: November 17, 2005
funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/combo.html000066400000000000000000000065251256243640000232400ustar00rootroot00000000000000 Combining Region and Table Filters

FunCombine: Combining Region and Table Filters

Summary

This document discusses the conventions for combining region and table filters, especially with regards to the comma operator.

Comma Conventions

Filter specifications consist of a series of boolean expressions, separated by commas. These expressions can be table filters, spatial region filters, or combinations thereof. Unfortunately, common usage requires that the comma operator must act differently in different situations. Therefore, while its use is intuitive in most cases, commas can be a source of confusion.

According to long-standing usage in IRAF, when a comma separates two table filters, it takes on the meaning of a boolean and. Thus:

  foo.fits[pha==1,pi==2]
is equivalent to:
  foo.fits[pha==1 && pi==2]
When a comma separates two spatial region filters, however, it has traditionally taken on the meaning of a boolean or. Thus:
  foo.fits[circle(10,10,3),ellipse(20,20,8,5)]
is equivalent to:
  foo.fits[circle(10,10,3) || ellipse(20,20,8,5)]
(except that in the former case, each region is given a unique id in programs such as funcnts).

Region and table filters can be combined:

  foo.fits[circle(10,10,3),pi=1:5]
or even:
  foo.fits[pha==1&&circle(10,10,3),pi==2&&ellipse(20,20,8,5)]
In these cases, it is not obvious whether the command should utilize an or or and operator. We therefore arbitrarily chose to implement the following rule:
  • if both expressions contain a region, the operator used is or.
  • if one (or both) expression(s) does not contain a region, the operator used is and.
This rule handles the cases of pure regions and pure column filters properly. It unambiguously assigns the boolean and to all mixed cases. Thus:
  foo.fits[circle(10,10,3),pi=1:5]
and
  foo.fits[pi=1:5,circle(10,10,3)]
both are equivalent to:
  foo.fits[circle(10,10,3) && pi=1:5]

[NB: This arbitrary rule replaces the previous arbitrary rule (pre-funtools 1.2.3) which stated:

  • if the 2nd expression contains a region, the operator used is or.
  • if the 2nd expression does not contain a region, the operator used is and.
In that scenario, the or operator was implied by:
  pha==4,circle 5 5 1
while the and operator was implied by
  circle 5 5 1,pha==4
Experience showed that this non-commutative treatment of the comma operator was confusing and led to unexpected results.]

The comma rule must be considered provisional: comments and complaints are welcome to help clarify the matter. Better still, we recommend that the comma operator be avoided in such cases in favor of an explicit boolean operator.

Go to Funtools Help Index

Last updated: November 16, 2005
funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/doc40.fits000066400000000000000000000132001256243640000230370ustar00rootroot00000000000000SIMPLE = T / Standard FITS BITPIX = 8 / bits/pixel NAXIS = 2 / number of axes NAXIS1 = 40 / x axis dimension NAXIS2 = 40 / y axis dimension LTV1 = 0.0000000E+00 / IRAF ref. point LTV2 = 0.0000000E+00 / IRAF ref. point LTM1_1 = 1.0000000 / IRAF matrix value LTM1_2 = 0.0000000E+00 / IRAF matrix value LTM2_1 = 0.0000000E+00 / IRAF matrix value LTM2_2 = 1.0000000 / IRAF matrix value END funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/ds9.html000066400000000000000000000103741256243640000226350ustar00rootroot00000000000000 Funtools and DS9 Image Display

FunDS9: Funtools and DS9 Image Display

Summary

Describes how funtools can be integrated into the ds9 Analysis menu.

Description

SAOImage/DS9 is an astronomical imaging and data visualization application used by astronomers around the world. DS9 can display standard astronomical FITS images and binary tables, but also has support for displaying raw array files, shared memory files, and data files automatically retrieved via FTP and HTTP. Standard functional capabilities include multiple frame buffers, colormap and region manipulation, and many data scaling algorithms. DS9's advanced features include TrueColor visuals, deep frame buffers, true PostScript printing, and display of image mosaics. The program's support of image tiling, "blinking", arbitrary zoom, rotation, and pan is unparalleled in astronomy. It also has innovative support for automatic retrieval and display of standard image data such as the Digital Sky Survey (using servers at SAO, StScI, or ESO).

DS9 can communicate with external programs such as Funtools using the XPA messaging system. In addition, programs can be integrated directly into the DS9 GUI by means of a configurable Analysis menu. By default, the DS9 Analysis menu contains algorithms deemed essential to the core functions of DS9, e.g., display cross-cuts of data, iso-intensity contours, and WCS grids. However, new programs can be added to DS9 by creating a set-up file which can be loaded into DS9 to reconfigure the Analysis menu.

The basic format of the analysis set-up file is:

# # Analysis command descriptions: # menu label/description # file templates for this command # "menu" (add to menu) |"bind" (bind to key) # analysis command line

For example, the funcnts program can be specified in this way:
  Funcnts (counts in source/bkgd regions; options: none)
  *
  menu
  funcnts $filename $regions(source,,) $regions(background,,) | $text
As shown above, DS9 supports a macro facility to provide information as well as task support to command lines. For example, the $regions macro is expanded by DS9 to provide the current source and/or background region to the analysis command. The $text macro is expanded to generate a text window display. It also is possible to query for parameters using a $param macro, plot data using a $plot macro, etc. See the DS9 documentation for further details.

A set-up file called funtools.ds9 will load some useful Funtools applications (counts in regions, radial profile, X-ray light curve and energy spectrum, 1D histogram) into the DS9 Analysis menu (version 2.1 and above). The file resides in the bin directory where Funtools programs are installed. It can be manually loaded into DS9 from the Load Analysis Commands ... option of the Analysis menu. Alternatively, you can tell DS9 to load this file automatically at start-up time by adding the pathname to the Edit->Preferences->Analysis Menu->Analysis File menu option. (NB: make sure you select Edit->Preferences->Save Preferences after setting the pathname.)

The tasks in this setup file generally process the original disk-based FITS file. Funcnts-based results (radial profile, counts in regions) are presented in WCS units, if present in the FITS header. For situations where a disk file is not available (e.g., image data generated and sent to DS9's 'fits' XPA access point), versions of the radial profile and counts in regions tasks also are also offered utilizing DS9's internal image data. Results are presented in pixels. Aside from the units, the results should be identical to the file-based results.

Go to Funtools Help Index

Last updated: November 16, 2005
funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/env.html000066400000000000000000000206011256243640000227200ustar00rootroot00000000000000 Funtools Environment Variables

FunEnv: Funtools Environment Variables

Summary

Describes the environment variables which can be used to tailor the overall Funtools environment.

Description

The following environment variables are supported by Funtools:

FITS_EXTNAME
The FITS_EXTNAME environment variable specifies the default FITS extension name when FunOpen() is called on a file lacking a primary image. Thus,
  setenv FITS_EXTNAME "NEWEV"
will allow you to call FunOpen() on files without specifying NEWEV in the Funtools bracket specification. If no FITS_EXTNAME variable is defined and the extension name also is not passed in the bracket specification, then the default will be to look for standard X-ray event table extension names "EVENTS" or "STDEVT" (we are, after all, and X-ray astronomy group at heart!).

FITS_EXTNUM
The FITS_EXTNUM environment variable specifies the default FITS extension number when FunOpen() is called on a file lacking a primary image. Thus,
  setenv FITS_EXTNUM 7
will allow you to call FunOpen() on files to open the seventh extension without specifying the number in the Funtools bracket specification.

FITS_BINCOLS and EVENTS_BINCOLS
These environment variable specifies the default binning key for FITS binary tables and raw event files, respectively. They can be over-ridden using the bincols=[naxis1,naxis2] keyword in a Funtools bracket specification. The value of each environment variable is a pair of comma-delimited columns, enclosed in parentheses, to use for binning. For example, if you want to bin on detx and dety by default, then use:
  setenv FITS_BINCOLS "(detx,dety)"
in preference to adding a bincols specification to each filename:
  foo.fits[bincols=(detx,dety)]

FITS_BITPIX and EVENTS_BITPIX
These environment variable specifies the default bitpix value for binning FITS binary tables and raw event files, respectively. They can be over-ridden using the bitpix=[value] keyword in a Funtools bracket specification. The value of each environment variable is one of the standard FITS bitpix values (8,16,32,-32,-64). For example, if you want binning routines to create a floating array, then use:
  setenv FITS_BITPIX -32
in preference to adding a bitpix specification to each filename:
  foo.fits[bitpix=-32]

ARRAY
The ARRAY environment variable specifies the default definition of an array file for Funtools. It is used if there is no array specification passed in the ARRAY() directive in a Non-FITS Array specification. The value of the environment variable is a valid array specification such as:
  setenv ARRAY "s100.150"
  foo.arr[ARRAY()]
This can be defined in preference to adding the specification to each filename:
  foo.arr[ARRAY(s100.150)]

EVENTS
The EVENTS environment variable specifies the default definition of an raw event file for Funtools. It is used if there is no EVENTS specification passed in the EVENTS() directive in a Non-FITS EVENTS specification. The value of the environment variable is a valid EVENTS specification such as:
  setenv EVENTS "x:J:1024,y:J:1024,pi:I,pha:I,time:D,dx:E:1024,dx:E:1024"
  foo.ev[EVENTS()]
This can be defined in preference to adding the specification to each filename:
  foo.ev[EVENTS(x:J:1024,y:J:1024,pi:I,pha:I,time:D,dx:E:1024,dx:E:1024)]
The following filter-related environment variables are supported by Funtools:

FILTER_PTYPE
The FILTER_PTYPE environment variable specifies how to build a filter. There are three possible methods:
process or p
The filter is compiled and linked against the funtools library (which must therefore be accessible in the original install directory) to produce a slave program. This program is fed events or image data and returns filter results.
dynamic or d (gcc only)
The filter is compiled and linked against the funtools library (which must therefore be accessible in the original install directory) to produce a dynamic shared object, which is loaded into the funtools program and executed as a subroutine. (Extensive testing has shown that, contrary to expectations, this method is no faster than using a slave process.)
contained or c
The filter and all supporting region code is compiled and linked without reference to the funtools library to produce a slave program (which is fed events or image data and returns filter results). This method is slower than the other two, because of the time it takes to compile the region filtering code. It is used by stand-alone programs such as ds9, which do not have access to the funtools library.
By default, dynamic is generally used for gcc compilers and process for other compilers. However the filter building algorithm will check for required external files and will use contained is these are missing.

FUN_MAXROW
The FUN_MAXROW environment variable is used by core row-processing Funtools programs (funtable, fundisp, funcnts, funhist, funmerge, and funcalc) to set the maximum number of rows read at once (i.e. it sets the third argument to the FunTableRowGet() call). The default is 8192. Note that this variable is a convention only: it will not be a part of a non-core Funtools program unless code is explicitly added, since each call to FunTableRowGet() specifies its own maximum number of rows to read. NB: if you make this value very large, you probably will need to increase FUN_MAXBUFSIZE (see below) as well.

FUN_MAXBUFSIZE
The FUN_MAXBUFSIZE environment variable is used to limit the max buffer size that will be allocated to hold table row data. This buffer size is calculated to be the row size of the table multiplied by the maximum number of rows read at once (see above). Since the row size is unlimited (and we have examples of it being larger than 5 Mb), it is possible that the total buffer size will exceed the machine capabilities. We therefore set a default value of 5Mb for the max buffer size, and adjust maxrow so that the total size calculated is less than this max buffer size. (If the row size is greater than this max buffer size, then maxrow is set to 1.) This environment variable will change the max buffer size allowed.

FILTER_CC
The FILTER_CC environment variable specifies the compiler to use for compiling a filter specification. You also can use the CC environment variable. If neither has been set, then gcc will be used if available. Otherwise cc is used if available.

FILTER_EXTRA
The FILTER_EXTRA environment variable specifies extra options to add to a filter compile command line. In principle, you can add libraries, include files, and compiler switches. This variable should be used with care.

FILTER_TMPDIR
The FILTER_TMPDIR environment variable specifies the temporary directory for filter compilation intermediate files. You also can use the TMPDIR and TMP variables. By default, /tmp is used as the temporary directory.

FILTER_KEEP
The FILTER_KEEP environment variable specifies whether the intermediate filter files (i.e. C source file and compile log file) should be saved after a filter is built. The default is "false", so that these intermediate files are deleted. This variable is useful for debugging, but care should be taken to reset its value to false when debugging is complete.

Go to Funtools Help Index

Last updated: November 16, 2005
funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/evcol.c000066400000000000000000000072261256243640000225260ustar00rootroot00000000000000/* * * evcol.c -- example program for processing all extensions and adding a * column to the binary tables * */ #include #include #define MAXROW 8192 typedef struct evstruct{ char shape[17]; int mycol; } *Ev, EvRec; int main (int argc, char **argv) { int i, got; int idx; int tlmax; int ext=1; int total=1; int haveshape=0; char *s[3]; char tbuf[SZ_LINE]; Fun fun, fun2; Ev ebuf, ev; /* exit on gio errors */ setgerror(2); /* make sure we have minimal arguments */ if( argc < 3 ) gerror(stderr, "usage: %s iname oname\n", argv[0]); /* open a new output FITS file */ if( !(fun2 = FunOpen(argv[2], "w", NULL)) ) gerror(stderr, "could not FunOpen output file: %s\n", argv[2]); /* process each input extension in turn */ for(ext=0; ;ext++){ /* get new extension name */ sprintf(tbuf, "%s[%d]", argv[1], ext); /* open it -- if we cannot open it, we are done */ if( !(fun=FunOpen(tbuf, "r", NULL)) ) break; /* make the new extension the reference handle for the output file */ FunInfoPut(fun2, FUN_IFUN, &fun, 0); /* if its not a binary table, just write it out */ for(i=0; i<=2; i++) s[i] = NULL; if( !(s[0]=FunParamGets(fun, "XTENSION", 0, NULL, &got)) || strcmp(s[0], "BINTABLE")){ if( s[0] ) free(s[0]); FunFlush(fun2, "copy=reference"); FunClose(fun); continue; } else{ if( (s[1]=FunParamGets(fun, "EXTNAME", 0, NULL, &got)) ){ fprintf(stdout, "processing %s", s[1]); if( (s[2]=FunParamGets(fun, "HDUNAME", 0, NULL, &got)) ) fprintf(stdout, " %s", s[2]); fprintf(stdout, "\n"); } } for(i=0; i<=2; i++) if( s[i] ) free(s[i]); /* select columns from this new extension for merging */ /* we have some special code to test various bugs with bpix.fits */ if( (idx = FunColumnLookup(fun, "SHAPE", 0, NULL, NULL, NULL, NULL, NULL, NULL)) ){ haveshape = 1; FunColumnSelect(fun, sizeof(EvRec), "merge=update", "SHAPE", "16A", "rw", FUN_OFFSET(Ev, shape), "MYCOL", "J", "w", FUN_OFFSET(Ev, mycol), NULL); } else{ FunColumnSelect(fun, sizeof(EvRec), "merge=update", "MYCOL", "J", "w", FUN_OFFSET(Ev, mycol), NULL); } /* we have some special code to test various bugs with bpix.fits */ /* we need to increase tlmax value of the "component" column */ if( (idx = FunColumnLookup(fun, "COMPONENT", 0, NULL, NULL, NULL, NULL, NULL, NULL)) ){ if( (tlmax=FunParamGeti(fun, "TLMAX", idx, -1, &got)) && got ) FunParamPuti(fun2, "TLMAX", idx, tlmax+100, NULL, 0); } /* get input rows (let routine allocate the row array) */ while( (ebuf = (Ev)FunTableRowGet(fun, NULL, MAXROW, NULL, &got)) ){ /* process all rows */ for(i=0; ishape[17] = '\0'; /* used with bpix.ev */ if( haveshape ){ cluc(ev->shape); fprintf(stdout, "\tshape: %s\n", ev->shape); } ev->mycol = total++; } /* write out this batch of rows, along with the new column */ FunTableRowPut(fun2, (char *)ebuf, got, 0, NULL); /* write out one more record with special marker */ ev = ebuf; strcpy(ev->shape, "hexagon "); ev->mycol = -1; FunTableRowPut(fun2, (char *)ev, 1, 0, NULL); /* free row data */ if( ebuf ) free(ebuf); } /* flush output extension (write padding, etc.) */ FunFlush(fun2, NULL); /* close the input extension */ FunClose(fun); } /* all done -- close output */ FunClose(fun2); return(0); } funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/evmerge.c000066400000000000000000000043101256243640000230370ustar00rootroot00000000000000/* * * evmerge.c -- example program for merging user values into a table file * */ #include #include #define MAXROW 8192 typedef struct evstruct{ double time; int time2; } *Ev, EvRec; int main (int argc, char **argv) { int i, got; char tbuf[SZ_LINE]; Fun fun, fun2; Ev ebuf, ev; /* exit on gio errors */ setgerror(2); /* make sure we have minimal arguments */ if( argc < 4 ) gerror(stderr, "usage: %s iname oname mergetype [columns]\n", argv[0]); /* open input file */ if( !(fun = FunOpen(argv[1], "rc", NULL)) ) gerror(stderr, "could not FunOpen input file: %s\n", argv[1]); /* open the output FITS image, inheriting params from input */ if( !(fun2 = FunOpen(argv[2], "w", fun)) ) gerror(stderr, "could not FunOpen output file: %s\n", argv[2]); /* "merge=[type]" merges original input columns with new ones, where type is: * update -- add new columns, update value of existing ones (same data type) * replace -- add new columns, replace data type and value of existing ones * append -- only add new columns, do not "replace" or "update" existing ones * If tbuf argument is NULL, no merging is performed -- only user-specified * columns are output. */ if( isfalse(argv[3]) ) *tbuf = '\0'; else sprintf(tbuf, "merge=%s", argv[3]); FunColumnSelect(fun, sizeof(EvRec), tbuf, "time", "D", "rw", FUN_OFFSET(Ev, time), "time2", "J", "w", FUN_OFFSET(Ev, time2), NULL); /* activate specified columns -- these will be written to the output file */ if( argc >= 5 ) FunColumnActivate(fun, argv[4], NULL); /* get rows -- let routine allocate the row array */ while( (ebuf = (Ev)FunTableRowGet(fun, NULL, MAXROW, NULL, &got)) ){ /* process all rows */ for(i=0; itime2 = (int)(ev->time+.5); ev->time = -(ev->time/10.0); } /* write out this batch of rows with the new column */ FunTableRowPut(fun2, (char *)ebuf, got, 0, NULL); /* free row data */ if( ebuf ) free(ebuf); } /* clean up -- close output before input to perform flush automatically */ FunClose(fun2); FunClose(fun); return(0); } funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/evnext.c000066400000000000000000000064501256243640000227250ustar00rootroot00000000000000/* * * evnext.c -- example program for changing the time of an row to have * the value from the next row * */ #include #define MAXROW 100 typedef struct evstruct{ double time; } *Ev, EvRec; #ifdef ANSI_FUNC int main (int argc, char **argv) #else main(argc, argv) int argc; char **argv; #endif { int i; int got, ogot; char *oraw; char *nraw; char *null=NULL; Ev ebuf, oebuf=NULL; Ev ev, nev, oev; Fun fun, fun2; /* exit on gio errors */ setgerror(2); /* make sure we have minimal arguments */ if( argc < 3 ) gerror(stderr, "usage: %s iname oname [columns]\n", argv[0]); /* open file */ if( !(fun = FunOpen(argv[1], "r", NULL)) ) gerror(stderr, "could not FunOpen %s\n", argv[1]); /* open the output FITS image, inheriting params from input */ if( !(fun2 = FunOpen(argv[2], "w", fun)) ) gerror(stderr, "could not FunOpen output file: %s\n", argv[2]); /* specify columns we want */ got = FunColumnSelect(fun, sizeof(EvRec), "merge=update", "time", "1D", "rw", FUN_OFFSET(Ev, time), NULL); /* activate specified columns -- these will be written to the output file */ if( argc >= 4 ) FunColumnActivate(fun, argv[3], NULL); /* get rows */ while( (ebuf = (Ev)FunTableRowGet(fun, NULL, MAXROW, NULL, &got)) ){ /* process the last row from previous batch, if we have it */ if( oebuf ){ /* this is the old array of rows -- we point to the last one */ oev = oebuf+(ogot-1); /* this is the new array of rows -- we point to the first one */ ev = ebuf; /* change time value of old row to new row's value */ oev->time = ev->time; /* now we have to write out this last row */ /* first, save pointer to the new raw data */ FunInfoGet(fun, FUN_RAWBUF, &nraw); /* put back old pointer so we merge it with last row */ FunInfoPut(fun, FUN_RAWBUF, &oraw); /* write out last row merging with its raw data */ /* (its arg 4 that tells funtools to merge with the last raw row) */ FunTableRowPut(fun2, oebuf, 1, ogot-1, NULL); /* free up old raw data */ if( oraw ) free(oraw); /* free up old user data */ if( oebuf ) free(oebuf); /* finally, put back new raw data pointer, so we can process new batch */ FunInfoPut(fun, FUN_RAWBUF, &nraw); } /* process the got-1 rows by replacing the time with time from the succeeding row */ for(i=0; i<(got-1); i++){ /* point to the i'th row */ ev = ebuf+i; nev = ebuf+(i+1); ev->time = nev->time; } /* if we processed at least one row this time ... */ if( got > 1 ){ /* write out got-1 rows with the raw columns */ FunTableRowPut(fun2, (char *)ebuf, (got-1), 0, NULL); } /* if we have a "last" row to process next time ... */ if( got ){ /* save the user row for when we have the next batch */ oebuf = ebuf; /* save pointer to raw data */ FunInfoGet(fun, FUN_RAWBUF, &oraw); /* null out rawbuf pointer so Funtools does not free it automatically */ FunInfoPut(fun, FUN_RAWBUF, &null); /* save old value of got */ ogot = got; } } /* clean up last saved batch */ if( oraw ) free(oraw); if( oebuf ) free(oebuf); /* close and return */ FunClose(fun2); FunClose(fun); return(0); } funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/evread.c000066400000000000000000000172011256243640000226560ustar00rootroot00000000000000/* * * evread.c -- example program for reading rows in different ways * */ #include #define MAXROW 10000 extern char *optarg; extern int optind; /* single event (used in array of structs) */ typedef struct evstruct{ short region; double x, y; int pi, pha; double time; double dx, dy; } *Ev, EvRec; /* arrays of columns (used in struct of arrays) */ typedef struct aevstruct{ short region[MAXROW]; double x[MAXROW], y[MAXROW]; int pi[MAXROW], pha[MAXROW]; double time[MAXROW]; double dx[MAXROW], dy[MAXROW]; } *AEv, AEvRec; /* pointers to arrays of columns (used in struct of arrays) */ typedef struct pevstruct{ short *region; double *x, *y; int *pi, *pha; double *time; double *dx, *dy; } *PEv, PEvRec; #ifdef ANSI_FUNC int main (int argc, char **argv) #else main(argc, argv) int argc; char **argv; #endif { int i; int c; int got; int put; int args; int doev=0; int doualloc=0; char *mode="r"; char *iname; char *oname=NULL; char *params=NULL; Fun fun=NULL; Fun ofun=NULL; void *buf=NULL; Ev ev, ebuf=NULL; AEv aev, abuf=NULL; PEv pev, pbuf=NULL; /* process switch arguments */ while ((c = getopt(argc, argv, "aepuw:")) != -1){ switch(c){ case 'a': doev = 1; params = "org=soa"; break; case 'e': doev = 0; params = "org=aos"; break; case 'f': doev = 3; params = "org=aos"; break; case 'p': doev = 2; params = "org=soa"; break; case 'u': doualloc = 1; break; case 'w': oname = optarg; mode = "rw"; break; } } /* check for required arguments */ args = argc - optind; if( args == 0 ) iname = "test.ev[EVENTS]"; else iname = argv[optind]; /* open input file */ if( !(fun = FunOpen(iname, "r", NULL)) ){ gerror(stderr, "could not FunOpen %s\n", iname); exit(1); } /* open output file, if necessary */ if( oname ){ if( !(ofun = FunOpen(oname, "w", fun)) ){ gerror(stderr, "could not FunOpen outout %s\n", oname); exit(1); } } /* specify columns we want */ switch(doev){ /* array of structs */ case 0: got = FunColumnSelect(fun, sizeof(EvRec), params, "$region", "I", mode, FUN_OFFSET(Ev, region), "x", "D:10:10", mode, FUN_OFFSET(Ev, x), "y", "D:10:10", mode, FUN_OFFSET(Ev, y), "dx", "D:10:10", mode, FUN_OFFSET(Ev, dx), "dy", "D:10:10", mode, FUN_OFFSET(Ev, dy), "pi", "J", mode, FUN_OFFSET(Ev, pi), "pha", "J", mode, FUN_OFFSET(Ev, pha), "time", "1D", mode, FUN_OFFSET(Ev, time), NULL); if( doualloc ){ ebuf = calloc(MAXROW, sizeof(EvRec)); buf = ebuf; } break; /* struct of arrays */ case 1: got = FunColumnSelect(fun, sizeof(AEvRec), params, "$region", "I", mode, FUN_OFFSET(AEv, region), "x", "D:10:10", mode, FUN_OFFSET(AEv, x), "y", "D:10:10", mode, FUN_OFFSET(AEv, y), "dx", "D:10:10", mode, FUN_OFFSET(AEv, dx), "dy", "D:10:10", mode, FUN_OFFSET(AEv, dy), "pi", "J", mode, FUN_OFFSET(AEv, pi), "pha", "J", mode, FUN_OFFSET(AEv, pha), "time", "1D", mode, FUN_OFFSET(AEv, time), NULL); if( doualloc ){ abuf = calloc(1, sizeof(AEvRec)); buf = abuf; } break; /* struct of pointers */ case 2: got = FunColumnSelect(fun, sizeof(PEvRec), params, "$region", "@I", mode, FUN_OFFSET(PEv, region), "x", "@D:10:10", mode, FUN_OFFSET(PEv, x), "y", "@D:10:10", mode, FUN_OFFSET(PEv, y), "dx", "@D:10:10", mode, FUN_OFFSET(PEv, dx), "dy", "@D:10:10", mode, FUN_OFFSET(PEv, dy), "pi", "@J", mode, FUN_OFFSET(PEv, pi), "pha", "@J", mode, FUN_OFFSET(PEv, pha), "time", "@1D", mode, FUN_OFFSET(PEv, time), NULL); if( doualloc ){ pbuf = calloc(1, sizeof(PEvRec)); pbuf->region = calloc(MAXROW, sizeof(short)); pbuf->x = calloc(MAXROW, sizeof(double)); pbuf->y = calloc(MAXROW, sizeof(double)); pbuf->pi = calloc(MAXROW, sizeof(int)); pbuf->pha = calloc(MAXROW, sizeof(int)); pbuf->time = calloc(MAXROW, sizeof(double)); pbuf->dx = calloc(MAXROW, sizeof(double)); pbuf->dy = calloc(MAXROW, sizeof(double)); buf = pbuf; } break; /* array of structs containing pointers */ case 3: got = FunColumnSelect(fun, sizeof(PEvRec), params, "$region", "@I", mode, FUN_OFFSET(PEv, region), "x", "@D:10:10", mode, FUN_OFFSET(PEv, x), "y", "@D:10:10", mode, FUN_OFFSET(PEv, y), "dx", "@D:10:10", mode, FUN_OFFSET(PEv, dx), "dy", "@D:10:10", mode, FUN_OFFSET(PEv, dy), "pi", "@J", mode, FUN_OFFSET(PEv, pi), "pha", "@J", mode, FUN_OFFSET(PEv, pha), "time", "@1D", mode, FUN_OFFSET(PEv, time), NULL); if( doualloc ){ pbuf = calloc(1, sizeof(PEvRec)); pbuf->region = calloc(1, sizeof(short)); pbuf->x = calloc(1, sizeof(double)); pbuf->y = calloc(1, sizeof(double)); pbuf->pi = calloc(1, sizeof(int)); pbuf->pha = calloc(1, sizeof(int)); pbuf->time = calloc(1, sizeof(double)); pbuf->dx = calloc(1, sizeof(double)); pbuf->dy = calloc(1, sizeof(double)); buf = pbuf; } break; default: gerror(stderr, "unknown params value: %d\n", doev); break; } /* get rows */ while( (buf = (void *)FunTableRowGet(fun, buf, MAXROW, NULL, &got)) ){ /* output if necessary */ if( ofun ){ if( (put=FunTableRowPut(ofun, buf, got, 0, NULL)) != got ){ gerror(stderr, "expected to write %d rows; only wrote %d\n", got, put); } } /* and display */ switch(doev){ case 0: for(i=0; iregion, ev->x, ev->y, ev->pi, ev->pha, ev->dx, ev->dy, ev->time); fflush(stdout); } break; case 1: aev = (AEv)buf; for(i=0; iregion[i], aev->x[i], aev->y[i], aev->pi[i], aev->pha[i], aev->dx[i], aev->dy[i], aev->time[i]); fflush(stdout); } break; case 2: pev = (PEv)buf; for(i=0; iregion[i], pev->x[i], pev->y[i], pev->pi[i], pev->pha[i], pev->dx[i], pev->dy[i], pev->time[i]); fflush(stdout); } break; case 3: for(i=0; iregion[0], pev->x[0], pev->y[0], pev->pi[0], pev->pha[0], pev->dx[0], pev->dy[0], pev->time[0]); fflush(stdout); } break; default: gerror(stderr, "unknown params value: %d\n", doev); break; } /* if funtools did allocation, free it now */ if( !doualloc ){ if( buf ) xfree(buf); buf = NULL; } } /* clean up */ if( doualloc ){ switch(doev){ case 0: if( ebuf ) xfree(ebuf); break; case 1: if( abuf ) xfree(abuf); break; case 2: if( pbuf->region ) xfree(pbuf->region); if( pbuf->x ) xfree(pbuf->x); if( pbuf->y ) xfree(pbuf->y); if( pbuf->pi ) xfree(pbuf->pi); if( pbuf->pha ) xfree(pbuf->pha); if( pbuf->time ) xfree(pbuf->time); if( pbuf->dx ) xfree(pbuf->dx); if( pbuf->dy ) xfree(pbuf->dy); if( pbuf ) xfree(pbuf); break; } } if( ofun ) FunClose(ofun); FunClose(fun); return(0); } funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/files.html000066400000000000000000000566031256243640000232450ustar00rootroot00000000000000 Funtools Data Files

FunFiles: Funtools Data Files

Summary

This document describes the data file formats (FITS, array, raw events) as well as the file types (gzip, socket, etc.) supported by Funtools.

Description

Funtools supports FITS images and binary tables, and binary files containing array (homogeneous) data or event (heterogeneous) data. IRAF-style brackets are appended to the filename to specify various kinds of information needed to characterize these data:

  file[ext|ind|ARRAY()|EVENTS(),section][filters]
  or
  file[ext|ind|ARRAY()|EVENTS(),section,filters]
where:
  • file is the Funtools file name
  • ext is the FITS extension name
  • ind is the FITS extension number
  • ARRAY() is an array specification
  • EVENTS() is an event specification
  • section is the image section specification
  • filters are spatial region and table (row) filters

Supported Data Formats

Funtools programs (and the underlying libraries) support the following data file formats:

  • FITS images (and image extensions)
  • FITS binary tables
  • binary files containing an array of homogeneous data
  • binary files containing events, i.e. records of heterogeneous data
  • column-based text files, which are documented here
  • non-disk files and lists of files
Information needed to identify and characterize the event or image data can be specified on the command line using IRAF-style bracket notation appended to the filename:
  foo.fits                              # open FITS default extension
  image.fits[3]                         # open FITS extension #3
  events.fits[EVENTS]                   # open EVENTS extension
  array.file[ARRAY(s1024)]              # open 1024x1024 short array
  events.file[EVENTS(x:1024,y:1024...)] # open non-FITS event list
Note that in many Unix shells (e.g., csh and tcsh), filenames must be enclosed in quotes to protect the brackets from shell processing.

FITS Images and Binary Tables

When FunOpen() opens a FITS file without a bracket specifier, the default behavior is to look for a valid image in the primary HDU. In the absence of a primary image, Funtools will try to open an extension named either EVENTS or STDEVT, if one of these exists. This default behavior supports both FITS image processing and standard X-ray event list processing (which, after all, is what we at SAO/HEAD do).

In order to open a FITS binary table or image extension explicitly, it is necessary to specify either the extension name or the extension number in brackets:

  foo.fits[1]                      # open extension #1: the primary HDU
  foo.fits[3]                      # open extension #3 of a FITS file
  foo.fits[GTI]                    # open GTI extension of a FITS file
The ext argument specifies the name of the FITS extension (i.e. the value of the EXTENSION header parameter in a FITS extension), while the index specifies the value of the FITS EXTVER header parameter. Following FITS conventions, extension numbers start at 1.

When a FITS data file is opened for reading using FunOpen(), the specified extension is automatically located and is used to initialize the Funtools internal data structures.

Non-FITS Raw Event Files

In addition to FITS tables, Funtools programs and libraries can operate on non-FITS files containing heterogeneous event records. To specify such an event file, use:
  • file[EVENTS(event-spec)]
  • file[EVENTS()]
where event-spec is a string that specified the names, data types, and optional image dimensions for each element of the event record:
  • [name]:[n][type]:[(lodim:)hidim]

Data types follow standard conventions for FITS binary tables, but include two extra unsigned types ('U' and 'V'):

  • B -- unsigned 8-bit char
  • I -- signed 16-bit int
  • J -- signed 32-bit int
  • K -- signed 64-bit int
  • E -- 32-bit float
  • D -- 64-bit float
  • U -- unsigned 16-bit int
  • V -- unsigned 32-bit int
An optional integer value n can be prefixed to the type to indicate that the element is an array of n values. For example:
  foo.fits[EVENTS(x:I,y:I,status:4J)]
defines x and y as 16-bit ints and status as an array of 4 32-bit ints.

Furthermore, image dimensions can be attached to the event specification in order to tell Funtools how to bin the events into an image. They follow the conventions for the FITS TLMIN/TLMAX keywords. If the low image dimension is not specified, it defaults to 1. Thus:

  • RAWX:J:1:100
  • RAWX:J:100
both specify that the dimension of this column runs from 1 to 100.

NB: it is required that all padding be specified in the record definition. Thus, when writing out whole C structs instead of individual record elements, great care must be taken to include the compiler-added padding in the event definition.

For example, suppose a FITS binary table has the following set of column definitions:

  TTYPE1  = 'X                 ' / Label for field
  TFORM1  = '1I                ' / Data type for field
  TLMIN1  =                    1 / Min. axis value
  TLMAX1  =                   10 / Max. axis value
  TTYPE2  = 'Y                 ' / Label for field
  TFORM2  = '1I                ' / Data type for field
  TLMIN2  =                    2 / Min. axis value
  TLMAX2  =                   11 / Max. axis value
  TTYPE3  = 'PHA               ' / Label for field
  TFORM3  = '1I                ' / Data type for field
  TTYPE4  = 'PI                ' / Label for field
  TFORM4  = '1J                ' / Data type for field
  TTYPE5  = 'TIME              ' / Label for field
  TFORM5  = '1D                ' / Data type for field 
  TTYPE6  = 'DX                ' / Label for field
  TFORM6  = '1E                ' / Data type for field
  TLMIN6  =                    1 / Min. axis value
  TLMAX6  =                   10 / Max. axis value
  TTYPE7  = 'DY                ' / Label for field
  TFORM7  = '1E                ' / Data type for field
  TLMIN7  =                    3 / Min. axis value
  TLMAX7  =                   12 / Max. axis value
An raw event file containing these same data would have the event specification:
  EVENTS(X:I:10,Y:I:2:11,PHA:I,PI:J,TIME:D,DX:E:10,DY:E:3:12)

If no event specification string is included within the EVENTS() operator, then the event specification is taken from the EVENTS environment variable:

  setenv EVENTS "X:I:10,Y:I:10,PHA:I,PI:J,TIME:D,DX:E:10,DY:E:10"

In addition to knowing the data structure, it is necessary to know the endian ordering of the data, i.e., whether or not the data is in bigendian format, so that we can convert to the native format for this platform. This issue does not arise for FITS Binary Tables because all FITS files use big-endian ordering, regardless of platform. But for non-FITS data, big-endian data produced on a Sun workstation but read on a Linux PC needs to be byte-swapped, since PCs use little-endian ordering. To specify an ordering, use the bigendian= or endian= keywords on the command-line or the EVENTS_BIGENDIAN or EVENTS_ENDIAN environment variables. The value of the bigendian variables should be "true" or "false", while the value of the endian variables should be "little" or "big".

For example, a PC can access data produced by a Sun using:

  hrc.nepr[EVENTS(),bigendian=true]
or
  hrc.nepr[EVENTS(),endian=big]
or
  setenv EVENTS_BIGENDIAN true
or
  setenv EVENTS_ENDIAN big
If none of these are specified, the data are assumed to follow the format for that platform and no byte-swapping is performed.

Non-FITS Array Files

In addition to FITS images, Funtools programs and libraries can operate on non-FITS files containing arrays of homogeneous data. To specify an array file, use:
  • file[ARRAY(array-spec)]
  • file[ARRAY()]
where array-spec is of the form:
  • [type][dim1][.dim2][:skip][endian]
and where [type] is:
  • b (8-bit unsigned char)
  • s (16-bit short int)
  • u (16-bit unsigned short int)
  • i (32-bit int)
  • r,f (32-bit float)
  • d (64-bit float)

The dim1 specification is required, but dim2 is optional and defaults to dim1. The skip specification is optional and defaults to 0. The optional endian specification can be 'l' or 'b' and defaults to the endian type for the current machine.

If no array specification is included within the ARRAY() operator, then the array specification is taken from the ARRAY environment variable. For example:

  foo.arr[ARRAY(r512)]          # bitpix=-32 dim1=512 dim2=512
  foo.arr[ARRAY(r512.400)]      # bitpix=-32 dim1=512 dim2=400
  foo.arr[ARRAY(r512.400])      # bitpix=-32 dim1=512 dim2=400
  foo.arr[ARRAY(r512.400:2880)] # bitpix=-32 dim1=512 dim2=400 skip=2880
  foo.arr[ARRAY(r512l)]         # bitpix=-32 dim1=512 dim2=512 endian=little
  setenv ARRAY "r512.400:2880"
  foo.arr[ARRAY()]              # bitpix=-32 dim1=512 dim2=400 skip=2880

Specifying Image Sections

Once a data file (and possibly, a FITS extension) has been specified, the next (optional) part of a bracket specification can be used to select image section information, i.e., to specify the x,y limits of an image section, as well as the blocking factor to apply to that section. This information can be added to any file specification but only is used by Funtools image processing routines.

The format of the image section specification is one of the following:

  • file[xy0:xy1,block]
  • file[x0:x1,y0:y1,block]
  • file[x0:x1,*,block]
  • file[*,y0:y1,block]
  • file[*,block]
where the limit values can be ints or "*" for default. A single "*" can be used instead of val:val, as shown. Note that blocking is applied to the section after it is extracted.

In addition to image sections specified by the lo and hi x,y limits, image sections using center positions can be specified:

  • file[dim1@xcen,dim2@ycen]
  • file[xdim2@xcen@ycen]
  • file[dim1@xcen,dim2@ycen,block]
  • file[dim@xcen@ycen,block]
Note that the (float) values for dim, dim1, dim2, xcen, ycen must be specified or else the expression does not make sense!

In all cases, block is optional and defaults to 1. An 's' or 'a' can be appended to signify "sum" or "average" blocking (default is "sum"). Section specifications are given in image coordinates by default. If you wish to specify physical coordinates, add a 'p' as the last character of the section specification, before the closing bracket. For example:

  • file[-8:-7,-8:-7p]
  • file[-8:-7,-8:-7,2p]
A section can be specified in any Funtools file name. If the operation to be applied to that file is an imaging operation, then the specification will be utilized. If the operation is purely a table operation, then the section specification is ignored.

Do not be confused by:

  foo.fits[2]
  foo.fits[*,2]
The former specifies opening the second extension of the FITS file. The latter specifies application of block 2 to the image section.

Note that the section specification must come after any of FITS ext name or ind number, but all sensible defaults are supported:

  • file[ext]
  • file[ext,index]
  • file[index]
  • file[ext,section]
  • file[ext,index,section]
  • file[index,section]
  • file[section]

Binning FITS Binary Tables and Non-FITS Event Files

If a FITS binary table or a non-FITS raw event file is to be binned into a 2D image (e.g., using the funimage program), it is necessary to specify the two columns to be used for the binning, as well as the dimensions of the image. Funtools first looks for a specifier of the form:
 bincols=([xnam[:tlmin[:tlmax:[binsiz]]]],[ynam[:tlmin[:tlmax[:binsiz]]]])
in bracket syntax, and uses the column names thus specified. The tlmin, tlmax, and binsiz specifiers determine the image binning dimensions using:
  dim = (tlmax - tlmin)/binsiz     (floating point data)
  dim = (tlmax - tlmin)/binsiz + 1 (integer data)
These tlmin, tlmax, and binsiz specifiers can be omitted if TLMIN, TLMAX, and TDBIN header parameters are present in the FITS binary table header, respectively. If only one parameter is specified, it is assumed to be tlmax, and tlmin defaults to 1. If two parameters are specified, they are assumed to be tlmin and tlmax. For example, to bin an HRC event list columns "VPOS" and "UPOS", use:
  hrc.nepr[bincols=(VPOS,UPOS)]
or
  hrc.nepr[bincols=(VPOS:49152,UPOS:4096)]
Note that you can optionally specify the dimensions of these columns to cover cases where neither TLMAX keywords are defined in the header. If either dimension is specified, then both must be specified.

You can set the FITS_BINCOLS or EVENTS_BINCOLS environment variable as an alternative to adding the "bincols=" specifier to each file name for FITS binary tables and raw event files, respectively. If no binning keywords or environment variables are specified, or if the specified columns are not in the binary table, the Chandra parameters CPREF (or PREFX) are searched for in the FITS binary table header. Failing this, columns named "X" and "Y" are sought. If these are not found, the code looks for columns containing the characters "X" and "Y". Thus, you can bin on "DETX" and "DETX" columns without specifying them, if these are the only column names containing the "X" and "Y" characters.

Ordinarily, each event or row contributes one count to an image pixel during the 2D binning process. Thus, if five events all have the same (x,y) position, the image pixel value for that position will have a value of five. It is possible to specify a variable contribution for each event by using the vcol=[colname] filter spec:

 vcol=[colname]
The vcol colname is a column containing a numeric value in each event row that will be used as the contribution of the given event to its image pixel. For example, consider an event file that has the following content:
  x:e:4    y:e:4    v:e
  ------   ------   ----
  1        1        1.0
  2        2        2.0
  3        3        3.0
  4        4        0.0
  1        1        1.0
  2        2        2.0
  3        3        3.0
  4        4        4.0
There are two events with x,y value of (1,1) so ordinarily a 2D image will have a value of 2 in the (1,1) pixel. If the v column is specified as the value column:
  foo.fits'[vcol=v]'
then each pixel will contain the additive sum of the associated (x,y) column values from the v column. For example, image pixel (1,1) will contain 1. + 1. = 2, image pixel (2,2) will contain (2 + 2) = 4, etc.

An important variation on the use of a value column to specify the contribution an event makes to an image pixel is when the value column contains the reciprocal of the event contribution. For this case, the column name should be prefixed with a / (divide sign) thus:

  foo.fits'[vcol=/v]'
Each image pixel value will then be the sum of the reciprocals of the value column. A zero in the value column results in NaN (not a number). Thus, in the above example, image pixel (1.1) will contain 1/1 + 1/1 = 2, image pixel (2,2) will contain (1/2 + 1/2) = 1, etc. Image pixel (4,4) will contain (1/0 + 1/4) = NaN.

You can set the FITS_VCOL or EVENTS_VCOL environment variable as an alternative to adding the "vcol=" specifier to each file name for FITS binary tables and raw event files, respectively.

Finally, when binning events, the data type of the resulting 2D image must be specified. This can be done with the "bitpix=[n]" keyword in the bracket specification. For example:

  events.fits[bincols=(VPOS,UPOS),bitpix=-32]
will create a floating point image binned on columns VPOS and UPOS. If no bitpix keyword is specified, bitpix=32 is assumed. As with bincols values, you also can use the FITS_BITPIX and EVENTS_BITPIX environment variables to set this value for FITS binary tables and raw event files, respectively.

The funimage program also allows you to create a 1D image projection along any column of a table by using the bincols=[column] filter specification and specifying a single column. For example, the following command projects a 1D image along the chipx column of a table:

  funimage ev.fits'[bincols=chipx]' im.fits
See funimage for more information about creating 1D and 2D images.

Finally, please note that Funtools supports most FITS standards. We will add missing support as required by the community. In general, however, we do not support non-standard extensions. For example, we sense the presence of the binary table 'variable length array' proposed extension and we pass it along when copying and filtering files, but we do not process it. We will add support for new standards as they become official.

Table and Spatial Region Filters

Note that, in addition extensions and image sections, Funtools bracket notation can be used to specify table and spatial region filters. These filters are always placed after the image section information. They can be specified in the same bracket or in a separate bracket immediately following:

  • file[ext|ind|ARRAY()|EVENTS(),section][filters]
  • file[ext|ind|ARRAY()|EVENTS(),section,filters]
where:
  • file is the Funtools file name
  • ARRAY() is an array specification
  • EVENTS() is an event list specification
  • ext is the FITS extension name
  • ind is the FITS extension number
  • section is the image section to extract
  • filters are spatial region and table (row) filters to apply
The topics of table and region filtering are covered in detail in:

Disk Files and Other Supported File Types

The specified file usually is an ordinary disk file. In addition, gzip'ed files are supported in Funtools: gzip'ed input files are automatically uncompressed as they are read, and gzip'ed output files are compressed as they are written. NB: if a FITS binary table is written in gzip format, the number of rows in the table will be set to -1. Such a file will work with Funtools programs but will not work with other FITS programs such as ds9.

The special keywords "stdin" and "stdout" designate Unix standard input and standard output, respectively. The string "-" (hyphen) will be taken to mean "stdin" if the file is opened for reading and "stdout" if the file is opened for writing.

A file also can be an INET socket on the same or another machine using the syntax:

  machine:port
Thus, for example:
  karapet:1428
specifies that I/O should be performed to/from port 1428 on the machine karapet. If no machine name is specified, the default is to use the current machine:
  :1428
This means to open port 1428 on the current machine. Socket support allows you to generate a distributed pipe:
  on karapet:       funtask1 in.fits bynars:1428
  on bynars:        funtask2 :1428 out.fits
The socket mechanism thus supports simple parallel processing using process decomposition. Note that parallel processing using data decomposition is supported via the section specifier (see below), and the row# specifier, which is part of Table Filtering.

A file also can be a pointer to shared memory using the syntax:

  shm:[id|@key][:size]
A shared memory segment is specified with a shm: prefix, followed by either the shared memory id or the shared memory key (where the latter is prefixed by the '@' character). The size (in bytes) of the shared memory segment can then be appended (preceded by the ':' character). If the size specification is absent, the code will attempt to determine the length automatically. If the open mode contains the string "w+", then the memory segment will be created if it does not exist. (It also will be released and deleted when the file is closed.) In the case where a memory segment is being created, the length of the segment is required.

A file also can be Unix piped command (i.e. a program to run) using the syntax:

  "pipe: command arg1 ... argn"
The output from the command must be a valid FITS file. It is important to use quotes to protect spaces so that command arguments are passed correctly. A silly example is:
  fundisp "pipe: funtable 'foo.fits[cir 512 512 .1]' stdout"
This seemed like a good idea at the time ...

Lists of Files

Funtools also will process a list of files as a single file using the syntax:

  "list: file1 file2 ... filen"
The files in the list are separated by whitespace. Any of the above file types can be used. For example, if two files, foo1.fits and foo2.fits, are part of the same observation, they can be processed as a single file (using their own filters):
  fundisp "list: foo1.fits[cir(512,512,10)] foo2.fits[cir(511,511,10)]"
         X        Y      PHA       PI                  TIME       DX       DY
  -------- -------- -------- -------- --------------------- -------- --------
       512      512        6        7     79493997.45854475      578      574
       512      512        8        9     79494575.58943175      579      573
       512      512        5        6     79493631.03866175      578      575
       512      512        5        5     79493290.86521725      578      575
       512      512        8        9     79493432.00990875      579      573
       511      511        5        5     79488631.09462625      580      575
       511      511       10       11     79488780.60006675      580      573
       511      511        4        4     79494562.35474326      580      575
       511      511        6        6     79488203.01561825      580      575
       511      511        6        6     79488017.99730176      580      575
       511      511        4        4     79494332.45355175      580      575
       511      511        9       10     79492685.94014275      581      574
       511      511        5        5     79487708.71298325      580      575
       511      511        8        9     79493719.00160225      581      573
Again, note that it is important to avoid spaces in the filters because the list separator also is whitespace. To protect whitespace in a filter, enclose the file specification in quotes:
  fundisp "list: 'foo1.fits[cir 512 512 .1]' foo2.fits[cir(511,511,.1)]" 

Go to Funtools Help Index

Last updated: February 15, 2006
funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/filters.html000066400000000000000000000244651256243640000236140ustar00rootroot00000000000000 Table Filtering

Funfilters: Filtering Rows in a Table

Summary

This document contains a summary of the user interface for filtering rows in binary tables.

Description

Table filtering allows a program to select rows from an table (e.g., X-ray event list) by checking each row against one or more expressions involving the columns in the table. When a table is filtered, only valid rows satisfying these expressions are passed through for processing.

A filter expression is specified using bracket notation appended to the filename of the data being processed:

  foo.fits[pha==1&&pi==2]
It is also possible to put region specification inside a file and then pass the filename in bracket notation:
  foo.fits[@my.reg]
Filters must be placed after the extension and image section information, when such information is present. The correct order is:
  • file[fileinfo,sectioninfo][filters]
  • file[fileinfo,sectioninfo,filters]
where:
  • file is the Funtools file name
  • fileinfo is an ARRAY, EVENT, FITS extension, or FITS index
  • sectioninfo is the image section to extract
  • filters are spatial region and table (row) filters to apply
See Funtools Files for more information on file and image section specifications.

Filter Expressions

Table filtering can be performed on columns of data in a FITS binary table or a raw event file. Table filtering is accomplished by means of table filter specifications. An table filter specification consists of one or more filter expressions Filter specifications also can contain comments and local/global processing directives.

More specifically, a filter specification consist of one or more lines containing:

  # comment until end of line
  # include the following file in the table descriptor
  @file
  # each row expression can contain filters separated by operators
  [filter_expression] BOOLOP [filter_expression2], ...
  # each row expression can contain filters separated by the comma operator
  [filter_expression1], [filter_expression2], ...
  # the special row# keyword allows a range of rows to be processed
  row#=m:n
  # or a single row
  row#=m
  # regions are supported -- but are described elsewhere
  [spatial_region_expression]

A single filter expression consists of an arithmetic, logical, or other operations involving one or more column values from a table. Columns can be compared to other columns, to header values, or to numeric constants. Standard math functions can be applied to columns. Separate filter expressions can be combined using boolean operators. Standard C semantics can be used when constructing expressions, with the usual precedence and associativity rules holding sway:

  Operator                                Associativity
  --------                                -------------
  ()                                      left to right
  !! (logical not)                        right to left
  !  (bitwise not) - (unary minus)        right to left
  *  /                                    left to right
  +  -                                    left to right
  < <= > >=                               left to right
  == !=                                   left to right
  &  (bitwise and)                        left to right
  ^  (bitwise exclusive or)               left to right
  |  (bitwise inclusive or)               left to right
  && (logical and)                        left to right
  || (logical or)                         left to right
  =                                       right to left
For example, if energy and pha are columns in a table, then the following are valid expressions:
  pha>1
  energy == pha
  (pha>1) && (energy<=2)
  max(pha,energy)>=2.5

Comparison values can be integers or floats. Integer comparison values can be specified in decimal, octal (using '0' as prefix), hex (using '0x' as prefix) or binary (using '0b' as prefix). Thus, the following all specify the same comparison test of a status mask:

  (status & 15) == 8           # decimal
  (status & 017) == 010        # octal
  (status & 0xf) == 0x8        # hex
  (status & 0b1111) == 0b1000  # binary

The special keyword row# allows you to process a range of rows. When row# is specified, the filter code skips to the designated row and only processes the specified number of rows. The "*" character can be utilized as the high limit value to denote processing of the remaining rows. Thus:

  row#=100:109
processes 10 rows, starting with row 100 (counting from 1), while:
  row#=100:*
specifies that all but the first 99 rows are to be processed.

Spatial region filtering allows a program to select regions of an image or rows of a table (e.g., X-ray events) using simple geometric shapes and boolean combinations of shapes. For a complete description of regions, see Spatial Region Filtering.

Separators Also Are Operators

As mentioned previously, multiple filter expressions can be specified in a filter descriptor, separated by commas or new-lines. When such a comma or new-line separator is used, the boolean AND operator is automatically generated in its place. Thus and expression such as:

  pha==1,pi=2:4
is equivalent to:
  (pha==1) && (pi>=2&&pi<=4)

[Note that the behavior of separators is different for filter expressions and spatial region expressions. The former uses AND as the operator, while the latter user OR. See Combining Region and Table Filters for more information about these conventions and how they are treated when combined.]

Range Lists

Aside from the standard C syntax, filter expressions can make use of IRAF-style range lists which specify a range of values. The syntax requires that the column name be followed by an '=' sign, which is followed by one or more comma-delimited range expressions of the form:

  col = vv              # col == vv in range
  col = :vv             # col <= vv in range
  col = vv:             # col >= vv in range
  col = vv1:vv2         # vv1 <= col <= vv2 in range
The vv's above must be numeric constants; the right hand side of a range list cannot contain a column name or header value.

Note that, unlike an ordinary comma separator, the comma separator used between two or more range expressions denotes OR. Thus, when two or more range expressions are combined with a comma separator, the resulting expression is a shortcut for more complicated boolean logic. For example:

  col = :3,6:8,10:
is equivalent to:
  (col<=3) || (col>=6 && col <=8) || (col >=10)
Note also that the single-valued rangelist:
  col = val
is equivalent to the C-based filter expression:
  col == val
assuming, of course, that val is a numeric constant.

Math Operations and Functions

It is permissible to specify C math functions as part of the filter syntax. When the filter parser recognizes a function call, it automatically includes the math.h and links in the C math library. Thus, it is possible to filter rows by expressions such as these:

  • (pi+pha)>(2+log(pi)-pha)
  • min(pi,pha)*14>x
  • max(pi,pha)==(pi+1)
  • feq(pi,pha)
  • div(pi,pha)>0
The function feq(a,b) returns true (1) if the difference between a and b (taken as double precision values) is less than approximately 10E-15. The function div(a,b) divides a by b, but returns NaN (not a number) if b is 0. It is a safe way to avoid floating point errors when dividing one column by another.

Include Files

The special @filename directive specifies an include file containing filter expressions. This file is processed as part of the overall filter descriptor:

  foo.fits[pha==1,@foo]

Header Parameters

The filter syntax supports comparison between a column value and a header parameter value of a FITS binary tables (raw event files have no such header). The header parameters can be taken from the binary table header or the primary header. For example, assuming there is a header value MEAN_PHA in one of these headers, you can select photons having exactly this value using:

  • pha==MEAN_PHA

Examples

Table filtering is more easily described by means of examples. Consider data containing the following table structure:

  • double TIME
  • int X
  • int Y
  • short PI
  • short PHA
  • int DX
  • int DY

Tables can be filtered on these columns using IRAF/QPOE range syntax or any valid C syntax. The following examples illustrate the possibilities:

pha=10
pha==10
select rows whose pha value is exactly 10

pha=10:50
select rows whose pha value is in the range of 10 to 50

pha=10:50,100
select rows whose pha value is in the range of 10 to 50 or is equal to 100

pha>=10 && pha<=50
select rows whose pha value is in the range of 10 to 50

pi=1,2&&pha>3
select rows whose pha value is 1 or 2 and whose pi value is 3

pi=1,2 || pha>3
select rows whose pha value is 1 or 2 or whose pi value is 3

pha==pi+1
select rows whose pha value is 1 less than the pi value

(pha==pi+1) && (time>50000.0)
select rows whose pha value is 1 less than the pi value and whose time value is greater than 50000

(pi+pha)>20
select rows in which the sum of the pi and pha values is greater than 20

pi%2==1
select rows in which the pi value is odd

Currently, integer range list limits cannot be specified in binary notation (use decimal, hex, or octal instead). Please contact us if this is a problem.

Go to Funtools Help Index

Last updated: November 17, 2005
funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/funcalc.sed000066400000000000000000000004751256243640000233610ustar00rootroot00000000000000# cc 2>&1 | sed -n -f funauto.sed # Linux gcc (and others) s/.*`\([^)]*\)' undeclared (first use in this function).*/\1/p # Solaris cc s/.*undefined symbol: \([^)]*\)/\1/p # Dec Alpha/OSF cc s/.*In this statement, "\([^)]*\)" is not declared.*/\1/p # SGI cc s/.*The identifier "\([^)]*\)" is undefined.*/\1/p funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/funtools.ds9000066400000000000000000000062241256243640000235410ustar00rootroot00000000000000# # Analysis command descriptions: # menu label/description # file templates for this command (* for all files) # "menu" (add to menu) |"bind" (bind to key) # analysis command line # hmenu Funtools # 1D histogram params for a table param thist column entry "Enter column name to histogram" pi "(histo)" bins entry "Enter [min:max:]bins" 0 "('0' for default number of bins)" norm checkbox "Normalize by binsize?" 0 end # 1D histogram params for an image param ihist bins entry "Enter [min:max:]bins" 0 "('0' for default number of bins)" end # Light Curve params param ltc bins entry "Enter [min:max:]bins" 0 "('0' for default number of bins)" norm checkbox "Normalize by time?" 0 end Funtools Overview * menu echo "Funtools Tasks in DS9\r\rThe tasks in this section of the Analysis menu utilize the Funtools programs\r'funcnts' and 'funhist'. With the exceptions noted below, they all work off the \roriginal disk-based FITS file. The funcnts-based tasks (radial profile, counts\rin regions) present their results using WCS units, if the appropriate info is\rpresent in the FITS header. \r\rFor situations where a disk file is not available (e.g., image data generated\rby a program and sent to DS9's 'fits' XPA access point), alternate versions of\rthe radial profile and counts in regions tasks are offered that work from DS9's\rinternal image data. In these two cases, results are presented in pixels. Aside\rfrom the units, the results should be identical to the file-based results.\r\rFor more sophisticated analysis, please consider using the underlying Funtools\rtasks directly. These are documented at:\r\r http://hea-www.harvard.edu/RD/funtools/programs.html\r\r" | $text Radial Profile Plot (annulus regions; options: none) * menu funds9 funcnts_plot "$xpa" "$filename" "$regions(source,,)" "$regions(background,,)" | $plot(stdin) Histogram Plot (any column; options: column name, number of bins) * menu $param(thist); funds9 funhist_plot "$xpa" "$filename[$regions]" "$norm" "$column" "$bins" | $plot(stdin) Light Curve Plot ("time" column; options: number of bins) * menu $param(ltc); funds9 funhist_plot "$xpa" "$filename[$regions]" "$norm" time "$bins" | $plot(stdin) Energy Spectrum Plot ("pi" column; options: none) * menu funds9 funhist_plot "$xpa" "$filename[$regions]" "0" "pi" "$bins" | $plot(stdin) Counts in Regions (any regions; options: none) * menu funds9 funcnts "$xpa" "$filename" "$regions(source,,)" "$regions(background,,)" | $text Column Histogram (any column; options: colname, bins) * menu $param(thist); funds9 funhist "$xpa" "$filename[$regions]" "$norm" "$column" "$bins" | $text Image Histogram (options: bins) * menu $param(ihist); $data | funhist "stdin[$regions]" xy "$bins" | $text --- Radial Profile Plot in Pixels using DS9's Internal Image Data (annulus regions) * menu $data | funcnts -rpG stdin $regions(source,,) $regions(background,,) | funcnts.plot -file "$filename" ds9 | $plot(stdin) Counts in Regions in Pixels using DS9's Internal Image Data (any regions) * menu $data | funcnts -rp stdin $regions(source,,) $regions(background,,) | $text --- end funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/funtools.pdf000066400000000000000000015515231256243640000236230ustar00rootroot00000000000000%PDF-1.4 %Çì¢ 243 0 obj <> stream xœå[M“ܶ½Ï¯@é’u•–Æ r/.E²¥R‰m­Ë‡T\v‡Ö 9&9»Zßä_žn|C§²Œ+‘œrÉBD÷ð¼Æ@?Z0Bñ?÷wwØ|þ-—%¹›7”üþÜm~Ü0ó quòûkóZE˜"×·Û–ÅHU7äú°¹øê4,㸟¯ÈW¯¯ßïf=Íä/ZoÉ5>þìú‡äúÏ›‹7§Ã¡?ûq©cè’³B™êë]?“íØzX”—&×íÍ^“ñ–¼‡žÏävœˆYçÌãs‘^é¹›úãÒÃ/Eó.žc¤–<;ôCh÷äæôxÙÏlgöý͈I;lÉié÷ýòHŽm÷¶½Ód«ïõ~ 0hÎ’YïugîOó™¶7¾FÏ‘å‹UŒ‚šSÎ%þêa> stream xœí[w7Ž€ßõ+ê1óà ï¿Ù¹­÷Ìn2¶Î¾ì™‡¶T¶{#u{Z­8yœýå ªIT››ìœÉ¤‰† ›_³’UùǤf=)ü½^\Ÿ}úÜ8?½¾9SÓWðÿ×gÿ8ÓåO&z¹¸žžž—?‹“ÖÓù«³ÚWOÞÚ)d3§éüúì“ù/çÿsöHgÕt~ùàÞ0Úó>à;_œŸýí,Lïà qöðYƒ›ítÝå˜g—á‹ò~Öä¬Á„VNµöü­qsÒ]©ÍЕÄbÿšd—gø²{gºåÒÆ¿mnIIAµ®2拳7g/δöØ_Gø &Ä8§TÅ+Pþüq3bÜŸL/ÞìÇéóíëÃrs³Ýï&øçÅíËÃþö¸Ý-•ÅeæJØnM`hŽYÄðõár9G&øÙèé‘v³ùÝ‘ú£¼a²?»’Œ N6P'—½ÚP7e¥–»’X,w¨“ŠÔ1;¶\Ûꦤ ZW³„:FŸ!Y7{SÅPÇ4‡Ôgûë·Û«íîõ´Ù]v‚«}ÛÜ€À¼Ê]²³+–šË¿nwߢCtfákõÐçcÂØÀÀ;z#ÅLÓý€iB¦Ò˜6eå»’X,wLL!Óà [®miSRP­«ŒYb,~c,ü­â LaJw…™ó7Ëôåíî¸ß_ÝLÏ—WËaÙ]È·8òì×C´Ê¯ñ –f?øþ7øe\U_VÁÅ,ù‡‹«Î¡M§äy›ò¼·y>x棶yMYÑâ®$Ë<_²$ÏkÕ-—¶ ¯))¨ÖUÆ,ÉsY#)ä9è*® Ï+à»ä}sØ¿>l®¯qúz…Å©m1X£ü¬ÌšÀÒœÑÇñ›Ýíæª^ú]˜•ý 'Mü93©©“jRu›C%•d§uÁÍÄŠŒHTkOÆUØšÒš¡k«eük’“.¸µÎ6$¶\Ûø·ä¶))ÈÖUÆ|qƒl#ö¯8SaŠ«xON-v«×T ôë·Ëîñ´‡O›NlgÓS.I~#Àãô¿` "ÎìûÕ–fGÃl>ìœTrÔ —Æ»KòÀ¥Išé©mÁeSVð¸+‰Þ \›. ݲ #—MIAµ®2æÎ¥Qµj‚´4ê*®àÒhªX€Äg×›×ËWËññtXއíòÝ2mñ-Y0¡7ËÎÖOyóòµK-€ËÍqC\ÙÍG3ms‚§ÖfÀðÔ63Dµ-ðlÊÊw%Q›O•〧JŽ-×¶À³)kPÜUÆÜñT¡$2‡«¸OH“Àç7·€'Ôñoo§p¢¯Ì®“J³ñk\ƒ%øÒ²pßáŒjöê!Ìÿ ï<Ò>µÎ|Ü_þ~þïe>G%)ó9yI™Ï96¨Ý)ceÁ¨w%1*I™ÏÞKÊ|v¦[vf Œ•Të*cfÊ|6¶$p%ý*Òý!óÙRÑ {¾÷¾i°@ðò‡N\õk9 g›5q€%È@­ˆå°Ws|³áœ?.™4—œ€KÞ3µ-€kÊJw%Ѥ¸¤í\Rª[Vj®))¨ÖUÆÜ‹©T  iª¸‚¸˜©ZÄÎl§¼·™£°P=G¿& °4«b©E¼gÙ?¸ .†SÞBªÕP}ø¨¹ú ¶à­)+PܵŠÕrç-Ä¡ú€›«j Þš’‚Œ²ú`Ë7(G oÀ» U\Á\‰¶óÍË«Óù ÿfzuØ_OI:̓…z"Û51€¥ÙK5Ž#A´¥9ä‡@ÛO.ÔD±PCƒéÝPfxï‡2ÃdŒIm ›²Æ]ItC™á½Ê ïuè–õXf°’‚2²Ì`Ë @—ëÞ°|WèU/3‚rÂ+÷¿ê2µ,üÒ±ÐYXš-Zâ(€Ôæw°NfF׋ç{&3§†šÀ;=ÔÞ® ¨-XjÊ w%Q 5·i¨ ¼\P[°Ô”5(î*cî,YïKš”ÒìCW°dC¯ >Û_Ý^ï^,WËÀtS^§‹òæÍ´Å–:Ô¯ö1±aÉ÷6Ö„†æDD›‹‹å¦.æh(–´û•¹*Ô$¸hÌ:}í)50h58l’|»mm jš²bÁ]I cŽoܘããÛlÙÞÉñ›’‚rCŽß,7jŒ.Éu€/TÙ*® Só‘š'Çíw›ãòxÚPë§É)AÄ“Óð9œY.A:%ã:,›ËOß¶Ç:1éàf¨~뉩ÎCÊÖ¤ê=I¼Öc¯í˜ÄkדøÚD5eE†»’¨Ç$¢ˆR¹'ñµ-ˆjJ J I|³ÜˆR±¤Ï ®(&WqQ¸¼0õ×ýþÛÛ·§«ò ½‚+ÚK¸ÄMÇ7wàêHaÖ´ € ÈÚ ÀÒ‹¥X¿Ìi5¤ßý2wϬ>™áò?dõ±H•êY}m ›²Ö»’‡¬Þå0dõ.;Îê©Ýd%dVÏ– @—MÍêqqÎWñþ‚K®!´’Ñ¿^Ž»ÍŽJÉa+n#Ga†àV†æèz "«2j6þ7Ÿ¼þ߸ÎwXHÜð€‰ÀÍ¥À9<µ;n¬¬s Á*mñìÖŠðÜT(–ZýtŠƒ\ùAì°þ2såɲ±3a¬pðG*!5™+j H›²RÈ]I c…ƒ3ƒ„WCÙ²½Sá4%å‡ §Yn]OM•Ë{‘V0j,××Wû›åñt/?rl =v!Øì×xK³)–ìÝcSvŽ¢†þIg OO¢:GžDuxöDœDuÚóý'Ôî'QYYŽšö®$šáþY¿<‰êTæûO¨ÝO¢²’‚Ròþ¶Ì'QŠe‹CçXÊ#ïgi.NO¡vP‹›Ì^ƒUs6k¼‚¥9KÍóßo®ß^-âgA?O›ÓPX<¾!§¥ziPÛbJiÊ2gô®$¦¡4°9 ¥ÍžKj÷)…•T¥[¦)®Še¹ÞB1ésï?§Øì(;_¾»^¯aR)/ÓnyÇ+tï¶Ç7Óòýöæ8 ]q G‚‡áœ^ Xšu±Ô¢i®OF.¹!q¶xBŒœMgj÷‘ceîJ¢g›Ì8Û¤M·¬ÇÄ™•”‘‰3[n#™kYPK­"®9<û@#ßÖÍãisyICVnŠi{ˆ/·»Ía85~#GÉ ^(VD†pݬRÞ3f!Y¦Å³rÌ¢á,“ÚbÌš² w­bµÜÇ,¤!Ë´!r–Im1fMIA&™e²å6fÁÓÑø€·¯qŘAVPÓ»íõË«ÍîÛÇSyÁm_Z(únsu ßáËåjÿnX/ž-pÓ:¬ ,Á¯ÖŠ`ŽoËÍ›ýÕe­`šy¬þXoà*^Kb³æqK®àä}Ía›Kš°ÀN0ø„Yj2ª5/Î’B„M{#f#:6É×,³‰®ä ½§IlÕÔìµ{¬: ‡:ÊXýl±«Â R㢃uU¼p0±€»1ø¼ ­E1îÙWÌ—Vø*§"Š%r¸m3’…_½ ø¨_'¡å;O³”Z§‡tÖâ± ‘ÎZç8¥vOgYYòÕÞ•D=¤³²(™ÎZ¸R³åÚîé,+kPÜUÆ,ÒY¸ÀÅrç)®Cú*Þ?µ6RRùâöíÛýá¸\Þe¸8ÍŸ1¸«äVùƒÏç‹¥æóËýázs$Ž]˜ýµORüÁßÀK¸iàžÜ0`MÓ{|‘ ‡ÉœÞS[$MY3 îJbÓ{ãÇô¾¼6ËîNzß””Òûf¹%Æ”xUv¯‹´"ßÀÅüJгóN†ãýÒÕ¼aoxÇß _ 3Íßß—>k€ Å?~¼kïaTÛ±Á³ ’Q¼’5’j[0Ú”BîJ¢ ˜¿Fa–í–ÕB¦))(=2ÍrcT¥²%\GЏR¼9¹@óŸûÝ£êóÍ»é‹ï–ÝQZœ$öé!ÞlÖøKðI“ðÛ“ƒ+%êƒÞ˜ºçäêî‚kr«9{öìåýèɳc|P´Â1>ÓÇ£%r.æSHÊÝÇ^tá½½±Á«õ ¼Q Gª =‘ðFËGª¨-àmÊJ'w%Q GªLHÑ*>REmoSÖ ¸«Œ¹Ã<=)Uq¼!PÁƒ¥²;ý×vyw3í_ÉG¦ Ì.½Ñx°|…K°4Çb©¹-·bÜÔ9UÍFл®÷LüÝåãÃð`*ƒ‹8byÀø”[Oí¾<ÀÊRÿ÷®$†áÁTÆ»áÁTÆ[×-ÛñÁT¬¤ œ|0[æåƒÍÁ:Ë&¸ÀVñþËxØ©>åöÅéÅrq,ÅÏj $ö‰K$6¯ñiðÜn±Ôü>½Ú_|;lÏ´ìÌð`&ƒÇ6ä09Çf¢¶¦¦¬ãÀ]I4ÙŒSÙŒÍü`&j‹ajJ ªu•1Ëa²±îV$ƒgwЏb˜àû¯)ÿÓín‡ßVÉÚžÖ’úë/CÆ Ý*¤úOއz!š5ဥÙKIV!èIãC% š~d>”¹GžBÊ'O¸3:p2:p2ø<¢ÆQm B›²"È]IŒÃœŒÃœ .~€µ¡MIAù'¶Ü Õ¶äø1Â:Vq¡õzƒ—ÀíÍ·Sͤȯo–ÃÔ¿lÇ0êÌ‚^]‹ÁÂçÁ½¢1<ŽêDç?¼­TŠÝ ˜}änŒÀ°›aTh»Ôì»ôFݰh›dån†QfØÍ(KUͪw3šŽÂ1b7ƒ­¾ºßŽ˜|ÏŽ|ëÇåЦYØ|Ô Âšm2¼½–+9uw.Ð){:«aÏAgÃ{Ôîs+˽w­bµÌsNqØsÐ)ðžµû\ÀJ 2Ê=¶Ìsöð38HUs¨âýç¼ÌKÅ•½ØìŸì¿5n\Ί¥æj$Üf˜HÔC¸qå¼X¹”ÏL‰¥TûH)ù‹·›ãvs5=_^ãc³ûwVì›æÎÔ‡­òWê #|Þ™€ñ‰JúãÚ8»/Ë''Ƶ Ã…viØ¢Ð.óµûŠ+Ë’YïJb¶(´óÃ…†”°[vã+)(/·(Ø2­¨Á•Y—£0º> stream xœåUÉnA½÷WÔ$Üô¾p$ H(¬Ü'ã‰3Èž!^@ü=ÕÛL¸€ „¢È]]ý^UW¿g?£XøËŸíž¼¾JÃöH¼Çÿ-y&<üÑîáí:³À9¬IÂrÐR‚ñ‚:XïÉ úrý™¬¸ÇÁzóïo™Æ6¸QaëzMn‰o8"c©ÆÛE%ìçØzª<ŽNkÊ=Æž#)gŠ•u‹g…¢ŽÏI.ÐFæp:ÇÊSÿ –ffŽëp¶”ÍÉÜTÖ=·ä‰|"œë€çï ”ãÔ¨î0ùëJ@šJ Wãþ¡úa ëæa×A3là®ÛöãÓS13Õ¶Ø—ÔF&Ê#S©ÿ®ßºÃq.æT¼¸">V ¥ wgæÆ*À V–-q, [” ëE,QdmI ™ Þ֫š–ÈZ*æ\n'ë^[òø“ðhG먉CøØÛn·k†n<§Q(”ÊŠ+*þº³þñÍüä_=©¡ø'¾ð®ñzá]‹R–Ö•wK2™s‚æ02ÏÞ5F/¼k´˜˜ÓºònIæ¦ ´î¹ö®‘á/H­HáÞE÷©äópÇÝ®‡¯ýaöÝpª\˨©ªvŽ*sIUd¢:2•Ê÷Í¡_I¬óJ˜ÿJ°lHæQEãö'ké×Z.4®ñ=‹ÓºÒxI&OÐFæYãZÈ…Æ5g3s\W/ÉÜTÖ=×Wž‡;h#ðË-FH\³ ¤Zâó´"3/…³xñË*iCE`šª]=5ö»·¡Z€ÀŸ„¬œÆ£ÌÃJè`|Á›æx‚ó—Msê6oàC3œ›Ãw0¯@0f2ÞXp.¤¤ø« +mƒ&\Nº%?•” endstream endobj 316 0 obj 664 endobj 324 0 obj <> stream xœXÛŽã6}÷W63Ú\Ý%³ $A²H0ØMvü°€a d‰¶5­‹‡¤ÚíÀ/ž/OIÝÜݹ¸cQ4É:uê°Xôgp˜ ý³Ï¬šýó^ÂNÎø7þßÍ>Ï\=ì#«à»¥Ãr;3s]ˆ]ˆ’E°¬folkÕ4¥„_D³i%¿^~šù,ßÏÞ~h«*§¯ßÌ~XÎ~¥õ³?#ß‹X²€j¶ˆB†aßSÎ>¼ Ä÷bˆ˜“„Þ34¾Ï¼E¢ñlÛ:KË Vóz)¤b'• 6þtЭ-l‹’S«„²¨¨u€z@­v ïŠ:­ø=¬zÂ*kʶªåzMÞig´nâ°$ ?¼s‚¸ï¹Ñ7aÑÂïýà5¢)R …âºÕ”Ôx„’?Hß ¾+šú~ Ðñ–Œy67Âsìh®•„•<*Ûs‰HdÓŠŒ$j‘9ûf`!àÍÃ.ÿhi×móÍY·i­)·a’$,GØ»žÛÀ‡É‚™|SóN#OçùÿÏóOçùÏø†’8Ï߯QRÑ—Dú13”çó̼ ¼7ÿéjŸ‹5¶pP×i^´r•‹7ÿÀ×^FSOãÀcñØQÓq£Ÿ18^t~æ…<Á7¢JµGÚíør$t í¼)Ô¡xúW}…1\D,ŠÆ mÏ(#‡yq=OsÚ¬=<©¥NïŸmFNŸWð‚Ða‘;†g{n„`z‹{t(¢ì!ñOçÓú™Rqû½c7LXèñÙžñ¹ ¢^ó§Ë?u½BḠ&ÛÁö܈ÂqYö,}jŠz’´ JIî½mx÷À³/5qf²ÙbDèÙ˜¨®ç6ˆA3/t;ˆHÔF˜‰áNì9ÌOF§P×s#œØcÑ8ùpšfq­Þ•Ø;Ü®yx÷Óh”Ž|L•í¹ Ò zªTº){Íçùoô¬tD#Ÿ‹ÿå^¼ …¶çF˜Ï¿O jS"¤ÌBZÍ÷æH×è§¥‡ÉÓÔL@ÇU˜­­º:g}Fïm™ªFÀÓ=`Âê˘‘_° 3ñõðOCÆ31Š’É‚7N¯×LåÙôp?jƒ½À¿¯ •\PG[q*-T‡Tê§Ús$¯: í\[ÃBWua)ƒÀ,Õ9C}\J¬3p8 3ô襀J LP»×§‘·ÙMÓm„•æ9=ˆ‚W¥u`gÔ0ü}M«­‚¯¹H:‘59<#|ÍÖzGhþijVá›]ÌPÜ-Ö­ÄsÏÇÔM7±ÇÝNPäÚÜ¢…<¦¢Ð›§€UÏÊTàZ—¼©ß(H[ÕÌm§ŽÖŸ«ã0o,ûul¿ÆúÒó\Ú Ë!àòéX˜,F4E3eÙq€ÀITÞ5¿ÔG›!gw½îˆ$ÚóÎÚÜõ Z4  +M VÈ3‚è·‰I—Z~˜lh¨Ö;Dùii|að“‚c#$lN¸Œâ^Ç“Hév.Ûá,x>òá"¿ÐÔ (^J Ù÷C¸PÔõkq׊·#\Eà¯1?æÈ–¥Bzo!¥Ú7ín²Á½ZT‡F¨Ý–Ø,ñôËR¥g^d›í!•ZX@Ù+¼µèY¤çN_H'vÐÏŒòÙ z{•¥5IDx†ˆ‘zŒ³Ú Îᘞä7¤›8ôÎD–9明Ýk>]"ñJl a>Y ¶ÖÝàU”0×ó;Pæt¼ÓÌ>V-x“˜ÑêÓ™æuãñ‚¹˜Ø­í-¬tš½¶êÓ ŠõØÔ,év+š 㛣­ îðšhE<3ãâ¹´ãÞÇkXíÞð¬ºy¾V^2 ½^!fx“wãÑöïû鿔èZ!yÇÈ(÷^š{ —ù®?b²SÈ5-*AYvàȈp±‘ Îý!E±õc“õB¾†•„x¿:c ‘àŸÛ1áÇÕé ¸JFš “ð5ã¦#©l ×±ˆ5xAÕÿÀNwr2Xâ4{â¼d¨0 KŽìcž<«i Ã|Lz8¦æ<×y´<™Sî9É}:‹v«n82C¶)_ ÆÙmÊ,•èüÉú¯Nt%ÿ¥C Àƒ(¨fxLË–K}Z,6Í™x­óFœ)ÏomdˆäñTÊ^›Fí‡ÀÜQ>ßâê´ÞÌÀ“ö”~E@‘õ·ÝiDB¦ŠG:.&%ô¿%‹®:‹ïÖ úÌK¢K̾çêѬ®ÅõpGãzXóÑlûƒÝ÷É·Äå úÿŸFqs(?Ï ÿ½àä\qQ¡RuÐu&ÂLR7ôÛ•ÙyÝè’Q úšFFT½E¡Ì¹8‰Çµ”w©4ÀëLÝéÆ6·×Sa[ÜxµO´ð(åÇ̯áÄ"qû›Á¯³ß”gä°endstream endobj 325 0 obj 1903 endobj 345 0 obj <> stream xœ¥XÛŽÛ6}÷W ò²`­Š”¬‹ƒH²I±EÚ ‰ÛòÀ•i[….Ž(í®“/ïÊT6Ä-‚y›á™Ãá!©O Bý~‹zöÓ[/`«f!üŠÛÙ§3C€~Šž­Ì°ƒÕffm¤ ’œ¬êÙùSx¼úÇ Kܰ0ÀnŽCWëÙùfh QnóÅçŒÑ wûN*U¶ e1ôR.‹b]{ íô⺒ š5m£JÕ+ÝÞ6Úê¶“ðT/zYËûúèõ´ó8rE0gQÀÍ|í^v8NOÑï$º«†º1Þ´‘™ñó¾E<×ÕU6[@¯û¶ÝnDWj$êKïË~W6ˆÉ‹à:¹‘l ©§·“¾š— j±–з‹ÒÎ(áñÙ”A–X±ÜC‡¾ú{.‚8 sG †L@w–‡n(zP‡¦w÷—éRo†ù/Q#jùñë‰Rð8£¡ ƒmÆâîÂþîwâÂð%,X°…dzì‹^µ˜ ð?ÑɃI»–°–›²‘kÿëŽ=©×âF"å:¦k¹-›F"Ò|ÆÛN#8—•’ºïðµw1ômN®èõáãYd'æìg\HœB£9ìqªvÀ¸0'V»A]ÀsRÞ‰z_É \ou+ö8ÔðÄqyÃØÏG—€w&» SŠÒÁ„EõH”ÄÄ“£bÓVU{kÚ? å¨0aî-z”š}ð÷¥Z’ȧë¡ó8ÌÌ$À€´èñÄ‚Ù-OLö‡ºë•îÒmð3åÎ\l³×zð[ØjÝœMrNû©í–vGDÇ·'ó€üŸIßï¤Ö ÜËžd™šQ-· Y©L§BÁh¿mIC±[õ¨Ök½*£8Z%Öøõ*G}(v¢Ù"¯¸g5Úf­Ã|´ü°Öž?>Òjj ;Õ…×6£|Ø9¸2þõJÓ¦qÝÞàÖÄHqd‡võÐï‡^cµ;ZíeQn¬™°Î.ÏtTeQöÕáG“qyùýt´ý?œ—#Ë_);Ez Ãf-º5¼¼Z½#=¡A/žGM§K›»«—¯ßþn¢y±š½™eq, ã0ˆ « <rÈðbY†õ$Å€2ºb1ËBÔTÆ]CŠW†£¡«¯ÅÌU9ºcp´d|ôjŠèuœÑö2ô±³Í —š!BG†>Ö“ áY¢³ y¶„¯\[}–fóë²7ÌÜã$]$>'iÊ&œ¤ŠÐۢljm °ÉÐՌב“4fNRž^MÑã„úúXOç$µŒ\-ø`‰!¤¤#×ç#a±ÏGÂó IÌr[ôø° 2ºšñ:ò±Èó  \5òj‹Ôgá8Cëé|,Rz üéåˆÇÉç¦í§JôåO1^2=žâ,ð#PŠÈ=žlQA†®f¼Ž<ňÔç)ÆwójŠOÔGpÈÐÇz:Oq$†§ßÆÌ‰øƒ™E¾Üò(žÈ-Nn©è1b(h2tµÈ—[±‰Ür”ÑÑk8•[×Gp˜'·£×SÑImùËË“ÉÄæóÄé s6ª°-z<Ù¢‚ ©f½Ž<±tªÂ,UØ=ž¨Ð¥¾ ;¯§ò„8­æ¼X:z6U+î'MOä7L¦ò¦£üÚ¢G†m xÉÐÕâ‰ü†ÑT~C6ʯ-zdPÁ‰|ùu^O%#d†ŠË%$ñÃT°<ô•—ål¢¼,œòRñH5Øh¡«…¾ò¢§‰ò²,uÊKÅ#®ÏÂq†>Ö“©`FË5/™Pø"í¤Ð¼¶âíYt8èË·>«Õûöäø\‹éÙù>.ì5¹mªÃC÷èñޝvíP™/½ ûº»þz—ýñ˜E¯G;t ïÜz+(õÜݽžoùëJ~ïÝ€/‚¶ëdWí^7coÝ"àM‡_ýè-Ä ¤ÿ°ÀQ²ë𶋈¿zô#ûi˜žôÞwí¶u­ïÉôäÁ0,8±ÃtÛµ8àÈô©ä, à¥ýv1ÏXóŒù_OÜçC‚*ó]ĽÄy’Bfš¤ ̱Aòq7¼™ý ¤„sendstream endobj 346 0 obj 1749 endobj 350 0 obj <> stream xœ¥WmÓFþž_1Š„î‰/¶“89¯-Pò ¡jc¯“m;ØëKÒO½ûå}f½vœ—J9q9ãÙ™gžyfö+ —ücÿ†«ÎÕo8¢EÑÐ/ø¿è|í¸Æ„ìŸpEÏg0󽀦4‹;Õ«..§#Ç£ÙªsImé ݆eÞº¥>™»»«úÉ£úÉㇳ?Í©¹.ûó<öñ¶sY¥H’¥RFéŒæ’Ö2³|%#* •.(N2¡ùÃ:S©&‘+½\I­B‡Þ¤ŠB´YÊ\’^JÚ’H#ÚQ˜%å*-`.^t\ßr!ó¢cUà플²TÒ|G¹ŸÄ޾.ç N©âÁ+r»NT¨4éÝZR±–¡ŠUˆ(³ôšp\ :Ïu&æäC¸®_6€]¿< ÙÅyÄž%Zæ)Žº‘É®Gˆ¡Cá WÐÜTjBй,Љñ¶Êø®)íÁ.ñ‘Å£c‹“ø‡6~”LD‘b¨¸Þ" 9&DYãm£…Ÿ\¢Üy¶é¡.1ꛆ’DRduÆ+IöÁæö¸±=Ο œÉd Ò΢Î%ò¾QYYÓp8p|?p­e¬ kwý! ò<Ÿú‘¬ÏþÓψ:+ùåØu8Ápb=÷ 'ëH|\gì­e*·ú¤Yкcoúý(‡SÇwCvõ­ÇÎõ¯lzŸiî¡Iŧ!N4r[hþh愳í!#¶ì]×N&-$mÁõgd½ÄeŠ$<>ɧ<·)ßžß=ãðFæ;ŠU^q$i¦igÌ8A=N3õöÈ ~ƒLéžœú>  Æ£Vöÿ#·DÜŸZZéÛF@#N’CLÆ^«œ'”sRsÒ÷ÄGÛâX ¦E)rý>"Ad¦ÉÔºÃ$h”JêñáF$*â$ ‡^g9€«u"{üÝ:g£¬Ô$")¡ÑY| [«+Uâ‹Z hǧ7s¡²ê¡³ª1ò‚bã>&.Q+ÔT댸à€ÿ“<½¶°6BÜ÷#tÀ¨$™Íë@n ‰Õ=ê>ˆèAôOÚíUÃbÛ£ª%Ï ÚZvßËM£°V>÷l­ä„Ó.Àóã9&oZçh޼¿%À¬}ó»T‹-V±^Ëôh´VÃó…1<𠣡ÛâA¶fÜEB:Y©ô ¿Åöj®ÒBýÝŸw=*äÌÒÈdn–³ÅD-n»•$ÉXa\ ,›3<0,â誡æÐ¬5çq¦¡sƒ—^f^æõ<»13©²åÅfC‘и+‹ н”[Uf[‡1ojuÌók Ô™ ¬Áww£QíÂÄ# ba›¡î…£•¨gÓnmE]@Ó­ýÕû„(úÆ®Ðu¿6Ì•ç î[böÓ†ãÃ9(òÅã‹ZÈrùµT9à\ÄÜLd?ází[ç²g:¬…ôúÍì#Í^ÿöáÝõÃý¬×fà‰ÌëôqP(£ŠR¢UZ®d®B¸(+‰ª¹yÈsÖ[é,´©;xÓ¥•¼CB°CdPìØÅ2ËQ²T£]ïUm¥7™Í–9Â(NµZ€a*5VÞgíÒgéÑîl‹†/°+,ã7hdù¿cýĺ­Â%vÏJÀ‡#gÚiAÓ\Vè\ömKÔ"À°£±xJ©4LÊí±ßóŽLä n$]42ΟèæR~|¹öî%&¯§îàô%÷ËÙ}㬲ÎËŧ º+]ܵ(Å-i:7â;2XŠ¼ŠŸ3Š’3å½µŒúÃ0êjASŽƒÜñ'vÒŒu¸iQןïÐH{ǽ(̤XìQEvTíÚðSëe²û^wZhF’C2î9ÜŒ €3ÿžwïÕåWÔ–ÅÇ›ølEùfa2-ÌÜx÷ñ¹Ù§¤i0·ÞoñÜ>ôàù޹/Ê7Êh¼;½Þàâ¨eZïáûñgE5V¬ôX wY‰Å©jîâ/µ6oµ–¹*m½c)ˆ5°ÞʰÔõÑ ³¯•²K QU+y’µ<>wsñ¦g?Ý °Š Ž:‹«6Vãi{ñf#»>îïÜj…ßÊÃ6ûáÝ‘­mžÑéJvcc#41Ùù8<Sä9c„ϯfßñó/Xñô¾endstream endobj 351 0 obj 1635 endobj 355 0 obj <> stream xœWÛŽÛF}çWìÀÍ‹D‘³p€l¼6 ,$’‡À-ª¥aB‘ /£Ñ>eæËsªº›¢$¯7³ðešd×¥O:Õó~Hÿ±?ó÷ú§h6§mëôÿ¶Þ^([ÈþÈwôÏ¥l[PÒrãÛ!%Yä§´Üy/wu«IÝëFm5-uwšZµÃ;³Îû¦ÑUGt¯Ê^ßÒ×Ëßà6Ž”±×(dOÿö^o~£î·¿Ÿn£·ô†åͽ2ŸŽO¯#?øÇ×/êµQøid1½´ÀÎbó8AoÞÝýd6ÀY]uEÕk¶=šù‘Äû°¡ª¦ºïö}G›¢Ä1›m¿ãâìí^çŦÐkª+9¼u“8³ÔÏ’(.×ÞËM_åªÌ §X1bEah7!¥ÝNUk*‹JO.ƒ#f½×ò|lêC˧QûašÑ4Œ9uxR¦CSt®|ZÞÁûVoú’ŠŠôþÑm[Ô×MuÔ»}y¤}Sàp6(vôe˪í´Â17´EøFµ-)ªôAûR•7ûû¡Pê>¾};µËðöíÓk÷>|eÑí[·ŒŸ.j¿Y±+WÔè3Æç¦½çèëº_•úÉ|îc›C"ƒ‹oÎYïœõ'g«þ¿G|kùø7L×ÍcÛÁ¦›ÐÍW›?»Ñ¿êfÂHMøŒ¼êyÕ?]3rÄ4„S«ú^£– µ]š+L«º»ã—E^tÔ÷ÚQ5GåÀÕÇMÝк¿ÝÊ~WµOB(Ù™«Vªk÷ô7\ƒØ†¶w5éªíÁ1!*Kff#î[bîá và*Øf€¹sÎçVºì—;]!Kªí51*£Kwâwuje¶í›:“mS8æ¢1$¼Þsƒ"_øȩïëΞ„#óÈ‘×JZ:wcªxÃ'«›µnØ=÷š›K CÜ—m‡ôTã2ô Úrl,.{Ågš.{†U•Ø_ÀÁ°K•mí4ÛObI¶G:Üù«1çb±:‡\RôîÃò#­ŠJ5Gí„À¶Þ鮨iµn‹FP‡'àz4e·ÇÀñ¢ 9VYêË3ŽK(º,­<Ùƒ¬ë †ï=”nmtæÅ«ЧmåüU9wΦÖjjýÛR¨›ß[>*”Ao­¨ò ÐÃÍôĸ“TóÎ)u™ )úŽ+ ÓÐ+KìåÿZz?z ¼Y@‡3ŠÝys 17¥÷ñwx’ñ'"@¸=>¢Ÿsõ´Ì Y]Ì 3 Æà¹4;nu.6¾¥íYý ó»|úY5…0l­óR99‘Æ\é­-ð%þqšøYœ|yÌNÝ®Sv#\E°J•µâ e /ã4 ?¹ü´¼j°S0±çóé[n éžà¢AœÊÀùó(Ÿuò‚.¦¬ëV¦EY×{Ÿ~ÇkÝ©¢l9«›Êæ(,wVðí»z‡/Ì£Oï@éa\a´­1Š© 4ÇÿÍ\õE àYÛ5}ÞIKœÒâ@,s«4ƒl±-> Ã4 q²9“0J©Ÿ.ÌãóHGè3X&–ƒïúê;9ÂG fŠõ­Áwh…8Bãe3—h:ç®ø?2€'&žF),™°?Õ‡÷ˆ¬CÈúê÷ª>T¸[Böž6ÄÉ….]£eŽ‘{÷âڬϦaL‰uÓÔŠŽ¦PÀ¿Ñ]#cjÓ U6Eee匆Wùq±¦ò%ÀÌëó1ñ=¦9“hr)¦³…¿HgϺåŽZ/¯×2ÆÕzmysÑÞa”øó,{–òº{>˜¹Zã=1bšø›R~ωæ£ê˜VÞ«¦k]ãE2 º"i|Œ¢µ½.°~ «Æ½¬ùNô¥ëò¯ƒ‰L¯Oç7`"ß÷M¤m §HNó+sÉļüo÷Ehô8ôùíР) 8§pmÑîq±S)çõÏ)¥Qà–¹—3? #÷bßO†îI¼æž{„s¤v²DáœWYÂëÑ|³éXÃq®¹·ùBó&͛Ű‹üDúv[Ö+U^²(JýE9 ì`U9HèHã…†œOÐ:¨«¹ý‰’7¸ñ@þý“ÙÄã(ƒã¬cc¼¶p˜ådóÂâh Ý“x@ŽƒùÈ‘üú.^Ír²ýfÓ±†ã\Ÿ2Pœ È2C¯0>Ã÷ ÖGš¢ßú¶³öÙi,5¨/1_F‡Y|†p„#:,d9Bؼ° ZC÷$^„Ã$>C8œΫY޶ßl:ÖpœëógvüÞ]Aœá¦dW<P-UñûƒnÜ…ÓröJ3¯À âd n0ÏÀ p: ƒYŽÀ5/,~ÖÐ=‰×Ü ÏÀ ‚tð*˸ö›MÇŽs}>¸A Ð ù®É‹Q4 ?¬¡«~(ºÿ…«u›,(•èiê'iDÓù\üÎØôþþçœnendstream endobj 356 0 obj 1899 endobj 362 0 obj <> stream xœUßoÛ6~÷_q0Ю,Å’;îš°õ¥/ ¼½ { $ÊfK‘*IÉ6гþòÝQ”­$í08±ò~|÷Ýݧ/0˜Ó'<ójró˜.oag'sø€¿»É—IâM <ò ~Þz³5$ lËIï›À:Õ&ï`[MÞl÷Ûs(µ”ú ÔÞn?yÇUp¼ÛÄišû¶˜¼)•3™FCôÅrlüXn­Ð BJ(x.™á°“:cZfË$·ÀTûÌÁ6™ÑŠÆ—>5ÖAÆKm8%‹’t/—)DÉ"N}òõV¬tÜø**&ÔFç”k‘Z×ïBE‹t ÏĆªÿˆ0ž·? {—3€B7Údmú#ÞŽO…îÜjQtÏoJ¼²ûóà=ÜsUô„b‚S›Ü÷Ñ^XÆqŒórq/›0©‘„?ÉÅØpu±Bž;Ñ"D¤ù¯çS‹“´^ Co±Iù>†-&µÎP~[ó\”1f'#l0ê·"òŠâZ¡/ŽèûÓ¬² ;/¤»Â ?÷£Õ/r£œÖ¸@Rd†™SÃ¯È ?²ª–|†,Û¦ê¹aîÛ„šò€ÈÇ ì}RlžU'\W³ÁìF×îÆ×Êä ÞCÏ›6§•ò®ïÁeÓä²lAN°Óèã‹@‘ìsMØ?£e@ô»Åõgf×T\9‹k¢ˆÚë´0ÈuUûò Ìõc†~ A†ŽL#6úJ*1p0nñ^7Ø£\+GâƒÚºôÎÍXÏÚ€  7Ľã;n,ª35"ý¿¤E ¦ ¤ßä&!½RC­µØd‚°*ŸÚ(”df ;ùôdÃrZ}´Âìë´Ð æÑþôøá³êPks£}Ucf."!VA—¯o—ë›á? ”:©ÊjœÜ~³ãÉD×U°»ˆì_ò»gN‹³G?ï®*EÁFWI×}/4Iç9oLôPï<Üû¨¼~=:}ïvÐ=‡ðB__¡ ÒWSàž§ðÄ€Ìw‹jòü=ësª*`, Cý$X-“ j $ (½Sh{ZD ºF͸;pÞ¯¶;èq{i¦#¡jÌÐÇ ]LWk¸óøhº^¡HÍ7ñÒ«Ô-ÉÇ/ÛÉoøù<1œäendstream endobj 363 0 obj 1017 endobj 367 0 obj <> stream xœµUMo7½ëWÌMjm´²µ’Ê@Z¸†ÃmÔs‚‚âr%6»¤Ì+>J¿<3$W–ƒ8Í¥-É™y3ogïa˜å0¤Oúçmïõ|t:†¥í á ËÞ}/&þx ¿•hv2šÀ”u/ºæ0É¡8g#(ÛÞ@íg ‡ƒ~ù¨ƒj­Á*“‰‡þG. ŒóQøeù§þ«ò_„ʦPÞwT¼ê.§Ï—ã.Éx”gE y˜ÒŠÿΨÿ }'âpyNìŒN‰ p«·b$~-> ðV˜¾#ìZ++²‘¬7Éœ ¹6FpÊ· a@×ÀÌÒ·B9‹OÖÌZQeP®%}’0ßίî¶j-ãF#ŒóF¡ܾ¿¹‰ApïÞ ëDµH¹iשּׁD€nd+!iŸó¬yʃŠGO{ŒµàAóHÅøÆIµ©àïË«;‚ZÍ% ‹FªªyÄd5ð•àŸcàžk¯…‹ðXÂïJ8‡Àî^zØÛ®;ÆÖ>om†4X!ªYþ&¶  Ò~ѤÒf脪ž f!jmÄ·Qe½ iÁÅ e¿ ÁaÌéfîv{¨CãÌh]GëüÀÚ¦ªÓé–Bî^Ê ÙÜB•,wp‘bî:…Ä{ñæ% ¢<’>̯ËËæ~ñe‘,©Žøþë’!9s½ùË; ´6Qˆ#ˆÂåõˆ¼½Éà›Æ’u(=O­Æ˜Á)ø -´:ªZV\ +J¤ª¤“Z£˜Ýíw#÷$»„Þ<A AZÛË+ƒ÷¨œ¨V’ÐFǘ–tmWz£H—°ÖM£7ä,¾°v݈¨‹ºˆ¨ƒ‹õŠ_Ãl–VÏy?P ƒÙÞ)õ²[îOä³IÂ8Üy{wu~ ¸»í<I–»×£lxhz;§Äui›’LþJ³{÷Ôóõq/y:.ºã"N¦8ä˪w4XÃGd{ù‰æõa”S¤k<ΓØt|X_ .k)ªØbì+΋-§C¥îîõnÎÐÂD»¥PÂ0MñœT‰;(¦Ùp2=ƒAÔâYö€–ˆ¹ Î{LRÆÒ°k©çŒih¾d@±~®hõmµgÙø?ªåº¢:ÃÍqB‘þ­Ã‰å²PúI‘ ‡(ѧÒË• ê: a¬®ö MŠGíaÃðªb˜•i?‹F8Lª–È*Þ3º‡dŒC¯åp HVŠ D¸ÍáÝÝð8»¹n×)¥…1ÚØ ž^uñÝÕ†Áž–Ö1ãº× Vµö–ò¡,!Ýqôbaòx& /›*Øu]Õ*­1ln›Á¶L˜TÍ%Žãf‰­7ºÝ›Q°î9Îü~n@z¬d]‹0ç¹0ÌHï¹}†±å´%ÏvI@ŦA?'ÈÓ¤€Á´Hm*ˆ½Ë²÷?_‘ôÍ®endstream endobj 368 0 obj 1094 endobj 372 0 obj <> stream xœ¥WÛnã6}÷W °{©­Øò=ÁÈ^ºX`b}f(Úf#‰ZRŠã¾Å_Þ3$eËÞEPŽe‰œáœ9sfôƒ†Éˆ†ü¿eÑ»ú#LiãzCú‚Ϧ÷£7òK(~É‚>¬ü²9F´Z÷ÂÞÍG4[¦É‚VEïÍ­£B•µ6¥Ê¨²êQ›Æåû>½]ýåwÏÚÝ£Y’¦3XXe½7릔"—í¢ÖÅx‚5£Q\D;ç”)™ «HÃaéQX-îsÜijSˆZãv¾§gá°&3 H¯©ÞŠú¸˜= FÓa2³Áhœ¤ÞÅ›î•*©q8ÿ}SSiêÖe–Ðj«­…Ô¹®÷„k]T¹âˆ±¼qºÜð¹pí¤Õv‹?ØÙçUï{oF»Þd²X$3`6_L©èM–‹YTüϼw÷àa)YxKËdæÑ0&8AŸv[-·>Îñ|îžâ¬¬‘Ê9倊"iŠJçÊ’iê 1×1”ˆˆ²þ´²ÖØF ôœS*ÃÚ®·l›ý¯ßzoD¿ŒÔÑérm,çÌ”„+ÚHÙ‡×Ìÿ’pûÎÀ»v}ú¤äm^mEXp÷å+U¹¨y¿Kèëšö¦¡µÆ#NôÛ×p×ò!&0¸1ëHÇùãôîŒ}àÌá!lØ£Ù>É­’°Çq“zCº¦Bo¶5"f?¥b,…Ý3p"Ëø ÇWÖ9S(vÉ0‡ ^»òü”QÆéa%D¾âˆ6C2`åA©ÊoÍÕÓ‘‹|ïp˜Ä¦³‚š’tþ¢zRO¨P瀊£g«„3%ò»?ó´…À­80)Uò¤J‡Ód²ì’*×…®=ÈŽ±Üšoj€»B=~dšq¥ •®€,$²T»A®KÂU ì%Ö¥{£JÅÛYJÌÆŠ‰.Ï(U ‹7HgÿhŸ„sFj¿Ïó07Œ]K_w¬g‚ °›{µÑeé)°fΟp¡g¨¤ïi¢KOªKÜçÉl<^."¦ÞU’$ªÌ.ÁŸÌ“ñ¬<ºÇʇC´Æ5^²°‰šª G rcªà¿-©N‡Óî:ÊëX²¯ÁtJƒtÄ¢ÌÎèê]`q„(¸=w·³xü}ÔýÎôîÊÃ>d‹ßØbV7l[äΰ® ìxÝuí]Þ«Ö¬/¢Öå¹7¿W¯Ÿ üútý‰Þ¿×{\ ºLÙ¨3ÿ]ƒ­ AqßÓM¸~´w÷Ý»{ÜÝâqsý™p÷9ìú%,;\¥Éð&¡ÍošFNÞ¡îzè<çªuoP4ÌTH´#pŸ{ˆ*@HBØ{][V—B0D ý¾†çcHH–SL‘²U¬«÷¹v¬}ÈR¡Ý–½­×JÖQñ­Å5NãZu:Õš4™:פJ tÄKê—Éx2[¾HsŠÆÕAÆþ$€]Û­¸ÐEùI&jEÏÕ³;P…¢f”ʶc *ÚoûÌ`>N¦³EG‘tÉí¬5á]ƒ¦R<ð~ˆäz§¥º†i°&k,»rÓ‚ÂçâåÝ%êIɆŸ$g‚tËSbiòºÏ{Le ”´ñùÉthy¡ÔÛs^_bœNѻӗa,AãCõcŒ„`¼fòü©|% ÇØ6œvðBQ9ͽǪÂ<†< „S[- È¡Arƒ‡¯}˜ìŽýâuÊOÖˆ¢ªŠ‡D-u ]¥dÀ΋M<"„qc0p¸ÆFÏ®‘ÛÎY_ÆÞøÞ8ýpX¾È.edšŒ­B@ üiþCGÔó¾•ã4mš(&p3>ŽíT gÞš&Ï¢†,“É0ídŒ”•ÂtDmÖÛ«m#kŽžÃsÓl¼rì"uzoþiL¨“ò¶âÓÙœžöcœa>£ÁrâO2?¾o~ïýïUó endstream endobj 373 0 obj 1738 endobj 377 0 obj <> stream xœWMÛ6½ûW ÒCÀV-ɶ¼A )š6@4]99Ðm³¡D…”ìuo»¿¼3CêÃÞEšEvm‹óÁ7ofž?Ã<ŠaN?áo^N~ø3Y,aï&søÿï'Ÿ'1ð'/áÕ¥I7°ÙM¼i Y «›e”À¦œ<wµV¹j VPijÍßì;ƒ8&«$¡“¿Mžž”Ö +×Z ÍA4øK’¨ ²ƒÜ趬|n¥(`g,H‘ÀšÓäQV vduæ3•ÁÖäÒ9Y€ªØŸª*iŸ}?‰Ó•ÌÐÆÔlð>£ìV!»,ŽëºÙ¦ÀÃá*×wHQ’ÄÝ)phdI~sQÁo¡EŽ9ˆê|:H+# ³x¾Œ«Y² \Ð𵪄Öç)¥0è"õùdÑ*^…@»¶Ê…Îÿ#›¼µsÑg8ûÉ©¨$aQáTÕÑ裪öðúÍæ¶˜ƒ=C#¶Z:ÆÞŠx”v ?‹|îq­Ó fHŒó^W0G§ªDQW×Öµ± WK•b//¢ãh„ËBmTÕLC ±~ÊA!KÊ€L]‹…¾(ƒ§;kJ.inʲ­TsŽFÅË<\b‚ ¹1ÃüѾl¬Qܓۋë>°ýÀç›h=vða¦>â/d¦K¯¢FÓ‹#hyü/ÐY)_ +÷x»—è.‰ƒ€™‚Ñ¿ï u2‚¸¢Gë¾;Ñêæù€¸B©ÅóÁ—O¢÷UŠ;¨Úr‹™? ã;8œ“ 2嬇4ju'5}„6xM(Ò—^ ¦qÔáÃ|O“iú‘ŒMÛÔmGi·Æa ôvuL`OöÔð´§neÙú¦£n¸º<1½%¦8_õ®Œ5Æ»"ûšv¹©$`aKÃcbÏ( &^·UcŒv¾ØpOtg.wA.YAÎ.[à!‚ÛF؆ FA±K°‹6˜ú÷˜”Ð!pµÌÕNå\•)·•¨†:QýDÊMK}ÀÓÏš½åõÝâM¼¹cGçGЙ˜àÛŠØFÆØT•­ä]3äÁ›î%à‹a¢œN€N# UÙ–)ЈÝÒÄÆYˆþ{³Þc âùR6!>Ç~‰êÊeqa¼S¸ Ñî6ÊùÛ{ž"ðÚtEóÛ…¸ß#qºEb fSàAH ¥}QßÿtÛŸ|àQÓS™öÆNY‡³Ìî[ü¹(`¨¨ß‰Sd–²KÑå›CxT¶èyë—ÞxuYYKÄ¿ !BòˆÈ×àà}BwçHujðØ€÷'¯fÿHk"øËñ&üy3y7YÁi²X§I”® Í’%”“egÑ"¼Õ“Û¯jƒ¡³;q€ž¢„=¥ÑŠB‡5ÌÐIº¼I1P<_Ï#ŒÁo¿-nÖt5ã•ù'é×)ÇðŽW}œÅjù?ã §hNžú`oMZĄŸýnÅ^B}ã÷­5î.¨4#7ÉH­œÄ}Š;X~n•% ÑÌ3ûzÎÒåVÕ±üŽXÕz˜‚$Šz6Dð«9aóØéÕð)kl­¢7ºy.©1ѧ›"ˬbÒö‰ôÞGF˜s%sâÜQ Øbu%Ž;¡÷rk¯’^  ùüAûßû©>ïÙ©v†óFe!÷B³Fst%×X•{æ–jàÑj×x©'`×6($)ÞÑñÔEeqG ‡»nà«=E˹ìDÔ¬ºY7¼3z‘ußwRè®p8fH³\´þ£ 9nAšÒâ´+½ [”j=ç2Í’›h…ªfØT§ƒÂ%ÂëF¢9LÖcN•5­O˜.NWÔ£ç«Ip1G¯huï¢ –¼íõ)Ï”Ë)2÷»«èô¯ðÄžMß þ#½Ei²B×߯Ž/ ŽTÐFð²f…9Ú3<2q§í|ÂÝÖÙÊæ$è âÙƒŸEñ:NFè?!~ ‡­‹Â'÷å3†µ&—«ò™LG»õ‚5ð‘Ð:ökì[A=>ft¼Jíuß‹º¯PùZô£_µ_ 0x®bëâGÌ4Ñqz¯G¨:¬•¦n®xŸÙÛódêä }Ûp\Ýg´6'úÀãý<|‡êeýH’sS8ÔQgø`¦›ãGÆîì>^)ÓþkꦫkÊ’ •fTHÇ =P5²¯'Þ¿W]‹qð~?à^—–kq¢ÕÅ÷Ó;ý+Ÿ‡j®2Xs:)ÈV0[.é6ˆÚºßmï&ÿ¾ë'endstream endobj 378 0 obj 1704 endobj 384 0 obj <> stream xœ­VmoÛ6þ®_qð0´lNo–ät°[; ÀÐÆÃ>A!K´ÍV/.IÙ1°/É/ßI)²“鶉lñîž{yÁgøôëžEíýð>Œç°Qž¯ñoã}ö#îQÔðj‰bQ˜Â–kϪ,æ,„eí=¸RÛkXwMÁ˜5(¡Éø&…0÷çø—Á|òbùXË·¤µè`Î|ŸÎéÅh3‹ý¥3–¥þ"ôácèûþ‹g^°ÄižáE_Â{6† ‚€bGøX°dîð’8ó-^<ÏÒ²“¢Å†+šYn9¬…TøM^ï*JàãEÛ5ZÆó¦«W\B»¾çôR4æ½h„y’oDÛ0 [ŠmSÆ„æ2×ÜØ!ï#‹jÙŠм*º*×he$ç EMò-”•kÑpÈÑÅ&+®ôv­Ú ’ÉÀ¦?>#6[t´B7+Eþî¹\‘ðÚÕ^´ÂÀlxu+¹;æÐvz×i?k²bÔ!˜šíp¥Ðc Öd¦Ñ¹hlnT^S"Ö­¬m¹²ødÉŸÂ •Boá?ZY‚•Ô¢Ù\ÈYí÷Èů5L>¬EÅ/€~¬¬=s5ù`kr'úVD·ñ¬6ÈTCR7õBMeƒ¢{e^#õìÉÍôx»Û•ÀBÞ¡À ­ˆÌ§%/n Iä1’ZISeçz€’Öù1ÁÉäÀÝ·¦P¡«‘Bª®ÂçZ¶5&‚ØÃKô³LQ…¼ª {ÂØÙúC–.Euœ:>£7šÀBP°ã’*ÇKè½ÊÑӣܚÜÜÝKOA0ι¶ìPúˆ€l¼7˜«q3œ˜_Áõjâz5 YÇ4©–¥÷™R µ£Ñ3nèhÎâdB÷JèEz;8o¢,¾7£óUÅØY° Hœƒ?±;ˆæç¶â€ÍãdáäfâÜLÂÒ0ðûsPØÅ–šZíx!ÖÔ…ù†?’4>Ê…A‚I`fÓE®Òrwæh€lÁ8] ij,Jƒ!èå¶SS8¶ò¦éÍãú܉âÓÉÄ¢º9‰#ÑÒ5 CŒóÁ;< ý? þõË%`šE4q z¥»dÑJé@û¯O%i qnŠ&½4¬·> stream xœWMsÛF½óWtÙ‡lRLðKRö´®]ïºj+»‰™S*‡!0 g `™hù&ýò}Ý3AÉŠ+‘J¤@öw¿×Óó-²œü›Þ‹föæ§åzC?[Ð?ñw˜ý6ËE„Ò[ÑÐÛÄVËkº¥]5‹ª9]ç´½ÝdKÚ5³¿]54ùyM Å‘L[š;Söª&o{WhRmIû‡’œ>ÛúowÿƒÇì†vÿ3Ý¥Û‡®°Cù¤k?'}§[2 OÆSç´×møöÑv/h·Ú½ÁƒväTi =pª=ÔÚ?Reþoû:}ÞáEùÇdÒѤï›F—t§ê^û$yG¯|aë_þºÇ믯 ì]qNXd _õMëÅiPûzÔÞ½”¸Êí•×o\¹g5T*ùŠKköù‹ª©Àt2áHŸµ³¤œVPåžo)Ϲ›Ëu2SõmÑŸ¾¾N_¯ÖÙÍêš[¾+᪰=d¨;ÚÀ–\8jò.LePŽÔãÁ3§îtgtX­êës× ðˆ‚ý4(8Íx¸Ü^Å,áúì£÷¦=ˆ9ýÇnöãlK§Y¾Ù.³Õ-mnn7ÔÌ–ËõªòTÏ>¼ësª®a([²¡ÛE¶pèT0@pŒòì6úÈG—Ûå"[mÿŒOXÊliôùÎÔ@+gÚèâ¨Z㛌þ›êŽ2‘ª½ý@Mž5‚'•Ì7+±|®äØœ®«Y4ب«M¥ Š*SkbJPiªJ;°ëüEFãÈZ”äN×÷sˆ0¤öªøxpˆi»i…ÞT#|Þ“¿ûnI…ji? ;{¤B™ŽÉUÁ n§ŒCÀ¶ÕWÁ^á-Bû è¬cBuÖÖº¶L™Ú|æ²Ü æò9l‚\ý>8Up+g›XŠh0µ½Àêßïju¯Kv3 Ú´EÝ—ZÔ9ü«‰Ý/ÚA`¦®k~g-íjnc#£Ê\þ瀹ðv©S@®RwïÌáZí==0“ß°"ªüˆ2×E_+Éñ)ó`v\ûÊ8àóÐ7Ü÷ŽÎÙƒSÍØ©ò»÷»ˆLÆT£19§ Ëcö$“:D8Ál.£÷Õt|½ò¡4í+å#æoÜzä0íLàÑìÊè5£Ÿ½æ „«õužm6´¾Ùæ`ãz¹Ygë<>þ16ÂR–‹¥ët¼½C;(OoÑÓ:œg@t³½nW·Ò+,ek±4xýÁ°Œ!aSmî¥æqD²_ˆŸ‰­?ÝzæÀ<öƒ¼.B|f°T2RÐÖ¿hºíXŒÏh .—çö?%DÄ •ÚÎtÁ:î%è5|qÙBu@YxÖ5zæ§}ï=øþ ~“ 2áeLõQ3óÉVNVÎAäUêNcÅÀ˜„ÿÓQËœPÈ£S€ŸÚ^Æp<œÈ$Ó$Ë…Ç|âP…9Óè"{cšáhܤji¬¥©…æîDw`°ÌØqxƉYêÖÎg"_ŒC3£'Ã÷¹wö•PS#ãŸó$: †@­BLTH“ôiߟÅ<4\\²§©Æ¤÷ÏÒB×,#¥|0™Îælçìàñ ï[Ù°”K9V¶®í‰ëRX||ðbÊïI¶—qS]æãZù‹?þJiÅ!/í}áçõd^OÐÀ°Yüž9ŸHðusQ0n}¿chiðõx,f\H‰—ñ}Å\lÄ æ†v}ÝŒ<±}1ª|)®é°üÃÛï©ok욌#65 ÷ôÆð‰±íç…|ýŽÐ˜r}’žªò´žÓÇ«,{,-"ÁF’§S]6¾}ê,–¤¥C!L½·=ñéü|†§ü„äCŽBKö@f Ñ ¡È}hZ°t$qÕ À’ãÖp²ó˽!l:'~±-Ì 'Æk¬áAùá’0Ð#úÍè_ö„UÂMÖ¡!wNE¬bÚuÚñ¡ ¢HžŽXãÙ,aCKÃ|+u¥°¾±¯‹ò¤æ9øB°£°—õs¯êÎðá÷Ÿè'âYHe/Ú›Ó+]ñæ\![¾¹Ê}U®úZÖ"noº¦Jëü¦±EL‰X-©¢ìW>Þ´‡;Ñ¥!¾O}“öî3ªÏU¾ºïx9ü¤Ðx`¡a¡àv²‘J~ˆNÉ5º÷̇å2]ÍÏkZ¸à=‘åY9.ŽàÖeúN˜4¬ÌOžRÃX¾NA.K\r†Úx‡AÅ[þfq•/rÓ±Ü^ÓL£Už-6Ø¡ÖÙ òŸ×ý8û?1ªr endstream endobj 391 0 obj 1756 endobj 397 0 obj <> stream xœ­Vßâ6~ç¯Ñ“º·'äûÖ^OU¥S¥^‘úPµ'“p78¬íìÞîüå7þA¸ÝÛ>œÁ˜ñø›ï›s¡ÙWø,w£ÙÇxžÂF"øß›Ñ݈:å~^¢Yç°€åzä·RÈ)d‹”İܮþÖÛ`ÝÊR Z*Âïa\ UÖüFñ$¥ñ$Žc3)ÛºÕÝjMhÇo—ÿáÙ¤€åëðÐM«JþöGÿ  b†ÁZÔüÂðç ,øFq®g{ñ9ØD$Šb7NV+VÞnTÓÊêÿ{.›ºÝIh¥0ºßÅgÝ7˜*5/¯¯ãÞH·jýi¥Dohš½dÉ•ú†eLIÖÑÓ2ÕíÊ(V^⺭Ê—¸ºÁ§äæS‰P!;ð¬FágïÈ®®NË!Â>„¢=Åá§ÏÌ^X~næ½â î™qFæQbçβԃJÓ”¤‹ÜÏÉ"Y‘P²(N’Ï£N|ê½^’g¶ÖM]7BnB¦Cd”ÍnßHnézàŠC«yusNl؈ôŠFô±'f8üê×ÅÐAë%r²waóZ¿Êöqsd#÷Mi26-T ÈÆÀ“fÇ3±©ëŽ DfÈ$ÊÉ (‚e5ºšîm ½ y^,høôƒ0åLc™.;ž{¼vÿ4¡9‰S SOnü©ÖˆÔg›Fü÷¶æž¸j¼xøpإ娮ÑaY·*ˆB&wL=ÂáÙ–wÃV5wTXWÖߥ O‡u2¬õÛMå7{ª-Ž@Ü¡yã]}åÑjrÂÎäEAçÇO—$gEqÎ1G%2R¤s˜Æó@åﱇ0´ØíkškU;‘ËUþÙ1ã°|ó’p³n•Kc&Yý¨…¾°»ð±ožÚ»äK<<\ôÏ>oˆt2sµM®gá~ýûf6yS7`çÈŸ®‡¾º9fÖ…ßï|%œµ“y(kLÍ÷LÙ²}þJ°¨]Âê=/ÅZðjr©wœä„fAÏÐ¥èÉœIÞ–“Ãw{cÓÍW‚xòùd³ÍfCœc@e_Xd®’tãsã\y_˜.è»+¶ÃØÂÜGÚXnÑîµ-÷çìÔþJ&¡‘µMü[ÜXÛ*\§z­óa&¤¯¢Uc¶Ñ'2üû†PîYÝrwy í»_ÞX]•†¶ëzaÕpízGpì0(~× -¬ˆ.äÂÄý~¸H×0Ë¡ðR¥1LÓØ¦,2M©eàýrô¾¾þš$“endstream endobj 398 0 obj 1155 endobj 402 0 obj <> stream xœ­VKoã6¾ûW ÒC² ›)˲ôR - ZøV Z¦v%RKRëMoÉ/ïð!YŽv ”†m’Íã›ç'È…ÌÒÝÎîcËv–Áø=Ì>Íh ôW·ðÝ&•@)lö³ø.…’ªbd ›vv× ³×¦;?)pÒBÍ­˜ƒt€{÷( ·ÂÜZ0ÂvZY¹•tOà4e{#†»@ØÉ/¢+ÿxx ÀòVJwÔï6ÎhNl~žÝíe#,w·3¶LW¿ 2¼ižP=´:²W •€-¯?ŒîÕu9H­¼‚¶µÜK±›{6ÞÜU2—­–„æ MÞìPT¯jå¬?Å$_’u^ÒDGÙ4Pëv+UP¿Ô¤Bc9¦ð¬Z“jUÁ"š‚¯&8*‡xE /F>Ñ»¾Žàœ¶ß:Ãk'<­ígj‚×`uojq†\äG`ƒ\^Ù]ä¤XgU2iѾ6™¢ëÙjÀž[îPF‹"e×Lu²/`Ò?t¢i, ŒA´ÊHYæÿ ` å¢é=Š'ÿWkƒk'T=ÌHFË À[áŽB¨)¨ìˆMÂ×bÔ(ëßÞ£Ða£ß·î.ÝBàm¼Ø;ñ…·ÂËSæøl›ŒéŠUEx… l÷œ¥Ú³}9<]ñöÍÄšj”¼âgôzèˆö_øÚˆ°7;±ËËü¬”.—'òendstream endobj 403 0 obj 1135 endobj 407 0 obj <> stream xœÝV[k+7~÷¯RJÎ9ØÊJ{ô¥P…Rhq)¥”ƒ¼–mµ»ÚÍJŠO“_Þ‘V{‰“´…Ò—Êx/Òì§™ùæ¢;ˆ…Èý½jV7?²$…£^EðÿÇÕÝŠz·ª¯·^,Ja{X ßRÈ)d%#l›Õ»Ÿ´TG0'ï·¿{ñ,ˆ')aŒº¶ûÕ»M3®OpÁ2ÖAŸ¥©NPq«…~–¥$+¢2¬ª”Ñ—ˆqBŠ8wÓbàÛ¼ŽæÜÂŽWûÖª=ôâ([¥Aª½è^”©9_¹-64-H𥰡1a{ÄÒ­í+1âܵc–CébÔyé;Ô~Õ§ß è ›´ê‰¸‡+®”­­~L#¶N)[GkÆÖê+ötåצù4ZÓ(VÞ_#WòA œõo{n8d-n!Œa·…„8öBè›N~2‰"æÇ(5ûéŸ#WmmVIdgúŠ÷‚OøÁûJ‹êÃ6 iÛ>íz9 :Wݼ%)úþ¯%_š±Ñvgz^á˜×¶utüáU ó©BA$È Ü¡íñ¾ˆ÷6N»fÅgÅÔ ¼òôÆôkOAWÀ t#ŽŠœD4uÏiFÊ4”¢iDÊÂO#q‰O,.r†ü¢)+gÊ'T6|ž§)byL'V@‰’agLÅ¥s\,I9aÑhB–ŒD¸œ9´uÝž]Å™ÃÑ« WmÓµJ8 ΢.÷·À³T{ÔO³“—c˜}3©–Ö}üL¬cBˆZÿ-—\ ‡Ù.Îã ·Rš$³¾=óЋŠô¦yÏL|­6üW–y:ë_,º00É : Ð8O]`-k3K\éÄ‚õ}k°vž¸¦ÕuË ˆ®•ÊÀåÊH#±`vÁ^ê®æ˜°Ö÷™«ÃÆPßpCà—Öb·PP¸::H©]É¿:Ž"®LÆaW;·©ëç]Š‘0†ï\3žÏIâ$‰=uÉ6ˆ× ý¿=€ä;ù¿œA­,‡Â“c!Kl’œ`æSï|;³]ý€¿?çYç¬endstream endobj 408 0 obj 1106 endobj 412 0 obj <> stream xœµVmÚFþί˜8×$Àx×66œ¨Ä5$tJU‚ÔFU•{ Û3kâµ(ŠtðË;»~Á \£¨ê"ðìì¼>;3ø#X&K}ªg¸îôgÔqa);¼Âï²ó±C´Tp 7s³©Ó±džyÜ) 𠆾I½!Ì×g@Yü~‘ñÔ+¹ìY(Yøü9ýqþwÇ3=Jæ·gZ,ËÔzZKfAÄ[Æq•Bò$ˆeÂd[&bËŒ±J¤\áÝ2K õd±È³ ÌY“E’W¢¸[â¯`ùûs©­aœi†Ï“Å]Ôl NPœÒ«â/$i( uĤ¡ªt{¸ôO½à+ÔìÿBU¹èˆÀ&1-:T´;0‡”–I7^)CLÇC6µ}š–¥yXivMYV¥dÕ§¾_S¸ÞLNTã½Òð¨kÚž«#qLBK‡àßP·¤MWÙòèКÃa툜¼_ø$Þà_½ŸJ¾b§I’î¸X‚L‹,dxQQ»Ât½IS%²cƒB²hT¨°”x*òxºÜö*¹ERȃkÑ®Kh×êRÚczlGTU¥î’¦*7|Ïù͹¼[¼±Üzöü„8ÎIwV;’ßHï,Å&=×êËú ’¤Ô÷î ‰ŸÚ®§zK >“QÃŒ:&Õƒh¦‹ê\Xò-À‚£ï4®|¶7›N›TDÛ0©¢H…®’ N&ð²Qç÷Ÿß¢8=va·â Óº½1bW^·AR04µ[¡ËR=?ê(Ð5¶L˜¯ð±Hе§.1ÈSØ$i®‡I …4F_¨òƒeû`½IXW¹V¸È0ã›*5žilo æQçY\5zMeUÍê6V®‹Ýoû•¤ŠP·ÞPš"<—yÆEŽ…p„Ç;бÑaä ³¥(ôñaË2‰*`›B¬œö|ÄÇxÐ+BoÁ"ݲ£ “â1ÇìkM„;_q U‚ŠZ¥;…6íÊ<Ô¿ØP'LÌæ¿çQÁE_®ÔX »,"ß°7®ˆcØ×áþu­²uŸ”BðŠÃU“ý©±m{9ù t/•ð?$\¥`Lg³_g£FM(°¶O‚EÂŒ–ðžç@ê}Ìk*ØÝÁÓzs3}õúÍç_¦“ÓÙ˜\ËÉ|2¶®áåëÛéÛ±a\÷“›éíØ(Ä@tóî‚ó¥6V™“ϧ(x|€+ã1 xò®¨ÞDA”{[ïÕ 8¶TKe > stream xœ­TkoÓHýž_qÖx[öÔ3Žã˜ÊH­©BüaBȱlj©3nýH+Ò&¿|¯_iH¤®ÖVrg®ïœ¹÷ÜÇ5,Æa5o/£Õèä½;X”# ¯è·]xk‚^D+œdf ‚dÔåp9&žÃ‚Õè1èùñ$øJ‡ÙÁE§yqœù>ÿöä¸Ûi²ÁÛ—ð}píÞàªHUÝ3 sËÀF÷žÒb{"HáÒoÚH³O[Á-S÷î ~Ü-eVÊŸÀåmZý‹ånqŒïX¨ú*Ë+˜W²(Ó’àÏOb¹>Qu–AEµ”j@ o.qÓ8o¿|s1û€?È„¾ö;¿—š¡í›ÿüQÿ’û_zU„qšÞs££€€uûáe]$_æÅ}ÔD5é9Äh‹2!öj©ªÜüYnÑÄPwËáîvcÿ­4£ãÆèC2z'ö!»$’[Ö¾¶©Òñ}’·¿-ÚÿÚ^m7ýO}3ôB)•Œ–ùŽ0˜cÔ]½‚µ-ö‰šå{ßoŸw%Ö\60¤$›áä‚ófìÑŒ,Á². T9ŠZ¡7šôF΄Ùc!h>ñèqe3–ö‘ì1›Ú.節SÔ¹(dYgäv]¦j±››u3r›¹È „ó|-·YÉgèàwãÑô8ã®gü…qÍ¥*˜\C M*#džÅaŽe(ßÙj-a‡Œõ®Æ"Æ;Vä!ÜcSÇâ4ïñà2o,¸7ð°)ëUôMZEKD!ÅVb82@zcfycþ ~)SWEב$ªÆqZ•a†*œgyB]´ZÉ*P¹(ÂJÆ[ÌÃèrQ䵊x“Sf]áÁäv0á–õ¼*ˆŒ±³ZRM„YNI£–m.c™„”Ì»{R§ë4®éîîÈ<1q1mé´9³Ó³Ù¤½†;É,½£÷Ä Ã#endstream endobj 418 0 obj 807 endobj 422 0 obj <> stream xœåVKoã6¾ûW ÒCw1Ã÷#@/Š^zh ߊb¡È´£VG”6Ùãæ—w(R¶â»A¯eK¿Î|œáP€ƿü,›ÕÍï\*؇…Ÿñ¿zX±Iò£làÇ ª nÀÁf·JKÚ)ÂaÓ¬Þüîÿ„ÝØ–í` ´=ñŸàªhÛ±ÃEùµbüš^+zÝþ ž¯¾žÃFéóÕûÍ_è±°ù%B¡ûÒ¿ÿ>}l‹¡€]Uû[È#™[hø}ï}¸9TOY‡Jù4f­»¢ü{ßwc»};rÙÕcÓÂØVC8­*z_L£èËàËøI)Œýîã]_c¬n.iú¾ÿwÍY?ŒM㷋ݬÃx7ôE9 ´÷a¬gWÇÃÐ!Xë‡%*b¢â@C]Ï@”ÞÍâ¼½“ÿ'ÿêÇô3xåí‚øµ·„ŠƒM¿ÜZJœsñ]Ib8ON1Æ1£I‡N%>œâ1Í9ßLÚcæÅ5-Æhb™‰ïY¬dB•ÊfEz'Ž¡Ø8mqG,iŽ¨ìˆšWP®ˆt“ È3É£‚Emr›Pk€gŒ"NÏXy[•Q“S’Y…›™"€±`Ô%T+ñŒ¨)Ìc5N-šrrÆbâT•P%SDÉ)XŽãh·DêéC ¾U (5#@Xîõ%#ß@EüÚÏÜþŸS,–QË&ôá)g $fÝfºƒõ4e q ?S©\Z¢Í¤ÀA°$VFÁÓ‡&Ìd'&T-N/S¢}­¦ 8±¼M$Ëh=d’Q…¨‹Ãr‘ŠÀ‘i"ñKÂE%EšÑbB#*Q›Å±ùõ%‡{»®®»ÇªÝç>E»,—HÀæÐµ>’ðÑ÷Æà·· /@²V]û%<Ÿh¶Iz±Ó-=z•÷ؤ|N@¬æeã+ÎüWfŸs×9ƒ” ª.ˆÏØÉ¸d —  KåIŒJ꜖/€™Ò‰@Šb=Š9òæœaN»…Ât˜ 2Ÿë“Xaa;ããZ,Yrßp»€3–«e6$øFŠ/§9_ZÞ˜äof3©ëE­NûæB™Øü㥠[‹×1.ã ïIdzžÓy»‚U*^Ø6ÛÕ»õïU˵°Æ˜æ§c1«ÌœaåŒàÏ,vm팫¡¼÷ʢŲ=$À;Gq8ÔŸa¨šx£ÿtè°t{ŒOßûrÀЇëØ!ñ㓯?_ÇuñôƉv×±53¬8k&âžÑ௵/‚‡¶<êC\^€Æ†/Ú!âÍ.=ŒE] Ål)Tm¬ èdUqt;h:\Y”åØôïd#}‚‡¶¶®P¡¡©ŽÔþiÚ`S…€ ë­?øv‹µün×õ˜§¢Þw}5Ü7X›ú™ä}¨"LäÁrÑBÈ¥,ÜæLkvÊ6}ª8¬¥&rŠ ÓÑåŸ6«ßðï è²Xendstream endobj 423 0 obj 1120 endobj 427 0 obj <> stream xœ•WaoÛFýî_1H?4gHk‘¢H)E°s¾C€\ÑKumâX’+i/©ì’q|ßì_Þ7»$ESrš$S£™7ofÞ ?ÒL4ã¿íÏlqõ>Œ´µ3úþm/>^΄ÚÙžnÖ0›‡ ­h½¹ð_ ( (^-DHëýÅK¢7ôšè½¼£7USÖ–tI?WɽW[]•YÿžÅ’ÖïØü:ƒùµQ’ªÍÈð{þ|ÍŸß~>T¶1Šj½W´©Lgù7YKowëü|RFn©Î~|BSíŸïå_·pnàe„þFf¶¿æG`ÃÒAçl9 ¶yè²x<¦1°¤’>“ʉ÷óép) .Rrat½S0ÿQÕ§u1ÎiKîË}AK—$¾÷šK;¥º¤‡ëìr]ÞfW×éå:½¼MŸ |§ëÕ;E¶–e.MNSäVÖœ)c*clvË¿>BLA€M%@Y+º«š"g£’RõE°(!ì_ó¯Žh¿À É3|+™íìd²ÈšŽsJïÉ6û½.·Ôìƒþ¬ ú$‹F9nùÙ°.œ7μɟoõ'¤Ò9>µ\Ò9{F¶*›}ª 3åb´ÞeÝ~Q§a,ìj8‘Fq3mU©ŒC {IiQeh#³ÿ³û ÄVLÚçí•,­wîrïðÙeUYK ‹èsÔé¦) f”­Š†Ëúè²iéŽ[ºã•â%$c_¼Ü4e†.d1–d‰å< Z#ºÓEA¹’õ]ä 2;²©«=šU)îýÛòC¶è|vqC8!‚÷9Uã˜K±ˆâeŒ,Be» ÝW *^¢Î‡CqÏ_šÎ£X,V+šú*Â:­Ëú1â”Óã„öÜmt–x°ê M×>ïÿ̡Þ› ·þ«yEeU·¹ÀÏħº¢måY”ÇXóÞùd\·¾Vß©TÒb T×<]lY@ó{¤h1²Ü—ªÁð¸jž€ä`—çºv §ë–{îÈý“ˆnÜ:åè籟Äsqx¤ÿ¯L%\Ç„Q;˜?Þ¼rª3b!‚â/ût¿²‹èãP*hN!ï­ûDïY~°“Nb‘„]«Ï˜_ß‘OêŠÕrÕœ R¦u/«nn<“ âb@¤×輟ô–6 &}Âü,ý°ÍŸ;«å—'EçurP™Þ äNûð`tðÅŸù×w ‡û‰Ï‰me@ýždŠå‰ªÕˆñeÝ”ºæS—‘ÁžÂÊ2z»«KnáTe#‚÷+œÉòò2¼²*Ìvœ¹‚•X.ú™™ê?QØ]¢Ôè­ÇNÏ'äÇ%išSæ/¾é@û¦¨õ¡`Š‹f_NSÉ1ºà֯˪tç!,8K¼bÎ&Ã%UïЀ[¿xà°ª\X àN¡½=üÒ©Î8…Õ\Äß”€UüÞU¸&±Ý}šëÍFŽåsâià±ÁQèè󨱦¢yòû3׳—§ëGÐßѹî׎&§ÆîEæTWf‘H¢èÛÊÒÔ‡ÆñÖ¿€MÚä¼¾ Ô‹åð˜å#g£]¶Ã¼eœíÃß= Uƽ4¨úŽhÿNÚ”£+™á·Q7ãäüÊj_ÞNN±ÞªÊÌoXXòyéâ`]?ad5»ç^a.\›%·ÄoS#ùÞ7¹6~Zµ¯qBK b¶À­\îA€n×ÿÂß?‹®%endstream endobj 428 0 obj 1840 endobj 432 0 obj <> stream xœ¥WßoÛ6~÷_q0†ºlV”§èÃ6¬[¡Å:c/Eh‰¶¹J¤*RIý˜üå»#)YQÚ¡i$v¬ãï»ï¾;‚„qHè'¾fåèù»t±„£%ð;þGŸFÜ›@|ÉJøeçÍÖÀ9ì£p–ÚÃj›² ìÊÑSy8¨LIíŠ3ƒ·ÈLS[9w’gµ£‹3ئªLíd7'©é!(]5rá„7ËŒvBi´P8±/$ƒg»Gé‚¥°ûsôtwcà`êR8ë\œâ§xÌÉúZ`+™)¼”pÊh;ŒUëà(µ¬ñypÊ‚•¥še¦0z–ËB•Š|ʺg“ŸÇ¨æU o ÎÀ^BcÑJØ. ½´þnž®aK8¥œ°Á£‡Fg¯;S0®Nâ%¿Z¾ ×ÕOüίør V×L^Ã8SuVÈÛe’N—<¦éÝcÞÿ¥iïö«Ñ™¬\#ŠâLcN7ª(è–òS£ðrXºvÝh­ô¢£U눧l½Y`Uwùèi¼,aÞ6_°Í|Í£F©¥§JI‰{Û.óžb«”Ã,`÷19NÞG>L¾˜.yäÉû‡ ¼¯ž|5"ýõS_„÷s#¯e=Å’xÄÚ€› [Í×ÛˆÍL ±[±uÊ“ö9Øå²S¨QMjûÃh •°–Ð5ÍñäcQo„˜m—l¾Ü"¬¾ÐÕã°'äqfʪŸ;’fBw,Åʇn8ßcëý¢ý?]ŸøŒóE0æ|ƒÖ!jàhÁ¶ ž¤ñéËEÇô'Á°s²Z|«å¥I†NÖ K¿Íɪë/j¥A…fé k˜ÎÛ4bKŠQÕæX‹¬BtÏÔ?¶«IW$)°˜wR-×Ô(]:Jã¤ÍÒÆlY3_.ñ†ÛGµiê¥z:Ì· öí fA¥ð¹•• 9ìÏþ¢jéì ñƒì„O2¼ã@N_k8àçS…;u¤#žh¯ŽDž °òx¥E¹–HÖš$Öz­oU—Ä817 Cëk”³¯ªHa”/oÐsn3ê…qû|Üâ{qƒSøLñ?N”Ù+<-? j…Çʱ jL5;žP¶o^ž¬Y²š¯ð¢‚¸4ºE"btoòÙ(|ÁY_9~Ʊ‡Ã6¿ ÌÞ@¼7Q}Y‰ÿ8…%jàôVHy¤‡ô±)šRÓÉÜxok]6…SäådJC½a; TT2òÆàµ£,Ü ùÙÆÑ¢”þš=®Õ-¦(P«s’ÿýù{&ó ¢‚çÁ`GÀBÒ_µåèö¸üÄ`¡ nrç Q ËpNo·Øï£K«`~ØD«jYI AûUÚ“ßcl0Ä]mÃÝç~owÈ2¸½Œ ^µB SßÇ…Î;£ßN†ÐÉ=zA,°¨M‰˜±;B Sª·u®´¨-9~À³Þ0¾XðGÁƒ7ÆÞD±Az½z½ûöâO¸EN Ô·À€jHŸÞM½6GZ$qÕõJÚ W©í†÷ðYÖ õEÛNÑÚÜÀ­÷y×[y©ýÚ{TøyqìV׳ƒ/ÙŠ·³m† µÞû{üûa:6 ýԢƔœ_Üöb¯ 唤)c9]f5‹"²ZÃÆK윳d‰z¸YÇFà"éo»Ñ_øó%Ù 'endstream endobj 433 0 obj 1519 endobj 438 0 obj <> stream xœ¥WÛŽÛ6}÷W ܇M[µ$¯/‹ À&Ù½ E7.Ú"( Z¢m¦º8$Ug³_Þ3$%Ëvò°m%q83<3sfø&QLþ ¿Y9øæ>™^ÓÖ &ôþo±¡ð“•ôbåÄæÇ´Ú üÞ˜æ1Í–I´ U9xöý†ìNÒ׫÷Nvd“Y”$éò«|ðl¼j×;]qX¢O:_“ëB>’9(›íHjŒÌGNsÝØ}cé Š‚²ºÚÔº$[“±B¯…‘ßðö\XAüF¼,ì +4~ÏZ²íq:÷ã4JœeU©­Ì!aRVÐ^4eeH ØÕ0.*2{‘IC¢Ê©P•o$6½t¡ÁÃDdÊv~<{­*Q#ªj+Y«¥¯¯NÀšÏ£Y< €lš*«¬9,F‹tÞ¡¦Ø'R¥ØJÚëz«E9"ùû°«›-0´”A^ꦢ\i™ÙâêŠ^¿zKk8¥Z‡BqœDÓë´‡Ðj3¥ÀĹíÍmTa¥VÕÖ9±ß  ",] `¡ZçŒ`M²2§f#JHIÓ›±R¯­°9»à 2-·BçðÌP½¡ÃNº€ï.”;UòC£þ…¬,Ÿ*‚!{"z!3'Vaq’íê Ò>¯ª¦\KH<ÃzV7ÀÙÓ ÐáÃÅh¹ˆÒÅôI1büsµÙÀõ®ËžUv‰ƒufè=ºmL ™&Ûùð¤@'‰{áæ¢ìâ8ZÆÉòèf®ÌþÂÍëh:›vnÎ 5ÓhÞ?¬ÃýBÍ2Š»¬¥×PSÖš‹Â× Bª‰5ª—Ï(x$d•É)ð.kŒaQ ÂîVƒ_3: ¦³å<šÌh6‰¯©\O¦q4_ú×bðö tMÑÜiJ¢™ã¬{¹e“½9t\/)ìÄ œû·§™AܯËhê,¼à¨ ­Z2àÎ}–¸çª+Icr?F ê â¤8y•+„óãþvD¯dÆ©™L"¯&–ËÖ4™ÓÒù´dvîyî™Ušo‰žC{)¿¥çuøÕâÝ.×â)—Yû¨E®ó.×WC¼¾ fþdÓqPN4Î [°vã¶}åüóÂÄêGÔT iþ)—›zu÷ò&„ŽxrÔñžNÿ}EïkudcW:…2–‰Gr½bÏOÙ3j{hØ1TPR8–h•h)rÊP—R{Îg”W'œtØúÓØÚ¹áëùQ]&¯«+Ë,æs£P%cˆz}ÃNM0sÿýí—Ñ¿¿½Ù=†/l‚É%ܾ¿ýëåÝ›‡Ê?Üß¾ò/~s÷×w°Öõßÿ§šÏ…¦_\Ç&y/5Ó #qR6•㜞¡?æ ñuÑò"Zyú±„ä¢ÄYÙöÖåcÙÕܾ6ÊqZètíwdðÎó3/ùºEÊD‘5…°ÜŒî¹3vµé™UF׿ܰáä^fjÃ-ÕW o’¤È~‹`£4RIèmSr ®…ÞÑ©2î«ÃÀ—ƒß~ÚòÐî“ÐZ<¸Oa¬›«jè½ì éüù©‹Ýs¹ßµ8>¸í¸rNÿŠ#CƒcÚt‚®è¦1¸¼¤‹$‰ÒÄ¿>n¡)Z:MKǸH[#£è*âoiìîL[›Ód2Òô?Ù\$Qâ4y›oj+Úœð¸<8˜ýÀ‰FÂÂÇ~-?ZŒCGÚsšúR6>D>çÇX*ÓŸ~»àu‘Á‡†zñh£|2JôÈ´²VviÜëK)†É «ÎݺщÎs—–GW}Šž—Ÿ¯ž¶j0Œ= Ulæ>æ‚Ïûé…Âüª¹T˜\]…õD¹Är¹Õ’ëuãf¬ µ³õxºãéJ¹‘Ñ~<}¬3qÅ'.<ìC®°›Ã|Èéô>Žh¸Ã«sã‘kc¨ñÊÕˆAø1¢·ò#ÆLƒa³à‘Þg;Ùì÷5_F¸ (0PÍäÈ:Ü#ŒÜæe'v¥ïy‰£|úm‡˜ø)ЋŽh_H¾ÑœOÐð#píþ¡©™a?ÛÏÅ«M­À/¢>›ž«'Ši»qI´U|ÓPU?r]XV]ÂÄÇ'¿ˆ}9}Äñz…WxÆ@–ªj¬ô¹^¹ï¡x88} ú§îöص¶îèÉ•Kà¬Þ÷.2¡î|ɽ•nOXl5„ƒ!¶>X­÷œÈ£>"Gì=Ës»¡Ó¡­7W ½¡˜Úß(ŠÂó›áy‹L‚Õ[ÀÀ¤Þ³†SsÛy@¡à\Á]s~šŽ¹»‰‰¯\Õù (á|“ön1~~«&3Œ¸áBpz—dÙ^!fsZðP#º&íñµ;;¶ÅËŽ·ü t—mendstream endobj 439 0 obj 1772 endobj 446 0 obj <> stream xœ•X]“Û4}ϯÐä¥ËŒ×ÄÎçòÊ Û0Àt:ŒbˉŠ?‚eoº¼e9ç^ÉŽâìC™NÛ$–îç9GWþGLÂHLèû?)F_>Ƴ¹Ø™ÑD|‡¿»Ñ?£ˆ—÷_Rˆ¯7¼l)¢Hl²‘݉e$wq¸›btÓìe#š½k!ËT|£‘Ty[”F´F¥B—ü8©Jü#ó¤Íe£«R­iDY5b«DªnÊUÒ¨4_l>ŽâY‹ÍO£›un*±}ÆŠL¶y¼îJ”²PFÈZñ§TŒ×c^3Æ¢qÀééN?©’BjKÝQe_¼ESçk_µµá¥©ÚÕ keˆ ›òçPüYµÈ É^–;%¶U³çpÈ%o£/Öpkt¹ãï·µxÿ¸þ@Ï¿¬jq›ÂãÍ{DõA˜£n’½2¡ø¥L`a'uªS•‰ñaSüƒ]ãz,4B;T™"½¦r5í“§Ÿ(V=»¶mƒDÉ[³ÇÞDÅÕC¸ô(»$ hÅø«1¾6G¥Ê×r¦u­C‹Þœ;ôñ2üDXY8¬Ä‹0ާ+àe“Žnnsñ>צÉt®>P}XÍæá<êVº¢P¶„ޏ´5©EQÕ\Î]•ª… ûˆšÚF×2Õ­áV!ÉFþ­Jòy»ŒÂå žnmÇá-««U ÐÅ&Nǽ†w·UŠo6ï`a›³üº~÷öá¡+|£>Ù}/¡x Òùu¦¯u*N6:  Úãú%ÐÎÑ¿Øð3Ñï6‹ø* ú9×(‚¬wm 6;¥©Ÿ}'{,XÊQë½Ì4Õ \=ÈkÈ哬µ‚d¦rCFJ¯u‚'yûê$h€ AÆ¿Sg.“GZaÁœf0m Øöà»Í+ÏŽMÔ=³*Ï«#ö‚ôW‚œž$IÄËvöè*ŠM§;FÉm•ù®ªQ³‚ò¨[ÂxG[”Äãº:vjEu :Dã.zòæá‹‹dcˆöœÓîô†ù©-Ùeuý2UDr§mßJuI3®¶•é“yN¶tJ‘»@8VY‘%Í;"冘]a' 0·Í¡µÈÅoF½FáY´ 'qÔQøÓ·wa´ˆWwâ6smˆV3k{• ¬”™lAí}ÆêQº³!ê*m Uo;r>Ù&ä¬óDb›¹àíë:åÐèIƒ²C$÷@Ÿ¶xçĬæz• -®×Ô4œn9>®ÿz{ÿ3lß¿µ×ßжÿö—ŸïÿúñþÏ`p¶¬s„TJû5xµTtwíø8lÇ2œÆ‹hÙµãô±Òå‹íŠ1[øºçÊuÔ@PÇ?|ìpÛCš[B%¹Lž~9)cPG}ÏÀy»h$­!0#€]º]¤p ùžÝÙÙÕÃ+<ó– y¬ú#’\´MËîÔ§$žÙ\-º Wóyá?†E‹¢p1éŸs‡º%ýI…SÙYøá³X€€‰u\0« $Ë©l¤´ñƒ®©\ÍÇêÞ"!³¹”#D˜ì™YϽ\Äád²ôZééB2M5QŸ1Ûç ’Lž£:Kŧ@,G>Vü´âÑ̹G]žYH/˜å95-“Ü ìþ¾­ît`¤m;KwÀ/·Q?h8ZÚ³:T†3áS¥DY «i-£Â忪®zj[ûÈ@ÄœÆZNÕaÓBÑK—§Âœ[–où³P,RÙ‚ß‹FäJ"Fj½f/Ÿø¹k‚Ì»^ÿ´?]vÞ-–ñ@xeð]è\ÖàˆcìÍQ< ç‹i?— m/ÂeM†¢Î§"’Æ$Hã”q½rò¨P|X?©: µ9Fm´ˆÂh²ð`«‹C®Ý RôÑØQù£óSY‡gÁ±@Ë|©ñÛéÇÇR!·ŒŽSÎGÈ™&†yºxiÍq³‡XY¹,B0Sõ7B’C@B6k-mè²éPªþYböêÂá(Ø„„=e“¼2| βâøu±qv:ß9" ÑBçì3›Éúyª=ÊçÀ+w}S†ôéºæ±$QW—Šî9Ž¡ã³R†|ˆ—á|¹úL®0ûÅgÊ7šW”÷éì3ÙøÂéG;wÁd­Žþ¤œŠÞmÖ¾Ô¥çéÂ’e‡Ó™¯ñ®ž|±±P|êGÝÝ>¬ ]¦tWS¯qÁqN˜L놋‰½\Å›…½£ýôÀVLY› ¨ÚÇ~).Ž¥õ…ÞJ–Fôï :S©³,˜MÙSç2øK[ñÐÖ0U${{öN£ìÉy½„åwŽqC;ç©?8¿Ì¸ºTto7Ð:ìÝ›¬ZH±­>ù/TIlíÞø÷‡RÙq´*IÊ•B2ÝŽ{bwWɵ⃊;F+Ø?øû-ѹÅ(gê¡K ‚Dï•ÄØgL•hÄœv3£¨t&¨ï¤Z‘ß|Ð|Í0–ïá–.R|37i(ܽ´gvÆŠÁ’cX£8zÅÓ½IiÚš¤<{Ýãù%Ê@¦¨à<êÈòšÔËåê.ºº™ e822§÷î&Ýçb|çqÎ%Ià¦(N<­Ûi5 ¼‰ÙÞƒ¸ž;¾ž}—^ÂNSK±â™r…“y,nç vOhÁýfô+þünvGÆendstream endobj 447 0 obj 2014 endobj 451 0 obj <> stream xœ¥VÛnÛF}çW Ô‡$€´æU¢Œ6€ƒÄ­¸H¶ˆaøa%.¥myQ¸K_€¾H_Þ™åE %§²Ë Ú%½›'jM5F0Üe<;Á:+g\‰Öõµæ³-ÚlSX ÛoTÖÄ¿§{/`þاÎÅhµ‰Žª;m“dÚoý fù!²>[c¸·Ü pI?AàAf¹¡0ìÞæ6µ¾<£ç#s hÌüºï_D_¶¶jd·5äály©¡ÐfAj-}xÐ"WTžXq'˜‹Îª„.›†Õ0ôÙÔ{‰UDb®Aj­^ýmMíbg–ï:xë¾ÈT2ß µ¦¾Ð C÷Š„ê•âJe:tÕ”pGb‚àšFŽíMÙtZß>åÅ7½­oGáÈØçe‰%hfÄ=ˆ;†3T:ÅF¨»D–Xœ¼\TÒ…Qãª,%Ï:UÖz5Ð27µBÑÖv†û†§‘:ƒ‹d·”ŽeŽŸ j«ùa] ¼Pb¥×ÐT…FÉð2®­2ÀáA½¹Î¨?qX@½#D |†…fnŸ™Qƒ´EmÓ}‡-åoœÎ] k3nguŒi|™UDb¾Aj­þÞŒ&Š^ûQB1'ã#ìâñQIl&¢­+™u·Uµðžf&»¡ê%ý"Ùöž™ vÜ$ [% mÌk!ñ\£`“ù?“ø Œ)罤oêïG‰mðNÆO{ÊàÓ01ƒóšÌyŽ<€Ç1¨š5AoG5ƒhYýh*ߨå-´óo€\3qw£e&Fk™ë íÞbŠoßO­æúÚ¬×æ÷Óogí>]Àî]\~ènÞÝn¯ë‰£úzjÝÝí?ØÙ6pæBÕWػ§¨à±ÝeÝžÆí.Æîðº»ëÁM;8³=ÈnºÇn.< ·Çîx¸É1p{1ë"¶ü½³£=ýDìú,{pápýØ79α¯=¸éavO¦â¿á±ûpáà°Ž'˜E*Ïav€ý'hú¡ët]ú³õ/w“°endstream endobj 452 0 obj 1363 endobj 460 0 obj <> stream xœ•–moÓ0ÇßçSœ&´ ‰„Äyh;iH't;'Ú»Øîï±á3b„Oc 1· l{_ÿ­|c@¼mÜùŒÞ Æ~Û€¹÷1È Æ Ø׽ψáb ŽÒ,œ½Ïˆ b ^©Yµ{Ÿcø^…¢÷˜>#†¾[5ƒhH_çmG—ŠPºªÜUÐ~ˆ8FаÿÖ|ÏqC‚IcUUX5^BT‡<‹­/øù 깑Cendstream endobj 461 0 obj 960 endobj 465 0 obj <> stream xœ•WkoÛ6ýî_A’¢¶ª·å Ðli H_ÐnØZ¢m­åJTï[ûËwø’)»]W·®.ÉÃ{ÉëOÄ÷âËæ™×“ÇoÃ8!›nâ“çøÛL>MÕ…˜G^“Ë¥ê6'A@–ë‰y@ÒEèedYO.–[FºËKZ‘¼©úš“‡Ë¿Õ¸ÔŒË2oᇺ,&nlóyqÚv’SNVs]²‚ˆ†e·«èžLÖ´EÉ1Ù-­z¼­ £ù–´ÍG–Û¾›" .JÞ—|#ûËÙfzQ“æ Õ4»–Ý–MßvOë]Å~2QGáœ,dTa |‰€Èºç2r&X'õÙI­Ùµ°rAÎqɺmj¨ÑÙýŽòƒVJ‡ä̬ݖU•Gà cãºædÃ8ki5U¡´}øuÓš‹ò¡@ž€G 6s<:âŽÐV*Òùäj9y3Éb0 Hm_Sº¹ Y”xA–á=H 9Yè[3Ÿd~ìeAhsˆöa yÓ¨ùľÎ#œ#“Ô·¨ÚªÑ´™èÌ@7Ö|²þkea\"ùõr½& ¯ö`=¯ú‚¹Ä®E-'´ª†öU¯—þxÜ]‰N¸V ׬ð”à»üÆqêò ÒFüÆHÐ0¡M‡_í0šöM¡üÆQ0â7²U™¿¦Í„cº±þ8¿q0b·äßgWu[÷Fv»ÿ¡’t‚ňÐ( lêÚtÕÙhßê@h˜-F„†óÔ¢jÓ!Ô´épì@7Ö'4LMJ)©Ë{Ñ·ª*±ÔÊ3þ7ñw6¯äwÐÅ;ûý!hí §ŽIu£õªÜô²¶‘s[ñQ-íª-m÷¤e†’k¦õªPzE‹¢T ÔÑí]Iâ´f²\ÚUe^Šj?=l Tcݾ^5UwRûEÁÜ‹ƒÔwŽk¿Ô ÓÅb¨ýdÀÇ(Ä¢,6=fÇ‘—¦XÉ£â±ïtÝh7§V…`gÞ<ŠœBð ¿ìdê$ð|n°±@'•kà¥Cn–(Y†‚küGë¾"åšì›žÜQ.F1Iú¼½z~ýêÆÞT´jÀø])¶j?4èÒª¸ÓÐKC7ìa²§y®*âÄn³8{.è=93³œé³lètw\nXsÀèFbœüBwCéK~Ç;{D¼ÅŽ SìY\‰òy2ÇÑ=¹V= *(N¦aj}, <&eM7¦ù3+%òÒ¦äÙõò®j4·{Ýij½z»Œw˜vJä¥ËÝûš¶->&Öež`'õ='»òžUÇVu@Ñçò|ÞaVFjEWQ©Qì« :yÜ¥GMì‘Ë=(\Ó¾SYôh`õµ¢Oþ!Á¾3)¤ÃáÒYŠýŽIÞ¥lAzäEsÇnY;U¾;Ø<¨î:6]\\¾ûõéË+çåWo_‘-£zîh |ÁZ¾}:ÆÅôÀ<ÒuhGR5T`sA éR\¦vËÒ!`sîÙ–E=Ó¹ÁÝ줨H‰`ø2“«ºéÁœ°¬!¥ZÕ:_ÿø‚bÁ'ü[Ÿ&@•uÙ4H§Q8É¿4ÖlõX£ ——Ö–‚Àn۴ȼ”é«,õ–oúU…ü@ ôL kµïÓWklß¾•$´=ç27Ñð•›xóy50ߌ'r•xqÛN8˜~ œÿ®ÆIÂi3û¸ïz¼ïehØQÞývî¶(cQÂþc>sÁ[‡ŽLÔô#v])@C‹½@Wr7-%eà¹4\¯¤ µSKóLÞ]*îòVÍÝuÔw;ÒI‚TàÅc𻪚ü#â]NFŠt+5—)‡uÝkðÈ3@>Á£éœdj‰Qø‰ÊƦFCñfò/& [endstream endobj 466 0 obj 1665 endobj 470 0 obj <> stream xœ•VÑn›0}ç+®úÒU 40i›´N•ªIÛÐÔªêMHâ‰@;[#íeûò]ƒŠ D>2çÞ‹ås®y±ãÂXÞjœ®¬ëoÄ`Á­1|ÆÿÂz±ÜŠj˜®àc‚4„A2·êPBh8’•õà‘/Ÿ`¾-fŒ¯áBd\8s&ø#‰éˆÄáÓ<3±f¯ïm\%?±Š3äN†v\¤^ý ¤W—ÇYìýu<ÊBb]Ýuõ ¤ eñâsBœ´³øñ9¡ Fí,A|NhpZYh|N¨‚n;KŸª ©³HÁ†ø@J‘øR~¨¡/¥È@,SŒËߺäœ=ç8W‚džî …›Ûä;ª°H7;©|œrH `«t‘g«u¾ƒç¬SŒ.˜0S<±Ü”ÛÅT}ªê»žªº¯’´ÞÏ÷Ñ)É W>g.bÂ?°’›¸Ò³½‡œk *e¿€‹Y¹ð§ñΰ⭷&'œ¥m¥=¥ ¥Ýd²Ò©ÑàS-ƒYLt-ƒ;Lt5F;˜èõàšôo¢«Ñ5ÞDW#i+œ(…ÝÎ+9¶H¨Cˆ7Q*³óZ_M8uBâŽ#­Â¿9ãâðßLL—Ò'[žÍF2qÑø§•e²YeQ0- ‘²BûbZæÛUÁc¸ÁÃ~|¸sà¦ÜÈÀïD¾]û+g¯)š+{c€Zû•Tµ´í¼>=Üžãã²[ã÷ |Ø#|3µ§»-~Òi»—ÁÑ µç½éypt|õò‚<:×u˜vñ¼ô¯£7_0GòÖá÷ñº¾NìÇúýëèÍGòÖôñ¼¼®Ï¢û±‡^ÿ:zó‘ŽëèåùyÁ@퀤º­ë|ØLiˆ][ö*çv0qhÕÕˆ/ÛÙ§ÄúŠ÷ˆåþ„endstream endobj 471 0 obj 707 endobj 475 0 obj <> stream xœ­V]oÛ6}÷¯¸04"ÎÔ·ä¡E›ÁC‹aZ {`$Êâ*QªH9öcóËGŠÔ‡{(ÐÉD‡‡¼çÞs•¯°A6úgßY½úù£ë°« üªþv«¯+<@À¾²Þ¤ æ¹$+³C„!LäBZ¯nañxó0m6?¥ÿ(nCúþtƒmëS\ð¸ð:N‡Æ:××—WwÙ K v9—Cäº^¬bMóÕ­Ãõõ—ÛEq‚í:|ãMIIþ â‰É¬& 4¿ÓÔxz•vz¾éeÛK(š$y¬¨@–jÞl)úênX£R·½ƒ'Å Ow¼PE¡òà`O_][ô±XLQ5DNåònÂ`ŒÜ£4\T×o3f“[„(›nÆl'D<’Îo&@81ÈNçÍ>¯ç3\„]1²0)f–Oó1 ¨šËHeÞÏ,à¤ø][üiÙ‹¡H§ Ž©SYÄ£†„çàš0ìØžêŒ¾Z&Ô¤qÈÍ_¢üÆÊ¼CtkÉj 8ê‹,òxîÝñI·ÆdLÂg‹v.=ðb°àŽ?ñ?DAãxÙV¢fÌÀÝàStGa‚ß<£ãKh„Ð5q?7=d„CV¾£Fåc FgJ©=Ë{•¸¬©úš«Ñ +¤ZLÊeZz>ø´Q”ÝZOÏžWSbú$§°½H·:h M–jL²¬©[™"Rh¦},Z’Q'§«™n ƒ¡¿ÐãSÓå÷Ö*ü=©zÓ»è¸ fnˆ™2u‰Nõ#pR«¥oŒ«†ÆT‡Ìˆ0’!šŒ}š½dK;Iú˜†WGPMl¸±¡zÖú> stream xœ•VÛŽÛ6}÷W I[±ä{€>lÒ¦-ЦíB6‚‚–(› E*"e¯“/ï /¶ìuº†m-MqΜ9sF_`’¤0¡Wø.êÁ«ûl6‡­Làg|o_©Û᫨áMî¶-!M!¯þÞ–),ÖY²‚¼¼x¯-»c?xËA`Ðࢲ‚I(´ª¤(,ˆ × -»ZÁŽÚ †Õ}à‚VtåÖówÜÿ¦á…¨oM¿ª—ù¿ƒtšdÿ6xA›ø#«É1ÜFïùÈÝHïáÃ0Æʯ²ä·ƒÒÂ|Ýû Jf™=6<\CË–{þò9Üb>N¥Û36¶jK)7­.¸1¼Ó;χÏ"žÚKòTìxñ÷ãQP‰ÖØÅê ˆD1Ãdž+#¬Øãf]7¬F+¤Âs+#˜=“£_i LA×4¼u$nƒÃ¯€Q0D¨^ÂDGÔ¬Äbxö—Ä2C\Ôœ)ãrEН‹1|øáÙ´R”ƒé¬ŒÕ7 Áa'°BÃGwܺãx xâ«ûi¶„5)2KI…(€f÷ ªN•Â40®"0ªMøφ#ÁI'§;Ä¿‡xñÁ/Ãß颷{>[ø‹l’^,¯n-'IâÿóŸOp>ÞÄÙÃwÚª§€žbñ0úíœe¡›î¨eÛNzq ñºÅKaI nPMòÀކŠáUw¼É@êCÔSeOý@56¸…è|VgB‰f³°žãÁç"ÚÎ:YÍçd>y9x”}ôŠÿD–ÐOh¶N–ËyØçUTì˜Úò~ÏR¿1 6“$[^tV ÒÑyBQø ;LÙh„‡mdüí1XD5^¬“Åt’ÂØç„!ßýýþÊú.¿F¶\$«Å*"ãjßjU£CbO¶Â¹rû¬˜…P{]0Âi.€æç­º¢˜ãèŒÉ™×Ÿ›³cˆ’ܺ@»vý†Çudeaw7sÏÐýÓé©"OÒM¦Ù"]Æ| Tì‚yl¥Þ` ›Þp‡<[¯“õ|݃ŽFÒ¶¢Dl$/9ïEÙÑLAÕ 2®6ad\CL׳„ÚâŠ&Bõf3L+ìÕ‰¿¿e{άy Jî„N*Q§ è[†à ²Æ)Ò`ÑÄFHaÄ.B(v3$Ž…èu¾­.ÆÝ©‹ðǶ兕Çî.b;'ÖméÏ©™Pß°†cRl}ù7Ü8÷]k\£úxÆõ¾› ½¶v=´Ám§P€¨‰¯a*H^¡ƒ‹ªŸÊA”(d›q«Úâz(”›#çô ¬ð(N]¦Z‰áBÝÙ¦säbN÷?¾‰¿úyI[Æy(Þ·KCùx‡¼HäelìQÞÝ­H·”ÛC”¼A‚)Uœ´–ƾƺ¶3 +ø¸äRÔ‚¶¿ gõmÍàDãD´95ïÙG½¡æf¥%ú&!qµûþ|+uG6QIM:ÃBš‚Æ&Àú‡\p¦~×â]ëyy„:HLË<£VUeÆtuãJáÝpS¶\ñs9zAÆ¿2,ÂÕ'ÂSc.k.Ãñœ#Y4Dƒ±œ•ŠK8 ^½ÅGu¦Ñ?•¼b´ñ<’,ËwE”ò˜È“7@µPNÔdt(±8ÝÜ#ær¹6 Í©'œEB‚ÓÒ˜ôÌ’¶‰ÜÎÆGœ(u‡[HlH# -ê®ÆG?.Kß9ØÂ OðÙéÙŸ(æðÙØ]¶ÔD[&é·r»Ä-¹VzCVH¨{>7rA)×^™‚Šèl¯Ÿ"ªá3í&(0[,aå4M“É<ƒñj™Ìœf ò¦ŸòÁ_øúæüÉÖendstream endobj 481 0 obj 1387 endobj 485 0 obj <> stream xœµVmoÛ6þî_qóR¸/2-ê])Z`E›.ÀVt›?´2€‘h›­^\‘Î Ö~H~ùî(ɉÇhÍ-Z:Ÿ»çÈ{¾€Ë8¸ôí®Y9˜üé!ÌõÀ…·8æƒ/nM »d%¼š¢™ïÅÂt6h_åsˆÒy0-Nôâf«*Wz ã =q>ƒ1~ý|ºj˜<‡¡Q¥„K¸>™~Â¥XÓßèý'#úÝñ™ÿþ/p|ìŒÆ;?е§8 Ò "F OÜ8 âð?x.¿k”$q”²4¢”ÇAøh”l1ÆpN¹ŠsÊFçYäï^Ât¡4Ìê¦p–Ëe#3ad¢ÊáBœIhdYŸã=UÀL™UC÷ )´d§¿t>§ ÝzQ·OY†”ûi>x<>:ÉN)[Â4èM@_(“- -¾Ò¸²©A/e¦fWˆàZ«j^Èq¶ÈŒln «‹UY–K¼eê®/Qē˙X6>A+AêÁ˜û—ÔK‘ÉïjCï`2:‡mj ®×&Ce­ñ©lŒPUh ]ƒÈs°.4] ÊT®ÎU¾EçÉ>A4¶vü.[ü²R¤DçfÁ ©ewŸtLƃ^6õ¼%è¦Fh 5wR„aªg0—•Äð íª…šW2§Jè 08ÂÌÈKQ. yØòD›#b±›WnÈ[pëq4rFÝ&dª² Áøé$ô»Ý`?œnò±¼ÿõ—îÎûãþÑæ>éî¾îß|mwL¿Aœï˜l|î?^ïDîlN¢~;ýöóÓ4fA˜„A‡Ý qÒO‚½î’~’®Ýa²0IŸßºKû‰¿×]¸ Ó¢‹|Î\?‰"¾]ø}îÂ[w^ŠçYz<ö~ÔÝŽ`ýÀ÷˜ë¦©›<,w½ø ¾RÉÃHOà©O'Îdþ`ñ}t¨à°ÔleaMý¿ÕD#rbç~ÙP·‹…Fâ¤Îýª mׂäýé­ïp‡uèÜçô!ëÉ&e·Hv…=òòÅ#?‡+û»T/q¼,„½RŸ|ñÈsmÍ[ÃÜZÿ މÞ_œÜ:v8»9tºA¶û8 "7¸KÛ>ƂئiMÚ>¾‚„ÇwIØË–î´Ýɕݥk£«öMùxf»ÄV_ö"æy~Ò÷åévSæë~|Ýäg`ÄY!oúÞŒ½te;9®Wf¹2mƒÌêŠz¦mØF4g(&ôz.Œú×µÔCr¨{…aÛ²·€nÛ²ª46Z¬ˆ3i.¤¬Ö½›¶wêÔU×xÙ¶”©jâ\¨‚pª ¨x qEíQ•b.±p/e¡7Zòµ¼ÌäÒÔÁP>­ªÌ¨ºj›ðŽ$r?e‘ç÷I,¶“ˆ­Õãnº©lPhØ€9 «k6SFO0e§CŒÌú‡—€¿¬MÿC Iä7R£¦&z{ªZ¬‘¿î\4ª^iZÙÔu¡{%Û£ô¢ëŸNËey”0/Jb[S^LT¿™þÀï¿I”ytendstream endobj 486 0 obj 1451 endobj 490 0 obj <> stream xœ­WmsÚ8þίØÉ}  Š_0ÆëÍ% É0Gœ”8m:™LGØ"øj,j‰|lù­$ÛJÒ´stEÖ>Ú}vŸ]ñ,bƒ¥þ•Ÿñ¼u0vº܉–§øw×úÚ²õ(?â9E¸Íu| š¶Œ© ¾ ½À#DóÖ+€é2s)`Ê9™¦RìÝü}'Süo&Yq»„×Ñ¿ú<l[!9޲µ^I‹‚ÇLàyörÆ€Ý3—æúÛçIG¦s† ˆwO3Aàu[ÃõÀöœÛÕ`èÈŒÑ:¤b‘ÑG  X¡À(œ,sÉy†ž¦ÓëÐÒßÀ€›½Å7¡Þ¤zÝŸiNçì/¸áê˜z¿E Ç.­:ðõÇÚƒ,ö Y.Rž—Þ4±­µ‰Ø4ñˆg´P ©|áSè[0aS^0ÍIÎV,ÍU Ê^ûEÁ,O ¡’‚|\0 H1£ñ ”‚âK¹XÊÒtdLÍšb©H&BÒbBC!1­ÅœÊ5ã&Ý2%_åã*¿nŸx¶`µD žSF&´ó'Ãè²JË‚H!¦µN·X°8¦,U3ƒ¨õ¾ÕƒfØ ˆßÏ |˜·\ßvH˜¯YëòÉÚ]»T/"‘@!uu°‚µCõiíVÇtmï·ñmâ6T5@ôQײðyÇðˆEû4-oZÜ-稕8ÅêãYª™)Y¬j9ÍUæTE+ƒ’iÃ)ì ™¤ù¤bÍê¾®åí–¤XT…*³iÁç&’æ -ƒ­Õ¦©ql¿O¬x–ã";NгH`›¯¿Æ"‘¾FrI×$¡Šç¨ ñ&× 1Ǹթ®N ó[§=bi¤êÔK*•0‘£¥À¢C Wª6e/3”®µŠ%×)tOÃu •˜Ä²••f²ìq_ó9]b@+9ÒXW;êP‹²ÔA¬Ù¥÷QsYÆWèÏDõ°Jî¦tjéaŠú¶2{ÄqÜ~)½Ýn½±{N¿–¦X¥ýج[z¦‹B»ºIB-X]yh^VKTô’íà ¸gž)w¸ýžßàJΨ4þ—VàÖn×q~1€„£0r.aÅ‹/€k¥ÃʽJ$÷)­ 1@¾Ð’)؜߫¾ŠALÈ"MIàÈоw»¤gyvÃ÷éR.µj2†mÒ¤åeéÛÑø$è:öóéГ±œ eý(Ñ–M{Ç\ ©hf,[˜nQ «o™„t‘Æ^#¦ðoŽƒNÏÙ& Ìuz8žVgëiÅÍ9õLX (FŒÎ³5jÚMÓ‡ ©˜À\ây¸|KwõŠ¥æqµ'†Þñsĥ⠜\…Ÿ/ÇŸ¯ÂÂó!|k/Ûß÷7ÚhµåÝùÙÙ ŒpKŒ[jËÑùéðÝá—³æò0Œ§ƒ1.§ °½Æ¹ŒÆÃðˆæþñ@cÍ5<ñb4¸Æå‡öwÝ­­EŒ¶S‡w“ çW „ox'I'ûÞH£j—&ƒeŽV)v¹˜çê¾ ûhy‹8PæšÛí;E5 }bãYÏÂ^`£¡óÅÆLÓg > ·Í^üm‚¥Z<–þ½)»I}¯kÜÌnÄìªëÝ^uY½1ˆ·{›w²ëh^Ï÷Ð>Âmh¼À´÷ðùáøè=°óeîZGÃèbx ðv×–¾†<2±h²žÈððzx O@:2R¼¨|Q@Æ‹ôá%önHÇÒÓ»«R’ÁÎQz’‰ç!®å÷ d¸œOPj*æè$3ÓEÃxw~…Û¸ãG×ZÞ1Ç+ÆÓŸ>ikÈÓ‚/Oãü £ãËÝþVàØ³DÇ­§mÁW» ×Qxx6@Èv)Ø®K“qýåE^"äì@Ïþ[§[^{»37ÀÏÇgºˆÚöÐ<Øöò¸nûØ LðÏzEŸ.òvCŽè„e?…k@^…ÃÈ@V¶!/f"iË<Õ¿pŸÄnîü¯0ý#Ú¤+<6íoS}Ýâ\›XžÏR·ZìŸN¿¾<¿oýz!@endstream endobj 491 0 obj 1558 endobj 497 0 obj <> stream xœW]sÚ8}çWÜaÒÝ Æ6$8éîB³Ì4$·M§ÓÅAKå1ùå{¯dc'5d³d2[:ººçÜså;°-lú+¾ƒ¸Õ¹ý#¸‘-Îðÿ¦u×rô(¾‚N}=lŽþ¢eæ:0pàøÄµ<ðãÖ?…PÈUÄ6 –ÿEÂ’³goáwÿDè¹8!סI[o¾ËåXä „ö"M­…Pò{ïGû÷ d;îÊOç“‹é;88LýáéÇñÔ>]€½àóáìè1ÐøAh„<ø—“+€wMC< y*–m dŠ5#=ƒœ¯&sØéjHŸ]G„1S™øù_ fÈžü*Bµ„tÊ`'p½Q\î‡t›!û¶†œæñ5Ï“'$‚!ªo„¼|ñyêïØ¸œ±$LcX±ŒÅ\!xæ‰Ú½ñ³}ކ<ËÒ|µçHÿÃdüq4o†<ÛøBð(Ôûæ,XB–®› ÇWþtx>FÈÿl¦<×¥a<Á]¿dùe<Û»ñ/<“"M ÙFÛÈMmã³s-¢gQŽHãj³â°H3³ù½QpX`YVõt„u›pû–««÷™5¬2SUs€aqëøOŽ)ûñ-h¨&¿Ë?+»Ò˜¿°ŸûÅ|r~IåߘDºs8 g#㔞¡ÿ/ûüÂ9†®Û9ýæÁÿz1_Àåj|6ží†|Á/ºÓÏç§8ÿâ ¯ÆóñýÙìžmÓ¯ø¼èÿr4ô‡þ·Ë1 ²HÒnM‘Ýùß3_þ~…Ü'@T])šU–Þ ‹d Ãê…2"†‡òíé° â4‹Í#]–I(îE˜³¨Ð¯¬MR)8½bÑ1á"‚6{)nEbx¨ÐáXÄú‚V4[‘OzN¬³ KvOÑüvÅn"“„åqò¨3l¤@—ub™$6 æÁ„ôü¡NV®‘çxx&©‘çx½^‘æâ²"¯¸aø)'–¿4jIž38qêä9ƒW¢šËмò™ §œXõÕä!¤¡.㼃iˆ+æÈ¼Kö¶L`1•’“êzà^-˜è'O˜c×Û&x—§Ôu±I"—è@HÉ”Z ,Óv£tÓÄûØ’·­Sz¹Š¢t,"‰×…Žé!î-¥^Åâ51íú) %3kðL,yÜJ}$Ö†ùSHUF\õýC²‰Þµ¦Ý½©?Ђޟpz|¨Ó±½Uµi)Šjrq vø6JÇ™žcaÅBÇs¨Æp3î ­§Uú©õ/}-*eendstream endobj 498 0 obj 1557 endobj 502 0 obj <> stream xœVYoÛF~ç¯Èâ"-ºŒÈaбÙÖ…á+q%1!w•Ý•%y±ygvyÙuQ82 j5³s}ßÌð+ ‚ôW=¥wr%CXioðå}õB«ÕcQÂÛÕâh SH—ž»Â8„ÑtD–Þ1€^ÿÁÉr+Öœe … ø,¥ –¹Ñà¿N?£á`鯤}…”_P®`vq¾~E?þÒùþÇ›Ëç?œÚŸ@Hƒº[‘9á°,Áwä º`õ~¨]”G¶À¼¦³v`-‘&Ú õÛ×ᘣùB¢vƒ4+´ìâ‹ ˜'ðVØjZ/°â‚〢͌ò.¬ -–tÙ"g{(·#Å.}×÷5ðý®ÒÛ;¨N!GFì{VµwÝCÅÞ¡:ýÙ£éxü˜'h‡n· P^5Ž6y‡ã™\íáçah—ÏÁ~€:£O¯PºKÍÀ}Š­ŠFÈt®ÉaÇö./ X¡¦«,î#º½-ðåÚ¸3f;!ˆÌW–‹ªŒ@àJ"Pöý¹rM¢äNTO!ëÑî{Ô"”Ho_׿‹óXLoÍhêÔXUòQ˜¤nW¤®#åÔh­Øä{^<3LÚ1BÅ[Ê¢Àº¸>3CžìΖlv‹Õ5êÜõ‰(×nB‘¦²¯­Î\•F³zÙ Iݽ¨×r[dMÇ‘ ´ïä J¶wÄþ·áÖ\]ýuv¨èõ. ²ïVûh »øã0 #ð“‰]Oñ ™9Ÿ¼s˜Íendstream endobj 503 0 obj 1448 endobj 511 0 obj <> stream xœÍVKÛ6¾ëW ÒC7€-‹²eïîmÛ4Åi€6:Š‚–(‹$:z¬×Gû—w†¤¹RJ'@N¥aËÎã›™oÆþQÈ ¢—}fu°ø+^%°ë‚~Ç÷.ø0­ö‘ÕðKªÕ6À¤E`ll¬ïâðÒ:¸‘5ß ØÊžx5ˆ.„ÇúRvÀÛÝP‹¦ü®jÙ÷"Ÿá€f¨·¢U€úýГu…jCÏ·• ‹ŒWÙPq4!Ѫ}~Ø2Œ!}Ü­ªµ¯ôÝïøùðJÁsÑvœ$ñ,;„Ñh áícúÁèÈtÓíE& ‰3U us~ýspƒwÛ#ì”lv¨ÔªaWjåœ÷ˆV½àÔÒƒð&‡š?!¼¥¼ÐuúFþË—6¸Tß<¤”¬~ºtm¶3øPòÿ‚Õƒóô^é$xoÚ‡z=º¿ØHÕ Õ®ì¡à²S[“ê4Â4’êL±jQ«öž , Þ¢J¥Ð‚Ü#ÔN¦ˆ^û:kXÓ*iz "Šáz4CEŠÃÛ­ì[Þ!ªž,X|KC'òP+^YÞP3Щ›¸ûVe¢ëé *å×ʯâÅÈú4næâàd"X¸ŽfïáDcpy_ž¡;È>+©4TBBl1ð:”V$´‚£"™¶üBô9K–á&N`n(Þ±3§0!¤åÐ݃¶Œ7pGÈbFó‰CSÿ{Ñõ¡x‚}Éݳ(ºOl¶—tâØ–©K®¹˜òc4ƒ7ŽtuBv¢È»Úµ¼žÁ¡”•¸7Uü–ùáá`ø)žä:œiëÓ1 sùôDƒ>ìÑ û2ÿ¯¨wad+:äQ—½y‰'äÒè³ÈhHÎH< ë6•qÄöðá×ÇGK;\95ïír02Ã?«žËn_ñc§e•:ü#rœ³“l²jèä““Rj9ÁI<»+»ÿ.k’6‘Ä3¯÷ +žÌ[u°h2Õô\6”‡WØWvb?îOã´¼Az%Í7aB”¦‡e¹&¢ºáä5|êÊ¿}¼¤ÂENë'Ó¯BSÊžE©j±­Ìt¹°Æ„ l§ÇxÕ—¸ôf¸ðfÔT£¢s 7KŒ’ùÄCãHG§ÓS)ÓŽé5ëc“oãã—: €¿µöÄñ(¡ŽÌK×N:òàìbæ×KŸ‡¥ópEw,]ù<¬.×ìί;–.}çáÖ¯;–Æ>kçaã×K™Ïƒ³ck¿îXù<8ìË+º#)x=¸úM0€ßƒ/ æ4&uoà«$s<šô¼•_7™ãä„àí&øÅüœ/£ÀÇjæ89™ ð²|“Å''³ ÞÉ‚ÍWÌçµ5ˆ¿‡ëËÒúï ü%ø5¨DÈaý¿Zƒøg`½Á±¡% £$Æ­± WúÿÐ’Ñ_žßÒàO|ý cí7tendstream endobj 512 0 obj 1098 endobj 516 0 obj <> stream xœ½VËŽ›0ÝóWê¢S‰$YVêtÓM+vUU9à€+^L2Ó]æË{ ÄãdLMG½Q9¾?ιp ‡ÀB~†k\XóoîÒ‡´±ð¿©ug‘ΆK\ÀÇÝ<7„5D;«%Ö¾ãBTX7ÐóMš-Ñ›Ž…~ˆ~aUgÑ•ÊUn¡9HGݧTïUOŬ̾:ê™2,U†µÙWG—¦ ¾ª:â«£¾)ƒÚH—˜}u4¸ÊÐÿ~o²°kËŒ7k„ÃPgÈ&Øx½Ï;H¨ °ã9Û<å›gUÁælÏ㹞Áç¸ÊÛ¢Üè3yÏÃ/í‚ÞÛ[^6g'¤‚œ%xúÑЧ»hÞ2¸´¼úÉ’ôÍx‡öf —‹;Ý̨¶Ùj‹=O/e毑tж^höÕQ#eTå%1ûêèÅK-‡@ˆT©»”ÊD9ÝV{  è6g P¥{ZØ 2CH0„â;¡'å%Öͬ”ªÔS®0\­Ïã§²Ú4ç¿Ù#4G.â bZ–AÛ°DÊ¡+&¸?ÜíCy"2¨vò,5#.’šÀŒxrêXB†œ¸Ãû|س èg§º’KTû¸ û¬|Îx¹p­Ý˜©ÿæT7¬ø¼-Tð ׇ{2?]/ïx´®sÎ’¡èöF¢™–ÊË$ï#e_#¦žê$è쟅Õ{¿Æ]V™;ˆ,B®!EÚ<éØoÃUÇîiQçÌ–Z¨÷UÒÆ •˜ó4·ûƒ”ò¡;¼2zàe mÉE#UÙJÑÌWeH+Á¨äB¯¬©|IŽK½—À š>|ÕŠºð¦ÎéCÓayuDÿ]ÓlˆftÚV8=^ÆyÛðÊ|¶>‰”•lOE/qUÍ[}ýÈX9¼«r,&©FÈj 5¿g¹\‚»Ó3—FlÀV¤ò wm8f¨T¨Êü ræÙKÛ·°~¸é;Üd褾Ã}I_0?‡èÑ^ ß— |¥”¥–¿FQˈþ)ã19 ƒ0È:"eÏçN cR6Çy¨é5o<›yýKS6_÷0gó'PÓëßx¶`Õ²]µNS\8ö-›ðª“”> stream xœÕWmoÛ6þ®_qKƒ%,J¢Þ¬¬ë‡¢iQ`ÐÆ:ÝÀÈ´ÍVoÕKbc-í—ïHQ2í ºFÖt:>ÏÝñx<—xàʾ¦¹å¼¡AëÆrá%~×ÖGËS* /iÏJ-σÅÊêçz{%”Ìa‘[ç/ÊÚ ¶ Tuùž§­( (WÀ 9[ó™R(»¶êZXŠ¦ÊØ®Q²¬¼C­%lÄzÓëÂ(øó¦lQP¤Y׈[þt _>^¼·<ŸPXül·%¬yÁkÖr…´g& Mâ[–WR‹B½_•’‰b½C=HË®hذ¥T5¼•üp˲ŽKèìñ™uÎÛ”\Þ9o|C"cA=é?pÝlÞÁª+6¢i¡åMKVA·@/bœä¹£æ#X²–ÁJdüŒálÊœ;¼©#œD²Ëii™uyq0ÇÛáu.ŠYζ3»  CÔ¿}åÖñèÝ<Yùû„îFHif«¡/Gãk¤£m€9µYWÓú€Ô@£¦‚;9Ï@j ù†‚—LÎ h‰6Ÿœ> 5ÐB-žœ= 5Ð"mzÞ4G|„ÖÿþÓ¾¸ CîþW;‚þwD4ÃÓ;b2ëÌNï¯é¬;XYó, .Ä¿–¤Xé±Bú説lë/Öo^ƒ|jeÑÅò¼®YŽUëvͪ*Ê5oº¬mf8Y*1hÒZT-4]ºÖ57"aE:…æ$ñ¢¡¢~çà*8Í5c)w©~ƒØ왣N~p–}DœßNÙéò >Á}/awàLß?»|ùê—?ªZ-œ4¼…¢üÀw?‚¼mE›q¸?ÑI}Ò‹·»áÊÑ”A¶dý#Å*4÷'öý Ü <ÞnÊ-oN>c”5µf=õgpJñاþç³a)Fk‡(Û¯¹·lðž:K~ë]–}ú½w¼XT/Ö•ÈEÆúuÁ-”çxø6ÀjŽ!¯ªL`Ìôy©WBE–…hž`°XZç: D¢ÉÃÙ¤ 1“¹VÄ…T¯ÇÓÓ¦±Kây vŽ.¥_¥‚ßBµa@‘ž›Lƒÿ#ÚKL?P.¢jßHØÖ\¶ ^¼Z\éöbU—¹”࢔eÖìËÏáñŽ…~~wm³wðD,çOáIÙ_¯oD[‰íOÅ;ó 7æd_Îy²ÅÚu±]мÁ‡|Øé‡[|85Á*Ø~Ú=`„Ñ—ØLgÎ#`UűÍÂÍDZMS;R·cÒuÜjc¯† -/ì£[;ÁD!'b·Ç “ë¥ Ò²h™($²ôo;õ« ª.’\+û Ͱ¬”ú²^ìú-WÍ{Þ›tœƒCå"s”ìA ³N#I;qcå¬Þ}‘*Ó+žŠ•L}™Q— ëµÁåûA@b c«;‡ÜòÃKŒ?J2ëê+šfÄ#ÂKˆ?×½³4gdíñƒ1pýoa +¼=ãå°º²ív0î#{àÇ!1Ý ¢8&^ð/ÉŽ„‡Þ¾Rqß*üÐ` ]÷[£˜Ä oOyeü‘ĶŸDJÉîÿH,õÈžÉ4ìËC±·Ò‹0Šî¹B··ÒK"> stream xœXMsÛȽóWtém„‰’¢ª|°ÖÚªv•Z‹NRQíaH EĆƀ¢ùËóºAJIì•Kbèéï÷ºÇ_iä4âÍç2¼ûÆcz²ƒýŒß§Á×A "Ô|,sº™‹Ø”‚€æ«;Ð4 É,ô¯hž.çkM«´´©òi›ë¢¢ÊP…o7¥y*UNv£—é*ÕV¾ýénþ@i±ÙV”æêI{8WªÚ#SR©v¤ŸYÅ*Í4뎥¶Ö§»Õó ‚ÈiþËàòÂVIZ\Pj;õ‰G‰ªÔi*µJhUš\LÚJ‰*gÖ§ÏVÓÜο &´Dñ4ðÇcšL¯Æ”âpûqà³ÁÃwdšü@4Íü‰¤ç§mQ“Yº)Õò‹®ˆÃËÎLØYD³?hšüX4µVïM¥ªÔœB—ŸZÏÆ‡Û…øÐe3\ê—JòÖsE!«—•{F긕.Q.6^|×U;uu5ÛŠk*ååêqɈ˄\§“òõjvì 1 m»2­àOÛF]õœŸnjJôJm³Êë[Þ¤/:£g•mÑiÜfůQèK«r횣ª7š{ll+Ñt£´Ü](2i·wkø±H‹"-ž§Õ"Ó¯Öpu©ðzžuY¦I¢ ¶¶µ"]ÙpUƲe/cÙ•)óknÄwŸ¢pJ3.i0¬!‚Ù !½/DàXô0lrßdÁ»ò‚‰…Þ'±Çªi‹Š>:¡åZ•Ùµ)‘0„…×™Q•TÕAHÃ%©ÒgÕ>ûÆ™»~Ž:€qœ¦Â,¡6ë¦LUÕµû†ÞBçWðƒí-2$´_(‹ˆ¬ÍNŽ·€œ¢ÝÇqÁ(üÙØ=~$@Qã¨4ÜIguÀ;Q +QŒÇøX&?M­©‡cà]ˆ8H¤mûF“ ¼\•µKªOçæC¡dúI—îk‡`ðø,žõ HV*•6eu7?~øåVÌÞüóöÓ_é‹®w¦L,›†,ú•+ãÒ ®€¯d—*kêÆ@:0^±±N/Ë':Ó¬¶#Þ™k°±.›€ë|¸ ¬±ãjÚ¯Jû±6]d57œ¢$]­Ðô€MÿÍ@ìÜv¦:sšÞt´Ôœ,ü¿NG²ß‹"Ø=¤ÄP «e¢ÐOûîÄ'éšØÒ/©­ºbI4ŠËDw¿~øù–ºûŽOû³‹eom‘c‰Aªy¯•ÎêÑ}¤!aÙF5¾9WÜ휮ÃɀůDbXbWXk̦æs4ºxNKSÈ%B®&Íõ˜ßå(fºÉú—)á rm¶´Sîj޹½`zwk ñáŒ+ΕÞíí¬|]ë`òºEô”sã¸~B N¥¾tw+ÞšûõvÕß‚.jDzÒ^ûOþÉO”´m39¶M¯cà\’Ú ³óöŠcÃÖI·±l¦jÔQq=¥`/âCÝ•±Øæ p<\š-¯Âøøƒ’ oÜb+=æ]4‹ü(˜´MÿÊ«‰? ƒãÞ°ÏÐc2Àžö/éÇ®ãMÍ;¿¹ò5 /šT®–àˆ?ÞݽNý!dZÁ4•ZS)|ã²îÈ6;.WKƒ} S5È®z²L©æ¿xÜŠ~¾ªž5X4üé(jRÑuÙ«2¶¹*õ×mŠ¡×HL¦tå¶««‰?4Œ§LÜ⎌üKÂÑendstream endobj 530 0 obj 1988 endobj 538 0 obj <> stream xœ­WKÛ6¾ëW ÒCÀV%YòC@/}l»@Q /¹àJ´ÅF$µ$µ¶rK~ygHùµènÓ®½0(Z3‡ß ?ÎÞC§Ðß8V2úþÏ,/`k£~Åï6ºRoãPIøqíͦ°ÞDÁ7…E óU/a-£7Ýà{g0³í%WΖ°¯tÛKUîk!í†q:„éC˜S5Ü ×‰ý*†uÃaï J´}»þ+Jgqëߣ7Bm´‘Ì ­À±OÜ‚Cú­„·¯1ÒY¶€š¥º(&9!Áåç;x`m†©-‚-qcN-ú™¸B•’íÿ­ â‘ky'”Ÿƒ+.Âq¦•[±–# îwrâ<ËÆÝß*è˜q¢ê[f&~ë´žl£ûQ8ôÑv Wü›ƒ•½DJµ©…bŽNW×’»F¨-h45´óÛ®a ´â1ÜhJ0“]ËŸ&ú’´Mk2äeÚb‚tÜZçÇpÖ×F™”EšùºCLc5LgÙcò1.ª’Vg®7Xk5Tìa÷˜ÃY ½¢ÔŠÍ†Y‡ÆL Bu½+Á Ü×€]Ë*î öç\ì„k€êÛQ ’ÃÚ‘sÞñ˜V8/U¢Ù t2ü¾†×ÏTë9oÖa¶N¬½z5uöpI×ÿYž@VàY …˜~ç…iÇááãÏßÌrgôƒ¨±ÞY  ù`Q½ÅR3TT îZ¦>ß@ ·t5kÉ×ùe½‹æ°‹òÅ5$Ï“dT$«$^ÍôÞÿ!B¤8óHi<÷jô“ÏÝôŽQ!¬Q–€$Ä/ÖY—ÍæYŒ,þe)N<ÒaÙ„8MkMóÙÒ¿†ò©Q"YÅ|îQ5¾ZE×`¡â9­´r Ï¿q¨88kÉ{uª’•U¥á•k‡ ±”(Srv'´¤õ¨ݶzG:à£ÚÐv¾ 2‘4Qº½ûúLÙîËÛ2-‘7ƧËrœúi_x Õ—Å4yJôÖ žžSH5ßEº¿Ó‡S=9\à ™Õ¨™cà†ŽÃ,›â A· ¤N)FH—ÎùI¯´”hú-GtäåtBÇø|j3![(MtXpÙ¹nn×ïÇÀÎøöxcQPVƺG~ƒ!î±Çl‰[ÃÌóÑÖÂvGÐ˼?i²0̇¡Ã< ‹0,ð ÞIHè)Á/\š”cy¼p£[]ny]¸Åuáæ×…+® —_nv]¸ìºpé—¾îuå² 9©¥ìñþEðmËþ€-½;e ¿éõŠº 3Übº)ð­rç"Ùi+|k“Ljotïè*ñÞ­¤]ˆN³ W¤½^ü°CCÕÒx·ÅðåvضMȶÂ",.…ýõn-ì'ÃØ`‰ØfXNÝÒ7c>þ¯Aü²ùE‰h™¥qRd0Íqî¯ßYqìÞE-í:-endstream endobj 539 0 obj 1142 endobj 544 0 obj <> stream xœ­VMoÛ8½ëWÌ-) +"%YvÐZl³(°—íêТè–(‡ %ª"•Ø@M~ùEÉk¥‚·h-#{B>ÎÇÓ~…0 ÚÏ`óÊ»zOã¶Ú áOüÛz_=Ò/Áä¼Éúe)Yé¹½RË5 VUÞåMך[ÞVªå>ìU9«¡ÓÐ ÙÛ”BÞ‚nx.J‘3#T FÚÜ fÜšóJÕnuÓ0|gìVLµåöàEöÅ#Q@!ûË»Ìp_©¤T¢ÞB®ªŠÕ<)!oùˆ¬YÅ1¥f•ß²DŶW™[…§àq,7“éöÀkxqyG4…µM››*PvµÛ¯M!ê‹O6¿ÇÝõ»kúûÞ<}¾À TP £a#L#v¯Vð® ~UwR"6 @Õâ¯cØÃªŸ†îCý¯E4Šó;Á¤V‡vpa+ª´UÁßVTÚ6bËkÞÚz1hùÖv§bú´¨¹‡ÍXÓðº°U>¬µ·ÉŒí°ÅZ½iY~Ç1JÛÛ÷ro7±.G:Åq@(EJe…wi|Ű>ØâãŒb¬ã˜ «0'…H¶}}w]¸AêðÀ‘…fŽwAVi.—°pQ#`O—£1¥/B§-F4¤­‘}|¿H?ícâ'~üä7JÔæÿGžüÅè§¶Éß9?öÜkõŒW"У·¤åº“Æ&Òç$•ºÓ Å}C„>Í÷BèæÂ4°ÃCœ¡ÎDÎÄÎ$Î,IY9³v»C÷ØgÑ?¿i ¯fø›fˆn}^¸Õ,ù3—Ná~gu€[ž‚›Íë$\r^¸ø¼pÑykGÏÛYrÞÑS“bÏ:IQ £AzGyûA ãQ›q” ƒ—ü1ÌÙ¦U_xn'¾¤ÛŠóP®q¬ì„ÖzGàñtš&Áj=*ÿ¢O»oûÏÏPÉÓd AãdÈoÈP×zÅQ¯èj}¤ø9kØFHaöð ZB{íØ((}Ènh¶‘\Oæ ’~æánÞeÿ¸5Pãý¢~ï$×&jLirU™N¤V=œÝáù0~ù8UÝÅb"v£ÜÁ„JøeÞMçÝѼ;žw'7Ç>¸£yw<ïžbGó w<ïž‚Äó«ãùÕɱ{v¤¾Æ6·8Så.EÉ.qÜññE’éPˆŠö„ð‘c,,¿[ŽDã#C†þÓeŠÃЂG$ tX–FKK ·™÷7~þ`¤uendstream endobj 545 0 obj 953 endobj 549 0 obj <> stream xœåUKo›@¾ûWŒÒCR)P^6Ž•Fê+U¤ªêÃ7ˇ5,ö¦°KYHBÕKúË;Ë.`b§iªžZ,‹æ›Ç7ßÎ~ÇvÁQ?s²Ñ³O^0†µ9ðÿëÑבۘ€¹E¼œ£™ï…pód¤¡.„.LNƶóltƒËí—^¿ôûeÐ/ÇOç—ÒžÂüñcu×c–O|<Û›ÆÃK þîh¸ÿ¸³÷„;û—îî‡ßƒ•Bp]ÕaÏS]Ån¼€¼—4*™à@RÁ×Pn(Ô@n˜„ˆpXQÈi‘ˆ"£1 ehP4V%Y¥„~`YÓ4:%yn×õ¤â X9º§WvÂJ ²ŒEUÂwõ9f2W/G'C½ì+ú7twøävå¿ËŸì-?f™÷?0Ð\`4w^JB™(è1Ô¢jd””¸¯µ”v…Ix ‘H«ŒƒHÐRËoUC%™Ñ­ 91!]ß„\1ŽHù|¡ñË;©M];5öæ1–œ°´D‰ËœF,aÑ9ðØ¼©U4*(Æ×m8Ç}@oH–§X•Ê%i*®ÑH?« aéœ0L$²L95uÊ$IF{ v6äVÝDbÝT½i ÇÛ•ûA`ûah*Ršk-ښݩíxÓ“¶fyÍÊh33Žº lùÏœ Xz+Ç-›]|¸hù­—‡÷(vIÓotçe3^µb>¿˜6½L ‘µo.RÔº‘¿™ ¹Yöd—T–6½ÒwEû}¹¼FÒSR7ºØJ`M9-0­¸Me•Šè >J³ËPJήOïÀä·ðfÓc{˃GO·»éâw}7מæÂ.·îºf{Ý‘èM;Ç“q@o›tRú ê}ÖT¡Xà1½«dô<9‘ëí¹µCòb÷ÄPÓ9=Õ›“Ê3€SÄeô N¿Ðú B=-õQÓúþåLõ^ ‡\5V)(pQbYŽÓLô¸óŠ—÷­šA•j¢Ùð!¥DÒaÔ¤QrŠiBªg㲤$¶5wVÔô¤‰Q /ÀÆçØ{=œ×ßX~`ŒIoüâó«‹ cy lÍñLPÞnM ™&«aéG‹Oz|ÿµ ÷KdÚ#›ÉÚ¶©­AVኤ½•?¶|)ë΋ì½È(Ê¡.t‚š„0mö“ïÚÎØkìØA3^ýPMÊ7óÑGüýIu”endstream endobj 550 0 obj 912 endobj 554 0 obj <> stream xœW]oÛ6}ׯ¸h’6kIþ,†>[‡[±&†" Z¢m&’è’”ï-ùå»—¤$+I7´) [yÎ幟þ#Èþ…ϬŒÞ^&ã lL4‚ßñÿ&úÅn „¬„‹¥Û6ƒ8†å:ògc˜Å0]$lË2:_n¬ëJV¹¸“i¹³iÁ­0À+ðëk¥ÁâF³™\K‘C¦Šº¬àáNau]Wˆ±!(ËW…€¡£´}D”œWo–·Qœ²–Dç†ïi;¨=/jÑl-2¥s¨êr%´ã<Û!"»VË­4Á¾ƒ, X ¨ ¾äµU%·2ãEq|s£yd–R…µ,¬ÐD­ÖHÄm ÀN«½Ì…§×–…83Pª/!¤ª Ge‰ ü$QP#ãàÑáîŽ2ÀÇdnì„–ÚX¼Û·Zj²ToêRT–ðˆµâ¥@ðáãò V²âú^Q«¼Y þ*7¸]¡)ŽÜŠ{ë( d¼Âu$n¥^…ë!n%Õ¬, ˆEQòïšÔ󳳯3ãï-2BYVî wuÜå, _t±"+WVí8ÔÖ^g”>ÆW¸1Èè ÑÑÅ„ó°¿Ø9ÅÆ¦’ÿˆæÊ cNºðkŒ¡s¦¯ÿÅr±æ¸ÁÛ j»«í‰§ýõðÞ×Z){óõ1n˜ÌïpØ -Âz£ =4Î’A9ŸŸ*ÿ¡¹f¡Ô Y„ǃ4Ù -2`lárN×À'„Õ¤5†t?×ÜPäµLŒ\ZàÛ ¯ÚQ¬ò‚èô‰SÂ¥[ÞG0[U9IÛ&ciLï|Ó—ó¥ä=/½OU¨©˜*!v¾8@¹Ç;º¸&þ‘½#Ì·—i2ƒ•¨$¦²„ðÐ¥µRl-­/noWÏ’¤M-ÕEÈFTB÷ì [Ò•Ô×cãK‰…¤W1zB5ÚRtîUÑÖ©/§®õwcLšB<#“Ò±{‹h· Ã~îà l‰þyž×†¤ê’…4±ñ ‰éK/‚D ɵ9H›m…¹_$)¿_’÷À ®*úòž(:‡ÈSNÿ^çr-Ϭܻ²WÖTŸu$Æè$ö ÄÇ+ÿý» ®” ….^œeñ»Õ¾d ~$gdÁªàÕo Þ-™*Ë6¬ÌSkP€âÿjz©ØÀÜ:EàEEè.NöèoNƒÛ*@¼tîéýK(qõ)­a#ÏÒẜš_8÷'¾¿~×þûœç¯ç9œÝºûœ±ÜÖ&ØŽ]=W%£un^<„ç…C¸†yZeÂùƒt¡,Ãn%-óÑs„ò®ªâxÓåY?õC<© )V©4Áag™£´ÁÐõÑûZ•½t|¨w$Rš<Í'¿-£ÏÑQ2O',!IG1”Q:]ŒÙhâ‹èê¦-Db‡“Í8r¹páKÀÒµö–ÚóÌ[Ú9/~†‘ØØ!5´Nͬ8•®á•±Øæ_á$Aìç­ôp³#J€ÏC´Ò”fqâ:÷ ®ê•Á‰@óš©âH )Cûïxi˜Ï)%CÏ ÕÈ?½g˜oBÝhûu¿ý“ÏUO=‘ÎX<5"Ó¸öÄ ñ„%³ù¢ñ 7mìÇãtÊ’â7”˜âØéЭîñÇb‘ؔґO¸¦¹_hžÝ Ûqz’EË9¹ôû NDb B œŸ”õ?PéÆ3NKÕEeðs •¥vÞpC`ø%åãr2r ]6Më¨êfè±pÐ “C ƒó-¾—Tì(ŽxFÓ öÈE'{‰Ôå¥çÿÌÇAø 想ûqÜaêRù¦†ÏÓÌ]]Æj3š$0œÌÙÔœÎ[±?Gÿ x8endstream endobj 555 0 obj 1570 endobj 561 0 obj <> stream xœXMsÛ6½ëWìègFBDRÔ‡{È83rÆ©›NõÐS¢ ‹?´¢Þ¬_ÞÝ@S¢Ó8-ŠÞ.vß¾]ú+ŒD#úqŸIÞ{ó)Çp§{#x¿w½¯½€—€ûHrx·äeSXnzvoÓ&óPÌ`™÷.–[÷eZ@Rfu^h•½SIºIÕjw`pÑëå=£M<Ú,áœ0—ëÞÅðžüo1ŒDÌÆn è}j’-<î·)~x#hÒ‡Bæ L‰VlÊ d–Á&Í”>ò0Ål4‡a‰!q bn;ÎEcðq. Á¹{¸ªåÞ ƒ‹¸A !ü‚¢¨I †ã\t`b1O£„a9‰ÓáûQRWQ˜Ž®8™­`ˆ lGËíÏkm`ÕÎò Š€› ¬Êg¢Žð(?—rY¬»0ˆš/ É)'™p—>¨‚? úcY2›ŠpµÎIcT©¦­|hó£¡D¸ƒRnÀvhÎTÄ|4Å_‹:WUšü©!œ4ËÔÌ( yúÍ?¥Ó’ ÖðmïÂxShÕûMYpMqÿ&ó¢´…h¶•R–ö­òÓ”ô/êàIp’²ÁëW½ <Û%àÅ›OQ8…¹‹ôŒØÔ£cÖ%-±I ùú‹È^”µá †j%6t‡º‚uºÙ¨JÆ:$‹.›Èe³M«5û|,ŒÛ^^îãð>‚’òò?;‡Iâܳ¦&çbÇ “%ô1¬ºNÂ1ú6Žfçúõ©ã ñ¾ 1è"ÎD<Ï^"92´^…8¨'î“ê ìW•”˜Nƒ®WZ}­‘‹Ç¶MLwS„HTÜÊÁ`DŒO]¬U¥r€@dSÀ2«ñÞn§p*âürƒ®EbDÑËñ7Èå·ÊDÌdzY§GøôR\Ðxš×9›@¾Æƒ­PØPÕ¨²4T¬´²ÑàÛV„"íÆŠ™•P•{tn—ÛÆ–òÈ!ZºPÎqµM899²7¦ áÊðX”f(‡¶~Ž ±j²µ51ªÖ -™r*óXAÿê×Å_—oß¾íã7®.‡]FЉ– ¼1¸Æ?£QŸ©ðù«å¹l ¾Ÿ)mÅÁÎ^û”û1'ÃöO>ù28+;|°íªÇ 1RpŠ%ŸbŠžŸ½÷¾øÝÑénq '*pÆFAmA,¸à®ÏE‚ÇîÑ1†ï¢0ž3õwb[]i;/ïq²T®2x‹#^Ò&óùû°ŸmÙë—JžÙŒ=Î æç£D‰3´&R£\o]j—£haлvšÂðáå“î[£gÚ!GpºôZ¤;j†3D̽˜> stream xœVKoã6¾ûW riºU‰ò#Pήìv±@[R=ÐeÑ+‰‰HÅÉ­É/ï IÙ–“iÄ3çÅo†Ã¹ƒ(Œ!¢?OÓjðÓol4†µDpÿëÁÝ ¶"àIZÁåÒŠM!Ža™œn Ó&3žÁ²œÎa£d +a¶BÔШ­©Á>òÆ-y ·ÊÚԀʗ¥ªAÕrY (ø½¬×Àa-ïшµ˜ª²­j¸çe+`+Mñãr3ˆ“ÁòëàôÐ -RUg=[€æ•ðrÕ€4ºgš£ŠVEË¢ÕÈÜšˆÑ†æì[Ï? N_ÆGQ`噕OöòGÎë‰$+9²’IÕVÔÚn„nKC"wìCòaô3s¢ˆ.mIµæ¶5!à:y–:/תAßd²©) õTh-\6d‰×Z¥’‘íÃ=ܦIð´°Â„@;äu…Ø m< >¥d"m›FÔÆ[±e E‰± Ü6‡× Sà¢3€L«QÂ(ƒ¸ky9´k!±³æ°RøÓØÈtŸkgi˃£M¢¿F€iø½hȼxàU§â%„øN•>é*}žÇTïËlp:4\Iåwx ÙlšxЈ$B¦oE*sIîII4ýÔ`ÝV¢‘i‡Qsƒyq ^QI¹; ä|8ba}ykÚF„Ï/2«²T[’ÄL‘"è‚J¿âõ#™Uœ´5½çmM!ÛòDãx0|¼&s<éXÌ3¶àûrXȧá]X;ï>1ç®$6…™ÍvLýµþÔÅ_ä>“ú¶óFv£„{æ¿,þ ê ~pä’LŸÂpÿÀkÄ uçÜ1QÄ=¡Õjå?;’82ê ¥iêæÈÄ‘iO(˲ž‰™3õ„„Þ[uã¤'”ç¹cÆnÕ“IOh½^Ÿ92ë EáCuá»M2F…‡ ý.+ìýYùèȧÿ‘)¥c\ÀÌÁÆÿ}sïÂò]©{£R^”¼&€EÇ\Áþ¹&çÃEí5æÅ#€vHžF8¸ô‹o³Ù8Æ‹›vŒ×f¨Ä¢7±9`º#ƒJIôæYØ»Œ½ö•F‘¿Bv×C×Ü®íHƒMF÷úTpÔw|?£®-/{£ÿt’C CÃÉðò†Ì'bdȬàï~bO(§ç´û×›››`~ÎÆcúˆª×çßø·`q>Œƒ+ü‰¢kÕ‡ø.»†×±®†p'ª+¦ã[ÒúßJœlÜvß¶U+÷B5æÚnàg{cÐXÑ]þâ!·[çp!<xhí» åÙ6ú}:ló>ÀgwhጯJ^w—¬¶³-ø§u©V觉&JáìÐÈ,Ãü‘Hçך[×vœŠÝ—ëaE/Wûåäoyørõùëâ÷n²h¬„ß.Ý¿yÉñ-¤»p¦Á ÛMF4Ñ8†£ / 6™bÏ!x“8ŒÆ †#7†`â=½X~Å¿†'Èendstream endobj 567 0 obj 1228 endobj 571 0 obj <> stream xœµWmoÛFþ®_1p?ø HrIQRÑKZ·v‘»\ŠÖ ê¢è+r%­Í…KYp_ä_Þ™].ßÒÜÙŽL†»ûÌÌ3¯üóÁ£õ=ÎF¯~æá6zäÁøÛŒ>Ž|³ê[œÁÅ·|3Î"ËõÈø0ó!Z̘Çñm6úÔ×·ÿ¼ü•îõ _tþàfnt}×] ìRà€® ½~Àß?®Þ¾»¼þry;š³ÅÌç°|Gb' þêöÌ¥þbóüåyk#!ìƒ×»=s EsžÇ‚æå¬'jµZõ÷¶xoÞ¼ùœ¨ÁÒÄ÷ÚÅ\äüž¨8ŽíCížž²ôDQAOT’$=sO²jxŠ"Õ\!6§=QRÊz“=Âá)K/²j½^×X¼é“¬z‘¯6›}°žðçð‚%\¬‰G™ÌÿLn·ÛúµùËýÿŸU777C|Ú!P)e¬9<|¶(þTQÿŪÛÛ[ûà–×ìr$7CEõ5F53M±ZïóL– °÷"Ç_ YQJ¸ÚçUQ¤*±J%¬U*µ¡úk+ï‚Íû8ðÛäðŸÉÃï0YÃoq‘æ"“¿Ã׊îþëú¿`ŒÁ×ýï5brŸ5ÕÓDìPì«Ý¾ˆ²ÏrÐ;«õQå£ ¬Ë"ƒÃVÅ[¨¶Jƒ¼—y1"žïµx‹'’Û½®`WhU©"‡{‘½&Ä_¾»•¯ ëÉÃ3Ž€ÈÐâyK“zKK¶O4ññMõú¬^§ŒûG·.”o¶h¸z»¼†DTšÚõ õœËåè§Q‡Ÿ{[DΦsrÈFAq†ÝнIG×Ÿí¥­®" ^Äxšz©ÑåWai¢¡QÁ ºâçSÎüð…âqƒ×Š7¡GÖ—âP;Ú¼bF _LÍ‘‰%9\n)^Ktž(7ûŒTƉ„]YlJ‘Õᤶjöªœ"ÎØjCþ‰ Þ®áLW‰ÊÏ@i’îµsb2¶^è¨RŠÄº¤è cE”‰ÄàƒFÏk½`# „ÁT2׸bøœ¾oÎN,³èMʰ²8*Y¢×¯÷+-?îÉ+οºÁIbÒU¤ÝP1ij¼ªI“c Nï/¾‚krgÏ•±Èó¢ú­$æ»D'b,ˆüÅš\‰Žëˆ±qcªR£{ ÂTtcPÙh«KOÇí¶¥N# H…ÍÛX̨¡6*A$‹”Qì4¥ãKG“•Ü(„:¨jk„žsñV ç‘Ã1(£ fC,5Ù'´=§ûÄÖzÜÃ$›¨ÐI7.òJ¨K ÕYÇXË4PM×pÂc™¦t|•ŠüR•[7¼B*ã"3ŒØ—˜eEEµÕö‹sÐj“?šŒë'q¦t“Á¥;œÎ¿1Yzþ8&¼¼«ÚÿJLÀ4Q)\þx§ÿÈHÞå ’ºÂ4vœ\“©Ô#\ûhÙ×wÔÏÅA[ÉÆÅÖ¹¤Ò¡T&Ô‘­Dš]Õª#¦)AFi$ ½&}6Åo{I· S„wsu±©ç6BÐ"·™¸˜ã×T7+¤­ic"¾“ u¯F0|‰@¨¾±’²· £~¾ÏV²¬ó©mé½ÞbL F;Ì‘LR¡­¸wêîJ¹VC¶ýÈgát^“xõá=~yq™E®»»¬²{=¿yâcUì:š‡å˜j`ÓÑ>h§‰Ã:Ó÷}çñÃP>–ÓÈ›ºu6'LÂOlá;c&C ó#>_ €Ð'‰Ôq©VHæJ¦ÅSnˆìó£a}´ƒ†Lõç ‘ê¤V=‡7¸YÌFš%k>Ç>éw´7¨Ñ17¬•™mA®ÀÚ„:]‡ÀzŒÕ »„Èë@²…Ù„"½0iKÒ©­Tž›¬qέ¶…n%9´¾:Zÿ †CYoŒF(<¦ÿ>¤û(ÎeîÇ4 œnÆ¿>6Šû´¢ÆSÀN–d-n9Bßúó ÛTS,¯TƒÇ CM.Ò0d²E¹„¶s­0µh+ƒK¢¯! ùÔmO¶EÑrœL Q¨¢EÆBp/möªf.ÓwG\(JÌTQITØÓ‹Cn4ë¬è#"fuU_»h&ûˆ’¹Q­ƒß¼« uÖŒMIG'™’Û\á˜DvXÚÓž½€„Yàˆ#mŒàÔ«IÕó X;ìÀ»R‘afõX¾û×Û÷¯ðï·7„}'„Òv)u®#ÎLÊ ¬6ŒÍec¹Ûj~!Šjéî“¥£À±Ø›ô2/¦Ë”jC$4vjgh§ÿçmb ‚94ÅhúÙ2qÚ8<ÑduöP•âìÑÕ\*jеŸ>©&Fás+žÍM§;…J]Á¨Î¨l—ª¦f %rŠß8ü‰íèGŸƒ ‘¶ŸÒ(íEÝ$¤>„ô›6äêE§ëhìD¦e¹üÄEMÓ¥Šå¦'Û|mËê5Ô³ß}ÿÇ«ÝÍ`n¬ |æM9LBóÉeU ýæëà§ÑŸKÈÄÐendstream endobj 572 0 obj 1999 endobj 578 0 obj <> stream xœ•VMoÛ8½ûW šCSÀV-ù;·v›, ´ lb  ‚,@K”Í %:$eÇGû—ï IYrdwmręǙ7o†|‚~CŸ¾á™Ï×ÉpKÓéÃïø·ìÆ_¿Ý“b‰ø¥í‚aŠÓ±"‘&e„ª„ “º`Ô °,s/™ l˜ÿþóÿ{¾륖š J¹ƒ­Ò‚f[à Ük\eXI½ 9Fð 9fXçRYØq ‚4B¹bõDÁ0&tjiÍv.($"‚Õâ E5:#LÈ<î ‡”®-,¸Ýr^6@ë©R:#eqsJP<; ©âž?Û8ýœÁõ—î7žÂ>ãËj5ì±ÏkU€±¸eÐó^Òï‡6&¼*…±ˆù:V=öä¡'Yd$ sQ•šÓðÞ ëò-¨TK]½¬ÙžÉ-Û¨ 5—åKl`+ T¬¯‘!ï™ÌÌ SÜN9ë骮ês…¤ZÈY%íÅq=,  Z|’=Õàˆ2•U†­”çµç’ Ö*Æ…ícJß6]¶Çh™N Ok°M– ³–Œè[W¶nH&jVۨʒuK4oÂj:[д+˜…ýö³J]l!ȸ…°Hßá­þ¼òU œ˜ß ùÃ>(î@ly±,£7"å@•b¬b=†p@µÛS”>N¢ ·´L”ÔÉ~šš5OE.ðÅÕ÷ù Üà„Ð4«pd¨áO/S"O£Kµ^+m=ÆCªQP°GN¼ ‹€q"ðØí¤Žuss1yÎ5Í"’¡­Æ1m,hÜ\hÜ +_ÑajåRž¼côŽì^’|uÆ-n EÈ)O8…×pÐDð‡²tèa¡ c–Õ²Ä@Ü–ø¤a‰}”EðuA\]çPÏáÓjU×_ÜØ£~ÚDÒnÝ»»c9ûEÌ|Ï›\ cT*ÄOÌ“áÓ¥}ÐÖû¶{wì,¤×”ñï íSÂeVcB J{îzµ3µs„ž«cÿSn>Ô©wÝø!¤æÜðÝ2GI’à­ežuÎ{š®(ínšF£áx: ë°×$ZÃ`0àt¹;M/™ £Éx=¯,´Äše,1yÓˆ6?¿¤›vŒV4¢­ª5‰¤R‘%­CÈÈàô&¨œ”‰œQÓð¥æ¡ýoÁŸxqi8¤T[Üc±ClÒÕ ‡;z¬±,ve*,T3³^tøÞ¬YJ7@Ç”ñrb ò¾r}æ.o_fÎZ,¹c­[7G}-¤sË_CܱurÂÔ7!šŒ¦ÔþÆsIͦÉx6¢Ù<šFãþx” ÂñAuB¦ö+œ¿n|ºóÚOt´Fð~?ŒuÿO 2ÆjÈÉ/.GÈÆ?9õµüã‰_"ÿx8èǯùÐåè?¨ýÿú¯΀#5(€[`<©£yGýQ½Ñ0:mÒÝå¼ó'~ÿßPÇšendstream endobj 579 0 obj 1345 endobj 583 0 obj <> stream xœÍVMoÛF½óW ”C€¦ù)YF.Žã´uÄ‚áÃJ\JÛ’» w)[@.Ö/ïÌòC¤Q4N ¥ “ÜÙy3óÞÈßÀ÷ðéÓÜW…svÆ ¬µãÃ/ø];ßœÀnæ¶*àÝÜn›@ÀZŒ ÃýÇžj$ ¶æ¶õ.‘ ¶ã¥¦B¸Pr½å+#v<ß#œç€¥¢05Z‹O"†:]cÉݶàÃÖd¢Ô˜|¦ò\=àÒr“ºáÁDÇY±Íù ë³›(œÀ”HD lÀ+„ÅRÈJUØ.¹òŒU¹iËW‰2Ãz*|àw§ïôæ j`“zB~h/ÄÛ]ˆ©¶¶­v/µ- ½éy8ž&dKν±?N¨o k›Œ£¸g &¾ßÚ‚8ò´a–ã>ά’Ô-Kï:Ľlê+Á•ÚY÷ÒO, ¡9yfŽpeðbkTh7± (9ïtG äQriI"ä¶2Ðiª¦„Ý|líÓ¨…”•i}Àƒk¶Ú@.$§<[iÔHšæÊÚjå†4¼ H›´Ð†t’@å‘^·¶â‘çú0 !£¡@e¡]‹Þ.pX°•®XŽlËE! ŠÄ&Žræ©¿¢£]#ƒnpá\¦½zIõ@QHW"Û÷t|¤íY#RË^ JIØÙ äi<½Ç2<þNîðù¼¿¸Û|O¿—÷Ï»ö»jaÐvҫ¦égƒ«Õ6Àh¦K;ZðÏÕçA3oð1Í´¥Úqý~ÚZÚ䈃`mA×H5mgÖRa °…ÍðöàkK´S¬6Y#¨VX˜§z„K2ªu¾`œÕÌ%+Teˆ·BjC4mmÃMû³`)Ci•Fzä9v¼ÜQ /Ïq"—ÄGësk%ð‰¦MJ³³áÐã äÕø/Ú ^8á>-ŽîÓâÿ8á,B Þþ·ã®‡ë'ºñ£ß˜ôßw ŠcoûqþE ¬1 ¦Ç:÷z`a’ü“&\¤5>¼¿í²xa#pÆŒ'pn9žŸ„pO(bêœÄýÓu=w~ÃÏŸÀÐ×—endstream endobj 584 0 obj 1029 endobj 588 0 obj <> stream xœíTMoÔ0½çWŒÄ¡­´qí|îöF¡åªp@ˆƒ›x7¦‰ÆNa%.í/ïØÉnw[¤ª !‘l”µg2ïùÍ5P€º{z—mp|%)¬L@á>«à:`Þ¦WÙÂinq”Êe0~Ê g-RAч0])‹¥Û%)=*¾aH2‡âý®_Œ¦½ÅÑA1’Mn¯ ¼c+©fPju#z ²å+Vƒ¹ZÏÀt¢”˵T+Ѓíë¶aPÒ ¶“ó‹©¿BÉÝ÷D*´íÔA÷ë¥tßü´ƒt±Ÿ~ÂrP®Æ°£z"nà¤Âß~µq’<¡Iù°s’Ñ,â1±7Æl1Våy';Æ(MŒ,‰)C££9ÆQâHÃTçRñ¦A —zèã¶åªÞ¯†V(k6øÂ¥¶58“Tä¥l„_–ºZŠ·Â¸cÝ蟀O¹=2ˆÈ*ªj¤âñÑøðùâ5lÿ¿={3¶n.·¿]ì´ý›{LâDÜÄš/Þ—Šüù*“øWŽ×$GÈ?®‘'ºó u> stream xœVßOÜ8~Ï_1jÚJ$l~³¨wR¯mÕ6ÕÞÄ»øšÄ[;˲è^à/¿Û¶-RƒHÖÎÌ7ã™Ï_ü&Aúsϲñö?GI íMàþ/¼ï^hLÀ=Êþ*Ð,Žr˜B1÷¬kyÙ4 "(ï%À…¾º„ùªÕß6à_ƒnUÀ¯¡ªÑÂûóÏo+|ü}ôö°zUü‹1‚(NÉ N’ O&IÑ(=²I–F1Ø+EÛÉd4xõbà‡SûÚ8æYœô¶ÑØ1;Fiúà&ñ$ìmc´ Б*•CR ¢„Ö韴ÀªJtB¶{Àpýu ºcjÆ4‡ŽÍj%kaÆA®ºåªƒ•íº+2ë!³ ÆEO ¨¼—~AU† C÷ î î=èµèÊ«Š+¡Ý`l¥y8sR¥¹A÷q5‘¡·˜“I…úåÀNæv¦ÖVô‚)3‰HzÉK1¼Ú# \7T\—J,;qÍኳŠ+X2ÅÞq¥£]´ixì*6ãs‰o(ˆ­Ï]ÃD[o “ x#0êF®@Ú<ˆM«VtúþЬ§aö z¾-®Dµ²õ¯¹šIìB#+Ž®ƨZü’ªŽ/ýuãëÜZøƒ‹¦‡ã!ƈË;tÞ!íowØ9$(ZØûn=Õb·OìX{r|rzÀþWÞçJ”ûëØ¾õíÍÞ~< ÑŒ@†s‘™CÄ~ò뇓⠙Vã©h8õÑÁ 'Èâ|¸èíEAa8ÄxšöM|j<–^Ê`WÍž$ÁXÓ`WÖž$ÉXÜ`Wß~E¢ªÜ±hY]oö~¤[idÙV¶ªÇ²5 òü`ú ]•žn• шò›œ{¡I³h׋¶ã T’âôýÉ#BøëÍ\³zÅ5 x楔ªÂ´:nô-‹‚,I¦}ëk5Z7ŒÄYpŒ¼B·öš·f4ç ©NIx„ë2˜×}P¥—“ÙIdM⇅©í£xÆY;Q~ˆ‚R¯k¹Fažm¶;o†›Tq½ª;MÛ”n(™J °ò%kËUqS!ê¯AT‚ êñ(aÊ%€8º"j*¯P]]>óZ”Å¢VÎWÝJñ=hØfƃAgsj2Ž–†©ZñѹÁ²Õ¼¤ ”\c|%Ìû¤¬q,ЋÊL½1šg†ÝR«Ic)§NšûP>»Ä›øÏ¿¥gC7J¿Ö—ðqþ'¼–öyÓ«¦Õ—ìá£à3âõs`Ë%ÇÞaJüFhS&§Ž&U†*§“ü¦ã­Æf¿¾°@TiѰ7ÞI­o¹B¢¦CÎÁ%ã¥yp51ô¬•@sì4§o%þ4ig¸'_Ø È]Ã3Ä !‚gã°12’P 1.JKÕ9ëÛŸäiW{Ë•ô i*XŠ^ëˆãò¶ Ô ža¸ÝèŽz@ó¹Þž€vÇQá}ò2X{QŠ™$ÒY³ñ¢<ÇX©ÖÞ—Ÿž9§wèD¤ 4Hi™“§ÙÖ}4 m#ÅQøÛ‘ò> stream xœíWKoÜ6¾ëW Aì­÷#€ ÔmœhÝÄÞ ‚h-wW­^©Ø ôbÿòI‰ËµnCO•á5š93ßÌè xÄOþ÷¢vŽ.‚(†w€™ÖîÃt'„Œëó™’ÚÆ2ˆF·H—ï’)Î9ÉâXF[k‰%}&ikÀöýdd2˜[±†õè®tñÀµK¸:>ôí5×(¡:Ž;!ÑN0éÅGpqä2]Ó<#Q¦Ÿ–®¨‰xJS¤ ‡2·5dk®ØË<’Eßeñ)MÚЩNk™âGXbŒÅ5Åiž¢5?ÌRŒŸzzš1¬…±Ü©²tÙ!ü0m.ØJ¢ÐXÒêc-I±—9ÔDR©ÉØ<@{Šgc7´îd)Ý´ƒJnÄÃÚó€O¹¯Â+ñ>¦ýîëwªf$©²¶-W´ÁŠAÈ$A8Pä¯k©ŒÅ(:AÆ'¾þ SÃL0.ûú©[Óãcÿ¹Êþ ”óSÙ`tVw÷TFXl}/ߢ¬÷yºÁì6Е€Jgð—´¶(yª‡¨#ù)ž)òñLʃ4Óõa¼T¿ïÞþ8½xw¦J˜gN®¾¾uw]Y{Œb¼y»Ï’ò?߯÷ͺ«ZZËý2œe$7Éöìâõ›³ßÎïá('yNExì*¦ÊÚ+ÛSÝ£×Å¡\ÈÆ(¢iÃ&ÁôNT¢»îYc²æ8$$ᘯ$xö”DY3÷¶lÄ\ýpLòüùsÚ4C5ð[Sbšãðn‹˜‰ÉãáÃM¦ì‡Sþׄ˜2;×üì××j1ºìÀŽûp±sYÔC<ÞÝÄ2yxPO][b¸+M‚±%ç;‚®I"‹Å£Gý]ÁÀÐ-–$Û/šX,Y¸«Ó!´óqFã“Èbñ“ý‚& –WqÈÜ7VVƒø±3†ß‚î[†Ÿj^ª¥]—b=}wt¬Ç ‡Ó'³[6©ëu‹]ËK5&ÓŠ·jEQlfmæ±R¬{&E9%Ú7Ó«œ1lj•ÈBa6óÓîDÉnŠjX°ñkDB©ÂošqÀ„ºlœ”Ë•äÅiR]~þa°| ì­ŽèJâÃfx°ÓÐÆë> ­&ˆ]pË÷ókýq/¶-8Ûx·×û`¾M0‹FbÏq½ñÛì¶h–Žø¾Ž‡àw-0oi[ø‰}_ǃ:àÚ¸64K‡ÿ@ǃ’àZßÒ,ÖÈIRÈT&…>à8Í¥ìG ÙL¢ÄL©ï¿Ŭéendstream endobj 600 0 obj 1370 endobj 607 0 obj <> stream xœWÛŽÛF}×W„v`©G¼ˆ¢6O0 6â(Ù cÑ"›šNH¶Ì&G£¼Í|yªúBµ¤ñÆ^Ûã!ûRU}êÔéâ'X°ô×ý.šÉÍû8]ÂNOð#þì&Ÿ&‘YîWÑÀ÷\–Ä+XæšØ­¬"ÈÖK晼ÿgžú§äj$cËÅ8ˆÏßnþ@¿,‡ÍO¡±¥J¯F±ÀþöEh#óOË«‘p,°±¼²±òOÙÕH8ØÈ¬ ‚wQDÀÅ1…ç{]×P¨zhZ â¡ûú;½l„Þ 8t²ïEËíÄ©Ûû¦…hEÇë™ÙÔ µÐP©xÑË{ÞËv¼-¡ó`Ä»C»ÿ"{·›ÉÏ“<ňa¹^æ,f|]%,]Cž,Y”çøž/1/y¼ðÅ$_¤,b?°ZÇÁFÿf¬ÿš& a8íL£UóˆVGvÎ…ã6†±“ê³<=á퉺Np_ìˆú¦ÕÖG½Jz/ YIQh1 Až¶ƒMÒ徃ÄE[áÑ%¦ ¹â›GYˆožDgøæx@‡„} ðµB·Ñ¿«#¾ù":Ãw•çÞª} ðus.·1Œõëñ]ågèÊöŸÑ5 Òqâlùÿ4[¥! Y¾>t…'òG7 vÀaæ6ú7cu4[®ÏÍÒÌ[µ nÎ…ã6†±~= %ÞAÊ¡‘ý€ ¨j„–jüKIüä5â›81¸‹ïp½ÔPsÝCÁµ|áÍVî5hãÛ‹™é¶²ïxwd(-ó8†¹Õ«Òè/KÙKÕB¯\tÇP’ZÞÒÁ}- Ù×ÇÙ‰¼}l¶ªÖ†7ï³ÅÚa•D+–FâE^^Ùé”8/ݤ ÷r±$OÝŠùåö„eYœ¯½‚·TãƒFŽâ!<5É0íœ'éšåH„¹E·œÔW\¹^Fl±X9Û˜žKçQIJñd&JþÃ(ª¡YÁQ pàm÷ÍûÛß¼{;^&µB¼²¿3lP¸¤3qg1Ëâ${töº(TWRšÐöxϸÔÛž?ÀÔy™ÚJöh»\ì(ã>€³ûHhrþÒ.Ó=ƒ_‘_ÓW0Ú;ƒ8Ð`ŽŒøÎŸñq~K¾£Øy'‰M'µ(zJ!ßZÞj/mJi^ ý ¥’µ`@¼…Þl~-Y:ÚM3=hÕº«)èt¬œRhÙÓhM-Ú•5N [ƒâou¡ëg<ûCº|;敪°Eƒû½h)-Ôžpxñêh¹k½*%ïpô‚Šad;ú u ~À¦A<ðfO碕ì¨ÜUÓP¶¢VòcPÒ'o»}»ñxîÈ …·Pm9n÷»Ì¹ƒ#»ó™.$è*ãhlþ>è»P ­MÓôfß©?nºò¦ä=¿ÑmÇÄýÃ/§ îEÛk¢L,þ¯F#u£:am5ncóU]"Iâ‡7|‡Àc? vühæ;{ÙØb{ðQ^i]#£ ©¶UÅ55¡êTCîLeÇ*`–ö^>ˆîy=q%(no•Ñ Þ»ñD­êa¯´–ŽËN´Í_‹8ìXû8h"dx‡8Ìk‰´åÝnh_Hž¨¬t/¸½›è’ÇŸþ PÅŽÆdÑ :ž ”ªgŽç±fðý‘¨YŠŠu?ÃÅÉ܉ÍXÝ­’XJÞÂøÉóô?ÓLÇÿˆ°Óß^ÿôëíÔÕÇ,d²%O#\䋌>:u€Gç3Vjiz°¶Ÿ*F%+ì ZÊ&²ò(›˜ü¸¹"¶Ä2qÌH,1t;“ܺ+ØE=*mhÜØò¦ŒÿÆÐÈV]o¦lwCÛ’Ú_0•¾ï²E|b*jREÔ„-¢ÅxYªö¹À,1v«$TxÌQ„ѽ3=VJŽÍi’¥Sic€ÚNîTµg­¼¬îËbÍX!Ìå¥÷Œ­âÀûãT¢@ßËràõ”¢Ÿ@#NH‘ÏöÀÏ):rÊÜHÔ“Ù†#fë[×àæÆ&mæh«´$–@Pòg?ZÅR7!:ë'_)-+>áüÕ"Û^ìD'ÿåY©Cý°÷56‰ ¶œ™ÓªVö#t¯Ð %QUÈçÙâØ2§ÑêKÇ;±Sx°žê¢VC\‹@‡Ãà¸EǦ€öº¦Ðj¨K¸ãˆÛV`jP|¨Ž0bˆ¾ãÍã» Ó4tÚ(¼íËlt öPÐô;(…p Ÿy˜]º”Kx€3{:ÿòÿzjø€ô‰ˆC10Æè¡ýx‰à:bëSY#gI ¦Ÿ'ª—úÎsiößÀdÅÒcE9~¥Ôæ–øÜ÷ž6{áOq4®8½B3`OBÆ ^óî´‹…×Zó{n팜—½Õ£d˜> stream xœ­XÛnÛF}×W Üvk+^$RiQÀ.’Â@ ‰Z Œ`E®¤mI.ËeåMúòÎì…¤TÛhÒ pLrwîçÌÎú3L˜úg'ùèÇ÷~8…u=šÀoø³}yz Ø_I× ½-σÅjdd=ˆ<˜Í}Ã"]¼R,eÁ«4|™‰úš€ç‹¿´ìÌÊÎg,Œ's”_¤£‹qîÖ;ݨϟùvögy›5²Ì¬$*=;@½•M²­Ì2X‹BT¼À¡%×´Vèอk© …ö×Q‘ͱ7™³`ÁØ ˜¯Õ¥HäJ&¼ÑL0£B+LTÑpYÔ Šl§uUj[êR9¾ñÆbðž>o7K^׳°là•€B5ä‚1üztÎñbç\åY­ô¶·ÓÒqh žŸüЊ.P{·¬Ú†d´¿ÏEÝå'…¥qe‡Õðчp6û¯Õ°©×ÎU*mTÌÛF嘲„g˜›ÊŽ rìû3æÏýAž‡n6ÊeÖHÙj¥ VúfP%RG༣0ÖAÎq{ uÃ+ÌnÞ%`þô²M½8J6%f¨CÚÁI_b]Y­á‰ ‚­ÚZÞ‰Â9w€·}p˜ë SéKÁ6*ËÐÈ ªÇËÅèÝ(#6…iìOXy÷LY8úåÅ1¾ãçp“{LFñ$d±ç»ò±toZk2r¯TçA'ik­æµ:‹vͺc‡¾&£ÕWtŒy€*cêŽqÏ 8&] X hkJS±ÛnfÎaÕcöu+©Ñìàs«(­%e#,MÓñ¨öõFdÙ5§¦} )q_â«_ mÁP´ùËý8©Û‰{žcczaHøÌu¬sêˆh `ÕºÂ8Ç(l%›úüc"«ýÔó/éÇ;ü¤_ýÉ%ýxÆØí9œ¯”bk¥>=+Œe®Ë¨ïÛ˜Žû n’:A)8 ­öÔ5´èµ "\× i"ÄËb=ýáMw)tJ=«T+”Å€¹?x—VºªE—7þã‚>nM€NìÑ$w0…ºÊµƒí!Ä®J|neuŒÚwþì¼ïIºüì„sa<óœ ã(r.Œã¹e‡}ì9g?Z9A÷¦µ:Î…¤|À¹0ÂN«~ì9çÖ¬;VpèëWs.Œ}6Óœ»Yé¤Á€åžHuÁN;°cH™qêóKøƒÊ¦¨a¯?ZáŽÁbÓRgÓGIÇ ßû¬ ‰;#ðM„˜tâßÞ@çCt0à÷ŸÞÕaÿ^ÑéÍ‚#tzÑÔáÈ<Ði>XZA÷¦µvèô‚à¶v§U?Ði׬;Vpèë×£Óó(™…ÒÀB„vè<:Ngœ'¡ËËR¸æ~„Ñ£SÁâõüûÕšø',û·5o’œü˜:Þ¯O ”öúO‚á<c3~¦fü<Ð!Ɇ²Î© ßÉTæ’ÎIØò¢ W©Ä-Ïpbk«D@Ên³ Ç2n›?•ëÂÎb•j×'í>ž†¯wŠG‡.Q¶[xu³ø`CD%•0žÿ¤`x]¡õm%›†À¤mNÜã§Zú7«‡fèÐXMÝ ÍOgè±ÛÐOÀ{Ìî.3D»9<;Ÿ†ÆáHÜK,8º ÇI×7oWׯ_Ü=Âx?3NÏ^GÞb¤<Ãü¤;cã8±GN“½Ä.ò/§‘ÇlÎ⸿Ë}•:ƒRÞ‹ îxÖŠúÁè^½ù[çŒÉSc3ù^w±|ìˆÓ¶kØð;J"òȸb.+á„Í&Á T®•Ø”iX¢&YÁÙW¯y†×†¬Íq Õˆ2x»¼“ª­³™¥ÐL©Æ­œÿM÷¶¢FV ['·Áޝ¹>ûlP‚ˆ¢Bs aZf0¦òWgn¤gŸW¸ª†}õá×›«ê‘¡µëvÇ …VßâÓ†þ+ŒJz,‰Ükzªéöy ?KêZ¿œ¶9Ÿo®_àX€‰ ¹ŠçX€³ŠIEY‰DÓ{Ίߩnì6Þ6‰%Ât¸º-KUéN¸²q1øSµtw6ºBm¡vÏœ6¦².ñîÞÉåÂöœ½AËÎ5R“ˆV›]bZÿÆcõôUå@ŶÙÖ£ªþ›‡F®DÍnañoÎxè`†¦¦n§Pöcý¥;©dÙ8[Döž(ÆÃ=¡#ÑNoÃxu1Žä9è a`­Ì"ˆ59c6ðj?žê¿à ¥0¦-zøx7úB a¢endstream endobj 614 0 obj 1726 endobj 618 0 obj <> stream xœíVËnã6Ýû+.ÒEÓ%ëᇠ‹¶h‹³éÔ@ƒA@‰´Å‰DjH*N–É—÷ò!ÉÆØYt]‰)òòœs¼ò7Hâû ßU;[|Ê–+8èYâßaöm–:_U ¿îœÙÒvû™?›Â&…õ6‹ ص³[û^) ¿üýÛý=ÈÞt½=oAᨸaLÍ@1Ý7ŒtOÚà6Q4œˆa‡‹{®´!E¤ÜT5uè[& pýÓîë,Íã vg·Ár1ò Ò2xå1‹=ybt¤dkµVÂè¹P®;7©¹6s`¦Šßb¸ß#»Cs`ÈúãìVw¬â{ÎèUS.p!Ôkޱƒ†cÍñÙU½¢§ÊpqðÒ7öl©‚×”í‰ Âi îó‡ÄA¾jàC{‚¤¤be o1Òtä*Ùô­Ñ·%S8D]±E¹I!‡Õ%<ò¦ ¬µb $¥‘‡Ax«/ÏÄ:3‹tP|L_šuD#FVÙ!ŽMWÉÌ‘1q•ýFkŒ®s?ÐÔß%šš˜1˜TS˾¡È„Rô 3J Æ„2…á wöR1'C,áP¥ÿpƒ§}<Û+Æò´íë˜@ä «ÃyP¤ôa„äQË쭿^í ^ ÇǨál<€ÛªÇ‚Ú <æÕ{4ÅâÕ—²ÖR›(x^¹»‡‹”¦Zô‰F¡ì9úmxËÞ‚´Ý ÉU@¸+“ßÂÒ)ZÆ£Ew¹æhlÐ È"%CàNJÎÙ  D× ¯›köŒC 9rÒÊç)õ «fMw&­Ãê0V ò"¼&])^Ú²âÕÛ.[†Vñ{&m×°9r Í­\ëãikpE/m^ÜMõÍÛÅßYÀŧ<ÛÀÖ¶Â,µí±>ëúËhi¬c¡bö7DX¥™ûKð˜ø9·W-MÆ£?€–½ª˜õÝ>m>wÆûºPta·{²'ªÒ¬Ztü™5þH1l–¤z<(‰}n2·Îc×5ðDšÞq$qâÆ`2Ø nô) #£"7<ñ‡Ùd¤{µ(Ÿ mH×,™Rï[öºo[["£?‘îK×hpÕ¿R‚Ô¾ÃÛ ˜y¨ÐóaaÀ €]-‡åàÞ¤ÒçQ#îß0àÂìÊò¥™GÅ‘zöt¹±IpÓ,N³å”dXgé:±Óam›»Åˆê×`­†ãÓì2êz»YŸ¢N»Ë5R—Ùp<ßÄÛÍu­éj›_A=Ëï÷åz5½øtø?½þðrSŒéÅ^´Î¯£®ò³ôÛ«é…"µfE¼*ÞA-¶ë3­é¸›_JïywõmϽNÒ†½¶“‚ÙÄñ§¶rFï<€?ð€À¥xÕoSêN‡_½ÐwOµ„*²cª"×@}=Ù~S…eœâέ“w*ÁExueù\»$… ZŸÝë4Ù¾“MG“„ïé[ŽåÖ½Ú²õ ÷jËÓ8Yeø£ŸÎnqwÿ¾›ý…Ÿ{JLçendstream endobj 619 0 obj 1168 endobj 623 0 obj <> stream xœÅTMoÔ0½çW<-‡i7ÄNv“V⤠TÈ qðfMPb§±Ó‰ðË;I»TBÂ+o{ÆÏ3ïÍ\" "÷›žE¢T¡¬ÁÊÀ¨>”WX¥°fÜψ¼ÔÓxÏÎÒn¬’ÇGÛÝ9 ,IÃ(ŠÀׯdD›Išù•,Á†¯ý+‹NÆÝíYâfÂGçÄí¦Šó{¸7ÚJ YŒqé@% ¶R*ôrUê¾ÖÊŒ µjn!`jµo$L' ú—è…¥ÌJQT(t3´j‰ëÚVPÚÅO€>ÍJêÁ ’b'{èžìÛV*K´ŒpµV!È‹'“×?~0`K¾„P;$({ÝÞ“'oDÛÑõ¾n) 1ãu½ì¤ÚQDΑႵ×ïá='„o?“ÀÑ¿U@sÄ.°ª¼œïâ‹]ü¨‹G½ÜƒF¡w>ÌÐ: ‘y†qÌz™ž³hÆ1KgÒͬ™qÜ+gTÍCÅÌT¼-Ý zCÅQ—UC¹½ª‰[¢È Ȉ+Ê3U›@YJ´ô]j’ÓÒ{Z"¡™¡±>Í[:pkE­äîííDÉî7(øubçüï¿Èƒ‹`ƒë ¥¦§1C°Mœ…l3~6Áû?k|qêy¢ÆwFåªñ’BѺ1x%›Î7/9‚dw˜Y–…œý &fþ¤ø5ÕÖÍÔ'y²‰žìW®#“ÝŠR“ ßÇç®N‡nGmcwŠg]_7TÏàQ”NΛ™ç7fa´æXÅQìØ"çutËEðSd›Uendstream endobj 624 0 obj 698 endobj 629 0 obj <> stream xœ•W[oÛ6~÷¯8È´%ò5éž²fÝh:{Ø^i‰¶¹H¢JRv5ì%ùåûIÉvÚ ŠBÅsûÎw.ùLWIJWü/>³rpùëh2¥\ÑÏø¿|¤þ ÅGVÒKmF霖ëAMižÒìzšÌhY^¿oª»ÅÍ[ÂÓi]XUN8¡ûRl$Ý)[¢}³üs0žÐòÃàõ¢)KaÚ7¯¼î9¥)ë¥Éܾ“63j%-mõžÖÖLT´’¤*'7F8™óOMn+)·7t[‰¢µÊR)«&¡¨¼sÕèÉ:˜&?uáýýráý!e+U!+äĪvH«Æ‘(¬¦­°d›ºÖÆÑZ÷:*æŒØÃ+kååìV8\ÊR›þ°Ó¿“hœ.Ü(Z2Ò%wÚ)Aï—þú/ËåCÂÆ÷ BƈÀ÷LÔb¥ å´©*+š\RÙNÕ…¤µ¥Dë5°R¦ mJQ{µFnÔRTªn °w-á° nZxæÓSl´Qn[Zê+¸žïD•Á×µ®1Gæ—¦‘ïØTÌ%,çRÖ/¼a;7éA[·ðl¤Ú€Ê0qŠYÓë*µ*ƒK¤¸6ô/_rÒßsªðJÎVx>âç™·&ÌJ9éýKërHF»CØTƒ'àgSÕ ²ð…Õ3¥MèþˆªªôÒ;yL‰C>Ù^L'²ô"šž†ÁÝt“maÌ—ñÚ(±ÅcK‹ÆìdKOå4X‰7¦½#Ö@îÞã?->>û‚Mb)tüÏtY6×JY$ùÅIÃü‰(ÚÞ~ß¼‚Av§ëã›ù˜[Âdru1IoF(rÿöÿ%c¯(Mn|—øãá…bmè¶µN–¼â¾fþúE(ñ™Ìs2×ûÿuWÌ•‘™CYõí‘áøù·{î!¥•å\€S­Õ¦1\î}÷<é(¡“þˆ’kÚöÚNš-krBAï¡Z˜ù%œAlÔâÑ—LÙ2{ÂI„Ê!Éd“ {ºdF[{‘5Î{ËT‚¦ú‚­¬r­·ª›Ëïï´1*G•ü¢÷h&fH•ܟŦ€P„gð‡#Y±)T²/vðÌ]4µoR´ß*P#â[h‘w‡ÅðÊAé#ûÖæt‡ÛµÇ”Kx%¬Ê¸nP2K‹NúØeßBMze‰¾ãð8cŠû2;L6/äoQÈO!V²¸ÌOf_üîÍ€tÀÜ¡•q-»íAíáâk:£'€ÇÁóÛ3ý}†™‘ã”|ü(Û烌xé$Ú’|9õG‘lïaZ~ðDž1I*¤?f°Ë„­e¦Ö*t)ïë^´oÿ nâÂöjž2LLÇŒ,h“ÉËÕã¦öÒ;ªt%ŸOaÿ>ÄÄA‡_oçŒ_Åíý<*z ʇÃçÃÑJd?°ùøo:wèCÿ†Ã-(€½x¥w€‚Ù[- s •Ak‘ñðksà³S9·€À(¿>Y¾± ûØ÷j§9°®¾Ó‚ºù*]Ñ( –_0.ò°ŽÄ2èÌûânŒA¹G€¹./þp@ ›¿±¼¤H˜q oX…ÐFV’û ð—ö`žÞí$‡yÉMDqƒäçFò>‚ yÒ•Òñ@ Ý^й? &Ñ] íÂx:|ç£ð™I—%´²ïˆ¹Îð#LVoeÝ|4¨L4ÇžN¨Û“:ç5áu'ÎçÉÌMyàŒÒô:™ŒÃëÿ›8Д̽¦Yœ8Ý:ðμWà·6d Æ¢¹nŠ£=þ°„žÔO¤6 ‘£µûau=ó†³ ¼à؆ôÇ/‡…ÚldçyAœÆMë«Û¶’ôŽPÌÎ×úóéì:6O¼ 0È£$=W¬ÖÍs`‘‡ ØiC³¼ãÆÉËéù‘‡xûYXW8-žP±ù€¢ ¯¬L—#amtÙí ñO‹t’̦cäƒaùÀh÷½ ¬·”$ Çr’ÃñYO£\ìOݸè.wFfø»<‰—§ù±ÊñM2:aNÝ~%â•®h‡Ôê&JÍætÍBiz“L®±‡LFÉØ‹N=𞫟ÿYÑŽPendstream endobj 630 0 obj 1704 endobj 636 0 obj <> stream xœÅTMoÔ0½çWÌ­‹Ô˜8»ùê©… ‚n$¸zcg×Ô±Cì”–[ûË;ÙB[ ´Z%±gÞ›÷<ž¯ ‰ÿÍϦ‹ž_¤« ¶6Jà5þ·Ñ׈†˜M'u+€R¨ÛhÊ¥PPÈ«””PwÑ¢aœP ^­+p”aÜNZh¥ÀFg:ædÔºæÀ:6¸xìÁÉNÀ×8—z‹)zævšá2âøïgõ—P@¾/`IR¨ßE‹S.ݳƒÅ¥¨­X–X`Í£EüâqnEʼ Õ¼ÿa­„n„Ýò"ýC cÍÔEµï…Cå© Jÿê {•4Yî¡ C60½“F¸=?9‚Ž] °ã àÆŒ`…{b`œ.Q- ž¬ä³•Èþ“—kv%à7hEE z¬ub@¥Î=îr”Ç´X‘¬ZBœ®fµ5F9f/-H=u)æc3†^Ý -†Ð§ý`ßP3È­Ä£.íe¼aVp8{[¯C³Q7ÚÙycvT.T¾¸—˜‡`>ô3b¤gÄOÎÞÃóê1Ih‡Ù¸óéåF-=Ùî·¦bÅD»Œ‹‰ Š—nd¾ ,ކŷ,:)B}Ú8`WL*¶Á…[A¶¡;¶À™c³hÏÎ4‡À†·/ó…ƒ 9€ÏŽ5ÁÞHíî=Û•¬gӆ⪠hOÏÞ3eM^LëœÃ褒ßýYNìÈ$4Þ“ý,˜ÀÅäñSïzy-”%pl%Ц …Ív†çT»3£â°A‡8¦ûé4ÏOæëxžpý´Ž>F9|‹ œY–TÐE4_–„æÓ§ŠÖ7E³, 3ôµñìØIÎeáP}hàÀ8Q”÷ŒeY’”þ #"‘2 M´o5׿Έ4Ì?Ú1*N3² —æ³Æžû.9‚ss%º Þ<šBš$Ù P†á±¤$A†xUR’€,½Wó1ú˜C×:endstream endobj 637 0 obj 756 endobj 642 0 obj <> stream xœ˜KÛ6€ïúDzH쪤¨ç¢(I`‹<Ö‡öTÐ2m«ÑÃÑ#ÎÛ_Þ!9¤I'›ÔÅÂk©?gH}"4f„ª?ü®»èçIš‘ÝQò>»èSÄô#¿êŽ<_éÇr ²ÚFF—‘‚‘¼Ì✬ºèÉ«¥¿mÖ7dÞKíyÚ‰¼‡Ý(º®éwäM?Ëq+jùtõWÄS²ºžÜ-]'Æû§µý‚0¦ì',.ôð3²‘S=6‡¹z2lCãm³A9&¨nÝCÛ0ß8l–ZëÎÃqìÌ4N´¥Õ@êQŠYq² ‡¶©…²~EôRnÔ Çá­ï!%¿bÈ æ3äe0ä°\­iz MbBE+i«Ž!Ïò€!O¹³ª›CCwPÑ÷Õ1äIª£/Q¤¥Ër†}„ïà÷°Ìß ½$ ªF’†U#É\Õ0M›é@2¨h¥$¨ «FB]Õ0MŽ¡;̯Ö*bc¥®ô2nÄ˹±êT1lè=€îÀ£eP< ‹c®x˜¦GÐt $TDÉXuiš¹âašACï ¿xX«H¦ÔLãŒñr‚4;C»týle 'ý '-Õ9©“—ÀÒ±…"‚ 3œ¼Jý*«<¨"¼*lÁæ 'vbVÑJ©_E8¬ÞÇÉ+V8«,¬"v Ýá^qV N^VºŠ WF¼'‡#Œ«"+ë«\Aç˜qèÎs†%õë /YPOxÉm=Á¦ÇÐt &T´õë /Ê žð¢°õ›C3îXEßWǰÈL=QQ•ñr†pž)Îú›ZTgðøå¹_Kx^µ„祭%Øôø™D„ŠVÊýZÂó4¨%<çÜYåa-±cèNêÕgùåLמÁeŽñr~yr*&/Úa‚ËF­¾ÎÒŠÛu’ksgÛè›ÐHæ–Gº.2k 7Æþ#\ÒÄN4=ô¨\"ݽJØ+åí7Ãc3ïõS€†»oª»ÑvhÛá×G5µ»™GuÍj§tÍn¯'å§¥aê/}Óý4ËîüêÄi˜sèYΡ§œCÏsõs r s=Ë9ô”sèyΡ~ΡAΡ.ç\ö›R›W®Qý÷×m?µ:cÇ´Ô¥ó|;$UN’*L'IåÒ 6Ox°Ã°ŠV ÒIR†é$)]:Áæ 3î”~:qV/Ä“”6e\·esß‹®©I;ˆ \ë¯à!ùEt‡V^©änh! ' 3²Lê=Ç®®¯ ‰o&lüêM¡þ©‹<˜þö[Ð%×héO Bk· 9ûµß×m÷Ð;Š·:h;ìçC/K.róûÞ6ýòåb€ÿϱ«%œ]úm³[FIöb"ë¥iá&L~¥~‘`óÊ¡3ÄLw¥}tiç‘ü2â9å§¿ÅÔl¤©Þ0÷•ÿRç¸oê=d°£¸‡ÃÒäÌüCÌ?dÝl° ç¨y/fOäåï«Ïþ¼}óüŽ|†ITA‹I›K¿‘£! ó=QoÍŽM QÞô„—Àå­ÔËç,¦„9"™óŒ»|ð>ú>:endstream endobj 643 0 obj 1691 endobj 657 0 obj <> stream xœ­VMÛ6½ûW rhšÄ–-YòǦ{ÈÇn``“6Y-P-Ñ67’èHÔz"û—÷ )Ë^§9lщ$“œyóøæ‘_¨çùÔã¿õ3ÎZÝAÑ¢lõè þ-Z_Z¾Bõ#ÎèåÓúÁÆ4·ÜRŸ†> Æ‘Ð4kýL´(äŠ.þ˜~xñéjòòšÞŠÏr®RùdzƒˆÞˆ¦W<íh†ýsNÔI“ôÉcô</ iH¾ÏÉ‚`åt)é²ÊÖiI©š¢ØP¬s#T^ÒL›%LùŠ¡fx»4fuÖí®×koñU­<],º<£»#‘'ôZW z«òÏKúýÕ5Rûý:Ýi“ijŭ(O&U·Ôs³…ì®ãÒâêî<šR%åÚP.cY–ÄhZU†ñ•²§dI:'Áu••æÿ$ÂäqZ%’˜Áò(Ô\T•*_| @T‘¦2Á›¥£ ­\‘¼ÀF ¼þû„Q¼‘øÁ •ÂaS œ2™978íƒpl£uÐäû>˜§ZšUósVïó±CÅòÎÒd™Îjb¨”u§rÊ"Í¡¦½fñé$Û€†R]§@º3eVêî¼ÓýX½“¹Í¹E>';ò¾|àvðtkåJÄ’Å Ž…Ü“¶Glr[(w•BâÇúm’ðÏdãGåJÆj¾±¨ iª"w„˜Í ½îÐZ{‚ëÏ-"ÆàV)™´­`ºŽz«¶?ëè‡#ÇN¡ùä8åÛÉq­«4¡…Ìea;7É {´ÜwÓXQyà¹Dìä¡ß÷=4•ý|`gÁÁ#ippòI>×:vœ7Ò­Àg Ñ”®ÇF}»¼ã(‡kö\iÛõRÅKT±ƒÜ¢TÉÝ3Y`¬+Ys-ÔV˜:Þ(©¤­zß•aˆ6 Ô÷ýÊŽ|k/öëaU#7¶o¼¯º>•-ð&层ñhÀç¥?`AÛ¯‡¥Ãµ,ùTF¦ºéØsµëÅXg÷&_3øºÒ•K»¶æDÞ¡ t¾° î[9Õ;â“€¹Ó­»udî\ˆ•JR¯sÎYƒîÙf¿Þ&ib¾ÛážPá‹- ¶Ê”{†®–)ßY Óàõ  p‰®fØ©Të•&‹òŒUÞ«=ça–Q×Bt¤<;ÿòã»Oׯ¦Ÿ^OÞúmú‰+½ÿkà~Å£·?µq0oÕ¹ÿœÔ/ç<„—gÏv»A7|ÃÃ7v˜_އí}·iQÔñçv«:þî)ÏÝ=ÛÞàý¯úNl|s/ühìNgî×ø¶sëÿÂÍÁÈÿGvzÌΖp]Áî„£S ÔQÅߜdž4²…ÁxzÙhÌ'3ú? ›Þyßú‚ã³óendstream endobj 658 0 obj 1452 endobj 668 0 obj <> stream xœ½WMsÛ6½óWìøP'6E‹¤(JqÓ™~Ø™tܸ±•ioˆEÖ$¡€ 4n&ñ—wà‡˜:ñ¡µÇbowßÂaê¸0¥ßö;*¬‹;oÀ¦²¦ðÿ6ÖGËÕK ýŠ øa¥—…ະJ,cëBèÂ|é9 XÖ‹ë¬dyþhã¨!b%ìe¦8¨”ƒäU«¬Ü@V° Î ˆ³êêŠæ^®þ´®VÖ{k{Ëwç³ × ¡°ü…ï:®g†¹uÿ çÉ 4Rïa]¾¥ý­Õ¡y¥÷½¸ó½–d7A´ÁÄsÉ ¶^›$uéÙ°®½/\ý‰?Þ}¸¹i. âàŠç9¬n¬ï„f‚)TBä°Z‰‚©,"Ò@±^!k’ƒH`-ÄÃäó-Ñ£XõPAUG)° ©d1Ͳ2ÖÓóõÛÕýËSËõÛÝR\Ãe–«TÔ›´ ‰Mà‘¨eÅí6<øF‚Ø—`Œ@H`qR/5³Yà9¾ 3 aa¾7u¦ 3|^u#’ãi¤`h,ã§bœøáL¯›˜¸a?é Ÿå• Ú´ª’Ó[•‰’w…‚Ë ¼ætÈ•+™m¨ç¶ Ñ¿ÇxÄ kGôH±¯Æ~[Fè´ì°Rì8kŽìöÑÚ»äJf¨ï¬kå-ÙþÂóÙ ’ÒÙ|1sü¥>³‹/0j)ôtEiq'öo8rm÷½P_6 õØÈê˜úÁÉNì]Ï]83üùt‰^zÓùÜYøføu’ˆl¥ˆxUÑŽÆ“nÀÖ*Ùëé%dߢ!~Ÿ¦ÆXèÎaª4;ÅFˆ#ÀS£äêyv92Õâ Y…”\2º”£BŒ'ß™uxNÜ©9t3çNÐŒñ¢”•~Ô\i]®öOö*‚NzÀ ŒËt€ü|ÄÉBA)ú»f omXOš­¾pK¾o+ìh³/RÆ\6誄³Æ¤2kÃÔúQ·m"¹.C#ûf–4¡Ðè%::ÃÏ_ëg«ží5IqWêmƒae›gx2-MFçñ†‡ ‡&u@efe á’LëR\¥t«dk±ãÎqK3ú³Á`ÿ—wäÿínŒÔÎCXhfñ_˜i€¥úm©A¯Aï­¿‚îendstream endobj 669 0 obj 1428 endobj 679 0 obj <> stream xœ•WÛŽÛ6}×W Ú‡¦€W«»ä¶(¦Mº@ÐM³‹¦}¤%ÚV"‘®.ëìcöË{†¤d9M ‰R"‡gÎŒfÿ¦À)à?îÿ²õ®ßFIJ»Þ è~;ïo/4KÈýW¶ôÓ½Y–SÒýÖ³{CÊCÊÖ‘_Ð}ë={·—ŠDÓСӥìûZí¨î©ÒJ®èQT …|{ÿÞûåÞûÝËèèEi–úé†ÂœZ/²ÀO ;m¼» ÐÀ’ŸK¤—£zÑè^~z¢ASÉCö’¶u#?õOß$×oã(§5[º ‹Ô˜¸ŠB6Qyψf#ÛQEOßó–0à·¯?‹—ßœ!‹?2ëî÷G‹Î¿}]ö¤·Kª^ÞÜß`=}ªÂâN?ùÔˆ9}¥&‹g?fÜ{Ñ-jŸ9”Y4Y¦|NlÅÒÙ:MÕ+’ÜO)ÎóÀQñ¦)JO²¦"Ný°(0_ç່‚iXzEøEMrÔ¹ÓÆif¬–Þ4Ma.¤ÓÎ$š­š!¬Î'ÚwŽÛ¸ÄZzÛ Êñ:ƾØOL%¾ÕõnDšSÿÏS pdQ±$#Kâ322 q°ípA†}àüu§™±:“‘!–ddA0[5Ãîƒã6.±^NFºæÔ(tãÇë·²úii&ÌÉ*Ã/ÿ7I‘-¹IƒðŒ›àœv¸àÆ>pî»nf­ÎÜ$yxÆM’“U;\pãÞ9tnãëåÜ@03?Ë’ž7‡½¸¾½{ÒÉ舓dIÓº¤#Îà ¸.è°œÇnã43Vg:âh}FGf³U3\ÐáÞ98nãëåtÄÁ$ªjUécÿÛýõ‹ÇÊ …~ð/F¢ Z2…ù# 9ìv¸`Ä>pN»ÓÌX ‹üŒ‘0O&«v¸`Ľ³p¦K¬—3Ž3[I^Ý\ß¼½ù3KrÏ ¸“°¸Š"ºbuéöœîö)ôs½ëXd¡2ãïݸqZ†n»Jv“…/i6tî¤Ä0v¢Ã”öÎèÜ›ë[§y\®%zÄ_PºG=6)Íýý•”Ke{ŠÜÆ“®?kTÐ,Ê´£aÅÚïØAžœ¶‰-wm²vOÏÑÊ»z”€§Ú6wù Š3wf¸<: \WR`K¸¯ÎüûŠûÜJ¡ŒFm«²I³´<–°²óé‡fѱ°VP’>ŸÐ,Öì ¡kè£] E{ÂÆÞ­ ßl ?J£¬mµc~?HÃ…¤=ˆ”]o£™pwŠÃkåhey¶Zª«w{Œ@Æjæœï"{ñ``j>„ynèÓÓŠÝT´“JvF+{sàÈÕ­ØIÎï«(O+›gø8ŒHgÏoda´FM(Ìp·k½pRŸÙÙeaÈ¡Âu=@¾a@oÆaÏ,~P(p _“›¼ÎEšÄ8hˆ]+üÌmÇ~–J#Ðjƒ6.(Î .ÚoOl8æ§ïY©*ÑUÎ<Ôàú~ìúÅ-9Dó½Æ`›nöƒålg8l×[Îq¾Nß0/žÅZÎE)L¾Þ†):š™^Æ(—Qk)<]oß0JÃè|C[‘» ôr鄹qÉž ƒŽð#'TÚÑbQy͹'b™L|r„§xôƒ¹f-£²ˆ§3Œº„ËZ=p]ÙÍr*LÕÑØRRÄ\çqHšÍIù»÷;pendstream endobj 680 0 obj 1750 endobj 688 0 obj <> stream xœµY]Û6}÷¯ Ú‡Mƒ‰VõY,Hƒ¤ Ý¦‰Ý·‚–è±vdÉÕÇ8Þ·ä—÷\~È”;M× Šd2$%^ž{yy.ó+ ÎBúc—ûÕßßDqÂî†UȾÅÏÝê×ׯ0û«Ü³oÖúµŒqÎÖÛ•™ËYÆYZDAÎÖûÕ“dÝŽø©Û;6ŒrT¬nÙ¸«v”'¶W²Е#þQ½b?¥êië§F ¬Û²®¯TÏŽ»ºÜ±a×MMÅ6Ší­eU‘IÙž¾ZÿwÅE±õ÷«'Û©»®Ø¡ïîz¹Øm˲ërjdÃŽ xú®½kN¬We·ß«¶"lÛ5Mw$ÀúÃÔ0PðQYL¼×};úÛêåzõÓ*³ aiR„`{×MÃ$ˆ –‹$àyŽ>Ï@I…®Y®ò0r¹ ¤'Úž±Z®\7ƒ9Îæ™I9«¦ «î‹ö™Eg'úXËÕö ·óM»õçjÙpPe½=AÚ…u{˜F¦Þªê®Õ„•Ý¡Ö|ÁC¬›Fzc[7Š=Ô’I0¿Ÿm©ØN¶U£nXwP jáM"h'x©…çA”å ®«Õ“Úv½žë/!*‚B„î|TV´²˜ÉpÀÞÿHAx¬eÕc-Z‰ë¦am7²®,§þCÀè¾ûO}÷ Áî±pŽ2MÏýfÀzØNt=muv¿ùÂýQž;«¦é¹ß>³pìDëõîÌž~Þ`ïb÷5¶3ö”Ü«QõÃ#Nž½ZEÛ˜8YKÙq%’ˆÃy°›`.æñ {ÍêíØ`(àÚøjj_¬×Óøþ+eƒ<àbÂÅ -xš_7´`ZÍ5ÏD΃"KØ3§x¥’£D­)¿á¯dw]‡ôT)‰¬Ò3a¯n×oYSozÙ×j¸Ñ¤=tu… 𠃲Óé!GÆÈ ñ¦gí·ª_lŒV©J­¦7^…Ͷ9!Oé—ŒÐx^ >\ä­¤à~ÞJŠh‘·’B¸¼e›çÀµ&6ÝD×ã~ÞJòb‘·’ŸÇ=SÍ ôÖ›]+BA%ð,2¤ã”ºW¡AêÂôU3 ;êÝ¡©Ëz„6ì´Yðt¹ý8"?Ÿ°\Ó1ƒ8J.bú#Âd[·$K´Á(bÏ¢ØÚúYÁçNvNgFg“©VŽScFàêèQ½Çú°ÞwÃhŽ«¤÷:¸äp?ì»îÃZM/bƒN°»¶þŸýæ^ÞÓ$Ǫv(6÷îëZgAY!|+­O@¦±ÛKv&Kcñ|”÷Š\²Q;Ù 2Ø"ò4] ¤| Š~”MÀÖ¤ÙÉ)7¬6ù Vz=3§(-œ¨D-pÀg)+ëq×÷ô•ƒÞ$þ5Üvh”ÄBE 2gƳg”×´S¨B!êО@™ÔÊDÞ••вUDº:C¼í”QìˆX“úÊ•4¯=G¼|'á+5Ø)s¸ÅÖëEACK^Ê•ñˆ™­× êÊdBòÈ C¥¤®;‘ßf ò@£’œ3@0û_=áŒ!?áëS[™ªLU`e˜6U(»þä´ál¶ªñéz3‘]]·í¡¸`n ½D@ò‹´ÇÇKÚž<±9ÌQ¡Òj•^vywlÏ´¯]–t"áþù\³8?D»óÃ6Ïç‡0G„›èzÜ??D\,Îçîü°Íóùáž8n¢•Î’"N3’" ƒÌô®V"ÎìÑ¢¨d ʯu餥’ÿ68’†ËãWˆ,òé¤Â<úðÛ…š¦GŸ° Ù‰®§­Îô‰$[Ð'âx¶ª›}ö™…c'úXgúÌéÂ#|Y¦{=óÉ¢J„ñ]޽‡ŒÐjûîhÔûGyŒ„¯ÐE/:°9…n›fÀRe'ºžðºÐ²Íã1 £Ùj¸Tèî™…Ã=…>[µ<ò\è0DÜ¢6ÓÝëy$õeyD~¿SD¤n q-ƒÉÕêr‡Étfô’ËU±Ç%‡ð¹äXŒ]µiz\šK—h{ÆêÌe˜‰—a:«¦éqiŸYtv¢uæ2ŒuEak¤¦w=•ab5¹zh¡ 5“²­SC™±—GSòººÕ%ý}Qû·Q‘.n9¢"s·¶y¦Ï†ÜD׋ý[ލ‹[ލàùl•/o9Ü3 Gx·³UC_”…Å4EáoºWó‡Ïiöêý¦‘í=ѧ$M!iJÒÙ8r¡¦Ç]¯p\á´º¤2_'Q¾,N¢|.NlÓ£2÷Š7ÑõÅ ©ð•Ù\œØ¦Geæ'óDëLe–˜Ã%FÎÌM÷z*3W¸È¡Œ¶õ¨ócٵГ#]\èJâïùÛ··&5RªÔRÔÏ—ž×jIË_’L•Q?ʦ7s‘óƒl'Ù#‚î‚,Í¢X£ŠwR4_¢hm&HÓ¸›å`÷O’Âb’g,í@‘ ¤¸óȧ¸Éà 2/–÷¦;þ‘wh5ý0Ê~œÛÝá1§åÆüÿ·°˜gÂc¿J8’R’Ï#Ÿ³0x>΢˅}Ìu,ìj>ºðÇ£5J°Ö˜6Z‘ ¨u7ð9Áá«‚»E¿Ðbè­jPpWMhÔè ô7,‚? ʳçPñ…™7,í3º8ÄÉžóȧxŽÂ ˜Z,ây9ÖÐ*çeðÃc>¡?÷N5D?I~Ôme 7òNYœ/áßu÷ÓáðKÿ§³©œÆŸšhÝ4I]7»ívP6LŸZ>=ÖÕ¸û`ÏDT}¹¾ àtü#uƹ’lfá§Õo›Å¬¸endstream endobj 689 0 obj 2617 endobj 705 0 obj <> stream xœÍXkoÛ6ý®_q×aè1'Šzí6 š"@±õá}ØGE¢bm¶äJrb0ç—ïP”dÅy9q> EaꊼÇÅ%³¸¢Ëy^7öÆ‹ñ ~âù6ÿ„‡Ìó9öNgfÎ@M»¹JW±ZAà1î ‘Ð’‘Ý-”œ…BîÒz¿º…V¡¿ØAžž_"gõDö`ú€a ©˜ØáB/ö|ÞÇU¼€F§[6o/tÇÆþ¤:ûÏ;yÎÊûsñ¥ÏP#2]ä6¾b<vÙäÉ&-WÐ|KH)Ÿy<#<‰È …`Â"q‘b~—”)³ñeBé­„:„×sò¤Í|‰“M²¥Ô7(†â9¨‹Ò°1îíRªo¥dC70Ú»# M)ð Å1Cäšs]æ ~‰ÚÁÝ••îï&åbaÃñr©‹ô¾v ¤cj]äj É¥Ú¥v·—à™þ°p|ßGCäjaÄ”/w©íe¬Ž .+<Ï€»Ì*¨$‹D8„eÀYäF»,÷ñÚãJ(pNIÓì=DFCär¨o?šýI‘•—Þ. ’æë$c÷FÌ%²GcÄ]äÄ\á¨ðLj/½8싸}ÁØvk.˜ËC \Ó­=.¸õ‘‡tkÎD—”)9tëãùªžíVÏè]Æsí²=àú2tYhš1]ÙCä¸HÁ"hÆ¿ÌËZ÷p[„æ­:$™Å[´ÂÅÄßPÞ4¡ÒüÄ„@S–óšÒ¸‰)ËçÚæ0(T»¿bè!ïœgDßæE2_¥š~ȺUlöÓ󧃅ݤÛc36ž/Êc3§ÒÙÅ+,5`#âÜì„SÎkÓLgxùxÚá= XObÄb3ðíS àdï§QU¢•ºåZ_K–²²˜8Í‹3ÂКGæ*ÁF›•…^ÓñÉôÓ°¨­…ˆ3é¢t&Ük·\W9vr[aoiö5|è;ÈWŒjÚ:|^¼9o a#—Ù­£13’â`ù&ßL>otU3zMµ^âli4žè|Nõ¬\ÍS:Õø¢ƒ!tœÌlwÀb“dû`›bÅ”æY¦+£e[FºgE9Ê+It]ëô%íxÆ’#cÁuÆ382û¨µUn ÂÜAmÕòlCßl°„~™[3>©žѯ¿¿{wqAÛéDÙ²BwÎ6u“êªÂ¬¤¥ˆ‚è×£{/WM[d/é»úßâ‰ièHyñªO¢ÏófÃûënrøIvÅà.¾Æ½®ðMŸ¸Ãxl- ã¶ê0U¯Ó±¥mÉ,«Ò<`cq̪Qå«¥©ïS}–£6m’ÞbéVÖJŠ38T¾Iz<ÞàŠÉMïv½ýMnzzµYàK i I^\É<Ã#3JÐz–'3$„ß[J ØÇUÚéî5#{ì Å‚•jEI­(; ¢ÊzGÛD"£Ÿ¡%š˜©)TŠùÛe'›Qª©VEÒÎ6"vÍt¼²]u“.ï·:ƒzÕÔ½¶­ÐEÛâ³Ûõ=Úã’ ¡]>œDW)ìñ}Äj« eî¶o[#æm5vOm[íVéG2[ü@Y¯ˆG7Ê„“÷eï”-”øvÿWÕè6}<ŒHšÜ‘Ï\ŸEœ‹9‚°C ‡ïƒóXF€žendstream endobj 706 0 obj 1510 endobj 725 0 obj <> stream xœíXÛŽãÆ}×WTdYÛR/»ym$€³ØM lØ+džZTKj›"µ¼Œ¬LpÏ®4¶hªìЭþ|þÛèí|ôÃ(‚ý(‘ž¶d ÛQèI%¢À=f£÷w8ŒHB2RçõÙÝÒ¬LiòÔô¶¡ðl×÷B‘È—ØE$¡©³»Ñù23djø¿œJ_(˜/G¯RÃÂ@µ3©]Y¤CWPo ~ÛÊu³5y-`¾A~Ô‡Mu†âßtU©Õ5nÝÛzÛm¾kê«ðÔ]“ÎòÃèÕÞf™n*ÜZ°Æh”ˆÃK]kŽ#=MMxô7mì{»à÷G°9¹_Á^&ðù_F¯Z ^Ì–m¾1˜#làhþ¨M^Ù"?ÁÆè¥)a§K½5µ)Ñý²ØŽE_b¾þÑW1$D¾’Ä5 èÔ°jò ýP_ã2éß !È€×_pö á‹×î•]áOGÜ %¬ïqÙÃðø‹üuãr<ï~zx8àäÖW–Ey¬jô»Ä5iÑdKÈ‹ºÛáøŸ«ÿäÒBž¾¾th@÷»oçïÁnõÚL:²¨ ˜˜–‡{㹺v]‘ëû1srŸçƒ°]º®œëà PªÍ¬ù¦©&. èEñhÀü¡·»ÌLn¸°¹.PëEfžÈÌr(V¼k}ÎS|û„¾Hÿ äs‚ Ê´[¾q&ŸÐ-Ó´˜õAI?RA„õA%‰'bß=Þ§ˆ„ÊBH9ñŒ.9CAg×W³àEF“Dx Óm¥DgUё턧2™IIMÒ"k¶yG+ŒÀWEå4L©c 4¬]™ÒšœiÜ•EjªŠ˜lø'A÷§ UŒ{ƒ™LèP~ˆ$vwž+T"& ¿cò ûòžqŽ@áK¬"’ˆ)ªMÍn—µÃÅàÀ~$Â÷;Ó~â«—ØE‘0Ìù´Ü=O@sV—†»mÑ©&&‘yNcŸ!úlãªç†9Uö-¨ú¨ÝJÜ8¬ëóF,Zžœ¶šå ª wìÅ¥l¤ÅŽ˜ú˜•[Ñi• ¿°¶V ˜’òܳ™òTW†ò %éP48ðX7ÐyýDCGž`P—¼m¯óš@Ãæ~CÑʈæP÷&˼¡ý¸÷fž!-òº,² )X¸XØ»ñ›1ù3NÇø¶X¢¶Ö%ßSœú ]BðC%ù>0ÃrPîñÎ{6ð‘ü¾ß»ärW™ðûá•y¡wupTŽ"ÒŠÖY——ÑíöÝÀ!£Ûˆúºb"†ó:eù-•Ô}®ÝPžaØù¡3ìnÕµI¬þ8ž%íh³‘Lj‰ ¼å=S[L Ó.uaãÑ‘J>Õ$u'çy:n“ô“N·­c‰Ú’ô¡1U]±}Š÷âpÙi»,Ùe Rc×9Œ¿<'J_9uâ¶ë.JþnêŽH稀wÃÒisjHaày¨É~KNä\*×$N»e=9Xkk;efÿ3ÑA9<µ}t£MÇ\7;nøÅê|à§„è«6¾OÝ£ž¸"M§„Rì¥éÇJï#ƒ[×37ªôÿWªÿõJu•I8D‡Ï¤ÝZdÔ•"5Ñ¢Ä*0–ƒæt¤¢ŠÙnI¢3œ©n³bE"B”©KB‚ÏÚøç™«Õ·ÿzû’{N®®>Òjó7蜄qµ(Ìã/n×$µeš™c(Õ„¾¥wúuŒ-¨À%Ž×ÖÚ7ƒDs¯>‰üå3Ð\w—Ÿd¦¿üIéÂS •¢!C&aˆbì’€‘‚g§*g&è¬*ÌDò"£I(B .†ª- TU9TzÿYÞ &›ÛáŸÅÞ<žÐÝ Šô‘‘^®h ØRºµ-kÀ} EÂÌáäþ{$£¾üf|ºü©ûø©÷Ëé©NëFgCwÉ× 9·t£Ëô.79Ê%üÖT8‹­jS^¥?ëuŸ"ànYNÜv¥-žŸKõ(†gv?/Äž†7Óˆy“sHýSJïendstream endobj 726 0 obj 1940 endobj 738 0 obj <> stream xœXmܸ þî_Á^Qt/˜Uüþ’k ´E,\pw{?@ë‘gÜØÖIJw3ýÔÝ_^’’=šÙ|™CÉ–(ò!ùòWE!ýs¿u¼ý5N3Ø™ „ø| "^î§îáŸ÷¼¬€(‚û&°{#("È«X”pß7“ü¢ :Y+xÚ·‚ó0iÝh ¥¾´Ã& Ó^9¨ºmZµ…v8̨o“L«÷{\Þö‡®EqÓ^N¼AÏ­kPî÷ÿ ¢DÄpÿ)¸1{=w[xÀ5(5zT ‡#ܽýLGoõ€ocO#) GPQü¸Ö‡#<µ]l;?ë EtFŸ %?þ5¸Ñ ˜ùÁ¨¯³<½ínTc/‡m‡zÈyÒ½œÚZvÝŽ€›ÿ}üäð$qž¢yž%ÐI‘U"ªì´ ~»Â(H¤$Ø ˆù¿:mÔó ´Í%r„FMoW˜pÁygɹµ¸nƒ›PþÑMjЖGÕ7ÐNPËledÕ7tUÝNÎJ”Æf&aœŠ°€<‹#²1CÑad§WÚÆ"eI¬œ5òC7›ýóËPM¹“í°AcÐ>iÌÜû‘s²ÄZšD,ídª™Èu¸•"H°qêÂë÷ºÖÌu­ŒY=%I%´%B]û *ãHT¥^gJKÊ\¡iŸQ tߨ¦yÐ Ê#VÖ*Tu6œ:~(®ÙFg|@£7ðóïŸ>±íyŒ§…•ïfãÎQ[k9i™CT–IÊ à»^îÔG5Á-ìð/z¿¥'”Cv`T=a BoMâ*¶²"£PÀŸÛ¡îæ­‚¿5NM±ÿ;®Fär·äQ·[xãöLvãò{õ07¨÷r„7qfzáÓN ®N»G¯»wù8ª’e;Yíò²X½ˆ)b‘…[ #¦O‹Q¾z¿ˆh¬áråtsÁjz!OžÙÊIÚœbw uf‰Ÿtw±¼X•u£’[{Èñ ìÁ^iOG'îûF9Qb‰”F‰çÝžs홯|Å袵Ö8ÚˆI.ëZÛï’6®B¦¬'= ø¾Òµ&LJ¥’6Èñ“|`æ%"å¨GŠ\BÄÚ3ê'ÃÛÆŽµkÝÍ=‚ï)pä^Ž«BTQâ|‡2p£yé`LÞ¸Ä,pþ¢ŽOh'<φl•‡Ã¨c‹`²“’¤@nN=/mU#çnZµ’E"!ÉÙ’*`½·Àø }BÏ‹Gb±Ã¼Cüõ´Ç 6Êlr¾aP‰ÚÎJ "ü¨Fry3ê>ÜÝÿF޲< Èî¸tCE`UN^gYÒ´£AG;¤Ì‰…4^ãÕ‘ÎÂ~K²EiLïED„§×Ò{)J–_r 5 FÔp†ºËŒ¥®(ÄØ ø(Äa¼J塇‚{çÔq}]¯GoövŽÝ>qÃ%ÔKyDÈ|>ßY[;ô0°œ™n£›Y©+a‘œab>;©vèaàÞ9íÜF_×ë13W•o„¦Óò Øeç Q•G> Q…zX…Ýðƒ{`-]6.3–ºÀáuÛ‡!ª¢r•Êà Ë;§ŽÛèëz5 (Ò‚§°ÕóÃòQ"öúôeê›ìzç*ë÷®Ôë¥ø'¬Q¸>ûf¹Z*^nxútswíâ›·Ô ^žáOÏøÞûíì3_¿©åµ_^àÅn¼rÒ×…g3mq°jþ7èÉðþbþ7ü€÷ëëËO—WöØUÂó¶™ô 6 ëÒØâÑëf]Qã¯Yö:;;ñ÷º;Ù¶™eî%m×°ö»\ÎX‹¼€’•@džz=›²òp Í_‚ÿβĶendstream endobj 739 0 obj 2059 endobj 748 0 obj <> stream xœ½U]oÛ6}ׯ¸ °55Æ”ÉIÑ—m` hׯ CAK”ÍF]’ŠcìeÖ/ß%)ÉjšK† ¶)ñ~Ÿsî7˜ û×~§epú!œžÁJ¸ÄÿUð- î ´_i ¯îZ”Â"¼-…„B|’,Êà8c†Ùm8ìk-ª˜5‡7ß~¹~ýûâË«ùâù'¸eEÍATîåóÅ×àõ"xİ "R2‹Ñ!M  ¢d’óÈ‹àúY¡'B§.µ7u5¯ryÉ;%k#*Þ«2›FµæÀ@o…I×6§“pJ‡‘Yp¬ 3¼ä•#a£dʵÎÒ5ôe_¸zN?Daç6[,®‚cÀ‚ ,…Ùˆ»ÏŸa!ý‹[)2-ëÜ>Çs]i±ªxéš)¥‡7z-•‘><±NGâp&„øø^‚-ºd+n«Îëj o?^]ùϦµôÅݸ7­1Ào>ë1L:›Óhn€m° %°-‡ØÈ9W®GRøf ›C÷btÚãz½÷Λ¿üÔáfþ€G_Æþ^K[0,g7/v4î ukØvì'Q؈ÖÀ5ô‡ë¾­C …¡EÎïšsägÇtr6#a ÓØa˜Î¦19£þø8 £'2sž: ‹rY°êø+7Å€<>JØ 'gS>)ælJb程™ÊŒC.”Rᘹa¢Ð +XËí¬jǼµt²9@Bh¨¤q´¢H'`@« OE.p¸KŽqø9I\iá´íñÜ€Ì º–pZxxyÃݽX™P<5ÅîÜÄbb&ë%v¯£Ü€Šl~gK÷¨Ñ•ÀZå¡5|Î"ßÃ/û¥Ý‘ÇúË“xzÔ4ÐtØ[q¥¤Úk“á¼–ʺÈldžŽ.àWýwu4Æ\XÉÄãVE_„mM7™§²ºåÊ8e–m¿\MÄv«ï÷» tÚ±Ž±jGcßòƒ¿¶zˆâ¦VÈMûÅÏ.¥'…ÆTiÿ›cô ˜ZÕVD±Ü6?jcÚµ@ ÓñÐ,˜Áð¤LËuÊ÷óûØÃôç6ý²dj7¶>ð’ü¶Ë¡¬ºn¾í\—¢²ââÞa'kÐ ¶C•ÀZpï6¼Âµ‘Ë¢[‹Ô]Ï÷9&µ\f Iüéq´Ã%&.ývSuèi\òŠ+Ìcç3sÛÊõx˼ºº${)ˆ&3J¦ç]NQ'ä,~JRè‰Pçi˜Y¿C‡µcbw8Làl5RFÃyì7i”8?Ê÷lm×8Ñl… u¦U Ô½–BvƒaR¤Ge¡3²—ì_2½±ïÓÆîÑ%•X!q 7öæIÚ`7ƒÃ×ÁæÅjéØ~†‡õ c+Ê´`ŠÙüDܤv`œø 4rÓ ¥¨65r}¾¸†Ü²ÔIÊ0²“/-ŒH£ÛÏôOT •µý¿JŠuеñzei}:mù>ÕNO\›Å@ÞȼÌ< “?Ôô?ÈåÏ‹ZqsÀ+V€Ë§tƒ\É0#%î:mT¢Î´ƒAªÄ Ìn"J&v™M'Ö1";¦=ßÿ`vGÛendstream endobj 749 0 obj 1206 endobj 756 0 obj <> stream xœVioÛFý®_1p6qhZ¤.ˉ 4>R£‰sX)A°—Ö6$W!—’Õ¢¤_Þ7»¤ËI‹Ê°H‘s½9ÞÎWjú5ù¯ºŽÒÆá»°Ý¡Û¢Ñ¤ø¿m|mV„ªË(¥çˆµÂõi7œj@½€ºýŽÒ m<"º(³Ë,Ö/¤YÄeæÑÅû«Ï×秃Ïg—¯~ŒTl? ÝS\šË§4ÂÀïÒà%[;ܧDë ™q®ËÛ1MÔL YD¹,¤¡©HJYÐP&zF‰J•!£ÝSÚ?|üPøG•±Xç uÒ|JêG±ÏNñãÉ“å_„‘Š4,ãõ‰žÐÐ\ÖðÄZ~êÄÿÆ…óÖ£ àŒ„mÎ\ý’i3–9•…ŒË„&‰* &WÙmš*h/Å—‘${ÍÆj4"Sæ£#•Š[I=)adD3eøý­Òx¯¢ ¶ÏøZ•ÓK§âÄò*#Qéàw’ÐHgFà)b#Qz¤¬íJVÕm•ÔˆÜ0,=›r‹j¦ Éø·L ´‚Õòi0. ÏúpxàÁ¡æU<Œ½B=Ü¡ä\E\ºI®G²(¬«Ç¾"a-œü…/S1Læl>r%§ÐÎa¾‘¬":˜ãvd+èÇ¥K ÚŸ`zU³Ëê—ƒkªLäs2p!IçxœéìÀ¾ÊÅŒà,3«Ä"J.*T,Î ëêy„ÖD&µ¨©˜È‘Šç›uc f¦‘ʤL3ŽŒÛäÖY©JžY?ðÇI†å²(Ò¦!Òbur#¦\­Del€ããÇU³v«f}[pYœ,î¼ùò^'w›~«ÓCMý‹œÏtçTbØ#'J˜ùQfÐݱ־œÞœÿ~~5¸öVÎ"iî<|Í—Ÿöœ¹æg€p18 OlJ:~(þ~ÓÛí Š±¶ßd«ï‡GÍ~Ä¥_a4U± 'û~'ìláY~s—‰TÞ›$U™½ˆ»ã¼.ÔŸŸðñnæ»7Çkåܰ‚;ÃTI‹ÑêzduÝÈ9ýuà(µ42O¹¶«©û‚Àhò ‰c—¯8ÉÒ „Àd 넜Ïåaåˆ?‹8Ѱ½‰FKOßr›J¿kã N…å-]+?ˆ….þêŠ%4ø˜9KÅÐuyåñå—NkpöüòŠÆRD2ßœ0¦„”³V0ñQ£¦2™/I ïÌ'<ÑÕ”íR€3ȽXÏ)‹I$Û§+m¤\&+Ħ3Œ%äÊ5i 'ª©$\¦Žö†r¿Í*‹2Á0á}àŠyb Âg‡vàÜ¢Ú1Í$í,‹»æ»7[(t³nÖÎdµüf°ž,&:mÖ"#ÙØh#&m‹ GbÒŸä|­0sŠpô)êÄsmxm·èÀÕŽe6U¹ÎR®àTÀWŒkø½púúå5- ^?øíüã’ÉSf;æétŒ8s±‘_ö¸j¢Ó7ïÎ/¬1¾ù°ü·~ñéB¨Ä‘¯*¼m5×3cD´÷aÏÖfïã—“o•å<Î jɉu™Eß°RÂ5ÑÆ@0² ²ay»æ×Òêù ñ¶Ñ¥Yã¨ßõ[m ;­¥3a³ç~&ëo.ƒëv¨·Á£¾ßµ†Ú~Ûn„Ï+j²yzîò4à<¹-îª>ZÏí±Ê)·AÙ‚pQ‹+ßý?Á’ß·–ê.{ç ¦éU3ÂMrÝæ…ž=Âv`ՀЮ^(Þ”Ä7Á÷j]ãÃÝâ¼!Ü;a‚þŠ@ÀT%e$éY\)øãŸ¹BëÝ—©wÃÛ÷dWê©Æ®¶Ô³2n£®îBw7T;Ž·MÚ÷?Ü(´o·Óï1ô;E§SŸ¼›îq½m¬H;¼áƒ $ncÑy.æUþ¸8wvN׫ã,gæÏH*»Z h[Fè£<Èïš@$)7™ÃC»:–G;­Ú§¼3î¬ô@:™EÜ¥¼*¥õàVx«>SĘä°8Êl‹êÈ>_»`Š÷ªI¦Q™ç«½q¢ eìÎ]ðzÍï‡Ø‹Ý Të â0 ίgï!noçϧ×õ:î=€j#g~UÁnŽlq[ßì ¥»ïšº®ïmã*Pendstream endobj 757 0 obj 1622 endobj 762 0 obj <> stream xœX[¯ÛÆ~ׯ˜(šœèÐ\ÞéÔ/½¸9€Q7¶‚>y È•´=$Wæ’GV›•~ygöBRGn`ârw¿ùfv.ü¾ÇÀ§?û[6‹ï‚(†­Zøð7üß.>,˜^ö§làO+½,Æ`µY˜½ RIx¬šÅ׫‡èTE·Þö ôøöõÐöRÖ vE[Õ:Þ]Ë+Xá›Õ¿]-~X$pX„~–yiŒ ,…fÆ)ó¢À ëÅû$C$/ÓHN<âíž·§³$©â¥l+}<íOÜ~?ñò!VÕâëõ°qó#~ìey”Ûš°—¢íy½¤m÷aâ{I÷,ô½¼€ªè @Ø^‡NôÜÈs%K½, íA•hØsQ‚ÐË”Ùŧ”ɼ$Œ&ˆà·!FmÈjEY×òjÏK±9jK"o•­¹ÑoDSlùRë˲Èc1›)|ØñNobPÊ®ãjœ+Ò¼-> Å€¤&Á>9|š™å^œ8¡×¢ß‹WŠ¥^Ìük3]7~IÖ0–ŠRÏOƒ™äýqÏ/TÔ¢–E‹>üÄõkCh·ðúaõþ^õ¸¢è*x*ê«—“ggˆŽž‰¢W»a„¾CÆË2Çh Èß=–‹Ì¼ŒîEо‹2/ÎÍð¶z‘<_#ÕÀª@ ÞÉÃ?†þt¦nŠ—²¨kŒ[ÙaFߊ'”Ç丩Œ)w¼|ÔyJqL&Kì;\ÖaÇ‹ŠwF³\Ÿ9e•]eBÝáŠ#¬9"SÐãï +!L,”LörPõqœ-¬ eZ‹–ÎéI|ï he¿DP³L(:Þœú³°…Ayç‚~ÿ—=x‹oºƒP¨žÐUÌlñx,ÿØ›¬ïÁ7X[½¡‚oPKH‰f_®ÜvEC;·¼å]ÑcÒÔ¹ÑÂ4b»ë¡–òjñȵÄ/ ñÅ»0H!׉›¢;ƒâ;œfþÅ;*'^Å,XêÊžhNŸ‚» ,û M›¡u p^Aƒ–å‰pîâN‰s¹9™ýç³]ýâ䞘@ÎäÐï‡~¦Ì’ì´/:²*\Êý…£5ø²hܽ0(bs‚ßP<Ø• XŽ<ýÄ~^ÂW‡¯–ð÷ß¼9ŸálÖ’×u²;©ݨÃ5¥êŠlìö;i6¢æ/á÷ê¿-¢XL'<ºïI¼ò¿ñÇIÑ3¿ýöüw’çyRbpd&~õ§S¦ èd\´eÍG+WP ½lŠ^ÐÝ9^ªŽ2?ÐnºeÈÂ’ª_m9fì· –„ÏäÀáý?ÝqÉŸk©87òÑq~"5õ‹‹Rѹó^´ª=úù’.uA®iÂP„Ùcwe¤ƒ Á&!4ÃÃÖn±FÊmNƒJDZ)àmɧðgŠÆscl(‚/9°‰fÇÚNì€ÉÕÄvÚÝ©k£à¢gé ðji"¹6Çce'SôDZ†ž•Î0%¸³¦¤ ÅÎCxŠ!ÜOÌð6%PöÄ %6‘üwæ ÔøÈ|~ɹˆäeÉkÉ+°·ix·Eæ0.™àÚòƒ½-æ²xèÅØFvܺÕ$­^ihôC}Ȭwº0M5èP3©—D¹Vk`R…ÌK#3¼Q½$òr^öÉÆæ¦›¡VèºC ¼4È>»C]^!ÄXN|nsº„Ou¸xyÙØá~V+(L@§HE„*þaЦ Ö®ÐqÍt„ØfDñÜ­ï)Òû<ØKR”6+¾)†ºwD‘SôÅ#^$º"ú¬gö¦O½N¦+² Šo†šœã(B¸HßT.¨c:¶ûI½z‹÷É4³ö1Sr’%Wж‰ÞP×ïl½¡Sõ÷‡R=9.EJá(±xðž›>wŒ‚1Óe`:…>Þ¨Ä ot¹wj¤Ð†#Ѭë¢}ÄJ£ÐµÄõ)éxhì£ÛÇ_r("¡¯¤³CKY¡š6Šåzr*DWöû€6h¡ÔÐà-D¦0ïY²¼7E¹-·Ôkªu‚¼Ì‰¸MŠýÞ€Ë6^‹í=o+6¶8è -'b©f=eÍ©DÄ|åïî;QUdXÑ.>– û#ÆùKÙâ–þÕO}7ð_6E­øÏϯ ¶ ašŸ„ùñ »J“1l:£y=k™¸º•éx±÷µPýÕ•DK¤¡‹&­-ÕS˜³FÁv#¡eϺ{GÐK[¡v”¶F§vŸ£ôlº©h þ' 윱…`QÓFjfâÐ oüˆ95×H™mq1r¾®µÃnÂ}Û£RÍ|Êà=U¨¤i0}ÊÄé÷òÀÑJ® Wºê]Á 5¬Mèêѹ´ŠcÕsÖÎ@WÒÄ#HJAððâ­m.œovç÷$)d&3¼lØž¥©. G&XüÜÌYendstream endobj 763 0 obj 2162 endobj 773 0 obj <> stream xœ•XyoÔFÿߟ╪Âî`o •z ¨€EjUUÈñ޳NmÏâ#!­ºûÉûގסU³$ì\ïú½cÞä#¸Ì—þ™ï¼v¿åAçã ü=w>:ž:æ+¯á‡•:êp4­±Q²VµóàdhNëì\¼•W/DK8Çÿ[yµëö È(iûáêyù<†T±JY«—΀¯Ë&¯†µ€gÅÐôRVÛ|÷ð¾Ã=’ Ž\Êr G‡’v8¤X˜Ý³¡X@Ù ì®ÏÚ~Ëí™yî(|“µp´­Ê®ßãq²:Ï#UyÀ¸"]m˜½Èì‘aH¸¬Ös(v{mó §ÔgièqsAú²Њ~h›$Že µl…ÆŒ`ì he =Êî¶"/‹R¬¡y_ÊFá '5’¶ô<Ÿ%nKüæJÌ:ë3(ÊJ08-Ÿ²Ù=¨õ E!“þzkD.Ô‰¬m³k(;ôe#Ú¬G‘g× >õm†‚›ó™:7Ê’Z2â•5k:ØÀYÙ4†ª†,Ïe»VS9ãƒç @ ²ý7]sÙôb†24 ²ö}ò ÏÎ*…^›]¸è{²Y›£`$rRi9ZÎe5ÔˆûDkµ1s²ïÌM¬“‘vÇsçú)㉛Zçþ!®¯ÐNØ Úª|ãÇ>ó#>ñM¶Ý¶rÛ–ˆ0¬E‘ U?j•uбëý²¢-\mÊ|£QQ€Û( œo Ó–"ç -b@’"¸(1)ðÌùPJèdâhƒ6È­²1©!A8ž¯œ7NWŽï& ‹C}´ºvü0öXÀõ´rÞýG±8Ù"‚œX¢8qÒNW’Ÿ·¢Ùí¢hžDË,ÎcʹKmaÒÏýà…,IƒÑSC3ØJ¬ e/µG"—EéÔ!:Ôm¡NQU*_¿ù’xŒÁ²›î*×á OBVU2'oŽ<¤Žã©§»òOñÇô›ã…œYÈ¡í7£êV¨Nã?> stream xœ•WÛ’ÛÆ}ÇWt”r$¯Iƒ;$o[.U)rlÑ~I¥\C`°œhÜÕ:IUÈ/Ï™’²+»rn}¦çtOO÷ÏøŒõk¿Ë­÷òû0NènðúÿwÞÏÓKÈ~•[úÓJ/ˈ1ZÕž‘e”1J‹ÐÏiµõ^|ÛÒ°/K1 â´ëd;ŠžÆŽÆ ¹åw‚ÖûºÆ˜¨ã¾oEåÓaµAÿA6 ­…^;ð­ >˜¶(»¶"Þßí·¢$ëÏWÿðX䇴zç½xÿûw ¯íFÚña•Û±á#ö÷½Dßwý‚ÜâÓæï»QíÉG-‚­Y‰ž-ªÄPör-ªÏŸ{/øº»Tw= ;QÊúQ¶w´–m«¾Ë®Ùo!![ÂÚ¯WÞw^J^˜°Â/bJÓ$¢­±"óSÛm¼O H~¡‘R?Öl¿Ù·o§ßˆñp$Þ ñÝ®yTÇW )”Ô¡„…!VÕIòûîA »ÕnÏ"ò‹„¹Õþ-SóË8ˆý8ÊiÅ—€Ý´¤>ûîá0©«‰·Æú' 3*´R…ò˜è÷²-›}%èËzߎ]× þæ 2d~j—Üw²¢›óè$vÞÿh±÷0ò~œÚÝn0Lû}òG-®ä–-\+4­µwòã‚Ê ïéf×Èa<nÎX[o\Á‰ìÜÄ=Ž™$ìš{u€OqÅ©[ ÷£l=ôruh·]ï.XœÃ¿”¸oÞ®>صl„OÐKí´dêÞŒ–æþ`‹Z‚ éz©Ë¡ ÞX3І·U#¦ CëGíÚÃü€’Äp 8w”!d¦ûDçÎ ?P@.’`ûow¢=µæ.\yuú“SÃö—\²ÄÏ‹¸p\ÎÏxž49Q ‰’9`—*>r·ô°š¡q#{„%¨Uwû~ÜLðƒ‹Æ&ÊU„P+E[©¦³™6ªO?òFVg1M/¸çÍ&ïy«¬Øw[!ë—¾ð H^±Ô«ÏÔ¥ù¿Qyû%ia2·‚ŠöÜOqñ'ˆð·!fÄè8[wM½ç$D ð"ä*†E¯G‚jß‹aÓkºZþQL©­•§>K£hf-¥Ë'…BãFW‰Så Îô5¿:Kæ',¸ö!íããN¨wzß_%â݆ß71§…ÕÍõË8ƒ¹‡©›º„“´‡;›¿:]±<ÆþÇIè«ÄuÓ áœà«>Ësô3Jó0pÍÒË¢sÄp;á‘> ºžF-=×2‡>I‘ªnuÚÑÌYu¬à\×Ò«ŸŠr:Öãòç´‡3Ü©h£Cî%ùŒŒ(LÎÈ@rj›æŒ 3`Ïk]O£Nd„ErFF˜‡Õ4gdØ9£Žœëút2àvæ•g) ›®¯X`i>gåÑ jX}MsÆ‚°µ‚®§Q'X±ÀT„´¨º9cÁÎYu¬à\×§³`n XˆBý_r„霃.4ç €V[Óœq`ì1­ ëiÔ‰ƒ€±9QQäÕ6O¸9«Žœëúd©X‚‚ºéø QžÇ3¢¼(æ$D´pêêæ‰;`Îé]O£:¢<-ÎHȓԡšæŒ;gÕ±‚s]ŸNBÛÄ`‰ì¹êöëÆ¼ØaHKóÜ©PŠÌH|äÛ]#^ѯçšFœn*¼ž¯ÏÓÂ)ÄG¨æ0æû>uÈEt"5¨®yCwbT©‰ªfOݼ4+Tª×ÖJ±5è›Þÿôáë?¯~úêí_dþÁäšóÑÐŒâ+8¾ž¶áxAJŽ2Ee ²Á稖:•r¸ÔQè–¶zåAáÞ òÑÕsØã ™\/Žyªv}§Ê5¼Üà†Ù´§¬e$vœöAñs·ì5IúòVg"h~ñÅñ_f)t} ß]”úìJCd-úï™yioaËgG::YŸªJÃæ¨Àk=ÃCú|¤s¸WôYEŸ ÿmŸ¸¥¢;1–;“&e2×µn*ýVv>W.M•ø4Å€u¡X7Wì?“+ýVÝ S Þ«Êw@’¡ëXÄ()U"Ñ¢&…Õ¶°”*`Š-Œ£Œ¨+g¾; È>ð¨Ä†TƒDÞ-UêÉ[åî.ÉÔ5‚…‘5µB±ÆûG•+!©\ ä0WJ¥3ÀCñÛ/{YU¸ Î7^g—Q¢HMl²„œ2ãí߯~/þ]£B¿*w+dù”*þS<³+wæË„má劲yΧ˱«¤-ðY†úÔ¢îxÏ·¤"ïáÖSI›f”k²‚–¹ÃM“)Î~çýÜq{ˆendstream endobj 780 0 obj 1751 endobj 786 0 obj <> stream xœ­XÛrä¶}çWtmb»F4Á;•TªÖÎÊQjc—wÇÉ3D‚3L8ä,ÁÑxò¶úòtãFPRÖ‘*{)¡t£û qÐÍO… "úk~Ö‡àÛqšÁNü€ÿwÁ§€©%`~Ôøn«–ÀlÛ@ë2(äU–°=_ýc/¸Œ'à“€¶:¹ œ§nî†Ì{ÝïÄF­‘ûñÔ7P󾇯·ÿ ÞmƒŸƒÎAçU˜Uh—p’"+Ã,Ñb||sh)¬”%ëáÍi¸éOrÿùæQy&`<ÍÊ·›ÛíGí yÓ Ë!ùug™²rÅ’0†m|õ—ñ,îÅ´AµNþÆQ )ùt®Õžî¤øtÃÜ_t˜¸û÷ý(î~îæ=mÜŒ .0¢Ü~ûy†cÚ[ïøý&ßÚ®!|ý{kÆš¤zšûÓaø(zQÏpRpbÇ^B­¦¥ROâ*…TEÀ >ÀﺡîO€?¶F%Üÿ WÇ,ÌÍ’nPöü>£ ¨°Q“²û7žn½ç|sì;9oÈ]¹Mžû£—ü ˜Õ/ÇE8Œ dl[)f¶A£¿i,öž±Ø7ÁX†_˜ýñ—÷ï~ ·ÓôÀÈE¦B“V_ŶHœü‚Ç =üFG.µ?Ÿvòá&­ìŠc“y[¼KÊ1›4YF—Œ.Ãã„x ÄõMUˆOWf9L˜öÝ èÚœ$Òf»IUº„&K¡Æð%{ﺮÖÌïzâ×Y ²'uEcaÆJïŠNü xG1>º5ÐŽ§‘n(ÝkØÒŵžàÕÏRÝYræ(ꮽÀ~<;oº}Q†ˆÙpÑ€Ið†¯®*5ád=N Èy:Õó upbôÛ†öü:27%‘Ö·>N½#i»IÎèÍît  1Ea˜h{>4䨔cÝñ™¹FSž:¦½ ‹`ø»zšÅ”Ž¿Ä.(2N‰KÚ4~Þy…ÆyßÕ{‡Ü¹CÞ3há~—cGLxÙ€µ8¶È†^O£ÍÊ_ïü­ù“=u Üä…ðüþK\ΤÛthdîî…¤´P»)()§?r¯R=uw‚#†×ˆ™w Z_ŸÈÍH;ÚGNŸÍ¼ŸÅýé„û-Ω÷‚Ã=Ÿ:•˽vx°VÌŠ0­ L²•%Ê9½ eÙa”Q–,¶¿(ðY]­¤¬Öã"DX4Yꬪ!Zu;ê9ãŽQô}­ƒö ¯þèõ¯Ô‹ˆ›ñá'Ú|LLqæÓµ:;Zg“Ü€ìŠãKE>n1ËV¸Å踉P=Üô/ 4FÑJʪÕ٠7VÄÖªz¸™9íŽUô}}9n,S…=0OpÃÒñ1n Ÿ9ÐâGàqÌ÷Ù±€œÇI_¨çI>S%õœ=]‰™šïâI¢ÈÍ­»‰w\võbG*ê¦Ýv²Is½œ+‹r+®°\¤ƒurÊè€X„ «PÎÄ™EidÇ5®é„–I¯T¨,Ój#ã{…X:å²*e=¦µf[;iœ²ª¾Ïu°QaÌXFvÕ ¿½†·¿¿½UE¯g1ɧÐeº‚¦¨ª4%zåPc;©cwªFT–h ¤š"Ëe=ö ±“Æ)«êûü*hŠÔô ß]à ùt7`Ö–Ww˜ÊªÔz‚On¸ÔÉš£¹"LEnØÔ…h'5NÕˆ†ùœ¬yqQV¤i,F]¶5“Æ)«êûü*|rK«·×`Ða¹‚‡*Ê'èd†1¬™Ï¹™)ZÔ1d†3]€vR‡ïThøÍÊ©f?§œ*jÔ–SÛn[;©rª¾Ï¯B'µäù‹—=>ŠääŒuGæ£"ïá)f v½>fI‘¬0KÐ]™{˜ÙI ŠS5¢²¼`–¤É 3z4e5ö0³“Æ)«êûü*ÌÕo fu•Äÿ=£b¶¦ê8YSuœ.T­Ç:vR‡ïTÈÖTGkªÆ×YÖc;iœŠVTm-¿¦Ùèï^>yèüOùkÊ5ƒc¼K\Ñ#·“§jÄbÍàQ¶fð(]\=Äì¤q*[1¸µü Ä¢Ä0ø»k UÛüi*±*YQ7«Òu³*sÔmÆ 0nRE¾¨1YQ7«ØŠºY¥‹åhMÝnÒ8Å|êv–_ óÓÔýçkÈÓ]`Å^m¥šÃË0ó_u£Nýcwèz|ÿÔ*S÷zh±Öèö槃#V¥•zª‹õûwÕxrjZ7«Î™Ã€­Ê„UÛ$ŽÜóþ„•$6ÄG,ÜD#Ôª*tÅʤqæ ‹nßÀAðA5XØÍaÓÕ#â"÷ã¤îŠþ:òæÝ²Ž¾`Ftê“‚Bcb®Cøqœ…6î•´Ú+ÕÅ«Oš®µe.mmؽ˜fý}Cõ—¦­n¼Ò–Ë¥Ö¥ïôEáîâú´$ÅÓ®b`Øaa‚¦IŒìRhñ…Bñ–ÊR¾|ÝÒY|Ï?ˆù3VϦÊÏ (Iõ*MÃ"©J¸ªèîSBä¹»> stream xœ­XmÛ6þî_AäËnqkUoÖËâP4 ´‡-Ú½ø€à  %ÊVkIŽ(­ã|Ëþò›R¹ÛíÞ&Hlšäð™yf†œùÈ|/`>þÕŸE³øößa¼b{¹ðÙ¿àß~ñqЦ?Š†Ý­iYÊ‚€­«…Ú°ÜÈi[׳s_øu8ˆoÖ¿-‚È ÙúçÅõ÷ë÷³X6\N‚}yóáÍ£ÇîÌaŒ›NðqæÉüA0ÎÚ±}]À)'ÁVxÏ‹AôìÔ‹B”ú4võáꛫIsß[ùyHê‡^ø9¨JUÕðØäÈÇ ìøq¨gÍxêÓQ°®b“,€sg›°ªXÝã-~Š}ö˜;{v—AHýØõ3 EÅd 8–\ yCÐq“õg:‘~0†ºCH_Þý#}ü6»Ak÷‚½ÃßpÙ×,ã188Œõao-q°‘,,¸¬AóRGŽ4Ö- %h ‡~,€‰êñ¾ç‚…Œá 8 ¬w¸¤UÝŠÒ¶|™¶|'Rx×=Ý·ÊØ¨û²œ€º7'€ÓÀ¢’U}ךª†ÎBvâJ©n°Àën€.åÇà{@“l8©ŸÅN¶"0°T©H@nI$(ðã¾>4¬‚U“_»”ó.&0ÃI´àcqéød®&Ÿ\Š’\¡€<¤¼R{Åsš×è˜5xQ]͈H"!ý NÁ75`4¸cš 5¦I¦ù#7´,DÒA°CÙ—S)dcB¦¨y»ÜqÔ]Ê3?À”ŠÝ®upäy8ÅGû áÐ;ø¯W”kÛÒ/Z…J«;t=ß“Æ@ÿ@̶OˆCÕ´&œÍvg–¢$šXŠ£ŒÐ]û z©³ßIôà ((ÑìÄûA>^rq dN3M¾ç±>q° À¹†lpÇkøïâk)CÅÍQðþ£û‡õâ×EÂÎþ“Ô[±U˜e^š²Æüù‘—¯@¡Õ ¬ ã ñBT0öÍ €Õ'²ÀšµíÝj¨¥ãzýCy«Œ™íaÌÒõWëÃÍ´;ív°‹Ãâý߸т÷®¼0NèR»¯æ´„ ’0$,JÀoìÀÕWæ!Þ©Gm­åõf¿s©Q6Eÿ/á.,p“fAž¡kR×b—*?̪ü8œ©UfZQavë¡’n¨Šó<·©Šó,5Ò§ÁLÕÔð_†/qà÷úåÞà'OÞOÝ€÷3+àõÀò3­Ø6»õ0yð~ì¼Y¯–7˜i-vÞH7øá뼺H¿âl€wõ ÜäŒÕ†ÞT{ƒ­ýتBM=º¢ûglEiæÆn”ùNìFY0Çî4˜Ùš§‰y·j醭(MØÒÕ»Ó`fkžÖ`S;vgéŸ-üj±Û±Û±Û ¥0•hYc[ ¨?¬üˆ’e²¥š.¡ÖÇ (›«Œb÷enüÃu¹XP™¡… _JÞ_0üÕ#œ2A žñ@ ®ñ%ÎáZ±êt9Õ³JLªlimcF@% µDÃåïø)†Â›öKÞvæÌ(ª;vzÈŸŽ|À“½­SkCË˲&·˜R óéTl ¦aú±ŸL ÓE‚<£q=jhû@è{AæzshóVâ 6h9¨M@ àK"¤É\†à÷q[¬Ö0ÏTïV#0(/àNŸ¨ž¬ðÔHòô/c½Õ"ˆ‡§—ä®,a›R¨Îæûí¦Ýþ…}·Ùl®î®¶§®ª¶ÛÍíf8‚»mnáƒÚÜîÀÇëÏ[øóôÔëõA»7Ô½s¯èÍ÷o&ÂO=ëªz£²Ê5#üZC[`ŽR.eÊL]ÊáUveå.¸]° Ô;mxcv=øSÏ©`%¯7 ¬W±{Õ²qU\îvnP0ˆÕ›Òý&%o°ÂX·ƒtÊ”œ´ ïÑzê¼tDZiÙ—RTB…ž­Íúç_îßÝÀ×_Þ~¸!½»÷þþ¿ öè Ò´)§óKrû^ RÝàÝp NÑõî‚˺Vbau=<Å»¤pék%fV0&kÊ¥uÑ g[ 2~Cá-µ•%‹à¬J~¥ «•¡þ -{Q͆ªB!S³OtwØ9#ûÝ(¥õ2Ó:ضêgÑw„unYÛɺÚÑvb_·-µS~Áz†3êÆ¥m$br2zæµÞ9§ýƒ"eäLZžëÿ°v³Ú²FpºGBIýÉɳh<‰¤S×4 —;ÕEÿTÄÀåâîF7á¬ìFxŠù—n„Û¶á9sT>•*“”e*·äž¿‚KgEoØå$Åd@σ_ÿ!¯9endstream endobj 794 0 obj 2122 endobj 798 0 obj <> stream xœYKoÜF¾Ï¯(èbÇÓdó­\l-¬¬ÃAì ö ‹²©aÂ!'lŽÆ“`Ò/ߪ~‘Ô+‘$Ã~TuõWÕ_U·þß À§Ío±]¼û¢®ä‡Ÿð¿«Å‹@MóSlál¥¦¥°ªZ6€<„$g^«íâuWo¡«*)jQÂÐÁ°PtÍ~ÛBÉÃq'–°ëE!J¡FÀ5oöõ°Wg¯– ¼+.Ï’o°¼•À!y»>ŠV¿YK|/ʲL™Ã¼8KRX}"+HÝzqÅû²Râ šáÁ {/w(ñ j BîDQó¦9Â^Šjß@Ý¢PûÛ¾-†ºkµq¤i×Õí zxÿë9,¡Ç”JSUœä– ë¶P€Ê»ƒT:”¢[Ño‡èÈ¡ë;×F#h>‰¢>é{~ôà¼ëqù×â;ßîÄ”ÃlUûb\ÂÉû‹KöíÄŽ ½ü°©ûnjOxhßÀû¡n¯ ê»-ø·Î.»6­8îÕ÷Ò¡„)QTBa´|‘>°‰’ßµ!)AŸV¡˜ ŸåKÕìrmÍÅeþä–þFÍšùÊš‹Ë3æ“¢GÕ¬UC¼ýñND3f"úßÄ~-Üa) ÐW‹_ 0P“Ô‹!Š#äç¶cGœy~ˆ§8޽ Çvê{a„íÈwg³ÈË‚É0‘ìDÚ4µvšo:Xê%1ŒâA<Ñ®4Û.n‡mVzf{±Ø,¾>#+Éú¨)R‰‰Õ§0:s\‘“¥`®RŒ‡ML‰ À2¯„ò¡óT‡ê]šã;4Æsšã MÛÆHÓã°¢áQÚ4ïÐtÏi:Œ'4m#MÃÆ¶MÚŸOÓa<¡iªi{}Ü5—ù:5vmÿ¶oƒ·š”ËÅë âtÔràG,ÿŵèyã. ¦‡õ¤,\’>R?žªsèúyÕ¸û“½A'fS´‘$Á}ÑzŸÏ&l½çØci–›ñSºÅê`QÆbÌzy˜O,ÞõÝUÏ·[Ñ¿’˜‹äŽ®b뺩‡#] E+÷ê$#.óû*Á‚WFY5ÖºúªXu=ÐýÊï”ëÔr–·v”)P²*AɺT×kÏ¥®,Rîö™9þ¶ªó›…+Y†íHï d¿‹EæS 1דæl"k[ÌNÛöÕÙµ²,ÏC«Ù~£f³®5VÙ™ÍOûäþ» Ë3wê{ÁËw‡¾Æ0Üv¥¸ëâ4õX.>éOÌ£‹rÓäí¤&—òR¿`ôÕíËŒªn(ÒлXWôèV^zpT‘‡¸í, ¼XñDšû^»žæYg¶†Äh^”W|݈/Ýá'1Üܪ;ØãÖƒhõƒ tûÁÚïÁIu¤Æk–ŸE›ä[ŒÞz+îK‚h\, ýip±$b.Ì÷\¶G‡•µ­ š‹ó|\q–:Íæ{\vT[eeg6??¸°È²Õ&¶»1Å(†™ ©ÉCŸ j«`ѯq®a5×ioy°:îš™¦oyÑwš!µî‘s&7n¬~[t=5ôqK^Wå..RŠªnÅ=c¸­™õ{ò“瘳Œ^ã? âWL¼¿ÚëâCÝÍ×B´3&ƨj‘«ézïæÂv\ÅËR›#ë+š2Fè<ÒÔË1cSËA…›6Ç>Hu»jÑ·\ñ¥Áôš÷¸˜t±ÉÌš)ƒ r}ú|/Ê]ÏóNêÃt@úBÏàì­êz> stream xœÍVÝsÚF×_±ÃCœØBFB¨›N¾ ãŒk76™ö­sH'¸ŽÐÉw”fòywï$ ŽíŒûÔ1†ÓÝ~Ýo»«[èx>tè¯þÎéuö`¦|Äÿ™sëøFêŸxï&F¬¾“Ô±º>ô}ˆ†7€ÉÂyù^æZ$\A9çÊ,“+‘Ï€ÿÍEÆ‚W“¿ÐH7èÃl>é]8/ÊuÁž‚.U—À—vñõÕF²“y‰2¬¬ô™­4“¬„B¸PÌ™ Çø}w˜Èjšqà9W³u½û ŽGKFËkÓ†ÕÆUþ^fÕ"¿áËMZå.hñ—éÆÈo]¸ürqáÞ«eƒj¹¸üDß´§ÌbüåòÏ«ñøf4Ù[+¸u›[…¨å¡5:м§Xˆ}¥9kdŸVš³C-m¥[o†Vï1­½éÂ[j?ÿAèæö#Ï¡  ”\Р8K(SÒð`´¬³êšÇ)ˆ Ð$Ë|ÉUÉ@–›$'¬d†°Q|ÆT’q­ õníW¦ J½''rK;‘ñ-ZIЫT;¬œ>öØnè÷aáø½~ßë÷ícæÜ<¯wæßoc[“s–iI9([kØq)m­•%¡ß¥&"!U,gÔ=)« Æç“x'r¦ÖÔËwÅhrçÂJ”s¤-åŠç1·½Fsnׯ=#ßë¡àÞ›+YÜó¶ë>A® ¿©ñ&^dÒ¸Óï‘7ˆ ë÷ºfÐí÷<ä¯y|˜hÉ‹Œ¥È D~þV X®•¶(z¦ÍÙúÒß͹ö'Ì 7„¶-£äɉG¸>gäý/FÝê?º58ëÖ:væ‡Æí#ŠVôG/¨ÉþÚÔ Í„Ç8<,°¼ Ú2§i‚W(®«rgm˜^³ÙŒ-äДé¾'Xtvz¦J.ö§–8`¥éýZV*æÑ~7„ϱº“D”Bbwõ„!€ï÷|ªß¼NhŸYè(4–"røh‡y¨¹ØZ¨±9ô=zê˜:˜â‰о׆ÃZßPÛÌ\þ®YypNMh2Ô¢ÈëDh[ìÐBÌtÝfŒ©ÖAò˜Ö2{ê^öõƒš½G¸vTY]“×'•Z"é`/lLyp•¢n¥(–ÆF™.x,Raß#‘ÇïìRgÆ ð‹®E‘­-O£> z]ßëôhcòm¯‰†˜¡Ägç_X«kBendstream endobj 809 0 obj 1248 endobj 816 0 obj <> stream xœX[ÛÆ~ׯ8ÐK@Kó.ÒE¶énšÂp{óTEW¬)ŽBR’Õ"«_žs™áEÞM»†a-/s.óï\†¿€ëxàÒ?ó7ß-^¿÷ú… ßâÿ‡Å/ —€ù“ïà¯÷¼l ž÷åBd=X{§¾“Àýnñ*k´*+ lõªfè!k xÜ뮫6õvº¨ÊJPd}Ǭ>¨Pì§¶ê{Õ@¯¡ß*Ї¥¸Çë¯îÿ½¸½_ü¸ˆá´Ã4q¼­zkØ-¢ Žœ4’Ûzñᮣ&'aMÖÿ»C󮻿ƒªUÞ?^ÈòM°NxÝ8>Ü‹WyV×PõªK¨:Øe…‚Íöî²y`ÿeó¨°×ºî`‹0ÔjÅhT= áÚÃè·Y?Ù1”U­py¥²/Vß.^é½jPà`l 1"ºQ!¹_ýA°òƒÀw—8 ¦ÀKB·Ï·/ƒ 9>)ŠÐ¢$›jU©ZÕ䓉0®×N|‰YÔ䄬ÉÚ•}:lìø5^˜ |£›®*TË`–º®õ‰€RŸ²Ý¾VoXìõûÀ_CJv|‚ްôç½*T ]ßòÔQ.þ‹Pzî° î×dý¡û#¾âGe­1|ûjûm¶‚¯ñw|YèÃQkÎæé¯ðõíq·Ç÷*§GèFl \³¯<4+èªÿ(]>òúË ÞýôöíêÚ¯¥8µ\áå?è—žµ|q÷Ó»}w÷áöþ‘ÌÊÂËÊz¸ÜWf=,oÉ]]Iî«©Ô6³‹ÿ‡Ô6›‹u²|ùçTŸ›:)òöþfÍžÚž,% ­ ¡<%˜ï›|ú %³eIEki©ÙF1WU–o¡¯vø VŸ(k¹º!¤HÝ gV¢ÆÄr#®§HÙôÍusTmO)¯I#±‰« Ñ[õµÈï®]r&/›T.\Bº^·ª°ÏŬTSÆg„€¸æÀ‡jWÕY[ŸWoV`BH—¤‡#’N·Tê›±/˜ä)¢\ç2oF%dN‹^´U†´ç²…ÊÑ´¨YR‰§WKº;)´AO R~Ê žÑv§áTáÛzº+5ÂÂwºÇ@mõI!´«±–‘°ÞPìf¾ VA7„ !±åZ†å™­7ºGÈÖÄ ŒÛ¤N;pW5ˆÕÙÄßuŒÿsû›;•5T¢&ÉÜfÚDÇ^"¿k¤ôçY‡;GÉ]Ú¨y;±0bÃÊu֜ٷú¡Ívb¯ÄHã2òÅì.«5Þœª~+¸ãOkÚµC-Fª.²šýQ’°âÜ!¿ºo%Šº½Ê¥óÏ‘°»ÒÜl C×wÖDnJ­Þ<êa|ûÒVï:>)òm»'óïõ釶yGú|œÒ¢±ÍÿÝò aÖ%1çMá&é³>À)ÃLFnìsIC‡hÙo²ü#¡>€)á4¯W³æ¨0ŠpBÐóòQ{& M¶3‰¦>íë*¯z„Ƀ‰ÌÊ>6úÔ Ou˼¡xc tÛ“ÓB"ÒjjdlpKbD"@èÞןþI•ègi¢#Àqà¸klð²>ªóI·á„;b; WWµÏlz¸‡N“n§½©/NiQä}¹3=VšnÅf‘²Az"×$`³PjÈnßIý$0ÅN«ßñh×èvGU„ Šb#õÞŽÃÓIbg;[Œ'.…uõF¾û±Kã¯Å8@xrû²œX“”7N¾ÏÎtbÃL&Qè$É—˜DMŽÇš¬]3»–º½ž¯KÝØÇasð<ëX­CÇ¿Ä1ÔäÞ ¶D|«°D;Rת„i³“ ×eÉ‘ >œ$1»ì(II ̰ÜJ7XŽ{ñ£Q}‹xpQ_,·/œ×£Ô YSB£ååŽ6ÐŒ‚GÓ²Fê<o0Mæ„ Â€ ·vé¼Å·/'\‡ˆ¾—•ÉÇëlßÙj‡0àœ¼ÅXN9Cåmžc¾óéˆÇ…Yi¦£«Rà1#Imy¡ºr]V|—H›Ú²BŸ.º7#B G׋BÉÞž¦à®=ʃš@â»ö2_$.†Ï1æÁ:õ'‚ö޵æ {ër´’^š$F«¹D­Æ¢}gÜ1‚S_óEù;!Œ¯B˜¤’xØã|úVxæ ÒÐbõ²¢€FfeT†-‘‡Võ ûO Ö»Ç]†ó1þŸŸ§‡‘ør ½—`òÐãæÓ)ô^êzH|9BoºVÐÞ±V =–¾t}ÆV«\N 7ïŒ;FpêëË¡OSZµ¯³üsô±z®ÿ o0´ã9ƒÞ<iÖ–¡§*¥ôkcéëë]Õ¼ÆßìÓäÛO0ãügæñ€ô‹c+,‹½TÌ륺­hÎ6+gi-S«ÙŽÔæ+¡gœâÞüŒ/ÎeAMÄÂ8™²+ÄHLÙ¦‘å\NØ% Œ ½c­»Â(˜±‹¦V«•/'ì2ïŒ;FpêëËÙ2¦ôoIñ¹’0¸Å¾%ØÀ­Bs´—& KšC—’êË9£˜B8Îg>âÌÎãC»œ¹(Äáe6|º0Åk'M\[æ©ù}F³é„jˆôÙA 7¬ ùå&N”ÌØ¯ŸÎPëúðl>Œ 6úì#š&RNÞnOÙúX9ÊY=ÝÚºA^˜œ‡T…xž)å¨}¢óEŽ35ÔÍyz0¼È§×±6à„ 3^CÂm{”‹ªd]̬ݡ(ÿ¸ø ERM;endstream endobj 817 0 obj 2107 endobj 828 0 obj <> stream xœW]oÛ6}÷¯¸ó˲Áf­O[-únI×!kÑÄÅ6 Ã@K´ÍMU‘²ã {H~ùî%)×vÒ&YšÀ²tu?Ï9—ý#ÀˆþùÏ|Õ{vÆ ,to¯ñoÑûØ ¬ ø|¯¦Öl AÓyϽÀ8€4 Ù¦«ÞI¿–ýôë%Ç^öR÷a#ËfÌR€æ+\ƒ¬ìWÕÈ…¬x sY oæðÍôO)õ‘ÂI‚4ÆhÓ¢w²ÍB¼lD]ò\t¦]RiÆÆYœySt-r9—¢ÀL™¥ YpÃéÍa”Ä,K2 í+f[ ›øš—-&7§4%Þ)×­\•íªÒ»¢ò%¯¢£vÞáȯµÕ¢¡À.ÜEïD›¦ÍMÛøÂ¿>¨“ Ó0;¨›×µ¨Šã²Ç#Gáäþ²+UÝ)丄¶Æ¬É˜RVU¹%kÛ¢ ŒYš¥{-ê‹ SÙö½“^¢`ðVŠÂ ÍñQεÐ m¸i÷°°i¤1¢‚y£V¶;®»Ô>JÚPø“ÝCj4"W f©e•£½ ß+•@Õ^ ©FÝÄÜ]Ÿ¯ Æ4©ëRæÜHÕUŸSŽh{6í½ï¥°é…£qÄ&¤öwÕ ³8`iê¾–½«'P=±ÈzJþj~cߺÀÛ|ù Ñû~ú×(aþòûçÁñÆJ‘óoÿxw~~u6½¡Œ®o]Ö÷zÚ>ÚÓöOö|í.Ü9½×S-reérµäø¢!9ýàûÎÙ½¾ÈòËÎh@·/¼vpÆõäOríL‹-R§ÜœÖZæ ÷púS"ä¥Ú¼„k»u;É®àxC €NÆÄKëf§ÕÈp:ŽFº+Ëàö³›yƒ;Þöi!žötÝ ôÀ¾âþXÝ£`ÂFÙä)ú{— *éäÊÇÐß~:ýåòÝÏ¿ßaj÷‹¹cã˜ûɱò9?4ú£gÈèSBÅéÿãôiGê¾o^ÿÌ~$¯O$ö#i}ú‰×8×t  è(`£$„!ýgÃŽmÐt¬ü¿ïý’yendstream endobj 829 0 obj 1572 endobj 836 0 obj <> stream xœ­VmoÛ6þ®_q0º­uE/~M–!Ùšt²$M\lÀ0 ŒDY$Q);Z1 ö/ß‘”7±[‹/:>¼»‡÷ÐÀuL2ë%lüë¬c7ÝŸÚd<¢6œ¿¿üãêüüöl²8=›ÙP°¥ýjò'îîŒ`r±2! Òó AÌo¶BI–QÑñ^·X›¡”é.¬Ë÷Ë#|¯ò9ÏS™ò}• å’K 2!xžÖj³HÆs\¿IšÀr=,R&$Y²|êbû½ï*†W¥@GY.$%ð*†h˜!î€`ñi¤,I-l¨y…³‚ãF9ˆ‚†,®!ªs’1µõú’‚³\ÒR‚ŽiE¾ï­Ø9讬TfåGÈÓ*Ë,*H †P…R½2FKè ìÓ².hDãÖ² 3ÓûØf\$¼”Ð-éóuÔÎF¼ºK)tïmèÖ«Yô ºÃ9<Ol“ÍäßнVäâㆆjÃ4.M¹„c8¯òt8·4¥¡\ÄUnƒ`Q/̲¥ ^NÃ<6!vìÏÜxþ^˜pðäuNÞn?ËÚGcºó8߯ :'¯=ÿqf3ÜýN¤ú êHkp²£\¯W °ê¡ðŸ‡ú÷•²£ô¯ÿ{éÿHKÄTåLBY‘8/É”bý‘ªj§ ß–kµwWk{¬žxÙqƒ³‰õÎÀÜ †#Þ!ôÜq™ÕôÇí™ajÝnÕðÿZG$§¯ð¬ö´’?>ñK-KK çýÀjû}£E‘õòm®\WÅ­ƒ¼ã3%d‚ µ Ùƒ°e$¢J+JŠ¢FѰäs´£ÎÔ9Ôø›•ஊ±3Î"è.ÑÅ Áb¾áó7´©IÅ‚ ?ŸþzsõK;úkx3|Ž.”ÆM–GlÆ"EPD$Œ=£¹¨Xй ¥e(Ù1ò™Ë´và¹QKQ·H•J´Ö¸:Zp D hö3ÊðxCLf$äeôh;-è;8æå‚»GÀ¾ÅH±ÙÛ[~|¬;t¦2w6[b÷ØJã¯/„Da”¨@_9~üI6Ϩù:½xõTÇŸòΓR ³ýïPUS›F‰¯nb:Qó>j tMµ*¼ •`òäò€M³«›È†9…„àÑBÌ*~c*“’WÓæ eeÒ¼ÎÐ'íFòHÒg¹ &ϧ&ÑGŸ³°¨ÿ› ¢©øýn›nýÐ-ØZ?!z°qy´¶>ZP”áèYÖn«¢Pw5Æü”»æ—M«e¾ïŽñ<ÜG ÜþÈ †føe:†HÎX!®ºÁ޵"q]µ2¦D(ANSõ«(')ŸòJ¨b6âã†0R°#ÏqûƒöQgZ憾2Ñ^¿³þÚendstream endobj 837 0 obj 1102 endobj 843 0 obj <> stream xœX[oÛF~ׯ(Ün-†^fXì.ÐÖm7@ ´=Äò@S#‹‰TIÊŽí_¾ß™ 9´”&Š ×3äœïœó͹1±0ˆXHÿÙ¿ånöê¿Ò}{ˆ˜ –k rrŒ½¨êr{€ãÿ\[‘`óoœæ¦Ü5ÕŠi{Ä™KVnŠ–ý£s‹ý¶êú'­pô™'×pKÊ’ çOä¬ISbe¹:áÖã“#` 0Œ‘WÒ °¶9ôU­ØJõªÝaÕ±ûMUnœïì±S=;ìÙ̓H9"áš ™ã™d°PïÎŒ£\’€dxú"ŸØaÛW;x²} õ‹˜gZbÅD \¸¯¶[v£˜Nj$Ù+ ¶ê{UìÇx¶.rÉ œs^õ›¢gE«X§©Â…¢Ös¡°4K…ö0C– ³=×Å<à”ÙL9VØa}“tttÍE$âxéÈ(†9YÊÒ”Sñ8æT+õöÌRgA¨‘âç¹4†Ð$eQÓ”Y¬oXhk¤÷ú~]öT =bÝ^•Õº*á&Y m‰d Ò+Òëªíè6n;U÷”»Ô(E6¸OT°¢ëš²""Ø}Õoðg(.¡iP@H*”Yª ņQdP·/JµX©mµ«ŽÒÍC!¯†2€8Z©…Ûì'{fߪR­ Œ”˜7×a4ÜE Rô›òÄá‚Í渇‹»} ö¬dq]쬣 ]k€%¼d•ñh¤¬Ujï Ôõ-¢¸có—­ºÅUÌu×¹xY_hµîâ sQŘà¯/ªšr¡×W³E]`ÝÛƒVH¨-Šº~p‰×LdéåéÛÂé€ýGl_€3äµÅ÷µÞ7¬¬Úò°-Zã©îÈqTD2ˆ-Z}s6TLÁœÒü]­–T]"¬(ÕV“lDÌòK\Ç^Õ+h'…ðÓT@ë´.äì=´Vµ ´Œ4dÏ_>ÌO“M––‡¶E`’ž›ªÖ{|è4-ú ½«·õêÚT+Ÿgß³iŸBr}ê]·a/ßSÃYUÝmº ÖUß½„»=^½½¼º~zÿ¼ïp›50¨~桦´Uk\U‚ ølÖ$—Tnñ ˜¦ òí:G=ŒtÏàq„aKïÎ,¨< r ª`ÙjÃÓDŸ«ÍkX¶ZUT¥¦½Âe.ÓE F—zûà—†/Ñ)ÂT­\yÔœx©=©íC™t;êøä9Ï}>yeª^Ž|ºwÖ+èÛz6Ÿ<íÈ5_€Òqº8IªÀ}‰x$•"ô;-kŸaT†ÜgTâãÊgTòÜùn–£æ%Í ºFø(õ"q¨fé1jßsœ oëùŒ‚¨lˆQ"ôˆÊ$ RŽï€i€â´\P­è"hÎi0”ëšÔ鿆ý©Yú¤f"šÁ+ë¾Yz¤š–7+èvu 5ƒÑ>©YÌT½ôHµï¬9Vзõ|R3úÐФ~÷)VÓ(¹”#«*&ÍÅMs"ÓHú¬¥q¾ŒLhòÉDxLÈäÙÐ|ÌÒ#Ó<°|YA·‹'͇GÓæÃáù˜¥G¦}g͉üæãPÏ%Óü3‘×ÎÙâáT?ÏòH~«zÄEÓâãˆ{Ýôwú¡Sþˆåkú›ÃX«šv5„—˜óêrlw¤ÓÛ}°2Ã¥9>|ƒ“ùöùðvúKä…ûç­1q< ‡3î3¥«Û@Ý]¼Ã× KqƒôDï/ÇìÏ[·¸6þøÏöÁ¯ÙÑÏòõï?Ûå•“¼º6€ ûó%‹ÉÏñkÏB²zº`,s aþŸ'yœçhû©L“D¤V@H·H>(Ý"“-/•yG#`îñgÓ©©Ú _laŒ°0ýRÀtÔZ–òHðÓ€H”LÀ9Š!Ržr¶HL¦ÀWTþœýùà?zendstream endobj 844 0 obj 2088 endobj 853 0 obj <> stream xœí—KÓ0Çïù£pX­iÞ 7O  H°B²‰Ó%vH\Úá“3N⬷û¤EœÈsÚØã±ýÿeœï° ,Ô>ÞóÚzôÑõXvÖ^â¹´¾[N_Æ[^ÃÓ‹yn ¤¥5Tu r LâBZ[÷aØÇÝ3bm$ý5JüÄó=—,I²ˆ£`¬%Úð¤ß,×!!¤o”ç{ÐÒ¹h Ú‚\QkÙ¬%œí khÎÊãK Û¦b9“З{p‚ ñX¿\ó‚u t¼%ôÇÉ—œµ}|ê$Î×°%«)la[h4«ÌF/º_æ–¾~û\ÛŸµq:ÞŸM†~ôþõxõdp8¿jƒƒŒóûQM’ˆøAøþ4ª—æ#ˆ|mLi#¼èТ€qâ{ÎM½½Ô3[¼aè9dáÅax£ÃIS„¡6‚=‡n‚ó®¹ä0¸ÎáÊüó.+¨"p…‹ë+DPˆOÀ~hCÇ–\i—ÉŽV%Ô4ãHY.ÙLRȪ rQ­kÞÍ (ùLÂN¬!Ï8‚0pðmÝIÈ ¤]6L® %}olÑàCy¥â§~ }„ÏHZl64àM~3^¨j\s§li'bl Þ-ƒýT³5a7Aöìôß³ers½Rbmø·²eŠèz‡Ækò6¶Lnîáíl™Üàð2[tù[î¨ôE9VƒÄTÐóÀ:hh[ж¦0>¤’^ëc6aøT{j—ëšrÙHW¬3ɰÕTÖl«Øž=·áçfÅòt®‘îL¦õ@måº)žÕ´ hþ°<|GÐ\N,bØ‚«žÖ5 ðB´˜ù²º©è ÿåÓI²U%6HþhW!…6Ì·0ßøßÃùxDõH0ÄðHèî€Ø'kUÚÑ™ªŸw¥ú†áUiÈV˦)i¡wÑ´bë«@G}>¹ñF^Z´)NiÈÐ)Ø[{hwgx'$Õ #ìx¬,i‹CÙŠ›ó^ÓŠ³ì¬Ú6:ån2¬K9ˆ‡ÿïÆ;¸ËWâø …=3èI3à(fp6,׸™0‡äÕºPkÂýÊÙ2cj‰yî‚ È¸a„ÁªÖÕ€.Ìñ#"-¬û8Åø©ö<µ>àþ:€àendstream endobj 854 0 obj 879 endobj 858 0 obj <> stream xœ­WmoÛ6þ®_qË0¬ EÔ‹-¹k®X†Y‹6î§¡d‰²¹É¢+Jv²aÀì_¾;’’l§-–b) ‰â½ßs/þžËÀ£ö™­œËw~ÁB9üŒÿÎG‡i°l?Î4ÙƒYá^ãÄwc˜­œ'³ûµÈÒ²¼ÁÓÙïÎO3ç­3†­ÃX<3¶>L:::Ò´Ö-"<ïSQà c‡w›‰»QÄ c†¸dAÂ\ß7ÇÇá2AŒ¤„ô\꘣X ƒœi[6(%Ì9I÷E&˜bí‚6º«¨0ô —5: &‘²¯1¹A|lói-éRÆ TÙ‹FVd¸Üϰêjr‡P_˶K‘-{¯Ðg±B‘å=lr“ÓVK;árwd< #¦°¦¶µhB»$#ŒnL ©ªøVGfT†SÐIÿT]õ%ÙpÕ¸|ƒ`”ô8[ X/S@ÛøÙç £íÅ‘q¥@VèÙÐ,kÎ{÷V¼j„¬x>"¿¿Î–‹ÿnÅ!^ø]Æ× œin—ôú¡å¹.z¬ÇXc¡—DõIÌÜ$0ÇÇ¡=„òÆŸíÀ:‰e‰©ÝŠf‰½¸j©šûßÈ ‡bÈ«¨eEÁƒMZ ÓýplQè²ñ•ô®Þ¿þíÕ››÷¿¼¾í; ct;ö-F™iäaìRq ðk°æV èF`ßNaQÊyZ¢e‹à^q…†Qõ¡;€¼æ©’æaÌ¡«¨eÛàT¾¡.Y`ÓìÒs„]>C ”•ÃXBPYó"tŸ Gg¼ÐëÞ3¤õÉÿá’ùG¬ö¨%µ=# AÏìE~/Ù¼­UÛ]Z£:ÖC›3gùÈßpĺ¡ŽàË)¼¼}u}­ÑŽƒŠ×êAp’ v ÑI¢GzÜG'A»b'ºÃŸáZG`à6G+½PâèeÐG(¡ÉÐK·‡!Fõ±­ç>²ýk¢„¿*ÌbþãÚJ‰ÖÄsþº7XäánkÖxâb¾à"Œl?žD}(ß:ÿ\nbˆendstream endobj 859 0 obj 1641 endobj 867 0 obj <> stream xœ˜os㶇ßëS ÎLϹÊ, évÚ^.¾Œ;nšøtéËMA‰TøÇ:çU¥OÞ°ÙIcßÍX€€].,~Xê'G”Äê?~VÛÙoYÊÉ}?d?‹É73‹,âD"²úY¥¡1ç- _Ð(‡nÛvsYåt¤,0Å®ö¬fc?-"JÉdœˆÉ³n«¹ö±8ˆAYS?æj¶ž}„µÜÏ~;½Pü¨¶ä«…^rFÀl±šà*s®ÛÙùõ%éëûF. wõ@êf _.þ3»Z̾wDrÆBy’„rήô=BvÐ p¦ØÕž'Byœ„²"užMÛ#d1(kêÇl½N–GBÓùtIÆæ)ŸCÓ¤ÊfYvKòázññø”Ä0˜e®[™n{Ìì âL±«=OÌ„à3Á™ólÚ3;ˆAYS?æW1ƒ|L5³¿»ŒJØ/gOò€çI@‡C`v ¦íѱƒfùλÚóD‡³$ ÃiÇL8Öеš­~†8Q$à%C¡Þ¶K©øÔ„`L^,gç—Ä*ïÕ9Æž´+Rµ›qÛÌáV›qY7÷—OÒ‹Y ã¼ÈçEátÛSz¹A?“)v³@ÇyÁçEÊ&Ïi¨ãnƒâ¾Ž;Ï/O/^$¨ãïÿyóïwï×?\ÁPÝ#+RVCýPrù×§¨rˆ:ÏÓ@ÔyΨcÛCe gŠ]ˆ:Ïi ê<ãÉsŠºÄ ¨/êÎó+PA­Çªë¯>} ÌU7dXKÒ•{hîÆ,Ë¡|šÈUçY¨:ϨSul{Ðì ¡âLM×xž ‰,Pu¸EªcÛƒf1ÈÌWuçùÐwȾ[Ü’ÔO-²ká2”ZRB¿ëÊÇgˆñ4|Îy ø¨¸u™¶GÌ$λi øœ³@ð9§bòLCÁwƒóßy~1£à+f·Wï¾&1¶N–K¢”ôr#«çÏd¥;OiPºó”¹ÒÛ,;hh8SìÆAéÕQPºó$s¥;¶=XvÐåLý˜_ Þ™„ƒõ¯Ûëʼn™¦µïêAþ_\L„jϲPíY>©½i{¸ì ááL±+Bµ‡—ÑK&µ7m—Ä Ò@í­çWà‚w¤ÔË­ïnÞ½¿ú K5²a=Î; ×#¤ÜnSVP»Þ=’±‡“ªEí¤ôà”æ^éÁi’ø¥§)Ç"›Sé_˜êÂÚͽÒ*õÄ/=x\ÄÖ«iN¥‡ÃpÐÐõÅ¥sÿvµêåð\ñÁÙT{óO™¾mÀòxŠ-El*³§åS»¨ñ@žDx<=¾ åœ'v¶ÔºZ>HЬºv ÇÎÑ»«›²{$ƒòL ùÔkÌnÔ¦oäÊkØyu•÷úÈSõ{Pœ“ sðàAjMªO/ʽ«œÔýï”–1ªÞ„‡ÝÝÎ’^ŠÌt7/*IÀQT(Gö×iw>êçŽæàÛw™®BÌ}ÚGä£Ï¿YY"ÔÑà|Za ZQŽC«Ò¸*7ÝUÛ<ÈN™£ºô;YÕ«¾pÅw  ŠLjJ-rzÀœˆ£Ò”FØ6 Ò”‚dXÕ]?@ü÷£ºÕ¬°©Ä\ƒSØ-“¶ª•d‘}=¬žÁ&ë§DDùè%„º<Í«„»à fŠ>?§W‹Dì2ïIª†•d*ëü|8Am6b¿®«µ!‚‡r»Þl h„ù Ÿ ñO´7¼9Ôô@øÃ?ZÅaG gQdÁ•ŽXßu¿â@Âîºv¡¢‘Ò(ˆß-{ ®?YBèf5ꤟ×F·Îþv6½†ª­Ç£Rw|Ÿ7 EŸ¸Øˆ|ÛeEÛQ¯líÔ–©Yês=±_·ãf çWâÍeV8öªÜÖ†öWa5N@ÿØrKuá5Ú‹ÊePóº_OY#ÍÃðœ¨t€+Pe<¦{’ÛÆÕWFãâ·'·ÊÌ-W*4•Á ÷ƒ¥Á–md 'âÔ÷—Yú[ÕnWù`RäÙˆDFr£âpÚ2A.@ MÔ™p’øý좳ðendstream endobj 868 0 obj 2419 endobj 873 0 obj <> stream xœXk¯ÚHýί(E«M&_¿À lVšeF‘²óHÍ~mLžkܤ݆‹Vó~ùžª¶Á—›HÉ*‰À¸ëuêÔ£ó‰Â ¢ÿ´Ÿùvp÷!NÇ´®!ý„ëÁ§A$G¨ýÈ·ô¯¹Ë(Šh¾xÙˆ²ˆ&³8˜Ò|;x1ßhZ™Æº }7ÿSÎOÚóé,˜Da ™ùrðbWµëŽt*cx”%Óö)»n¶ºrTÔ¤h§¬Ú‹QílQ­ú¡±ïËã ßëãÁØåÝ^•ÆùÂÒ³­ªïß8«ªò8û ÊØìh2 ²iJ£( b1W7»±N/©¨D¸xq" w+ü W¼uvj§êúz>Weù¼¾Ï*Â+²æ€8¬nÅØ oüýàÅBå÷äŒèijméTTµÓjIfE6P(Ò,ɶùت(¶ç€æìþšª<²ðª)éÀF¿{>x;ü6˜ÐaƳ(ˆ3šLÆ mãh< ÂÔ?–ƒßoh "Ñ4 RIúMõƒ)›mõQ—:w§3­ œŒ§rø 3m4[ït^¬ŽôìoV¯ S=#ʼnÎE°Ú5¶¡,i•o¤¡¢ºÁªZ=0à\µ¤Clòú!¼Q{-oX%ìû#ä¹²¶ZLàª*yÊ ˆUïLµ´}^Z‰BrÒÿ¡Ü<ÂoGN0pQš—çá—G‹ÆQeõ&qò‘g05І¤(b‰N™ªŽ­2¶øYÙéÑÔC`Ο)Öìƒù 0C®;kÖ\y¹ªØ s]×=FCÁ‰\ BÁßܱ‚…â4GÀ…ªu±-!ÕUNä±LÚ8ms&ݤ¨TyÛ LQIº ÛÃwxk µ(5gÐìœ'›€G ”TÍvÁ–VÞñ.b†ˆsv¡Š5+ª’ƒ¢ÏZud=µ3VûÌ 9‚Ÿÿž aêüÀt®H[kl@'©ÓN“¸¸ª°ÆZm5³_¾ëÄëu¯JåX²`T#6u¸î>$¨°™4Јû0B º{IkݶшJùîãBê„>ïȆçåƒ^4€Ô¥>ÑiѬè ÞîÏ(ô9£üÁ~Òî´jª¡„<¤ÿŸ¿üÑ=ý}mÜùLçÿrxDâÌÞˆ9y‹ú>oÂ×Tü‚øxõê*ê…µý⹓VÐÓ@¤÷ðž¾*^?’Da#¸j X V×i—7ò£êJÛõ‘cå§]ñJ>6ê|áëÇgñ3ŽÚ¯·/‹Ë»«;õÀ8Øð#~¢,”Cûèxyu«‡÷¯à9È!§!…ïóëžæ•Õ>§KåTOU±:±$åç´ûK(ÔÂq[ßcÔm̽0{´t]Î jXF]ÍùèFLœÄ4zJRPq;H¢i„™ü¶ñMØXSÒî7¬;?)ïJ?`'Á;WÖl=Uª0F‡Ñ2¢I$º¯Ó¨©\Q^9)=t¡¹Iaö¢ò Û2ñµ³Ð|¦ÆrÏ•ú©A…è-¿WŽ»û¥…ÆO(özN¨ÓH û he@!‰&<ˆ£q”Á'ÿømHe,•µ3Xï· ¯&ý ¶»²gˈ/ö²x$ÿ9( 2QÔÙÌÍRËpV´EÄàfÓîâD ^Œ¦!ËE4ò}¨ÿl\Û©Ÿä–75Z DwŒ8ö£ÃÕrh(Fye:(»³Ê‹¢,Ü1èïûŸ¤ÂæÇµD#bfàGg òÅÙ—:˜fm+fm#äÎsSˆx$i~{ƒmà¥oÿ|®Ò{ÿ¥X> )ß(K/e<©ÈxĵïºE™-ÇQ»ߘ>ßî̳0˜¥—•¹£©4–LIúñÝü#-0Kí‘ë­Õ½ì±®îꄈx7Þxõ…Ãc!LúÛ²³MîjŸEÌ+§°Ç´››o²¨Þ‘ÀÅQÖ½/LSKV¥ut MÆÉ4HŠÃx†¦i8yú6†BQ0E_ØK¹ [Ÿ¼«\> stream xœíV[oãD~ϯ8í¶ŽëKâÄt ¤²B*ìRŒàubã{&"Ôû—sfÆNÜd·°+ñ†¢Ö—9óÛ÷ñ#x®žþõ×´šÜ<³9¬ë‰oño=yœøÆúKZÁ·‰1[€ïC’Oì^>Dqà.!©&—;¦ `ª†THIëàãkh –e”w ɤعMíËa/”d@€7ÕŠJ¹6ÁÕ)­kP­ <Ówv’)ú*ù}â‡nÉýäR€h²¢@ð”B­ˆTÚy.E¥wBÎd­ ©Ñ:pÌ»-)ª]¾º0ÙE}vÁrîza€&Ùä’ej‡ÏÒŸ¹Ñ"\öP¢)3XQð¾k ˆµé4ˆcwáE0 |]'mw[ «&w€noM2ž^º×K7W°¦Ê¦S(Í}ƒ¹P H‰¢&v4"%ÙÃÕ †;w+i ­F†7ÐÞm»ïžUIÄî-UmÞp~üåþÞ¾ùíáݯÃÓ—k¡ºº¿,’‰bh€.«‰fð Ù²7Þ-°×¸/××Ç­v³`\&Tv¼Ðñ3Çu¨×ìöøÖuÝáái‹éºi²*X +¢ÒâH•C³ Í>ºÕá}cê8Ц‘pÕÙN`"x¶ ÝíÈw.©­vFa²¼5ñCgLLÙ‡O=¡¾³ž¬ï¸‰Oà? ²ú ƒqŠÔ\èž#¯A±ŠB»uÍVåê?Øf£óÕV¡2öu7ÈC¯à+ á ‘Cr`|£%ct,$’íD þ1âð_K¡oùAYì\~¼pãhñ¿ >QgJ 68h·e.uƒÛ¿Lþ­>î<%þÓ¥€ÄÈ“œÕrÝT:zT4 ‘¤‚’¡nk%-‡‰YãB ‰"ùq‚gú¡HªÉÍIqrŠŒ%€ÆÈx½!›>6Ê3ÖnH>P!æ™Á  ޾°ÈïuÈ*˜Â]x%DY÷¹i^O‡Sî6NO4b•aèÿãiÙd^ç=œ[|á IÔ›hfü¯Z|CmÛdN*ê+n/ÍÑ«½¿ÒL·=;ÁaŸ‹“‰é6†Ê^„êí?‚f7ŒÀêÁì«a}œŽ¢‘›êÓV/b7ŒfÃ|{Væît.}7ˆS†åjîÎÏaØ9Ìbé¾|Nöáèo¨S(¬ƒÎÎÑêD»³Ð‹pVv†Ô³PшÔÏÎTÂ÷ÉÏPà‡jÓˆ*¼#Z÷+¤4%–Pl¬v hGõ†¦Šmi¹·Ê·+Ͼm4(ÛÕþ´ƒóÐ ã™ÿIÚÉT™cæ±S±1§¥Î®ÏÆ&iÂ=Ì= 3{s¥àk*Mü?•ƒù¨N-õ<ëãÀSqiÚú®7`:÷zÃÅR›Ü%“Ÿð÷7ÑëeÆendstream endobj 883 0 obj 1095 endobj 887 0 obj <> stream xœ­WïoÚFþÎ_ñª•–T%6 „F­D7š¢%$£TÍ4MÕaŸáVsçÞCØ´ð—ï}ÏÆYU-AŽ{Þó>Ïù+4<ô*>ÃYíÇapzSkÀ%¾'µ¯5ßmâ#œÁÛ‘ÛÖ߇Q\Ëm}hûÐêÞ9ŒfµãÑ”C,´±Àô$›qiA°¸ú.“0e2J80cT(˜åÌ…æ?÷G`ÊYÄ5Œ¹`aÈá‘¥g,IuÚùbôgÍozŒ®jÇ…†8è“?X.P—˜……Ê@¥\®÷½8rEµŠ¢‚Ω‡o,lÕŽ1çÜ»\QÐjíg¾×9kúÅ6Þ«9¿çºî܇LBf\¢'ÍÓ–Gf'yʹϾŒÕmf—+° LÊC/ŠrAÅ.õT‹Ó‹¢#ô%¤L[f Ã0"v‘ ·ë–¿û8ø|;ì_w‡¿½ïuî ɀ͸Åþ`ß5O>✺‡éF+ ØæŠ]‘S&­H°QÇd|Ï’Œ“æ.¼BÁ;4ål–&üUÞÒfІŽë¨OÐÀ³ˆ4¿À ~£\ņÜRÄKnÅ2Îdž ºwýÏê”t£?L”]]ÀÖßs3­ ^y”ó×þEþ½Ògçt¯?è÷c„Šïç`á”Êò<¯ôô= ¢ýN§ÿÓ]ðî¨æÆÿRó˜…_¾µð§2Ý;™êä§ÅèvD˜dVÜsšìÊàä³»If,ÔŠ2+ðXÔ@¬Õì1Lã¸3‚Ùš(R®O6¸3#Ì@=T¸ÿÌ•ýí•‚y¥:ò¿:àùþ™oÑUPÔ7xûj«e8ŸO5‰½3ðÛ /h4 ö‚¾ÅᎈL5f[D #ê²æÈ‰YB*KoÇrk‡–ciª¦Žá¯Ø©¦ü#ÀY!!›:̉’æÜÅl„U*1ÅæÃbîÁ'ŽLªjITd¸%{|Z€™Û9/øn#:ŠröXûTâ“(Me6Í,D̲ú|âqU2Y@ªŒcÔ8Ç™nçfÇ\ ‹™[*]`š™ÉHÙªPµî,Ò„…<ï-5•AaåkOÛ“öl·+¾ϱ”–ª,äEy@¶v*t´+ˆMÌ«ÓhX‘»BØò|¿ÕÖPZÇu %•<ù‹kUwú,s= ^#¨"EO(Rg‡¬1Þ"‡4“űx(Û^&O%QÞè;G¯°À™YÐN‚ Z Ò#H”Jqq 4Î]&™²{ºuPCÝÒŠî‚TÔ­Nî'Œf²ÔÉ¥D'Ü£«ëþ€ÀEô‰ÿtïö9ÃU’Í$J &6’ cÙ˜V˜ï JBGKñ‰y5Ž>.@¼|¹ú{›f€Æèä †3¿‹?NÞØd†1_Ãû¼z„×\ÎÈ:â%i™W2O®xcO{ëÞôöÏ!-p·F•éýûØiÇkù%¾"c·w1œ{íÀ÷w1¸Æ>±,±ÅÅOs›iIÝFT¤ð‰Öøƒ0–®–ç°tnpö„Ûç^³éÛEZL—¨@Êq°ˆcî$¡B~ßaU¹B„R>†1¢#u‘å¶|¯ìÃ$çÝ-N?õZ­ ³×„õD5°Þ|Ûg^ë¼:RåIÃAâ•û†>…;ÞÙTÉ·‹Ìû™Ïk¬’DÍÍ«mŠ&aê?ü2¸ù4€åQv´*n'¸üÓÍõuo0Âå°º|usÙÿ©{…Ë .‚Ö¿ô£Þ%^p—G¢jða4ì.qÕTW‡=çCïD¼½êÝ‘ÏåÑÃÑjG Íf…äëò`s÷-zPðzÙŠ:8ãëƆlCOTí¶.'!Hx(Û[Þ¼Ðã pÑXí–ôÍTeID‡kNÏ7$x¸‰’“ü¶(q™¨ò!kµáÜÍO¡u†€nçxhwèôz£Ú¯øúGsG'endstream endobj 888 0 obj 1469 endobj 892 0 obj <> stream xœÅWÛn7}×W R´u™Ý‹´«Mš6b'×u}*¨]Jb³Z*$׊P¨ôåá^¼’»—‡Z°e¯8s†gÇÁc>xôªßÓEïû›`0„™éyð¿g½=ß-ú-]ÀéØ-‹Á÷a<íU±>Ä>DIÀF0^ôŽN׉)/sÛ‡§ãß]@T }6ŒG ³ÞÑyY\sͯ…5›m³¶I'lzÍZЖº0`çŒÕ²˜Á-ÏKjêž|!2XR>a…fðF­Ä­Ð}X«R^@iaû¡Ï<ðMÅT]—v³«JKŒuy5_ÁÈ;Nç˜9ÅÄp~1þóé da¬àƒ‹‚€­LËœ# œ:L#,e Ì ê¡Þ]ývsòþúäæäí]±ê÷iqQg^ð™0°’yQï·7YÃ.iPVæ®PÇÆÓo{GÒ`€WØ_ÀGÁ †?É­àVÞŠ|í ¥Èº(XðT+Àp¾\æá0ACm]ý¹ÃÑÓaÄ Z»Ù¶ì–(ü´+‡8b¡×¾:}ÞV‚5db©EÊ­ÈØ¾2üÁ€y­ŠàÂbå.l0©Ã,WžwøåEF¥k1UZ8Z‚Àcau¤P( ô hµÔñc0Xãp+Ž,KªÂôaEœ¬„Ç)öB©ÜÔ‹ Ÿ ï©}©Z,ÖPUHØ¢3+iÓ9vÛ®DM´ødEa æÞn°°×ëúñn‹¯”%ár‹¬Ï2I¥6œˆ9¿•J½&ÕrB;š¨Ûª½ Uie!öÛ$!‹†Ñ¿9µNÁ•jí8âÃ8ÄÆâIG­ªLs¨÷ý#2/LFuöÂΤ1d£dÐÂß)s#‹4/3² J\5Änéìƒø±ÇFQØ€ „öQ‚!‹¢ EAµš¥Hå”Î 7põîòÒõê ³³$hïg˜ïG^p—ÕQ5@·ìht©Œ¤Ìà•)>ñÅ2§*È•Z’úT9›GæÝþkñ Ɖf]täEµ¢¦ (€Æõv|‹‚û$ßç•8 †ÄQá“íã  s²‘/ýðB>{¶ýƒœÀk?dz/w M߆nÔüòÍLÙí\ й]yÓ±–؇'_³‘gþ,žôÁl_tÖi!6'Ÿ›_DnD'ßOè‡ýUŸïtÓÞÂAåÙu½xTá–ø“Óª³î<¦õÞ1~Òîý«J{~h,‚ͤ3볨^BÜwp&ü7t(à»Ê‚iUQ½9ÄæSRsŸï½/ BóBÚ>-ÿ?èìAhlü$ :=¤ â1ìN•»ó`Õ£ÿHÂŽ›4Ö=žÓeSêÆ‡ÍÁ}™°0ŒöŒØéåÀˆG^×£îÅØð0¼ÇÐcyCÿŸåɯç>D&|> stream xœ•W]o·}÷¯¸èmÚÈ[í껹yðm“V@⦶ $(Š‚ÞåJ¼^‘ ¹ë}°yÏÔj%5@kÁXY&gÎÌœ93úHý$¥>¿â3_Ÿ|}™ G´t'}ú¿Ë“'©?Bñ‘¯é dšÑ¢< WSš¤4ž’Œë“gDJ×t+ª_.þ É”oøã×~'¬X¿kjõX6ºG§çïçWéiú=8éÑÅÏoÞàÝÓ ?ŸQÞX+ao%E!í—_°!Ø~™¾ïat®K›ÁäëŸ/~{w9{~ùá‡Wçß½ºìÑp:FݪóÕ†’$iíü{p«ÖÂ>ìÀq '”¦œœ,ã„ òǦ!Q9C¹ÐÔ8IõJR!7V梖E3­EnM¡‰<—ÎцQÉZZG¥5kwßoòDp £»8™]°ËfÍÙSÎß‹Çaš ’ép†.Š“gn¸b{1Œ’ñ8Ûž S÷[H =Ò\3Rc ¡sIHìŠ^ÏWäj¡ a ×ówÜFæJTìà,Î’QšÑY:`ÌÑ·£­÷-¾¸3¥Ñû·?¾}ûêbqq4K¦ãl{ˆàôÈN–&ƒé0žøa~µøñòÑ™~2¶¹è‘pt'«ŠŸ×•Ð7ä!âs+É4õ¦©}¬xëÃ;}I§ÌËF‚ý…B] ±Ž³d $»X•¦ÜTÍZ;4ÃE‹xȾrõJÙâ°PÃA2귉ЇØÇIšŽûY›‚Xõ©’´Ñg¿K¦8ú¡7åRZø"¼–$Š4D¨‚\S–êžù·Wi~B‹•r>,TIO;a­Å J¨j’Â=ð}&:ì©õ¦’T³á7Ö²z%n•^’à3²ÆÔÑÝkcIÞ ¶à[ÂÉÚkÊ Rïø¤;¦æâÍÛù…Ï(Þ¿§’o ôyH7Bžk¥¹sjqÍ6Й±)¿ Ioµ ¤Ù  =ª—ý¤þ»45ÏŸ?ýÓmÛ" ˆýPÏSÀ¯ÖJÿ¢~íÑÿZ·,àN½¬!ú”¥ó÷Kâ~gIÜÂÒŸ‡‚ÔUˆÒ4­zH4”5m™TÈò6´ìž™i2áÒ°m«1¡ B±º0µ \óš'jAõÃF%aFvnª,¥û26Ïdš {Báë鵤Ty7SO(dU1E呤“4Iû£97ëõß•·Ð6(¾ÂºÚz®n™Ð$8åß·û r”Ž:ˆ;b9¯]Ls}Ç% .AËê÷ °†ÓˆJl6R‡ÈChøôxÁ.Á2´ÆÝJ"{ÐМ|n{;@af]•ŠBc!AgÖ4ºSÞ+‡âÎK.²ÏF«3!À^÷òÎg«7>3(÷zúzì÷:lóv®Ø8zÙÎWB/%kž¿ÌuëÔ¢;1HjhñtVN AÂN å~_>A)7ck<ÔV6Óã5EBiØÞëúÉd|\;QÖ±\‡„˜Ž1ɲí ü¡Í³!Æf6›vjÙš0©Ù¸‰]ôŠm° +“¾•¶ÞÊrÌHÛÙçWßÎç Oþ¥ÔÒ‚¸b¯„ë¶ø+7òZø.òUytŠ—„¬Ïű"÷úÏkêP6AeeD(—áMR7ëk&„ö{Å©Òàüû,a©;Âx-ýõ¦¦;ªxú ÖÚo¾˜K+EH·àäüØ ÜKû_}õ˜õϲ³Ì“gœf‡Ÿ·Ê£U"“¹\!á^¤@_„c4öFÃ}x§0wÊOX@ØÒªœÝµöi{ÎóÚ6<Ç:ãÔa'© nî”k ëh«ÚjúÑÇ‘b‡\JV%¸îÑÊÜI¶ŒsŠð ß@²ý¾Êãn[ßdH82vÀùQн`ù¹í»#É'ýѤåýNñ·`y[aˆŒ5€~¼FIY¢Cvä_"3W &ƒÇ=žM'ÉxÚŸuÁKı7Žõe_E"A,œ_#â™¸î• P$'åMظPQ¨XM1ÀÜM8ÆÙõ‹Ò3W¼#FZY(Ô¼ez{a¿°¾"{uØ»ì-DbïÃØo­Ì©¬%6NœpÝF  q¦[SpñV™Æy ÅM+´·²Àx2Û?ÂÍ^DÖ⎸¯ŒÛ6`›¼ÅÅ/ ÌãÝYÞ»À6]£×¸$¬ßk~°×¡.m÷‚ïµê%¨ecæ7¾è+Œh‰X† Û­nuÝ{/•u5¯©7Þÿíìðß ä~ ¯ÇÇ8LU,Zºè±)@²_Ý`¹z8ó°‹ã,Æ餰ù 8&‘X¹©P€bo1Ž{k6žÐÔÏ”AŠîâ©?´Ÿ¦LÅW‹“Ÿðú x+ã\endstream endobj 898 0 obj 1787 endobj 902 0 obj <> stream xœ}VmoÛ6þî_qè€vMÕR;îË€uK‹]‘¦*0` Z¢lv”¨’Rœl؇ä—ï9R’•—ÕA`™¾»çî¹çŽþF³(¦ÿuïY9y~žÑÚMfôÿëÉ·IìM¨{ËJz“Âì YÐ’Òb\cZÄ4_E ¥åäG¢ç{$òœVZTQ&lN¡•¤ÖÉœ„#Aµ™¤Ñ¹´TK§g?ŸÇÔÖ¹h$í=š~vtLé{ø¶­Î„åY۸뢭¦ôáóû÷SšMé‘÷|ÄÒ“w'çä-q0»yùô {GQ×Ö*l¤``Qå@Á€O:œT¬´<7[@$y!«ÆMimÈÈEîr¯TE…Ò’DчAUµXûûTŠº–ÀM Ò±rœC_« øQP<¥ÃÙìJŸ·oAqÌI¹à.Ýt)INÄ­¤#+›ÖVhDLª FÝW´E\›eÒ¹¢Õž"$”n­Œè´¢µ¬¤zê]KñÕX$t V ÇèkçDÊÁT4teZÊUΓ÷ï˜vÝ–àšÅ"`Píÿ-­¡ ¡[éóhnÕ‚(LˆùÉKåæž-™ÿˆ:^æ/˜—ƒCŸ 8>­ ó ì£öA²¥h§mMÉ]hŒÑࢱmÖø0;Ù/eþ ªL·¹¤WEçm~‚uGóÎD¡¤à5É·•Ï›«ZN)ÛK{;eIÝ|¯™»‚â>•£#žÃ4×u}Ã#4Ž2O¢ålÙíBp·ÈZ­1¨žfò^©gØ‚î¡mÊ1äþq-æ‡1í9¬‹A43áãn7*ÛÜBe…ø-”¬ÂÔ匂Ócå·VY™ñ 0­Í‡«+~gô¼Vñ$“–ÕºÙfe˜úA4~èøˆNRá/(3•ƒa0¨¸CrÍc#k+Œyˆ¹nlXãŸü Xî*f óóɃE»ÆØP± ¹ò7Ò–ªÂR õaU3`:Ö¾{¶jËrEæ,h‘q|Gµ´ŒÆ¡Y•c%a¼õÀ‹¸À zÂK—Yµâ$¸ŽèLcºeØa~¤M¥9»Bn9RÁ·[…Øaãf¼PniX6u­U`r¦ RE3Þbi¨R¬™ê‘ëV »ª²6¶Ýøà:±òÝžPŒßpw|þðåÓÉ/é—_O‹)Œ#ïë\•±_QNz®Â_:#Çä¶crßqìðæ4=;ý}pX©¦V—÷]nÍx²ë ógZW&8ËePCRP*7x¸Ã:Mzòd8& azé÷$|œÌi;Yà^O–Ë*ÑŸãE´ŸôäÓÿ^ý»ŒGwÿÁlú»Ÿãû ÔË44U^вÖÜ)¿˜j¸’—…v}Y«n“ûZzæ@ªñ³éË\µEÑßmŽq±Ž“ýh_à@äi–˽{ ¸¿û‚'^ o'·ñ­ÊLÙßöݺñ ­yßãÁ…òÉë¿ZœKüÒ‰eôk ßè\ÂàÓ¿îhnJô8DøŽ)”Oó |ß0 “û†³Ú˜¥¡åk,Su)uÐ&/Î&\â.¬ìœRù[>\í}©`þZ½ž½$õŠóÚcL|xöìæŸÙmU“m®C…»cOëñ‹]~ª¸¦ "øCýI¯^㇨G¼Îpä±_ö.ùÃ\ÎtìÅyG³£„öç^\¸ÌŽÖ¯¡“ÿJdšendstream endobj 903 0 obj 1319 endobj 908 0 obj <> stream xœ­WÛnG}çW²Î t{î—xwǹ@€b'dŸ‚Ö°Iv<3ÍLψbÞ¤/ߪê¹Qœ(X &9dw]Ω:]ý;xÂþú÷¢Z¼úD1líƒïñÿvñûÂç%п|½âe)ø>¬6 ·×‡Ô‡$D«jñåe Ú‚®ö¦ieÝBkàFÉt •®×Ðî$~¹SPȲ¤_ÿ¹úmñíjñÓ"Ã"HýP„ÚóS¨a˜ûÂëËÅõ3‚BK"dKCdßuõe%·ê{ÕÞ? ûЬ·Š£¹•e§Àl(š—çñÞ—L«5îýøî×ëoß®~ýúrõãå/p¯ÄV€ÞÀ7ºÝë»×_PÚ{i­ZS®ds/YA©mû `µSÚ˜F-AžçŹ'rÄ1ÍbÌ;öÓDä™{|^ÞhIxl)ɘw½1œ6§f/™Ò³;Ó•k$ *¹VÙNzÛeš'9Ú§ÅrÓªfX2¸ç‘ß/yšàÀ‘Æ$qˆIYà‰¨|&¹~$¶”ˆèœÜ%1`šµjÈ£ÚF«[Çs·_Ë)r´9Ú\+÷ëjŠ!$qàc˜~”g"ˆÝãó¤ƈcŒPW7¥¬?º“Õ¾œùr’Ñ_êÅ"þŽ?´$2¶48- Ò‰UV¬U+uiû~™f´«<ˆú2ÀÞ•¥5ÜX U›®<ƒðgÓ`­¼5°®L¸>ÚVUˆ9:ªd«M ›ÆT¼yi)-ض銶k” ç®ò®˜7÷;:³¼ƒ]¼½†+}ÓÈæˆAߪÒ쉳#|cº-ü FT‘ë7ï—pØébG½'o17yCȾè›*‰§ø‰I”…)Ö½{|fS%‘HØRÜ‹ u³€ûV×SyÈ+¦žšÃ!oL×™­8ß}c~SEK•ºUµjd9À¾1êäXaâ…"EßžOÒ¦9Ò•»Ççe–DÈ–‚^8‹Ò¦™yY$¢Ñ_'©ð£¿ã-‰(šûC¶ßïUòÛ ºV˜¾nµ,õÊ:‘#Ú3áØ ×ÃX@Ö!S‘®á Û~‹U0«oöûRLåõc+Ü€ê`6DŠÅ¢;˜“²|ä°³ºÞR]ÍU»6£^ñ‹ì$¹7¨çW½º†A 9ýúÒO|‘E!ö¡OÅEò tÞP }®ç¨åà^]À¡˜5Ô’\“úA1v¥½xÅydójfÓûë6÷»£EüʹY@»/K¿Êh´0bÍ};äC}Ê•}wã ¼.)&”ùÔTxÄ`8n¹£)$šyFï#MgI/ÑíV6hÒZb÷°SL4µ ¿‰‘ñ.ü¿&먇ßÑg*Ÿ}·¢»/ñàÆF© <ÒÆ™æþí0x‹%¨j ÿV5t® XžEsŸ=5žHå‘’ÜhÌŠÁp Þ# 䩦҅§àÇI⿦ƒi]ÕÙTm òq¶Ú«]Õß(‡)Ï%œ:¼•ú®Õwq/Ó³èyty\<䲯M‹ï8ñ´®õ!EN>€Ëv–¶Ã©ƒÌÕ7ÇߘBõŸªI>n$Hp jUwªa‘¼§p䩆LÔeŠCé¨HwmtƒËfÛUÊͳà 5Ôp¨óÒ¼¿t¤O.1·w¯®–oŸtÖ÷À4?R‘ôêL"8ÍÔCYö~ï§')²ù•¬Qhœ¼°üC×EÙáhð/d^ìþCOBqkôz,‹{|YÞáÓòH/wXZøÉØŠà)…¯IQÜ 0ñÖ $¬%lem:êƒÑÑkàhå°7àxÚP5ŧJ{ná‚#¼ _÷>¼aߨ‚6®Õ¶Qhã™ï„ûá3’榋¾„­sz –ƒýt<• töì]„( ù“ÑŽüÊc¶±EùpÊÎÿñžÐ ñÇVì¶§ÇX/FÒÐÀŸQEzá’ë½®=ÒJRyÜvCs"‚{éf¶‹m¯þ:Yx!ªÎøÃa‹=·œÈ%ºA=›ÉèÉ‘C½ày6oôáhC©B…è›ñü yd˜Eºï°¾y”-'¥%°Nl>©|“ÙSÑ{7&²éuAìÜ©#»ÖêÐõì½X`!@8êñ‚‚¢»¥ ,[ÁyHëç%§@#H­q÷¾ù?ê*à0›qÒ…×wô±C2÷øÌ» ^vB¶öwÁ–r)ú[ŽŸüótË!=ݘ²4:O´SùÂPΈ]×ir˜«ó|Þª`˜ã‚$…ŒË0ô…ãu*eá8Tÿ´ø£³.Èendstream endobj 909 0 obj 1747 endobj 919 0 obj <> stream xœ—QW›JÇßùófë±1 1ö¡§‡Db9ÆÄ&´j_< l®°¤ìÒhßÚO~gwI ‰÷âQIàÿ›ÙÙ™ÙÝŸÐn™Ð–?Åÿ 1Ž'ÖiæÜhÃ%þΟ†©^â_@ÏÃ×N¬.|ofh© ]Î>vZx‰ñ€‘„BéÏËÊç MÊÄ{ï4Ð:o(UÖWñVíãËó·\ï$rðmô0Ù׎6» –9>„YSíðáñ‹èÒ¯¼Ü•Dó(…aa\U}qì g"߸Þô %aÍ”àϰÀ¯i\dy *rïþF; ¯z÷žÝ:Gxã^Û—êÆù©¼³'û¾Âë¹Þ{×ÈóÑãeôDc|®ãPV_»#s‡7"NP•΀&/NH–®ø¦9þaª0ÿVP’äþpšP<úM%(çDÚ¶¶ßsGýñPú³½4—4ˆf²6ýˆ1™0Aç «æÚø»3 Ç· ~`Me³í‡TÐ@ ,Ì3É*˜ŸËÁ#YFžƒ7½ro 9xº 0§ùc´”±Ó´ZCãB?$»ÑŽÓ÷îÚMvÔ`¢Ä,æc¼¾†˜MEôVÆý>G¬·@ö8òFo8î_½†”êÇið3ˆ4Û¢Wq›þ€Àž'à€à-ÁœÁÞöWw…"÷^ñԲش¦™JÛ8µ(6i­ÝÚbsSWë} îjöXnŒBueؘط½oùúÖz-¯‡d¥ŠÞÏg³Újˆ]}CVѦy¬1 °½óréVÍ;‹†îït›¾Rôï ¨èPx rÖOãHySòó¶?môQ>ÓWÑoÓ,û©Ì^µ¾¼x’g¸3R†‰)[ØËÒ]õÿŽ¥¢„T yê‚iÊŽu*O5x>™àÀˆÜ$jVi‡JÎä°âøEa*bñò[`3\àI²ŒÕ¤.'¸½Ñ5Ï! m›'…=ŸÊE#”4I3*ÏL¨|‚e–Î3’ ›K= ÆñŒ¯Æ¬ «Ó±Zç'x\ë|„ÄÀcÚI«ÛÕccÚxž{îú@‡¤–¥H]u¦£¿nN6þË“›²Z1OÏÍž!ÿ‡E$µNI[ Ò¶Àe:ŨÔn–KJ‚…tèƒÕ9Sˆ:ˆ¡ñNf#ª±NÙc‰%‰a•ˆMŸ•x8s²½¡ ~WÄç9ÇÂ#!¯™æÊ6ŸmuÖ…s•4'f«ÝÁƒÄé¹<Ý¢#ç§›}5þCÚþŸendstream endobj 920 0 obj 1281 endobj 924 0 obj <> stream xœXÛnÛH}×WfÝL 3âM”f/@f0^fv< ò¸hQ-‘^”fÓŠã/ßSÕMвgµÄ6éîS·S§JþB‹ ¤ÿóßózöî>JR:t³ýÿ³/³PŽÿ–×ôãFŽe†´ÙÏÜݲ–ë(XѦž½i÷dÚS7§¼PÍAwd M¶¬5=¨ªçç–¶ZÞÊ Ú·Fžº>ϵޕÍ椚¿o¨ÖÆãtÚ£î¾ßügÆAD›³7Sô­Ê?Ó©´…`¶øb(o«¾nIJ¼ìí±·´/+ÐuFŒV;çk£¿ZÀؼ˜“¶y@ßÿe%ÞÔ¦(;Úµ0Ô´–N­ù<ú_©Î²çEeCZåÅÔ•M.AM%_~.õ-«Ñ>LŽÑ _bÜ€6Œ›z.§¦=US§$GÊ^q˜¥¥B¹ÛÏâ“Бë®s)†å7@GÎQ%6CUƲ›mãïŸÜu$¯¡Öìp™•*]'BBìº}_UgçmÞî4õ0Åfn?þòïû÷Ÿ~üxË÷9©¹Ñe»|Þ¨2ÉÕÚ)«Hu]›—Êê+ñ%ÃäiÐO•VÆÙ+ÅŒÑ_ú Ôµ IÙptÊ–ˆFmA*àé©jÛª“Šv8dµiÜ輂7…:Ïìg¡«#ÛžN¦´ÂÚ‚­ø:tðÑg N*S"Va÷Í’ÂŒû&N¤°·}soþnˆcœúZRt;8ÖYÓçV€â(£µôßš{HD¿ªÉýÛJPüƒ‰Kˆt1ù ?rØsyoÏG-kè­ÚíÌœ‚ xôní>i= )\IS„ÍnÙ·GîÔ)Ê2 âE¼ö'Q´äÒ÷$ 7ZZÝkÀ2e}­@é²ÎAA v•f³7«(Ó5ݸ^‚¹½ik:%7ÔÔÖ JF[Sê>{¿·LlîwgËóhw1šƒP(8¤Ç”j[ùº9€–U‰ãíþJ£Ž ÌÒá6hñ3Ó—¤¦Ã%w@b×X7úââ0·Ÿè(êÄg¦ÎsïHÃxÁd6r Ñy|thÙ?¼Rº–v¹u‰½ÃQpf´©ËFšn{F´ wÎÎuêÒxÞ÷õžÃ03Zål¯££6"*»§jŠBB†Œ‘zPe%ÖŸ”g§»Ü”[Îþ¶…PŒ ¸Ÿ7³ßfK:Íât¹!%!ú¬ž%aiâ«Ùï/˜h@ Ö‚4Œµ)¥‡ØA’Êm(XÓ|Åo¢U*w/¬ DÇúëQçœOGº¾‘ê¶™_æCËëck¬ϺÒöCS ìµt¬Ô¹c¶°vƒ"ªzB8c‘bòÔ}eË#ò ñ×àZëÆ¡âÁt¨žÌÄi‰n1ÝDçˆá¤‘NØ‘C3ÙÜP•xv_D/‘ßJ’`¹v/¬ÈbD‚±g®"¿uƒrð–Q0:æ3;L6Ðî&+Oœ Ð¥<-P®r$ñbƒA’yfðzÑ “«N»1+3 yO\#ôÖøX}Ù^ܘàwWåùæÛ76$ À|Fã l &µéÿw6øEÒÑ7…hÔ\ÜáH†©[>ø@¸C'ë»iÂd™*…) ®ÓEQ—Ç—HA&Hœ«É`~Ð0ÆÙ±XëlõòÙÁ2¦­“œtŒ[¢éWÑP’¬“ ‰_‚H&¹Y„ ÊÝh×JF»Ù y}Y'™˜uý5h¹#‚P9ÎVrt2ß@·æ*;ÿê,ÔÐ;¿LtøÁc\)°/ +Å»·ŽOÊ«‹ôö廓ñt‰]âïCÅí¶ßÏé;óÝœ~ùøáÃã#ñ.á0kõYCiÒ°]ø%&ÂÑâ:^áúU&3ŒxALòßœæP`Ãj\Z°¦¨‘aÊEßÝd ,=«Ýd1# «ttô·Ù§ƒ°endstream endobj 925 0 obj 1952 endobj 938 0 obj <> stream xœYÝsܶ¿¿£Î4ŽçD AmÝ™Öc¥Ê¨vb]úÔ¡x8~œù¡³úfýåÙ]$x²NÉÄØÅîo¿™Ï, 8 ñ_ûwQ¯Þ|±d÷ý*d÷«,NÉ•ÄAÄêi›ª V,‹dÀ³ öŠËDè–Å* ã ãÂý*áºq-Vn«€s6SFÉÄ•–ÀuzÑœYq,¡/k±Ú?­>¯8éÇì_EÍþ¹!S4›ÝÊ(Î™Š€V×M½zÕtƽfí8ÆíÊJ³c9ìaÏrÖéîtSh¶Ï›-ý¸ùßêýfõ«C(Â,‹Ò`HlU3K0óƒÅĺqËÂtXªbÇÕ,=Àì™Çú²"`ç•fAB`Um{ø #Èt^ìYÙ dúË ›¾lسa욤„᥄^a©i¯$jÌC ’+xdÍ`‡n]À]*χ\,Hí–8ãm»O$j='RLœÍïÚgݡʑú2«ýêö Ì8GÒ8ˆ ´^ä`Ï\i×vÎ놖®4úX=¾zû Ü T'œŒ² RF @%èâÔ6kPwh›Hí–8Ï€J-•<œ9ÓÚÔZ¡©/ó‹•a ÐNç[‚Ë ÔµÇž”eßkвƒîÛšº¶Ð}_6÷ÏÁ‹T²/æ|^ r;ÍÚÏt&R³5œgð¢Œ/À‹’lâlÖxîÐ éH}™_^døØ•¹Ù jÖÿüø 1!ãb"Q ÄDÆ'½ÌÚCÌH&R»•ñ1©bB$3g‘,s‡V(GêËü"Ä·bWýÞ‡ç2œ‹2\¤ dx¤&ùÍÚCÆÕ'R»åbL¨Ò2aOœÍÚCÆ¡&R_æ!©ØxSQµ½>ÍS'Rª4ô ¤T™ô ¤T*µ¥Ì.çi05к]zR*)ý)U,&®±XHwfű„¾¬gH©"›ë "^!—B°K0d¯íêÕ‡"pØç¾ñòIÌd67J"¤™ÙVgÚü8)›,¯Ææ øë+{VäU¥%ß ºóÓã÷ªyÛmá"døiì¬Ü @ Y–´ÙñÉKY ùv‹Lá=Ì76XÏòKÀþAÒàÑ„H¦4aR‚¥ëU$€gjvçጂ˜%§(äUïÔég}f­÷P]@çYxcÂÃYËo¤ÌÒt’E>pÜk ÿÌῦ5)È I@j·¸Y½ºÞ±Çv„Îs» (æêY8טŽdµœýøƒ.‚(ð`žJNA=Õi{rÀ ’rrM`7´mÕ{ Ìd0óPêÞE É8zÑ»ÐÒEÄɽkº¤5ÁRä y Ù"Ððêl ñºÙµ¿ŒÐÓÚ¦ëê·ÿýøË-{È«Q³mÙéb¨v¥/gwe“wlÈïÜCÇv¬¨¹˜ß3¯ÜÐ+ïÚj¬›[]ó>4ŒÝé°§¾n؃-l ±Þ|ŠDÊ*nê °eìÍkObŒ«|‚Þõ1°mc8ÚÎñõàEm–aP6ÐõoÿÂï°÷ðhwc³v0¬ÙŸáÚš…OóÅ…Jt¹/ÿ¯ÛÝ×÷Ÿtñ´f~»¹Y›ë§ÿ\üû?ï>Þ\¬ÙÅÏøÇñ¾tuuû~ Ö¬~Tž¾CŽœIß!`F1pDO[Ú°+ÑR€BÏî4˜ˆP[ÛÖùËÀ®ß|4I¥]Ìt~üà¡í¹÷QtÖ5q¿fÀ[9zkMNÍxвE±sÊ&ì’™æ`›¹µ”øÆæj²ÕŸÊ¦¨Æ­fÛÙÀ ö‡Ûà‰½òЖ[6¥,X0²K±Ï;öúP•ýðt šK#Ðzš»·¥Ä8³¡Blѳ}± DÙKªÆ¡l´Ák©cή®7·ËT~ݰCÞ e1V9@X°wzYoÐ0˜)ˆaüUæÅð>ÐÆª®h|5Y 9—Jl Â‹$ÅR)²òOd¶g–J•’8es©Ü }j&“Xž•Š›q¸Ôq¥ŽêH‰)òó9fK*b/‡/,jFÑÖ‡JC `q¼«Úâw@p0…©ßS:…ÎQÁtˆèPòolï>.œ8ÅÄ%PFXCe”Ê@%f{BÀ)‰“tø\㋎)ýaH7f 1­’ÄNL„ji–LÏÚÝwå† !Äš%â0Å–È,P©ÙžYüaÖ‰“káO-kj鹿ñâÜœm¬¯}?~(üNƒG@ÍL£ÌEÏ×2ÐÁC"¯5‚A! mÀýXë†%gýСþEÛ yÙಅ€üê¶ÃZR×ùåVWe Ûö™P}ŠLyÐÿ®à¥o©ÔJý ]ÊI8‰ÖƒëíLG‡BžHÕ›“I‹¢=<¾ít g4m ãW³Ü„¶{Ëó óE»—Å75$[C«Tûµûx´F>î–Ò9{ãë(áë}˜}?ÃQ0R!f)TðÈlÏô}œ¼‰Ÿ³ÃGÊy>¶I±ßÖ-ätŠa”ÿ¢¸@[^¼»xZ›vb*æ&VÔÇ~²ˆb€PÉÃÔ0)-E×ÖT°ü~Ä~þX ùÍN{CÍtRm‹fK×ÀO® k‚ó\@pª-ÞäòÃrpVzƒ m_6¸pðëg-û<¸=óBÛw“¬ß=Roƒã†;!Pë¼1-ÿ·ç–Ò´àf†;ííïô®5 ½‡¸±€ñâ’âºihE>j,[ÓŽÌ¥qHÆE‚3qœ%P¾”Ùžé ø½˜8¥vöôƒ¦*‹:ݵ阓„.ϺŽM2’¾8¸l]!G£ox½ë­ÖËBqΡaà<ÂPƒJ=6Ûs'¤Ä)¶¡¦jÝÝãû9–=>zEN þ½äQ¬\’8¹G ðž€ý«=êÝ9söùN?·"TX¦VWŽ]„Šiwž)~Šá§†óñ/æÿ±Ó9¥†N_:KégK›ŸMÒvv 9”*sö\õHR–Q¹Š°@Bc‚Ó18C–Lªýºú{åÀFendstream endobj 939 0 obj 2323 endobj 953 0 obj <> stream xœVkoÓHýî_q·+v $nl'~À²RYQ¶RU i%„Vgœ Ø3Á3nˆ>$¿|ï?â¤ìJ¥¨¤ŽïœsÏ}Îg¹Œè_ó™ÎÙ?žÀB;#x‰¿ ç³ãYh>ÒžO­YžÓÌ©Ïzy&¾ôpN/%°ù\¡äD§SçÂÚñ‚ v“ͽ Ç‹ýÈMüú1wÞÞƒ‘ÜØ"µÄ•¼È+½Üî@hHYžó9(ôF‚ªÌª2‰œÃZ˜%˜%‡U.´Í '©Zmž•<ã%—)?ÁSsòž 驆¾¥zëÃt™µâ‰,,ƒÁžØóûïøÃ¥ÆÈ‡ëR|$v²êùèÂt‰O—L ]yÍy圮Ju+æ\#™Åб ’@:M/¾|J¹ÖB.j•ª,xéÂ…*þêœò/ŒÀ1…Ò¾NÕmJ¶(¸40ã¹Zùˆ„5!ñ#õ–iÐsÉ×ù¦ ±5þu0.\Rì™ù¯àIef&$+Q<›YOÍÿ‡õ ÕÙMàGP)ùU†àìQà,]ÞU…xU)áÑBx£îªÙ¢Õ³ÑSxŠŸïþ!9r@¥=É ^ƒX½*…4ÙÖ̪l'ôûó'×rqûÞû0 “»§=DŠØç†CªÔ5æˆIŠKmdô+9̕쓊l ?mEVÉgØ2¯Ð¸å/‘úúÝÕÕn»Ö`Vrö©ïDÁ>Õ©=Ôv˜l¬Üy“î£4ô\AþK™©×•Ù*ôgï®ÿ¾Äÿð‹°_Œä£La¾Ÿü63åžSP}+Ö$÷5+Yñ’½­ñOþš¾¸~{ùê¥jõȽPcðõ+죠M™«­Æ#Ï/¯§çϯ^œìöÙ®I4ì°G8ßê½ÛVe=˜jÇ£æÈô\in½ë¿H•4BV¼ûê[ûÏ5ï¹Ñ«ä~€zÑpñçç›m Nbì`l+¼õ†ÚOF.¥r sfX=ºÊKºîøYÈ4¯pnü–5‡Üåïh6&·JÌ÷ªñ á3íÌ÷ÇÍì›b%íõZºÉ„¶ äiG3³1ñÜdìû”X!Ûª¢Yº*ù­P•Î7Ãf¢ß:°É¥Ié(UNUQ¥8¸¶‹í·]„Ì¢ m¹Iˆ‚½úñ~[.¢S1E«^pµCû.ëèj¿£Œ'c7Ž„‘\Ï"µ¼M+Ó²[1­14ÍlíØý0 Ý0iÙo’¸Aø#ìˆä†©§ÚΨ]éÍ@Á9_'¤YÓv÷´¢X®¹j¶—„m¿±õЧ"¨¡bf¿¨e/œÉÈ·á Ç òƒ$²¤Ç{†3¹¾Eš¸ãVPS£³eYõ-˜Tc½%ž•ª°oëÑo§hƒZ&6qìeöÇí¶¹ÆôÎjCœ¢¾¼ìèºQi».Jžª7ü]Ãk…¶ýÑÞЮ -TÛg]?¶÷”ÇóãNNÜ$%mºåÂö<7¼”̈[žo°Q-µ:óûj‹ãÐ &àQBÕD×OêÇ{V[ŒUf‘’ã+$ÿ‚÷ÃT˜|ƒñ鉴Óqè{‘=8¤9YÏž=±‚ºøÜtmú§í BiæêÛª(p6GÇs#ûúð‚—–bE·hP,Õš^Nà;ÛÖÞ¥ä©é›ÍámÐmæiAl]> stream xœÍWÛnÛF}çWL´q™!)ê–¢/iâ@€s§ÑE¬Ä•´­x1w)Åoµ¿¼gvI‘²¶I_ê‹$’³3³sΞ]Rà‡ðoó¾Ì¼'ï£xDkíôÿkïÒ ­ 5oËŒž%ÖlLá„’•çÖ†4 i<ùcJ2ïä¹ÔËJ•Fù£äwk?¡0dû(ö#Jν“d#é¬ÎMQl5Ur%+™/%mDžn%-‹<—K£ItF*/kC+…Ǧè?(jsx¢ 2a¨•Ȥ‘•~ôÐ ‡MÐë¢"¹“9í7Œå'#s,õ -EN \*™Òª*28’Tä6šýˆ—ʧ¤ Lü!í­&MxØë6%ÄN£ÐŸR’z'DjuMß\«UÓÔ:Å–v¿†¿ èAõ`@¯/ÎÏonè†Ý…¯<ç•DkYUEu­MŠ0^õ6¥¼0­£^õžÒ·úÏÞß7ßs­ÛøÅ=ñ#Ž¿Ç NÎÆøoÃU¡7rqˆ5›J ©­£LPl#ÍUiÙàö‚:÷ik‰Ù²ñ†)R ™Øp¿‘L=æ ñõ4èݧ6»÷é§ Òî¨2±–ìcŽUWdÄÂ1p_)¤–S­U¾>pÍò,ˆiÇCð,F#¸·W_A3ëhäÇ-ÑæœÌÛÚ€lȈi`ƒÆQ0ŸÚ £`úЗ¯ˆ OþÐzêEMxË ,¬"㙵0êk° 2ä*Æk49µŽÀá€_£¼P¦TŸ|:³"#²ÒŠúþ¦;%·züÎÊ×ÓoØGŸÕ\–ÜF¡õÊ™Ùb¿”æËžcú>XWK©uSW[:ÜvÏûxqð»PÐþ|Ý+ÏÝa¤«¢Fýødïú._K’£†nGbÁà[P:ôËÚ¶¿ÛD±²¯ÉÍ. °Fp·ã£“Z –—µˆÒ…¶ƒ@Á‡æÿgxØ%:Xœ]¼þøáÅÉÇçóW ÝwŽ}ý»‘»‹·¶õ~fÏæÉÛùÏ0tdÿ‘ýCÐú¼Ÿq׸y4+ØÂ͘KÖÚÊ;"ÆMÐZíº9á06&®·ög¹xG~0¦(ŽxŽEáˆÇ:{ù…­nŒ´­§®½«a®Ã͆֠“ª iªüî<×#דÇÝl›Ë}×Ä>_ƒ[Ó"=~rÌ¿^b†|Ž`mù|þ¬6Ó PÁ_ŠQ|ÐÕX—r©ÐD®––FßIøi#*h·ÝJóè°#ôñB×SG_š¾ël¼Ô õíÝûô ôƒ¿68áFŠ™dÆ(ñê–³´\•ÛFÝ×ܳ_e˜(Û£ôAÚ+nËV?vÛä°å+ZKönÚÛ·Sä`-F[;ŠÞ×¢ñ„¦¶îÃsXD§³Ç'Pf:=Li_C¹Fendstream endobj 964 0 obj 1416 endobj 973 0 obj <> stream xœ•WmoÛ6þî_qó­mlÆ’,Ùj‘]Ñ ‚´]ÝíCQ ²LÛZeJ¥¨¸Ù0`ö/ßI½XJ;AâXä½=÷Ü‹>Á„90¡ûS6Å`¿àïfðiàè+`?âü¼Àkž;ƒëu`æ@úÌ…Ånðàâ d9à{ÈJ•— ®®oa¤ž\<^ü‰ªÙ7t?Yà»Ãº.\ÂU)^¡ð!’›»÷î‡ ÷Ãܾ»¹9áøøGØp)3y(Ô ÿÁ;qV¦+™ªä+³dñ)œÿ ÔbuŸ5èg.³˜ð(ÞB"H‚V\I&ð;¨R rXß_£E<½œ<ƒgøy~~ü»òUm¸Òñ6ò"ÚñZ Èe"Ôú –å]>+ÞŸ­>T^9)JV®5 & Æc„öâHPˆöùˆE’Ã*m;5œ—–Ö¢|H€¥äÑǶÙ]ô‘ƒÚòN4ôDò5—\Ķ‘Xa.}ÐB»å Ú¿ëìu©tvGpõîökü3‚ðÁ&M¼Œ±:øËŸuZÛÊBãÏa/Å!V«Dl=³ã©ñ+’´¦uàí0ã4+LœÝ¼ŸèxA×HG%ü~P©ÌÀq¨\—ˆD¾&ŒäÒçh—§|ÔÏ(u|…_e¡,¶˜HM½¢Œ)òä®ïM-…L+RŠ8ž5jõ÷ƒRReU&Óûʸ1`î1x¾V\Â*RQ?¢Iâ9—˜ÝÙ56õR€·trP©uí!ï5ШË)—wÝ×EeBÉ,MÑäò ÿзá‹!`LÃxX)ße+…’tŽºèª¹¼°LÝYÀ|¦ÔwwƒéÌѰþ–Þ~±ý6Ô«ú/*bVä³@7áªòPš5\ ¬`â}e+%%¯Œ§nÀ¼‰cÄØ ¨J[åÆšÔ¾ºÎ¹—ùþÔª‹Ò}t_tMz›Í桽CiG#pHg#Câf&c#›çz¶ÛŠòåyšÄš‘Gãy¬=/‹¯;m-&&«x["HŸJ^¨BÛ§”·È¡'^E«kŠd#`x^s¥36Óp—2Š?b[ £ ®2yÚflOª ô‚ &xfáÁ楢e?oæÍ * ±ú72Ú¬ÂñõZX•*I“¿¸FŽë¼j¸ Í)ŒHio Ž%²ª<ÄúL³=ì$¢N 1²ó©%@½U¸N½|o Z`÷"Å/{y‹kD-LÅÚìq±ý ª`a¨0Œß½7B£8‘qʾãŽè×™? ‘"^1Ý{~sÓòÎ}Uóùÿ¨~pXü®[óŠ² °–MÇ2‰Ö匔©úˆ7ÌØÌ7Äúß ¼y8aS×|ý¶&‚š0ç¤)`ÓNɺÎÀЧX–úi«2J5oÜ Ô:ÞèËzaAô’´7£‰Ó ÆÛ\¼¾xu2…ú>àþ³Mpvò;.Oêk‹EÍ©íÓ”=š1K—¹øòHuÄí›uŒæ[gHéF@ü°½ ?QFPæÕ㪂[I_r=´¯›é‹ÙØ"«FÙiYÖIÏkm˱NgzœQA*Ë%ÉwQ"訥Ypʲîqzzð¹q‡µÇä‚¶;ˆõ.Ê?SSMÍìRÛn>×›O™ç€;ñ¤¬;Ÿ¡"ß|ý6Ê¢&6ÕšûòQ/}vðíµÕƇTa—uÄC@ Õë=c'˜i•cÓ…¨1žl’£ž&Ü ;}µ.òç)îV{ö'(ôv¨Û a(D¥Êvx›õÆ“?ÍúÔëðNÀÂÀ·Í{ɱHzýÝ YèMê!yJð~èÞ4`ó08 ÷dzïÐoWMVíJþ ôÐ$ªÆ`ï}•v–ó>¦õŽ——è²}Ò;»ÈmBÂõKŸ…˜iž  µÂöNïVK}oÑGƒÌ5Œ¸lLp[û®mjó"Òd~3øz¤ßendstream endobj 974 0 obj 1585 endobj 981 0 obj <> stream xœAnÂ0E÷sŠ¿©q=±M—¨…Vê†Ö€ÄEªb$¨=~ãàÒmåÅÈšÿßÓœ C§—géþMæ%ö|‘Æš,k˜[Db3sŠÍõÛÐû°ßÓ‰xD *béGŒ3ü]Ù ËCS”ƒ4Y·è[¬.‡¾m›Ï¡9bê?éÉÓ&‹ÜÍëœSÂÞÿ;’r#éWür¨Ã÷¨Jy–”/Ò~ÈRª9|M“×m×ãr¬·}¨ðªwá ¾ƒh]æ¾±p©.3VºF$÷úvΆ~ O­endstream endobj 982 0 obj 218 endobj 987 0 obj <> stream xœ•˜]Ó8†ïó+,q± u²þHœ„;V0+¤ÕJÌT+­Ð\¤©;ÍÒ$%I)EÜÌüò=¶S» ‚ú#~sü8>çØŸ ¡ú/þVMôû ORr?D”ü ÿî£Ï3ü©òÇÜ<& ËÈ|Ù±ŒdŒÈ<%™7ÑËë]{]oÔðš@iìºÍ@Þ–cILã«ù‘HÈü¯èåí®iÊþðê7#™Æ´$gqfºçëz Ë®Ú5ªÉR U_/Ô@Ƶ"K­·=²êú¦òpý~~;#eß—‡éË=Q_`ÜðHÊìÕf£õP3jª¯ãwÐþþæææÍ¿ßßýóîïùíÃãlP•~ÃÝGx T‡;=]: 6ÓÿU‘™§,G|ûµê•1õÝ<úåI§$IÒ"¤™ªY'ÉE³<‡z.ÁœœSW¬¢œ&qθkÈ î t5£ZE®š$1Xs)ؤjŠ :½Ñö¡98зµŠVÏogæoçBÀ8ÃôvÖ õ®õù°$–’ðð| °k»µ¦ïÛì1óÅè>9Á2Ÿœ< 'Àtœ£-zälÂÁ®fT'r‚ò€Ï §j‹9ìCsp oëåäx>U“ƒ¯ï p4‘gà´€§U;˜½ó9–¥>9VЀÓÝMÑ#gt5£:‘c’ä¼ UmÑ#‡}hôm½œx­Âƒ={F.a­òŸÛ5 ÕŸ±£Bøìh’쨤n–¶è±³ ˆºšQØQ–ì(M'USôØašƒ}[/f'ŠBÇM`‡¾î”_~‡I_Ùb ±.½®¬ã>a'ò‚yìDA¥ÏN`¼%ì°Áâq±fU;‘gÒg'r)œª-Ù¹>´ú¶^ÎR—Ô°sñá^ º"c!=ZŸ§—%~¤™ "…È2)°èѳ ºZâG ‘‰ RˆŒ³I•‡‘Âõ¡9‹“ê¥ô2†‘ƒê)©^ÊÎ@6%¯ºÍ®i¯å õà˜,ÊÙ¯ëjm’»¬&T’ì#A…Œ©1™.Áa»¥¹­n¢Û ,¥X%g–>ŸŸ- Í‚ÐAó0t0:…[ôÆ6 {èjY:h†šL¡Ã½…Á>4'õC‡S½ta€„ m×^-ëá~Ú:xlêa4ñÊ]¹]qN®l ‡ÿþÉ‹šz k§ïv´Äé­ f»]‘Élˆ ÜÍB¹ì T@O?[uMSÚ#Ütµ©[ȽåÎïHÛÖœÝ=^±âx]Ôuñª† ?ûçé@Ù—jUî6ã1¼†WHf†Fò£¸û%Áã ô…°×OÖ­X{ªxJ 5ì9 aylî±ì™n`”'wOJ讯ú?2¬u¶eŸ˜BxÀùúZ?:;˜Ÿ8ŽAuô×d§dÖ[IönLf$7‰ `1Mák‚¯X˜¯©`Óþûý \rendstream endobj 988 0 obj 1799 endobj 993 0 obj <> stream xœ•WÛrÛ6}çWìLœÎH,AR¼ø­+­ÛŽ3•´3?@%±¥H…£¸oö—wÝ‹’IØÅâœÝƒÕgð\ýÕÏìà|÷Á°k~À;ç³ÃäÐìoWrY ŒÁjë([1ƒ(õÝVçÍ]-r{. ¨àÀ«'øX_¡ÝçeÙÂsîîÜdíxµƒ—l‹2¯ø!oáеÖ9äUVÖm¾!'Ÿ;tÙ‚¨áØà(è>ÿvõ‡ÃׇÕ/Λuó?sѶ©j+Z›åm[T;¾½’qGÀbŠ;¥Õ»ÛÕ=ÜøS0o‹Š7O°âë2oµ‰9ªê­~Ûçù[®œ_N’‡(&ù^‡… "±PÓÒ¹¿FôäzÒsC‰å»®zÌ«ç¨ñQ‚Œ™à‚S!öu'ð>=´Ç<+¶EÞÌ Øä[Þ•„æž)ê ‰aY×§¾ð²Øs?•;Ï¢çMA°øäéØà‘ùñæ£ ·ê_·ÈQõ™Òj¶¨kdûT ?à¾t„ò¯RÔÕˆAb9ž)o,º$>‹ÔMÓP¢È–Ÿ–w«{2¶1 C<€—ê5€Ç3+Œºqê÷«›å§ÕkN?ÑkfPl¡®ä1¬“òkÑŠÖ…Õ¡œÀÛvÇcÝ`®k±—DIhY„ùàûl‡ü”É× üŸ7ø}Þð'ȿ䕀÷³>ŸöE¶Ÿß „‰—åŒH=Q±÷ß¿ÿîÇå÷7´ó›Mý"S¿Ï]¤®n6hÙÓ¡òi­_Pât*Àž(Ë"+Dù„û Ú²Ê)$®˜Uy÷dأ⼘ÜÇäžÒÇzÛÖh…©fªøZ%@àÇÊÚc$-è 0okw[ˆö=«¾QÜîÏs˜¢ó¦.ƒÿí2PYß×":´ý°º}Õ•v„Ÿ-gO#Õñ5ˆ+ðf×(3L­·òp Y™¦Ê×àÿ¹psW~ÀjïúUËßWË»ûÛ÷w°Ï9¦„ÍØ‘7èO(Rø™CTkLÂ2—^Šj“=‹e´´Å½>-?  ¸ð®.ËúD¹-—fuE‰û´³IŽ´T$ áˆÓ‹P•S’ìȾx£ÝX8²XÅÓ‘ÆT2õ‘ê «X]Æ›â D£•b–ól/£Ž7b±­y™ËB+°].×Òƒha“$žMºÈ®^Ò£†éú…æUš™ôÚ“`ÑØ¤AÜ{•C‹týM‡£ íX/'=ðÝT’þ@P?^?T4ŽžË½~Ùøx% nzRuº¨†6ͺ©$#“F y\wô#(+» Jô©&åo8tÈãŽn%åøùêãÕ¨&ö¯>]½œë‹ÃÔ"‹ÅQh“Åâ8Ò°êá@–~¡ø0†f&½²X„6Y˜[¬÷*‡Yæ›GÚ±þ;YÑ”,SaYoÏ‹*v17˜)>˜Ï “ùÛÒlÏ›óg‘Û˜EØQÙ˜E´>Z˜©mhfÒkÙ6f‹85^ÕÐÂLSáC;ÖË1[Äø+ž0»‘‹ï"ÄL#Æ" ¶ Ä‘$àÏÙ‘$°°—=´ -I0†f6’Ž%…½$è¡…XhIBohÇz9b¡‘„ŸÎ[ Û Zÿh£^‚ã^‚}/¡‡ZÕKC3õ,÷Ìï{ =´Ðò­^¢7´c½-ßô?Ÿ£…1{AʦˆEá?"ÆF}cã>ƒù}Ÿ¡‡b¾ÕgC3õŒû Æú>C-ĘÕgô†v¬—#ÆLŸ±üoÓɵ-k> ѵÁòcÉ÷¢^òÕÐK½ÐxhC3 F’ïùcÉ÷X/ùjh¥¿ép|[ò×KÁò<-ù7S°Ò(ô" ,W¯‚•¤®Çz´R†’1›ØSŒ6Áït03ð2o&ÆVÍŒgƒX’l=bI”öžÍxÀ¬ÿª¢4¶£˜/F-‰´æ|´Ðg¶æ÷÷ä™ê£UC";[“ó‘[´KýÝ_¿^u„]endstream endobj 994 0 obj 1971 endobj 1000 0 obj <> stream xœVÛRãF}×Wôl•-4£›¥ª<°Á$¦²® T*ƒ4¶•ÕÅè‚íÇì—§{4²ÅÅ’FsºÏiõié,“E¿úeÆÉ w\˜W†scäø¦ ^à9¦ ÙöÒL'€‘íšl4Â뀙#q«;Œ‘å˜#Æ»?à=`w¥¢FFwé&c°CÚÞ6ª:Ũیí=MGû\#c†~3 ¦ô>D|ž* f:3Zá ±£N3ãøû§é?j—¯wùfàpàÎilÃpM^%ó\Æ`óá}RC’×ò€¶rrÇäj÷iŲNŠ\¤´KÎe "m$tY¶\˜c£³äÏIx(Ó³xG"9ÜKX–r–¬‘H]@½Po–’ΓŠp@û‚d`Væ,©«¿ÆßÇWÓoÿ®ÃÉ`ƒU-ê¦ ‹Ÿ:z"‡sÊ€à䲂5ÒŠa¢æuE­Ôb…îô™;½âW&`ü¶èó¼)Qr™¥@’‰¹„8Aõ>‡ª+¨k-v¥“Tžj)£dFµÃ½Š2ÆGF{dšÂy“×E‘V°(V¸ˆIÛRaÒ{ܼS«‚øªô&LrƒeJSÂᮨÈiŸ"4Ã"ÓÚùdú C]N®Nðÿé-ü›æGu“íÀtÇà™$z¦y±å.c]V4)2AŒàƒ *§ÆWmf{µçm×±ý¾·]Ç ´ õéÎÛz¡µoì®TÔÎÛ®cù}o»vàtQÛÓ·»{šŽö¹’·÷ûÚék×™žòõÍ韷áEÈBfYª—û•à#«_ ¸O*a#•޳:íU¢]Ðb5°»RQ·•àžû¤Üå]Ôö´W }OÓÑÀ>×÷Wýá<©„eµS«?°î‹z¡;i³›»^+¨±á¢"m²ʆ¸,2ÌAfY¦ªíÖ‹WŸCêFD”ò¡IJ2E覥ˆã$Ÿ“·½ ÚF¥Œ°õA‡„|Ò¶ðV ™ÃªÄ5DM E*á×¾«ºl"eª–"&Ò4“¸Á9¬C뉈!ç¥DF‘(%dMUŸZüÀ4j’FiKmÚl™¤²"o“;}ï?áüd,í†éªf¹,*C­íqzˆ .îQËG…kçůdM"tÑw ZK÷†2gÛ¡<Þ]À/pt ώྈ{™ªéƒ…OI³vèó?n.[4›¼†>µhß7ý„¤ ¦¯ü0D^&X±Æ–Pïž-êôv »Qbý Š4rÅòî;müÃÚømü ¶=(Æj³ËëßOߥÍþ6Êç´ù^EîÏ×¢ØÅûó¹ 9\Žß“¯E±³7æƒ^BOAÏ^8âpÂÅÆoLØkïCF؃ú#ø­¶N8¬Íÿ°66û ¶=(Æ_ÕöêG#~U—b¥Çí G2}OÕ‡"ÎJœœ8W+‘ák‹è¯Š[`!å¾ï¼CTÐÞ†|]îðÀCÆhHü¼½ž„êÝðlpvŽiËÙíñŸ-yχ‘Ši3ÓrñM;¢¯zÓöö#ä«ñ­OhÈendstream endobj 1001 0 obj 1244 endobj 1005 0 obj <> stream xœ•WÛnÛ8}÷W~i ØZ‘ºèC²Iº^tƒ^ŒE‹ XÐmk#K®$'Ícòå;$‡åx‹Ea^fFgg™ïÄu(qå?üM·£ß>3? ëfä’÷ð=ú>¢Ê„àOº% eJÉb5Ò¾”D”„ sb²ØŽÎæ+RVD<ˆ²%ÍN¤ù*Oy›W%iÚ:/×$oH^¦Å>yÌÛM^’v#ÈÕßW7‹/Ï/¤Ú‰š·U=‘ËzïX´¼y»øwD=‡‘ŇÑYËïÁxUW[åñöB"Ò0r\æØE6:Ó_’Þv2¾ï¸ÔMІˆò!¯«r+?üÀëœ/ 1#ÚÉcI¤Ï”R긞O¦ŒÊô¥#iD ΘÍgÔ|Ó?ÿ8ŸÍ'ç³?'‹ù_W³ËÉå×ٕܹü¦~LJ¸˜ÎK³,WÉ·¹/«GI§Ì6ã-—ôîÓv_‹ É[Ér)RÑ4¼~2æ=3!$ªÃ{.äíF˜¶(³œ—¯ $Nâ3f¨©êL¨“¬VÝ×ᛎp&ÒsêyØ'dª\7 kð„Úh{ȪÔew–ùú8*ß7€VU½åí„4„æ-y$å%I«òAÔ­Ì^~±„ºyh,`UÑ”†‰úbxWðVZ:d±‘(›f˜+Ѩ ‰\ÏáŒ/òR²¼5Ò¥Hù¶yQèíU.—åä2ÕÉt$NU\‹5¯30o$¹=ˆ‹½F\VåTÅÔœ[ñŸ»ºÊö)ô”'_ö%y¬êû¦Õ³„ µàrŠàŒ“y¹ÿA>þ•"²Fò´ŒO­˜6|·P ­*ÀDã/ò¶-Äa ÀQ…ÍùDìԔϑšëÏôö©9Ó€:> úB{]¾Åþ Z߆9^uåz/ž€ȯÒb’VÛ-/³i‘—‚¨*0âóÏÅüýÕÍåüüÖua¸žD¡Uh‰fÇT¢‘5#`Z@É`‹¦Á"׉ٯWx›4›j_dò ÆÐïblzÀ DìŽW¼hÄxB7P ÅO!QèZ¯Ó¿_‚£¨tH\d ™‚-À Jé#Àk°?øvW€bqY†²iy*Eë œ—OXÎ{¨Çõ+ÖâûAŠï¦NRìê[sLúZ“|ÝAÁQͺ7ÇÐ|¥Cg8v«Zdäÿ·C#vPíŒi—wfiŽFjG-Ìu'»°L¹ÎA‹¶@ ´ëª* ”õ¬ÁÀh4dÁeÚFdúÇë.\i*2Ǻ7#ÕJ¾ò¸1²s^×ü‰\KA;Ì…:ѱkJ¹å[¾Í„\ï˶ªŠFžìºæÛF¡+òe •e$ @_ÿBvk§vZAAÏ[ž—ÚΆKHJ.7Õ¶‚³Õ^×Ï¡.)KK)ÓL&{µ}Å~äÄsƒÀñȶ›BÂ-{Cãæ±|âÄÌ5ÃtÃåSf"xõŽf¦¢¦#3õáÍEIïÉ¢.ªBÔî‹zá £5­Nx¦%øQ'QÏ4IÃíùçÏçßž/SIÔËj-‹–Ñ=),a±M K|áã°'tÞÆÑÌTTC ‹“Ø&…Åq`¢êaOŠÙÓpŒ£õdRXÉÚ’òr§d Ä®W,xÆÈþëè’½ƒj*ûgöŠ<Ó"χ7¦Mž„&M=´ÈÓ È:š™ŠÚ‘çƒòÛäù.í¢ª¡Eî!t´±žNž'Ý$y·íÓNÜÝfù–ÞÝ:ðÃîngÍ}¾»»Õrz„QÙþšUí Œ¾b‘&¾Ý—4 }I“Èô%{qAeÍÌ·û’&Þ /iB£.*ö¥ÙC8žÕ—]ÔY¤‰‹}¹$Ïñt ø}Ùäët>Ýðúå)±k÷%é /i왾ġEŠ^À¼ÑÑÌ\»/iú’F‘éKZ¤àž†cm¬§“…Ø— y¦¡bð¢ÏËö5#aHmFBð¶ b×C‹½€I££™©¨#¡ áÕd¢ª¡Åî!t´±žÎH(AHFö#]ü„š€Ú:Do C4ðáТF/`öèhfÔÖ!¸¢~bt‡5¸‡p\K‡º¨§RãǨC9yö˜¢æ(^Ù\xÞæÂ—ðµZ\èLÍLEí¸ðà l. ¤´ºfä9ô-6ðœ0"±zĺ‰ãpAE¾t€ *ñ;¾>þg}Ìsendstream endobj 1006 0 obj 1739 endobj 1010 0 obj <> stream xœ¥X]oÛ6}ׯ¸óœŽ&Q’%°X‡Å†¶~Š>Ð2s‘%U’“ø1ùå»—2åÄŒµH¯{xyxy©ø!ôßü-¶Þ/_XœÀmçðþÜz?¼P ó§ØÂo 5,…0„ÅÚÓ¶!¤!Ìsæg°Øz‹€•܆Ð5¢kYð^ÖÈZñc'[±šÁr×ÓF­uCý¼^­`%Ö|Wöôµñàº;Ù¼€{·øÇ #ŸÁâ“wq$ÐC¿¨V’WG`¶,LË)Ô-L—Ó0=bhÓwSï¢ß7Ö8”š‹]ÛŠª‡-/6²>à¿nÖPÕÀÛ–ï_ò!«¢Ü­Ä d¦ í×/þ~zF‡EËûºQ«î:Òó;A^ \¬Ûz« °‘vknv+ü8žç¸c‹•w¡&"Ý r?ÎòÌ Áß˶®¶´¼{ÞJ¾,q}qáâ‘o›R\FˆX 9\¦¹ŸGó.YHñ@(ÈTí£óßôÚÚ$dÏßaø÷3,eßÈÇëˈ©=¿Æ*:¨ v9 ¨O¯CùqX¸7 píÜ)„ïÏÿáŠe9ò6‚ åkz «t¸y›×¥ìûRh¼Nô¸i:Š`2òmòÚŒîFü÷úGÞ›ÐJUÜÄj¾ªØÜËên¶üVÀWQP˜vf¸ 3ŒTüU×°â=‡µ,<ÑÁkꮓËr?î7‹¯m¸ªžaÃ;<ªb8Á”M(Ö+Oö˜?CÃÛê5",[^܉Þ=!¯žþ]‡'z'Jô¤ZÀÑ 3ô|›óÑéÕ½8DÌ2;9&Š­šiÒþLM¢™R®?ÎöPÊ­ÄLCWzjBÅCûaœÁ¥vý0'RÓÁƒ(KúK ˲.îˆø5/zÊL˜uš¦ÜëäÅ{0†”Uê¼²ëç«•&€W{µäÁU”·ë QBñµÜÃÇ]Õ×uÙÆš¶.îºÒÖ»3b7N‰”Žõä´\ò]_&¸ºväº.Ëú±¯ò÷…÷ÙËâÔO XäG°ªQæÇ9dQâ‡Y†õ„rHÆ[,¼,ˆý ƒÛ4¤(`C[S¨…g«Aæã[Ë(σjŠˆjf´}ÆcèúZxë3$62£cƒK»óíq\=îÙÚùï*;„D†ê(Ëç.!QŽY×Uñ@ˆiÐk¶†¶¦P-!Q6ŸÉ’È¢ê¢Cˆé3îC××ó Éb´>‚|„3då4)) œCJšÄ#RRôʸ¯‹)ºÁ¬ÛÚšBHI1Ô]RÒ0PUÑ!ÅôwŒ¡ëëù¤¤š‘òþ!Ižº„ÌI/Bæè‘q]BtƒY³145:’dlDH2Ï-ª.:„˜>ã1t}=ŸCí@Èû·#$N—Ùt ‰3f]×E‡Ý`Öl mM¡„Äxs ‰Y: ª¢Cˆé3îC××ó ‰C?w ÑThÁaxs‹Ö"i3ºSþºÇÒ‹3È¢‘–³h¬å,´ÜZ"GË­¡­´œEc-glÐrSthaŽ–†®¯çÓÂÆZ®Ø ^NPŽÔœ…c5glPsSt(aŽš[C[©9 ÇjÎÂAÍMÑ¡$tÔ|0t}=Ÿ’p¤æ¯DʉœÍ‚‘ª³`¬ê,TÝrGÕ­¡­TcUgÁ ê¦è8ª>º¾žON0Ru¤ä-'ó÷!‹RR{Z—5ïŸmW)[ngê•§~³(¾@a»ëúQö¢\/ÊN ‚xlZºåc>]Õbü-¦ªécȥʪ?½HÄøh)x'0£*Çßü¢œT0íô‡>+Mƒ¯_ó`“·½¥&Ýn;Áqn žð{ÑbÚž„äÉàÓ¼ÊäÙ·ïÔñÛåïVÞ#Ҽʠ¨ëv%+Þ#…¨ƒèݬéy½¯wð »ûÄk6ûK×tFr„oÓi3µ¸’#ßņ+ùjíƒçÕG'pûÔ“_}*k¥Eæ¥{ü…F=aç)dêé…~`”`¬‡*Jòd8OŸ½Oœ7Qendstream endobj 1011 0 obj 1753 endobj 1015 0 obj <> stream xœ•WÛrÛ6}çWìä¥N+1$Þ<“‡¤iZÏ´n“¨Îxü@Q†…¤b+oö—w,(в2±3â¶»Àêìgüõ¾Eí½xÏD›Þ `ã¥"ñ#ˆÓ8õ9Ôc7å¾È 呦)ö³ÈO!em^? ™H2æÚžF-<Û¸†p°Áˆª›ˆ:îhæÈ2t}-¼5ð«÷Ù u|@Ÿ¢†× Œ‘³2X¬=wGSî3XÔÞ¬ËJ^ÍÓóy2Óÿo¯Ÿ/þó~Yxï¼n¼˜é­bôBÑb»Q¤¢‹Cr2Žt2Û,¼(¥àÌ@”0ÇÐö4*®¥.‹Tt˨ºYx‡Í¹c '¾ÞGïÃ÷“’ yøâqRfÌТnL¸Z2¦(üÝ;{½,†²m ÈXJè·²(×¥\AÙ@Þìáí®Ú¶ê5.4y-}¸XÃðQB»•]®‡VÙæÛm¥,±7|ÌcQöóü/ä´eY盲Ù¬g ¬Ñˆ´{aPoʪR¸»¡¬Ê¯rõÈÆˆ¾Ýu²ÚCC¾¬äCXÜùL#S˜ÓмÜ4m§°q%ä㛚vP{m³ÞõÔr®–8ô³OQ­X·­¿.‡þŠ]«Pƒã‰gzêÑCX ë¶«e7Òß«8E9ß6+·ƒlzåwkxx{±ø YöAaTù0L0ôP¨íÚ=„eÕŸ€™£ÂCÂ39šRqÙÒçië]? S5^µò@ÝtQ»GAÇ6è”ùAÌðÞ.VÞFôðj†ÂDœÑ}á íÀ.³8"ôyXœ²YáD>K³tÄÙÕKÙÍ`¹ ÇkÕ+&ñ¾(³9˜ŸDÌ ?¸~%×ù®ÂƒÞm·m7ÈÕ9ŒùŤ1‡±“rEÌC7åŠXpJŽÔ<¤\0YÕÚžFµ)WÄAè¦\¥©E5ÍCʵs亾ª”{*³8ìò-BêÄ¢ó Øõ ". "Í&$DA8º«› f€â$CÛÓ¨# "Ê&$[TÓtH 9r‡ ]_ŸN‚>,—†Þ9y{LçÌ%ƒãÇ%ƒ£7ä¶i:d˜Š— mO£Ždð0™ÁUƒPuÓ!ƒæÈ2t}}:,óã'ˆ³À%‚Ñ„&ÖeÓtˆ0+RÏ ŽD„I4!"Œ™E5M‡š#ïÈÐõõéD`’Ó[A ò˜Ž@¸âLñDœ‰ ±âŒšf€"&CÛ®8Ÿˆ3°`DeSqfçÈõ©tàcf<’“¤ð,pÓ'ÏØ$}òŒÛôIÍ)4`ⶆ¶¸é“§Ù$}ò4±é“šRìœqǺ¾>™„|ðTNÓ‘Än"åI2I¤<Él"¥¦C‡ ˆÉÐöb7‘òDL)Ox<¢òi"µsäŽpéˆúT:æ&RK…óóž(‹9c0çBÿ¿.­„´œÀNÞía¡´žR–+¸l›¹žúå‹lx‹°ý‘Þ ýD«¹Z ¨YPñP—߀Ô`VÁ}‹&ÆØÍ½!Ùt'ý?ƒ]oåJ}ª –≆!Ê|ŒNw«oˆûcÒPÝó€û™!mטM·]»éòú~å ønmС¬ÚöS¯‘óQ„vÖD ÜÓ Ý@'û—wW·¨ø®Î‡ª.ýÉoϯp¶/¿^ãßìj4u~˜¿?¥±±šYvyñIÐï›!¿é˃\èx‰"-7ÕÀ®?TBF\ëg w4¶f×C¤½+°W…0ZHG_×àð©/Í7 \ /áNï sãÄý ÚYýÝ­«E8¢n[¼˜°Ê‡ü~Zƒ|ã'¼awh(7xTÖøT•Ò ¶”lëë|/k´ÿãâr¦>¯þ5V‹7¯/.á£ÌW²syÛæx«wFzo;ÜÃ*›CÁ3y¹a¸n«rɬuØ6X¶Èÿˆ¨žÉx¨êݨÚP•§}¿«MÙº”nd:VKœM ŠOêŸ.ú¹×c\]‡j> stream xœ½VÛnÛ8}÷W ü몖â$<´i²Mº·H Z¢,n$Ò%%9~´¿|gx±å\öqÄ&Äáœ3g.Ô/E1ŒèÏÿ¦Uï÷d|sÓÁïø?ïýêÅÖüOZÁç)š&'p Ó¼çŽÆpÃñéQ”À´ê F’/ôÃLÈT•ælýýëíÝð/üÚü|7ýÇ"@“$¡s×½Òðî ë=‰£vç-“ñi|”X¿“ñèô¼îûFÕê‚Õ°R ¤L‚ZÔBIV–+0 žŠ|…û2QqipÇ€Êé‰á€€M…j…Ë–k;B³­ìp^ MÍ`Á4†‚š8ÿúíâÖè™÷É™N tNÁz‡/b)'ŒK&JЍ.†(‘^ôïûVþ¾s®šyQ[9\1æ¹j¤«ôq(•z4–‚wHH©’5Ò¡a¡¤6’NÓ¢A"¡36`ö¿\Lƒ‘[¦K,YÕÔà[ÇTC¯¸çI˜Jb‡¹“6DÏHu#ÞÜ/î[‘–¢\ ]…¹ÂÁ`µZZ‡ZÌš+Iz4¸I¥‹ÝT±9‡…xâ%d ÉuµÐ*åÆD{lÁXrj †5S–P°Ö…e¨º×OÃÕÊš%.]À–•ë;z‚! \1Ñ™)‡†©®i ±T8GPlתۘÉ!td™­ 1!Òµ?{À/ŸæãÛ ¶N'oNÜÇ^«SÞˆ³íNžȦâZ¤^¬°_Ê¡Èê‚#®1Ø 8Œ7+{1»é s”Lz?¨”À> stream xœ­X[oÛF~ׯ8È‹]Tf8$ÅK?¤»ñÂ@‘¶±šn`ňÙlIŽÂ¡¬h‘û—ï9s!‡²³­Eh.<·ïœó2Ÿ! „ôÇþ–Íìõ‡(YÀ­š…ð/ü{;û°€=KÙö%ØkߣÅSZœCt$Í£#ö:‚ïQ/ÎÍAôe—¾P2Ož …Z/ÎÉF.¢ÄúIî ä-(Ñë(..—W¿üÇO?‚ìàÝÇwïÝV´÷U'ÛF´=ÂÕU|UcÌ P–×½èZÞW/¯×U{KÚ|D_é<¿µÅÔl*ÑÑ£‚2»©PSËEÑi`Uµ¼;@OFÈÄ:¾qOÆéqDSƒšÈf}˜†tÂu}˜Ã^×FÕ¶äŽF9 rÍ{ýa+Ær¡<ÓcÑ?m"šê©°œ¿kJw¥4Xx¼–í$¼}ÕßiU¯VUù8¿no^ÁŸâ°—ÝڕȪã埴ÕY"dkñöuó†"ñº'bA®õƒ @7Í5…hªó‡?ÿt5ÿÿyœ[»gqt£u<ÓH¦6:Á{LljÉuÌ[Y!®&l‚K¬A¶¶S 2ƒ·V‚16ƧFœæ>,Ö©8¢G¸Â% ß*ÐxÙ0LûanXŒØ±Rƒ¼Sb¬È.—?_þ[»a‹ÒœPM?W™ŠªËÔteõÿŸªk‰.Y|S‹/+‚|± ¢[®g§›]«¡<¦³$±ÓmÇ*–ªÜ+:º<$‡¹:ćÿ O$õ™Älñö`sCÕËM°:½³46®œ™  µ²ÍÎ!çvY–Ö+WR×F÷ͱû9 ’$qANØôÓJÖPš“å@¶ë‘t½Bר]fm{.o$aBJÙ4¤Ô‚ |` XyWm¿<Åäø¹frI¬Û1äâ×ÊnNЈ¾øV+] ]ï–³_f)ìgy‘qq- ÁúgdKïêÙÕ7§ä¨ØÉ¼R­'R=*O©|Ù $\6ñ•Üõ¦j/‡àr$¦0çZé™)âµG‘˜ Ž}†sš÷p±k{I=©vÛ­ìòF"ê¾Q=*çÝÕþfÇ/r=4•Ò5f%h(tâó®êÄš¬\p0ÙœbL=öÕe ·¢¯çp'÷ز6‘+y4(le{ælcýô¢U»:ª§=ññ©ÂKÃ[ìaÑ–Çû]'ëE{‹TÄ»ŽN¨Ð¶R ÏŒ}Ú"{AÕ›²#Kzº”rkJ2-A;K"+LÍ ½Ž­c Ÿ‹’òÛŠýˆ2‰ŽÈØJ l öZÅëÀ£ ŒÊ³«ÉÉLetæj‹Ákø n)ˆ íÛ“jv¤öÞå_¿ÍÐ×Õ5b­uš:T†0¾¡VÜ\Ã0MYÚ!¹#$‰ˆ 'øƒ¡¾VíúëÛÞ~zxüjFóÃãÜæâæÚ¦ïFó+²È‹yæƒÅ ôÖ„e—#XöÀàáÝNku`±b‘ù`±"I­z9‚åî¬;VÐ÷õÅ`±‘ÃÿXs‡•¦ì(ò試³ãÌÇ0ÉsÃEO0\°…‹Ö,= Í…É ÚÑ:`˜dñÃ$ V³ô0´wÖ;+èûú¿1LŸÁ0qŸŒ„áñ; qšFî †^1õ ££¥ñÃâ¹8I}äâ”M‹Ñu£YzÈ™ Žt;­u@.ŽÙ¹ǰӪ—röκc}__Ž\Ì4n¶Üž¼"5°ÔC޾ãh½Ò#…>ɱˆMHŽE±#9»ô3+èv¡OrŒå’c,s$g—röθã}__ŽK-ɹ=oÁ‚8ÎØ=óýPWªÿ ÃtB}a6¥¾0¨Ï,=ÍEÉ º]:¡¾0™R_Ôg–„öκ“øÔç´¾Â0²Ô‡¬÷L׆Iú¤ké s|ëz®m‹( â ÐòÊ]§9ÞS”n=‚çN @NÖî¬f_¢Fðåxê4»õàpk¼r²Ÿ_ !òe¢Ä™ñA$żÈÿAý¿Tî«/Í 7ߪq¥8\’˜ô£x‘0ÿ2û/c’míendstream endobj 1027 0 obj 1905 endobj 1032 0 obj <> stream xœXKoÛ8¾ûW ²‡´@¬š’¬‡Om±í"À¢Eï©è‘h›½*ÒM\ì%ùå;CRŒä<°ÙäJä¼¾of8ÊX ôëþõìÍ×0^ÂVͰeq,!É“8ˆ öiÄ9dÑ2`Y†Ï9 2ÈÂŰ,fÙ"2/Ò< OFk1ã<` î%£Äk5KÔê-Ú=çŽûZÌ6À³3fâ÷§¨áýÚĘʬ738ƒÓGøŒ„/ò¹6ˆzˆ¬ÚÔ[YfY@î¿Ü j RÒäM}ô\3ÂòdÌHÈØ„‘!qØÙåˆûÂîÝ“Õêa›0Â’lÐj—#FÜžóÎ Ž}%F  í!N –٧—“Áli]¸‚ùjSûž£<ô¶òÌRôrc¨)H¦dÊÈPÎXú) ̳ÜœG±©Âߥº<-”)¾ÏØ{¸Øw]Ûk¬7Úõ¡û‚©ã?m«Nr#Qàõé¤Ó$Ø”Xœ¹î5-Žõ°8H0 ‡þ²W{^UjÕ¼¶/eÃû”ä&‰pާ,%õî3Øþ’Ý)šÝب9yß±W|Ü7ºm+µ2=(MÝ4…9‹\ÄeÓíõH ßë¶FÎ ã˾)Úºë…Rx”›;ä`Žõ‚—g·AQ»×Md×ZC¤žÐrÝK­EÀ§÷+àðñ|}—6rÛwŒÂ"k°i{tñÌÜh;¾DÞ°bVxixEVúZV\Ò•§©+ÏY€;´DŽÚí붿•ÞyРëÛmÏk—’9Ô´zt°5ÉBÎ’9ZÕ J•”3KáJPQ©àDiäøÄ HkDð{¼’Û†k5ò”Æ]Þ<ÑQÿÊ"~†v<ΈqG—ûOQ0VµéN'ó¸Ýºhî<(š_ 3Ô3npy ü >~Û‰†Ò¬í éæZjJ Ûûü´1‡S0ÞÙ“¼R-hø’n?8ÿôa ª-®)šMÈw^ ,ܵx×¼ØÉF`¥æÄ¡Ñüfek/ SÈMÒG–`YQa¸õezröê̸+nxÝUâ}W¼çÐ+‡ÙSú†–@‰Î5œ¿ù j×î«’"íDO鋸èöͦok ×€ô aa:[X÷L?ÿº!T¤Óî›­‰Rlø¾Òfèk-aÞû¾ö<ä³Ñ­w¨–Æ('®Fpd kÎòê:R_Q±Ú=éØbºô”ñœšæ+(Çñu²{Î_´:ðögƒ…ÌÕò 6Rc°¥¨!03›xY·SÙÐÂ@UfT<‡Ò¶ÅŽ7RÕÂ^ ÑâBRVA‡>V•¨¨»Ø )‰m*]Ñ"Âå0»»ÓÈ*uÑVÉǦ}¶X1‹œ6ÔV “~v5W͸ý?ãËýµi53¼È’¥Ó\rÍŸ÷¿¡¢$}wÜ_K?%7éqlEâ4 Ìúž2¾‡[%&Ô½³0Ç´ –4„{ðºøíÁÍŽsWè¹7r×;‰­£Aà4Ý6~’ YHßw,Ë—8È„1ŽbxњǗ 2¨(HPQ¾pŸ%GcìD5ZJ³8ÈÃÿe)^ àéÈ”šcoÎ’Üœ¸ÿfy¬icáË娈ՎÓWJ-ê¯îG:´ú±êU»zõM–ÿ¼Å‹ñû·•’¿Ä÷§ŠíÝ‘%¶55J3?ˆ™šU¸ˆ‚t1L[dôöCœ¶öq`ÙȺ¨[¡ÞËi."ØÄYÒE…ï |!¦Á÷É6=ŒÂí5*²¹âš@¤ä2&­)Ú9}{ ØRè ]ôwîBG|àVRÛÒBÝ™/HïÎdè:ˆXÓ–ºûv‰†nÑd!Ê‘ÉÕÔä¹SOVÄ7ÿ= 9õR¡æ3‹4ö—ÌÂÈ‚Åçì%3±ç¹Oá/³%1̶endstream endobj 1033 0 obj 1744 endobj 1040 0 obj <> stream xœWYoÛ8~ׯä%)ÖeEÝê[mZ] ‡ØbÑF¦]îJ¢"Òqü˜üò¡(‰7GÈIÃo¾9¨™\AÈ8„ôç¯U¼ù%),MÂ<—ÁUÀ øKÕÀï3§–ç0[ÃZ9‡¬ŒX³&8³?%Tz.a­ê„µ²é,X sieߨV©Ô²]ÚŸ VV7ªJÔõ†Átá^êN¶ÐH¥[+TkÜcc{Õ.ádýÛÉäÕ쟀Ç,‚Ù'g³ult¿#—lí@áQz)¬œƒZ€²0×Ò@«-Èe,ƒÛ©Q½Uïe-…A}ÑΑv-iíÚÛxuœ-T-A¨jj즃ù W‘b/AÜç‚ê—’è{2“ý0èÁï=Ý^^­Tà€£Ä;zδc[‰–ÈþÙªèT‡+Ý4DùV1ÉA×ëe/ ~¿jï`eȾ3´Á°Þ¼%ì7_ã(‡’òqÊ!š8!Ä·[DÑ/90ÆHhOܪ]D‘g7£Ô­l·²°èu3„Ä#4+c‰®€kQ«9\Lgßœ3˜tç°j:Ý[ѺZYa¯VÚb¢ðý°²²`:QᣑÀ^î…Ýç¹¢”$t–¾ÇåT_ç`0Ç̼h:—ÃGb°Xµseº1xkÅ%.:]hÍÊš¿+ÕCÊ#w2þã+tŽx$@訑²AVµú—¢±Ôër.n0«éBíA2à9ĉƒø„%k¨^.0v澡±N.«ÖµÙ«k "Ÿ eL"PôñžQa g®¸^R%õÖ-ãî7rÌIz¼JÓjØ5ŽåËÈNôn£^np)L?eÓÖnÆ-".õµ'j7‚øm°¢ºs;ÁÝ~P'k=˜æ»º Žw‘»›ø¢éív? Ì…¾4²¿Æo”nݞ݌&}Dé;q/†ô¸ÝÆ‹D¯[z@s÷œŠóqyR¡Ýb‘MèäáÝiÿŠOè¤Wwn!ýñ×(|.Ÿ?žûŸ§ðà˜MÿxïÅwãÊwßÉ+€×þxŽpp<|=ºƒvСB>ü–I—eÎ’´H“$Oý‚¼…ä ÀbÊ-`’æ)K‹2‰ù°…ø Àôªc˜Åœ…q‘eüÃô¹€é0*1›Yñendstream endobj 1041 0 obj 1232 endobj 1046 0 obj <> stream xœ-ŒË Â0D÷÷+fYAcnhoS—‚ºq£äbÓ„€}-ü{›Z†a6gN­:eÛ:ÒñiòÝH·¥õÄ+‚mꈳ[1¸–þ_FÉŠ•ÀEÊî~œ0‚Ÿšpµy ³¾àb£µìÜ;9¤„M c¬²¦ÂArI‚@kNÐÅÑcÉ}+%þendstream endobj 1047 0 obj 138 endobj 1051 0 obj <> stream xœ—[oÛ6€ßõ+²‡d€­‰ºË@¬k;0´ñ›ÑZ¦c®åŠrlï-ùå;¼ÉTÓtK"Ež ?žC}($©û¬Ûà—qšÁ "øwÁ—€è)`u ¯—zZ¤€å60² y™…9,ÛàæÝA ì4,àö°ßwýÛ®‡ß»æÐŠùšJ¶%Ã;Þ0ùóòï Iaùgps{h[ÚŸ¾Ö DYˆÓ0ÖÃË—°éêCËÄu'Ê… ÒÈA·…aÇ Û¼Ãetßw5“’‹;ðì+÷`«ì‡`í¹YgÞ0Y÷\«zÎ!µÌ®k$yÓ= ]K^Ó¦9ƒdB2 bã\€+9`—ö›«ç\*ë5œáÈzïÞ/oÑ8I¬Á5j]«ÙG>ìºÃ€FÎP器cÀŒNÉ3:…ð^Àžöèס¡ý ÎÝj*”Åõ¾õƒÆ¤JÚ2´{cT(·”'01¿0Ü’¸€JS!a©ØĆË=n@§ázUó2ë_H>]«5EO¦Ï—N~Õ­~³V^èÚèEã~G_‘‰f¾j}ºÖS¶|ÏGªá½€h»G¥ÊxCÏ*’ ÜÉV«½WAE/”BPò’aômFعgý ý‰0t¸1þæ}|óÚS1ìxÿM ÿé‚ÖütCt_VyÙVµÙ´‘¬n1*öƒ„·ÃCô®§­ÔÁ2¨cVchšXiˆ 'Üó S…  ( ôSú+| &(¡§G`÷ê”jg^l¡ŠZYþÌÎÇÈ=«ù–³þ;ee^=¬Ní®CÓr¡ô´Xá°äÿ|¿ÙêütÂj1Nø:(bw’1Uؽø~\×bP‰¥»^>0 ãtvÖGŒÀ+*Ä“:uŠW$ºúvš¹µIÁψÏDî8Õ;³;zÏ4Öm×4ÝQç¹nN{Ã%zsNß.ƒA™aqEaíØ%Y˜VP&YHÊûq .ãÈ5렌ҰĵØE{‚®§µÖíX ÐýQ²(b§Õ4Q«³hÇŒ;NÐ÷µ¶ß©DŽ“«DU‚Zò0Õ•è/Àiƒ'¬Õe£á±a*ƪ¤cõ'PÈ”g¥(/’ UæìRLÓd^XVÐõ´ÖPž&@yZuÓdǬ;VÐ÷õå€rù> uCÅg‹‡ö:%I<ò*Yvò ©Œä>©,!Rºj×dš)ó°‚®§µŽ¤²ˆLH¥eé´š¦GÊŽYw¬ ïëËI¥¥æô›°÷ DejÑŽQÄc8I„co—ƒø€‰3ër9Ñ|®]JŠTãûe¥0(ÃåTh:R¹‡DiäÚu ’ r¸ ’x"j»Z³šmûY¥PŒÂIššM[͵fÝ uʉú>×Á.¸}HB”¨ÚqÅolȪhÓÕ­Áz>x±ëymoG ¹rÎ8‰'ÐÐØZŒþº¥™¶Í *£¨íjÍh1)&ÐbN³n{ÐÜ uʉú>ÿ4RÙ;5õÐq;>`.둦tbÿˆt1ŠSuÍ}3ª¢ L\Î&!ŸdÓö`ºACk5]£ù3*² Ì(GͦíÁtƒÖI'êûüC0•‹ÏÂÜP¹cÿãWYT©_/H•Oê© W/ló’í “èœ ë¥~½ U2©¤Š£Qk<­n̺“xõbÔúÂ,H*bëÅ:P[%L¦ó>¹¦MŠê»çA}©Á}Ïðkhxt©ÒeʧhñØ« x¼Tª™FkøÕM†ä6º®É#†BgH¨°ÙsÄg^X¶VÐõl†s]“ÿFÉ\gG­5·™s´hǬ;VÐ÷õåàs—4ÇÛ߆5¼åêî¾õN}É=­ñºŽui¦‹5á×CË爴3½kÚ‡Šë<Žan®”›àæ­¹óJS Ð‡¼€ÒÜŒ±ÆÌ«T圊'w üÁ¿æ-»endstream endobj 1052 0 obj 1501 endobj 1056 0 obj <> stream xœuVMÛ6½ûW ’ÃnYµ¤ýÌ¡@7í¶Zl›øVô@K”ÅF"µ"µ^¾lyß²-ee gæÍÌ›‘i'´àϰçÍì‡OéÅ%­ílA¿â»ž=΄†-oèn‰cYzM·´,gA5¡ë„®n/ã”–Íìœè-uÅŠJUËwËa#¾¡åï,(Iü5%ò{6ìöÝËçXûëtò„R{uòÊXÏXƒ|áå‹p [ù ò4‰¯o©ék§ÚZRn´•yïÔ“¤M¥œ´­È% ]P!l%Ù«¦!Lð |„ž†üÙû€~þòÜ4 BÖª±æªú ÕJŸÂ1R¾dÑsd,‰%Ê¢ÄH5YD $ÊÑ) +Ñíl”«H÷uMO¢îOAØ1¾d»c¦’Ý.Û ·c»Ý)o•…ìæµ´5qâ¨#Nd§¹€\v™â×”$LÞô‚ ËJ"šR€d¥#S’3_¤!‚õ4QÖYz†ØˆœXáêëÝÊFÍsSã`äëò$;§rQs¶lÌ ³Áág -l\t’z+ ²Šy)´4½­·@C¢Þ~}=4ùìHœ*KÙIíh#¶6¦ˆqÇG‚’Òkâ\{Me½¹º6è•ÒÂ)£_GÄàCT¬²’d{n…nÙ`êu-é¡m<Ø[ ÔÜF"‡ãþ:æó¿˜~ÒÆUÐeÌcpÀ0Næë\²“Qe hû¶5Ó0"Ë˜ÜÆ|©¦­€Š‘½ÈxÓ§Ÿïüôb”ìÍö9ÒcË~_2l´yEt}§­O«g E÷Í ‘\„Ñ7—¦ã©3Àó}#ÔƒœýTâÉml‡ OnÛ"˜? xâ*¡½ïIŽŸ\¢ĘîáH› Rਰ¶oPþ-kt;?ùtràðÚ¥Ãëu¿ø½°ëð,;ÞŽ^W”\sÀÙ…å#úÒÒ£y*1S~ üûSt¢±ß{ËC;´ÌÁûÀ ž+y0ºµ±[6,ýÔâŠî;iÓ)‡A¦wÜGèëjÌÑžÇ4G5b ªt|ÏÁŒEë¶\v? dŒ°ÌZ«¯²*ž^]Ó$½‰oÒ[š_!°bvž,2þ{÷Ërö>ÿ¾föendstream endobj 1057 0 obj 1166 endobj 1061 0 obj <> stream xœ•V]oÛ6}÷¯¸ðâ‰lÉnœèú­C€vÿ ÃÐq‘HE¤âzoÉ/ß¹¤dËn’¶HÓ$æýâ¹çžË;šE1Íø«û™V£é§dñšnìhF¿âûft7н u?ÒŠÞ­¼Ù’â˜Vù(øÆ´Œéü2‰.hU&qDï¯V×gÖmKI©©*©¥BÜKšä]+J²êFÓøí˜ÖÒm¤Ôä I·r»1M«ŒîEÙJÿ|Lí”ÑìV [Ðx:~µúwÏ£„VFg|<•oIô #Z!¢uJ¯‡š¶”–Œ†EÙVšjc‡µ$IÚ8’:7M*³ˆ®4‰,óǧ>ˆ¾a×rûêd4ÑRf„œkIw­qøCå\ÿ‘µJÓ¦PNÚZ¤X˜†ägQÕ¥<õ·ÌMYš "ú¼¸§Êžì !×ôÓ‚)í'dža2à( à©¯÷ó;Ȭi£Êò©1ÌÏ‹#‡øKÒŒL’oe>lçßÉz¸€ôßEyø ¼ãøÍ3cˇɛï¨=ž‡ú†êãEúÕ/Œìâ‹‘õ 2#}E;í)a'À¦0åŽ`Ì”ƒ iüj(ÜžÝ8í5wԎᵩP´üŒùU¼':¿)´¨Â*Ê„ä¶54…WE%x0y°9j!E&›ˆþ4­_[Ë”¹4Ÿq©ÃÂ}ôa¨nðJ¥Ööµ ¸å•Ãê Tê]#º–Š€kr6LP&ª”ŒÕ$“6mT »¾S¼ä¾Í¾šm醌VbÍ A×A3ß#ÎsÝÞù¹àÇ}°m]›Æ…kˆ^yØ š>ýü®Ûwü)wÊdw:!èŸôp/‡ë•úÑ Ä¾^+$ÃláôýÎ`£,k›>8Û'|-7=À,jAEYB·•ÄÓ± m²ìŸ›VCå†[ ²m”E­”vôÖ7¢»|×ì¤ ¯) K&|Ru‚ùãõOWWý2ëJ÷©‰Yl18…ü׉=÷üñ€i}‘BnmˆÃÀ †rrŒè=ÂíÙž|¯Ñå,Á³o•&Ò¸·ü;`Æ,šÇËÞ¢_&Çü ìä!„ûY¼|%ñ%ZÁ¯Ÿ"‘¦Ò†®!;¡Îë \¡_¶ñcàYÅT< &žVkfGZšÝeš»FÏ¡}È=Yœ[é,ºÆ($áÁ1]€Æ {'”­q%sòWò÷ÉsÏ~ŒŠµ¦t»,ì;ö-EÐ+þž«º{ï0§®t&?w²Eþî„>Æle˜½xŒV –Žá„”æÆdš­ÖªTn®è/è•î´#ãî¶<ÏöÙ{å8_ÒE¸ÜEt‘ içѹoZ<[0¤¿¬FàëšÙðµendstream endobj 1062 0 obj 1298 endobj 1066 0 obj <> stream xœVÝoÛ6×_q50$År>œÈC†C±bÁRahô–N1ŠtHÊŽÞÿ廣$Wn½, Ù²uGÞý>Ž~„q’˜_Ýg^EÇ·“Ó3¸wÑ~¥ë>zŒÒÝG^ÁÏY;‡t Yµ¹)LS8¿8KÎ!«¢ÃìúSö¼KÌe)ѾÍþ ISHSNšœ&È>D‡WÖÒ/àêööê3e]ÀõŸ×¿gé‹ëӔƂk•¸GÖŠÆ…`þW¨=(鼋œåå UCcê·QzÒí– µCèÊ3<>y(¥BÞÀR8Ø\®„ªÌÒK£Ã¿@zjÕ’À•¬–¾‡LÉkc ÒÑn‡øXKZ€k¢Lm<,ÄJêû~[áA(Óšt'Ý (éøöd2…w›4¹Õ”µ.¤[R÷†Ûï{pp×.ûå ,3ÀxÒu-,·š¨|¨jåå‘s… uO ëjŽ–ª¥90G‚Cß]Ù[6@¸ð{)­ãPǰ^ B–妥&ÄpËÙnù“8l$ õÀXlÅ‘…M”§-»ÍsÁŒ Ê%?ÝWeLìcÂs3 U›ª1¤&éa!-©dXuŸs+òô¯ã¦£€;ˆsisBõ,„+I/ÿDݰ÷»ý©C¯œ¶¸h©ÕßZÙÁM+ÓïéßAÑ(eÖ²M°ÊŽpƒÙsdƒÁ”Ó^úŸä/,²ƒP†@V†žÊji¬Úof;¼¨då.GwíÍ—Qx:£6½ˆÛÁÑ´â‚&}?¨2<›ÀVL­£ÎToÐÞmTY}»–Jmô†gÒ¶Þ¥59º^×¼ôkˆOJé]Ç~ßÔ›ÑæÊ÷e|õ?~´ïÒBF€xóµG õ· µ°7Ö:ϹS볩ɅL‹ÎU] Œ¾êO(ÁÚ€¹ú”¡‘b³€Ý«ì`¶ƒ'C #¾ Aªì¦%<×Z1²m·A+B9³ÕS±ùïXCã õðïØ)ÆM‹ Ó™o–˜î%ø8´=^ ápÛ…ª+à!šZ+ \ (HwÛ¬cÂb›è óQpÌ€!Æö¥ ¹oëVõí&GË0FÝÿÁ‘xš½º– Áï’Þ¼¬pöK\<ͮ㢙áL·î}_†vZ0cA¶î1lÉn°ð‡ºw—Ãç¡åãÈ’jžÃ(ÊÜ7aä GHÿ7`óº!<ìó¾p^Þ0Ó5©7æc¢=yl²M¨æ@'}υî´Éù.Âãóäbòަi'©t|Æœ_gÑôúuJê endstream endobj 1067 0 obj 1006 endobj 1071 0 obj <> stream xœ­VßoÛF ~÷_Aø%) h¶Óæ‡fIm‡50 È€³EY·žîÝ)ކ=¬ùËGò$Ëi“bÈ 'vbñÈ?’w £t #~µŸ‹rðÓ§Éë7°ôƒ\Òïrp;‹ ´‹Îfd¶?9„c˜åƒxt Çûppü&À¬ìäµÍ´_Aî\šëàw®'Éìâ÷Ù—û“iÒÐïªPü®é-èOΓìþä"Éš|¸Ùy5ûS°ÂxÌQö&Ø›¼f÷Ù`]8^Ó;dhty3¶g“ñ~krµÂ…Î@›Ë!¨¹Að¡Òv ^ži¬]em‚Þ‹¹6èSøt~ÿ_¯V® ðÇûf>rÇ1c¼÷ƒÝÞ§ö ºHŠÌ[®_Ö>Àœ‚9â”qÁY:d4ýx½´Œýâ—Y ï"Þ«reð^ílS?§Gü)º…l!êâãù)ÝyÄèdÒ"_kc$/iX¸Á³p6(m=ˆÎNp§ðy#TbF9Wر…YÞ‘?^ù{ùöÃÅž;cÜ3˜7_YpM†,e´Qeäjųš{´ ä²+Ë5‰¢Ó«„r]ùÀawé¸0ðÈ'W] z’ OÜaU‘˜¹'=¸­‘ú€åÞ"¶ªä ô¸Ç@ìÖŒáùÓ¦94®¦~1 êŽÊÜ?‚¡Ë(“ÌÙ@ôò­ \‚>PKzÊa¦ÖªSµþˆiÆ0Ü>N:íÑ=Q!eО^Û›çëâõ_ÂÓ¼ èe½½úy:¥êðÀ»éì æÚªª‰êò1ånåúžò¢`ËPDR‘ö¼´ŸŠ¡baº™Ó©,޳ s%õñ0>ˆž‘¸ñ§×ÃPÕ8ü{˜+ãqøkº$$»çüQ–îŽjói“Mœ8/+·¦®¸³¢æ˜Ó7S;¢&·&(7V›T«BšwÔbk ÉÉ:éέ#™òú‡„ÛÁUYŒ>ç‰kd$Ÿ`Ýè/²dÛ±J-Ô±JFÜʱÄ_)C(H D%ÁeN=vÚ ðx|Êc“¿Ž0e®hž¡ Iˆþ¿Ó®ö&JÎk„q)µ#•ç [> stream xœÍVMÛ6½ëW ÜÃn¯bÉûå9¤@ú(º1ÚCÑ´4²˜•H/I­×Á^¼¿¼3Ci×N\'½Õ†e“&ß›™73äLÒ &üî¿‹6y}“Ÿ_ÀÒ'ø‰>Ëä.Éd ô_E ?ÌeÙdÌ«$îÍ`6…ËYž^üMN;¯Í Ûø7°µ(je–<j„{Õt¶’-ëZÚ€³kÈžRx5ÿ˜œå9œåçió29-l‹6¼ùs\‡£ÇQ¥Oß“Çì1ÿKÖóòlÚ/ÿ°ÂBWX×H Ž(ÚM¯—FW= )…_-Lá— "hOÞÅB0fṵ̂ÛCiÁØeì‘ñ}rº‹Š…2°@ò* ó+ú` kj(UPì©Ú—h3;Çäly¾ÄJuM€Š¦| PåÊW'ÉéJšóO½yÆš³E£Ì-4Úk[L—iÿ{sÃaî“ïNžó÷B‹.€€xP™E5]“Ñ kDó/&ç½´ú9Ncòºhº’iw ÆÌ$}üéç¾Þú´9 ø7H=â­£}ç|m»†=¢Õ![Û!ºCÜw£ÌƒV±'øPà*0ë©+ý<“9¤ÿV.t€¿ß3ŠÃ»N»ˆ ¹§|~ l¼ûu.ia‹¢sŒAaƒë¸ÃAüŽóŒ`ŠÐl@U”=À[È|k(!EFcÁ³ÛªÌM^¡c¦¢ÆâVœ 5%œÖ”:hK5æ™…’¢3ÿRßGqyYPÚxÑÒ'Åjoшì,*¨2‰èN@A«=Ť¨_ü®ÅÓµ ²žUàÜY9¼×¶óBÊ¥"†Ò`̹^À¢e’<_À€Ü‰°˜ë}×’FÁB­î)ï™@ÂŽe ?’ø ÚUƒßsR¾¾™æW0ã>—gÜÛ¨Ò4ežžSZ“Mžÿ8ãW|²}@…̯°¶q8•ae;Gc¼ì÷}@~æŽÂÆç€>a¸\žä° ›8.3òôúA¦w[vž÷MëgÖcÇõ £hFš¦£ã¹ðYÀa¡)Ø»>±;C£,uUQó‚ÊÙöÈî4‰(9ÕÑœ“ŽR¿¢ês)±¦¨6åšÍWÕ"Àq]¿T7×±¿L\@þÿ‡Ôo—$çø¿‹=?P{GêyWémö߬6uDÇ'4aP¤ðÆÕy÷DW^JwOé¹äÜÐiziî|bSÛçÎM¢+èÏþoèàÔj=N9gH5ÝRª–¤U)7 ¹´ÄóàбD× 2áNoM‡@l6ý&£ÚxG«@جøš‘¤ILjD¢½ž4†ßõ'7r´¹±Ë:®öƒ–rôZ:*v(ý>§ïë!¿¼‚kÉ•ÉezÏàl6²É½›'¿Ñû“´)dendstream endobj 1077 0 obj 1057 endobj 1081 0 obj <> stream xœ•VïoÛ6ýî¿â ¶X¸š%;q2 ²ÆmÓËæE‹ 0h‰’ÙH¤KRq4ì‹ý—9é²ÎF H>¾ã½÷î¨o0#з¹&eïçi<Ú‡ÜôðÿòÞ·^äB ¹$%ü6ða<†qx8GG0Ëz ‚£!„û£1ÌÊÞS€G/UQ•øü]Ér€Í«ƒp¸øus9/ÈUnáXeY!…­R•L¸¶LH[Ãf„ñçU’¾˜L§gÓ‹g³¯½£p´‡0{ßM2Í LIŽ)^u:ÇG[ø¨*pP¼}óRž±ª°”6-øtòj2¿<;™\<û©‹ú¹E=êù _À&gÅN™8 [špó|žŸ~8~=ös¶øÊ +e„Û-¡äp ÿö9_‰k^PÑ`:†/?]ÿt9„ã÷¼9ž¿ƒ ™Š|i™„KC(é‚éo-×°qÛ.dÊóàN&ïg]Àž­PÿÖü®z³%ª„šd¥³â‰ÈDÂšÒ µ6P« ½Ž4‰ (w²l„Ü¿Q·+-0™BÊ,#Ò‡M.[¯8™)]º!œZZl„±†Ja`¬&“ ß½[,nÏÇÓït×$¡Ì}¨ ña¥‰¶à1m ØÒ®}E5¬ –ðIºƒB‘}\ÕÆS)ÍFú”„Ê ›K±ÚYgÕ%ªLOD.•æ!|AúXa$LÞ ã׫B$Â5í½Oø˜L&»†òdØ“…`ÖÂ"ëj Æ Rk¥/Mß©ÓEö?Ò¾Z5©ýšžìÛ^a~ÍÊU¥cm”æ“øKðéØBaó–θ(y‹”¢x`ø×8ùÖ¬6tn3‰HؿΕnj¾c6¤9ðK‚Æ»Ýꨆûpî1ÎO©ïš'{Æv"wb“m<-ž2¯íöá!GNè:oÌïðä`Ç—ã7yû¹[À. OöÒ{kvVááó¿ª"s–•±€n¬4Õ‡åØîD°Ì6} Ñ¥ãhj'¶B4=ä{•TD?:›Jzžw{ßOÔ+\ÄIž3wsßxzhÜP‡å£ô›®s<”¯(ü¡qÄdMè §îÉcתӠ¨Û™X7ýÒ‡[µ G€”ÈíSÿ¤M^Ê¢ù·Jh¢Cñ<Ç”÷¶ —Çœ„œKj›> õ…•æÞ/(Ííøðr!âÎl`n F`|H¦ˆG ­¿+Û‘Í·ñscë¢={ݼ¥ŒN»XeMßÇ{ ‹Úo¶’V©ÂÞ2e:m‘ q¹«"Ó†òë:%¸ßðAxº ­0;ZBrLŸ9¹›€SŽ¿…Àáb—›0ã }ÇðÜW›öž¦|Qå/Ϋ+ü8“@¯Wç·‰q'Âà¯ÁÅç´ÕΩiåÚŸjÁkè–S{@4¦öp9‡#‡4‘WB+éZàÓ‚3í‚›~jÕèF_µÑÀ×$X?ŠíÎU|““us¸ ³ÉçÙf‹kŠŠ·î4ܺvR•¥—)G¸êŠ!dRЛ'B”D^Bóet»w1ï7•pƒh†R|0†C? ÃÃøˆÈÛG#Ï_48¤'³ÞŸøý±0Gendstream endobj 1082 0 obj 1317 endobj 1086 0 obj <> stream xœ­V]Sã6}ϯ¸³/Ù..6À¾±[¶»3ZÖÛ:ŽbßÄjmËHróÖþòIÎPZ:S…à±îÕý8ç\ÁíG1í»Oÿ̪Á·WÉáÍÍ`Ÿ¾Çw>¸ÄÞ…úGVÑûnɘN( ÂјÆ1NŽ¢„Òjðšèwî–Jç× ©U]qmi!´Ӓߤ¿!vtLéÄØ «?°÷7ëÍÐùå\ÊÊôn”ž]§¿~w6ù|þ%˜3Ue…ÐfÇüáòüçӫC¹9½q˜|=¿èí¬,=²Ÿ]¦ÁV·e?´]|Lâ`%×NžNÎ.‚q*ëÌÞøþó2÷i Xg•ݵ‚õã¹KíXQ¦8vîÉ¡£N -¥-H‹%ñÂ1“%›·d ¦á7Cú#SMG¼²\õO2 gr&Y“4TÓ6Ò–sš)MVs-À…i³‚„¡Y[[ÇlD®§/¨¯ž“U$‘Ì•èžx5Á +ÀF½`mBša©–ˆ?í|]åP:áQZ üäªfªÜá†J2F¾ø oTÍ(“:k+cE!F!jçèRÀÞ¹Ø-Ðj€PÍÐ7¢iÐ~@ê'y/ùŠ2ÔYª9Z.™–¢¶®E×L€½—eÑ%*C"Ãw-»ä(Æ·ä‘x’½ :û¤Uä¬iÎÖ…šµÆãáòA#måÊó…Àh…¬I`¤Jéáå¹#«ögRKZ-=öةɠ/DÙ¢g!¢(Dæ8æÏ¨¾XßãòyAmÆ=‰7»Z­ Õ®ë¼dïïï zý;<ƒÒãØÂ›N§ý\f^“$ñÛyž?rÒó›¢N—:€Êœþ7ÍŠ–®q§“u§ë=»TžÉ’}Ç®üHnK³“$G»¢rI9ÐFYk\g¬ZSB¨š{ä}8D+Äb£tÛ5®.û€b~ri° "€ÿÎ~]__o››íËíím@r{c>¸F¼Ï~Fü‚—áæä {ÒF£ñáÑx|’lŒ jë ¾†Ï¶Û04›¯‚úq…dlœÀ3¥5gÖÍsŒH+Ü”øY˜‚Ç…‚LÊAw‡«¸š‚ Ì×Rt˜MLÙ£K ‰¿|ò- 0>a 31å±øˆ ŽW¢jJ~Kj}œË5ÑècåÀáUSÊL¢tºk•åGÃ×' iþÿizò^½lšlÔGûÙ¿¼HnÿQp/–ÜeoÕóŒèÖ;hfk~±ìnž#v3lÿ]=kÉhLÇ!ÅqtœœÐÞø Â_ã|ð:Þ?qÿΜ¥ƒñù Íð—endstream endobj 1087 0 obj 1017 endobj 1091 0 obj <> stream xœÝS=oÛ0Ýù+Þ¦°U‘r$Ù[ ¤i,i5Ø2Ð’l«D'¤à-ùå=R®äéбgØôßÝã½Ã½ ð9û9ŸYÍ>}“l4 pOß {aÜAp>²ŸS‚…"Æéšu©1G4½ñÒš]‡ÃaÞ8ÀétºNR)?Aú`ïÇÎÐýq?מsÎáLJ ¬V«.œeYByžSXp?:W{ÒÛg¬Û&/õk¥|#mâ_oóù|p‹Åà,—ËŽl|a;öl½ÛëzûàPÞŸXjf¸¦†‡³X;…˜¤°ú a5¥ª…¬´B&‡]Uf¥©ŽÐ…ÙÈTÕÖ Y²É‘K#aŽ;rÕšR«3D°/ÍVµE^š²Ù¸üuY38ö~¸$qò‰½§ônž¾u³ѤíA³ž…òýÙûß’H¥ÖmaåìÅ…y•&U£ñ¶ß–ÙFY¹ÕÞ¡‘r.úNU MI!9‹W{‘µZSßê—²GaÏbÚ¹I†¨ÂÄçQçVìLJ{9¼ûb1'ÑÄŸ¸Å¼Wö%_ÚÆ(Ui|-ªìf:ÎŽ$é9“$ñÿNªä'®ÒoâoÔéÁQY|.,~<77—³«© ÚÉ[ä3ܶ›–üpñ9;Š‘tƒIüDL1§].çAßË#û1"endstream endobj 1092 0 obj 530 endobj 1097 0 obj <> stream xœ}VMoã6½ûW öÒ,`Ë–ü™ô”îf‹ »ö¶(ŠhŠŽXH¤BRözÒ_Þ™!e;é¦ Ë9ófÞã=Â$ËaBéS6ƒñçb6‡?˜ÀÏøÿ0xä¼Ò‡là§ /[@¾„Ín÷æ°Ìa±šg Ø4ƒ«Ùku¸÷"ˆ­ð ~ů°îÚÖº;ë`#¶µòo7 ¦3Ø|\­»¦îøö¿„<§ðÅ,+øñ¦ÒJ+»F™Òš ´ñ ÀÇ}`w*¶ ÚâÊÑ]ëoÚ<@™pŒpO«*çM $ƒ”¸¯+¡z¯¼tšcâ‚«gõø×°Þ›SBh…«…‘jˆPÏ)x}>™f“É Û·)W‘Úñ,â4[‹"­€Rí´QTô›½v¡uDÿf:S¥(Ïx©8g L9ÆfH[w¯j%¹Ì5Ê‹E¶šÂ(ŸṯÓuPÎÃÓ¶ pСc¡U®†úîƒuâAo…T êÚJTùO¿UÊ@ç±³Ú@[ÓcÌ/"@BÆ ˆÙ=1EùcZì˜o•Ô;»±¹t¶k0¢ƒÆ:Nõ¥#q‘Ieè+mÁb…»›¶ÖŒé þâ‚(b$Ò^Mµ¡b2ØTꈥy RتX•`­)Ù9ŽÐ(Y £}3„íáøà4v•†‹eR*ïK¬MžÊIÕQ¥ü±Vê&*cZ,ášiϳ·¥ ¡½‡C&}Ö½µ™ã¿¥ÆðZŒßýòåóún=þ|·Æ»wx·þôqÓ!IZÔcÿXËjžU¡y)Ô"µ‰€k±CÚËÎû¤ ûšýIØNÊÆƒ¬­=ž:>ÊT ¨¯-–„=2¶×]ä„Ã×ÌTW Ç,ÀÓ‡ûÍ:‘7'°Õ†pÿÆÂ”'iÜ®ßÝß÷êEy*j;ሉHˆ‡žûÖ©‘Wö¢îTAÆ•}bCÔ!?I¼°>,äq¢a Ôó1‰žBe»‡Š·Õ"P@Sì:CkQ¦õ®U`9\d¦p1UÔ§¡~% ­³{]âÎð 5IM=v¸°&…"ºP! >X²H—ăP^šÒ6‰‹­æÁRFê É¥ n¯M¼`Üs4§Ø£¨s*@Š6†Ñ¯›ä36à6àa@ûP¯úãísþ …ú˜ßÞÜ)ûå¡O¿³D6C‹¼½zz WM•ÏÌ<ŸœÖø:­ýßE­ ñçˈ†ÒÏqWr¾Xúü[\ŠMWhO¨³ÓrÒH}O¬qao"éê¿^7Œ,Ÿ&y¦Ÿ_þ®;ÜâÑMM=§gsý¬5Ž#ë®ìÿbγ‡Ì"M±ý÷æ\žMWý ŒÒgÅŽÜÕÑ(A5’öÓ ‰ÖÌ3¬X ®Š‹FûKjqgø6ƒ/ñ&¹íuj§XøâìÏL;bÏ •Ï–Ov»×¶óõôŒÂɈ>9¨pVÅÙoúnñYë'\ômZ°q&^r3»nÔѥуnò;:¡ŽKìæH޼³7Ý(šaJý+ño!Øšì<݇8ÞUkñÔÓܤN´-VG°G§–0Àh–*ŽÝø‘ç+•q95ÌÞofól>/.Þoà£öÁ¿dvåóëžý­Âã5ß Yõý«âôÕßÐuѳØóI1œÂuÏuÅšëY¶Ä°£h6ðò¡¾ $TQkŒGu/œ„±Qi7À-–°Š‡a…¯`×0ZÙŒãåyNkî6ƒOø÷/ÿë‹eendstream endobj 1098 0 obj 1341 endobj 1102 0 obj <> stream xœ•VÛnã6}÷W ŒÉ¶bÉvœèöش¶×u Eh‰Š¹•EE”Eœ/ï’’å¬MiH²¨áÌá™h„4âŸÆ«ÞůÑdJ÷¦7¢ïpÝ÷z¡!ÿˆWôÍbãhF×4O{niH³.¯§ADóUïœh­ä#a¤*“td¤º\‰Š(ÖY½ÊM3«²J–oæa5¸¢ù{V5Äà㣙?üÞ¾½9c›±ÓÿÅ?ßÿôû/Q‰ “—\Ûù»¯¿œ$xnhK…¢b)x6V%MÃÈ^ È«Š^VՌר _§êpœP%þ'*¿nt‚H_€Ò0çEã—EOb(_·îpÒà45ã«—üÁ~]ªªÏ¬K6”l[“ÑÈ^4>¢É|ªt“Ïkâ4œQr‚E'2a¾T†ØA a$ÉXÈ-Ì©œÊdáSj@*ÕFå÷YJd¦V ieHä ²Ä[Å_ó:Ëh-²Zš€Þæ[þ¯Ø™áØ›|ûáÛ»;ÖC>caOı,ìä€5¦RÚê&%‰F¬Zâ–hi(ו7Ú5˜=*¼/$S—ËX#Ê-Ušj]I¨n…©JÀFF“– @R¥©p_ƒŽB°¶ÛŒÈQ\!_·Ñ‰ªÄJ&­\"S•3 ø#ê¬ò°È2V©ŠE–my/Œ¢ËˆÏ)vƒ­mÍ·…Xu%– ¬ÄýwBC‹­×¼e›> stream xœWmoÛ6þî_qp;4lÆzñK C ¤[€vÅ ¯ýP#Q6WYtIÊŽ7ìCüËwGRò[š¦S` È»ãs÷fRC:¸_òétoaù-ä›îóé_Îñ¢ˆLÆ1™yÝ9{[@¦jmDdUƒZH v. »ºìÂR‹BÞöh¡‚JÁ{)Ö¸¨2aŒ¬f`ùga`YòL\ÂógûaÇ›8'¡>O+íâZÚ¹ª-ðjÜpÍ mÐp48±v›@ó<¡µÒpÇ©.°¹Ð¤¡  Y ¨ÐVŽg¶.Ê8A4¦0“Ô™}É̼ß7Üfs²ñ®.… Û[äÒ€ÜB„ï£DÞ´ÈÔ¬’‹¼¯êÊ*U0‚ël.èª8'9·ü†დ•ƒ¼Pe©ÖäZé\è-UÆ­Tì?¹0™–KZ?D¬¿÷´»ûxÐ õÇo¾¿¾úðêúõU{\T+©Uµ•…×’ßà=î(y-Ü[œ³"@ÁVu8>—yŽÒÞ^ðº´î?óô×·o®ŽÏ=tæÞꞦR{æB, ÌZmðmR¡2V×!Tx€ö‘ýpkQ–ôæ˜öÌÊ•Ç?Se½pp'Á©YŠL2ä‡W9ÃÄ/¸…ƒO ¦)×TmÀ±j)—û¶Ø"/Жµb±´ñ‚ç‚"^P­ºÚ‘Õ²öhÀd‚9·,¨bo‡C‚H«c–oϸDöoC{vŒqðF#]Ä1jÒ4ÐÞ‰¼D,™¤aC€‹¤¬)¶‚Ü,›-&8Ưպ¡@“#×çï'‰:Èz'gÈÐa^–亟ŒÙp<Š¡ïÃF§•ªú7%¯>ïXÃW˜hbaÉ €šü¼(B•°ˆçœ{éó5°·÷Ésù<ÄÍÅhÒd†ƒææ¸ß…׬îÂsônòÒ–%Â@™µNòŽ F)¤I°Ìœç~³Ø÷…‚b‡jÞqdIÊÆ“Çç¬Å ­çjþ‘ÅjÈ-Ÿ¥3Œ‡Á ±ëäš)⋯•ŽÏödÌ’á>œMA±vc˜K¡‰w˜qäµF/¹»@ýeOãGÂd¥•³y?£ïÁY.Qò­Ò¸ÓJaMï1.6Ät‚MðÊ슌¶*Â#:èêÒTš‰Õ×o-ñŠ>/ü>Zy÷s’±#8šäÄ•7¢Df‰‚Žt ¹@Ú]<>›}—È='" y8ÙK¢¦f˜ó•ëâ* ´9M V:…ŒÀŠ[¾XRØAÐ×é®ú!ÍñMÓØRÂrÎi•†µa»‹¾–N±„ªgóP3kjR–(2¸/5/ñ†Xçm2¹i“éÉÃàm•röŽtOíÍ^ËŒoª#;è]‰—$!i$;­¢QÌ­î|[˜Üu¬+ˆWM¾S܈7‚扶µÐ@g$ÕØQ“Ø)a@„ù!‰ëGñ˜a‰ìêúÛñøt Jø¤ú7õr©´5M\>Í+ìT̘?—áY©nnhû¶1⽘Õ%×È FÚºuÚÕnw±Ý'a:¥±mvìâ4‡tËæ8†gÔ’¶=èþŒ«aGû×ñd÷#cì~Ö¼š‰íñ¬ã´3mºÓºk|£¬ÇÇ}çÀñ?2êA j¥û(Ý—çÃ!èÑ­Ì„Îàp>F{{Ø`sÏȳ“f?ß!åjs:¾¹ÿ?l­+‘³&àÑ&ž"6Áhú“˜œÃ(JhÏÕ´ó;þý×°X6endstream endobj 1108 0 obj 1441 endobj 1112 0 obj <> stream xœVMoÛF½ëW „u™1%Ù²Õ“S$M€8AS59+r)mKî2Ü%%!è!ùå}³»”%Å6*Á%çãÍ›·ó….’”.ø?³jðâãxzI+;¸ ßð·|¤Þ„âGVÑË…7»¢tF‹bžMi–ÒÕõerE‹jpvgIFÓ'%7t'\¶VzEÛRÚ9ýëRRgºkK§j|ñ6ÒÒ³ÅßÞûŒÒ”½ÓQÞ ÎkIUï¨aG”K›5j)sKÓI²ÎÔ$ 'r°.Tc]xfD\‰&ÇS–LA›µ„›‰hAuc:Ï~¤“dìcv¢l§0 ‰²„u#%Õ¢•DKß UâbD™)ÛJÛ ³9\~Oè­¦LX8@8À!¾#r¾¶ÉtœL.n€Þ"G0@õ@õ“ëi4 ¤Ñô.Òi2Û yêWWã>F¬57HJÇÆç“›I’Né+·ŽØ“3¾-r+*îø§XïY.œX§ÐÅ‘7Ú¦:}WÀ¥r‡X=à›5j%S)ç˜Kƒ0¾ç{߆ؓ˜|ìÏ^¶ŽËŽ™ŽhQRc6–”ö¿ì³ÉL[æ}þV¤C§ÄUý•Rƒ>Üb ´¬iS®ê™¾'1nJ[ËLèw.UäašœÉiöч«Ò,E9ìSÀ-+;Ù w† ƒ„xãi¤í‡e§LkËÝ訡=@–’6B;ŒB²·§kB ¦+D/6˜ª¶®¹qïïpJö®ufûþ·,C5|Ûï+`@øËë?ßÿõéí«Ïw·‹_ßÔjŒ®¤v0kÃ)*Ëÿg r)ë¬ÏDàkl?j])paÃtÚ¡'™FÓå0èIkYPà R–o¼À3thspóm»´òKË™ÓÂwO ò̼…X£SE :ÆQ S–fƒ—Ì1÷Á–-\+ÝëCs )sê\8ÜÕ¾ANz!¸}°“F†²=,ÜCÐŒ×ÿ#H¬{¡cH† 5:ÅӢ܈x,þ{ÜËä䑿—M4©89Ìå)ÂÇÜ_¬[*}$5ÂâUÅO]¡2á”Ñó Ë“ñŒn¢æ^{WDE«sekêæÛ4j÷^™Ç1à†à$ÛN¯V±?} ½¶=þõÓ×7î^ýû‚5é…ÕM";zü•©†.Ó±ÿKÍ—ÏÑ 1/ßr_Åòm>GÈa¨êDðÄ T´®¯h_øeõ¯çO×A[ÚQ­¨^‹ÇŠxÏ"n4³†ÓzT¤S ¤mþ8¡"Câ3š”,!}?H\|šœayrpžÏÂyî=ÅÞ±Íé¶®Ë'|`&çVïèµò3yT[Ïà·'‡¬!ÁNàáͽŸïl}| Œ¼5ü3aBK–;~\ê<$q²L/fÉt|¸”Èût‡8ïÍîwU!”8±ýÆezÎGý°›”,Ô6¡[êÇyïêy\gâʼKGÝx”$I§çΞ߫`I0%é²$(ô'ë3rCCdÞC޳5´*óznÛ¦1m‡³òI²‹r®î±”C.øBwÚ‰mX ï;|_¦¡¿²OÌC7Ÿó#(ÿC­¸Ðó~‰x’ýû&¨Í¾¥@\,H$¬m« ÛKSú%nq¬úµlü€0Ïø8°Rû/ßù‰–7²°¥TްÙÕŒ®Cb×É5ÓãfšL<=ÒtÊ­}µüŽ÷F9âMendstream endobj 1113 0 obj 1357 endobj 1117 0 obj <> stream xœ•Vïo#5ýž¿bÚƒí¶»i›6B€î$àŠ!Äg×›øØµ·¶7?„øÐûË™;›MiPOQšÄkç½yó¦p•fpE¯øY4£Ë_óëXºÑü€ïåèa”ñˆEßÎyÛ² æÕ(œÍ`šÁí}žÞÁ¼o,È­hÚZ&àWÞ+¹×ÊBUª^=ƒWói’OážåþqtPuºT®…õl¶Íg•1¯ÎŽîÌó4ç­¢mk%_±ÍÃ-ÞðÏJÕøÇx”k©AU´j%("lÔ¢‘%mùB—ð¨4tNé%˜®ÏJáÅB8ùSÈ&ñZŒ!:µµÔ/D,g' ¤—{0xÑÙ…²p“åüN³?a¼…´ Ú•Ÿ9G4s…Â4 eZ ²ªdáBÈZ@­œS1:÷?9 éÍ’m&ž£ø:ÞþÛJxX!ÑR;bQÀÃóUHCçð~Ê©§\ÔÎ@#|±’Ä´—H£ðòkøÎh§JidâH†2üT)/AÂBI+åOñøËŸIe£ê\‡"ÚQò^ZÆR˜ºk4`y;éجÛƒ/è®Ã!K…%±¨‰#µœŠœÂ[à(°™Ü¢  å1ZäùåzRaiGϾ·]ÓòR`»Ä;Ïéiú2¾Ó¼ÕP`9u™„brÍz\‰qEH±U8"\tm|xNÉ-vGi%Cäø@‡S!óÊõâ/|PYÓtsœC  ùT¸S ( ÙiÞEU6ûLXtþ[ ÅèPw å¤x)ünº°²6ªPƒÑø¶Ð+£·;ÙÏœ½˜?r'Ý»0MO¶ö«$®„b…ñâØ<‡ŒôÃ-G(âR0O…Ñ^(íÂ@àpÑ»å`R’p÷ ÷ë *V¡ßNá. ¿Kïò{¸¸™À¼gÙ ýÛ÷z>ú_ÿVìJ[endstream endobj 1118 0 obj 1093 endobj 1122 0 obj <> stream xœV[oÛ6~ׯ8p7$lVÛ’ì!Ò&@“®­›=Å@K”ÍM’òå±ýå;$%GVŠ5[CÉsû¾ïê|€oþÛgZz¯>„Ó¬•çÃü­½/°G }¤%üº´ÇbXæž³ `¾IËÒ;¿çl9/4“ðrùZDa cæÐ[ï oªŒ«¶ûèìsÊ%L}ßþ¢/g/ÏNâ„! ­ÙŽ4ŠÞ0HEÑ”•Ze YR "·;ûl«FC%t·æ’"𺑸"íiY =H†©ž=#SíáÙ²ÃðïÐTó-Õ (d<Ï™d•Ål.m†è9🸛ä0ºùåç(9ÏÎ)®ï©-Li Qâ™i‹ÌÐ<ÊöšUŠ‹ *Z25î-ð*c{ØÒ¢1ë7a¨D5qà€ªYÊsžR Úpó6\/þôeæg ë( óé´;bˤ䙥ÌLýñÃ)L‚Èäž(†ÀrÓ¨çé&‚ä\޾ü«\”-“*%RŽ˜f°ãzc·Œ3@”ëÂÐùU1db…éƒâUêìGѸÑÜֱřŽÚàôXÒ#ˆ±qj÷¯ª-—¢2¤Â=•œ®PŠÃJÛÃK“º( ±ãÕXÏtÛ™›23XPâ•¢P¶ÔÅÇ£l^ºûóþæê»ËÛ«Allè0Œ’ŽGË]컵GîLb:ïÁ‚$³YÐZž„heã{uuŠÄ þFÓV¹…pízÞŠ(£š®¨rB ‚ø(ÖÇd‘Fà&·C¡–La q' @^‘¼Žlæ§ëw·WƒeÄY1*Ó ³ƒgŒp­'dfùà1 Ã^·—Ëß®‡€¾Oâ!è .Ôñ|Пä¨ï6Ì jº`[8Ò Ö eSh^w+óÐ'³EÔË•k!±ÅJÓ6VžZ8òÔT"¦ÝL²Ü:ì«c­¾›àŠ­9(Ó½&ò±íFjd)­† wá «%Wfï1×=F¨„O!¥v0¨f¥ØCcBw£ûäܺDpDu”•æ ‚^’0*»ÄNqëw.B£åÁ> stream xœWYÛ6~ׯ˜§6lE¤î t‹îÚÙ5z ØZ¦m5:QÞ›_Þ2åMl‘䤹¾~œùQÈ ¢?ö·jƒ7wŒuß}Õ)RàéMC†~7ˆÆ”ld5ÓÛ¡oAtÆ0ü+Ã]¸€¿–ƒ8|¤¸šZŸa}‚j/«¤RŠjOÂè‹­Y±£ØGè; _Ûä§Ã •Bg)ÂǾy$iB¤ê›c«Ÿê­¶Ÿ{IY0ž ´&¹Y Ö梩7hó•ö[‰±VÛ“Õ¨æÖZ?¥ä_ýq·×¨#}Òí4Àf×Ö”§ƒì«ƒ¬êmJŽ$ëATä]? JˆÃAv2Òë8P‹ìD+]â7b°–(ëCe½›·&Ë1Ï¡Ô9da¡¿ô¶·õ¨ÞöâêŠ}§?L° ô‡eŽª"XmP•«§# Ë„EîíÕ0œ+e‰¯C–0XrNág¿Œ®hT‡Ã'ü1¤ÃkDî(R EeâÆL׉©¢€±xeL!>Çêú4 zî±íí)D‹—ÅÍ-tæÐ*hXjkÌqƒjbKÉ#ËòÓ(;?òªnÅNbµWÖk¬V;±€'rX±½ÇˆÂè,ûðdeâÓGå ž\¿Ä,=xÌ‹€´;£u‚'ËË0˜9A·ã>Ãñ’ÍŽ¥c8»<êÞYw˜Çp“ÖŠ*5œÞ‘½D4B$$vQó«/ODo¾ñˆyáó ÏËò‚±)\6çAûÀâdÝ®ðyçÙŒyž:´KDûκ“y<8i})ˆyræAb»K9ž÷¢œ ¤nMðë7tOa:Rìö>ÛþL°Øt5'MŸIiÔœ9ô^z4ÁSP”X ð¤Ls†gû#³m‚ûÐ{Q†)ÂìO³„! ÉžÑžNÆRl[°œþ‡1Ô„’©o ·Ò=¬î¬ýžÿNmؼ gMÍ6 n¨X¦%šÁ"ZÒx±qíÜœ;ég™ûÚ˜Q!·PC†3z†=Úw]>vúÖ3–æØ!Ò0ˆ';oP0¡żfìlŠˆ¬ªúö€“É-áhÒJaìœÇ&(Ò*Ks[h£çó8Ï.¼uŠÜqg×n@ú’4~ §$òÀÜëxcD1,ó¨ÀŸŠ¼,>ɰOÜax6ˆžÛ/…czyʉJñ·¥)Ué2iúJ4ovM¿ÆwŠ´ï y¡(|ç755¾õ£´%4ÕÀo½>¸ÖpÓœf$ø*@”!Š¦î°ª­‹è€ˆx–Caú~äw¼ú—ˆg¦}a,ŸÎÛ»à?ˆ0=Ùendstream endobj 1129 0 obj 1540 endobj 1134 0 obj <> stream xœ¥VmoÛ6þî_qA€¤ílÕR“Ú)â`mÐ  ¤Ûü­è J¢l®©’”_€|±ùîHÙV^· C6yÏÝñ¹Ósúý(†>}š{Vv^þ•œÃÄvúð;~'oØ›@sËJx7F³WÉ.`\t4†A ¯/ΣÆeçÀ1dº,¹rP+'$p•ƒ.@ ÅŸÿE§ÑÆ‚¥P™¬snÊ¡ÐRê¹P(„ä¸åWKñOÎmfDå´y~JÈ_É$ü<β)=¾¨ ·VhïVŽ¡´uÜX°¼b†9žCº]qü­ ^>£/;ŸáÝÍ͇›l%Ÿ»EÑÿŠOg#žØ6“}‰Äí`äÎV<LR*Çð•/çÚäÀˆT SN…0ôßiH9TFgèŽçÁ Gåµqª â,V+€{m£‰áLýŒ_W•6t¾^ÒÚùÅP¹¹´|>妩Û'[1‡é~ .ÚÌ£uãâ˜ú,9£ÞÂŽy»I&°q‡oLBXgé€H=3ÂMKîDÖ©'"c²KÇÑÈ“i÷y 5ÓrFM§'‹RûãWMÌL˺T0c²æ £KäÄ7e×~Ïúb§¾œX`<)’°íÒÊ”³—‚#Ÿ .ªºäFdÄÀ1ålã=gX¼’¹)µÊB²MVUR„0M„4½õšvz)>ƒ¾Ö5 ©Ö’ãæöYh…¾Æv-1‘mÔØ(€ l;ScZ襪 säÝ7cmk&)nf<ç*ÃÄQ ˜µ»Ô‰™pK0µDV§ZæäÉÎÙò øêoE&‰·rqÓ¤ ®·íTËâôšë‹^û ýºZ…KòÂQiŒ˜L]€ÁªéBPÚíuä!„% §ÂÍ…åÚƒU­˜YB)Tm×O@_¼üÉ„A~z —#¸‚«ÑCG#8:Û=iÑ„]¶—áG ÿ´ |ãÈŠ)Á}@o[P?ɾzr²k‰Løöv}ëi†¿ƒ]ºîwÓ5NeüM“̰²’¼ ¢À9ÏÍdéòjʼø7òD³¼Í.‰ƒº7ïÉuQäm-yBÐýU|÷Án‚c áfóÀz³µ§:l_Ž’uØ+Ù‚¶»a}}5J¢ó}SçÚ˺°z;=Êñ v$¢š‘tÿÖšYðÈé‚äIÉñwéGSæ¼ZnÇÎ*(ôiÿç4/ÄbÝÅ!²€íÖ¢½GI ¼“2l Ò¶Aãim»÷©—^¤CVá­Ä²’·ówÜ:?Vç“«-’g¿>QUcvñùš*2luÖñæÌwË·Ãôãõñ­s‹ÙÐs×rQËÅpg‰=°Kc¼‚i÷û}² T…’¿`о³‡Ñ0¹€Þð":ƒqÞyÇCze}?îü‰Ÿÿ¼U7Ôendstream endobj 1135 0 obj 1077 endobj 1139 0 obj <> stream xœVmoÛ6þ®_qh¦-lՔ䷬.uë0 hÑÄÀ û@Ë´ÅUU’²ë}K~ùîHJ±Ý6X› pLïÈ{ž{î>Á(f0¢ßð™WÑ‹ë$ÃÖD#ø ÿ¶Ñ§ˆ9y?/Ùƒå&ògLLæI<ƒe=]L#rÉKø({¥× Õþ1ð²T{Õ‚UÐh• c€ƒæõV€Ú•‰áBÔþ€4ÞÑFŠõ,úÝÈÒ ¹Z‹gË"–Æ ,ßFOÍGÙòJFkaä¶æV¸¸Àë5¨ºñI~ÿ&‰¼ÀX®-ÙK[¸  ¸ÍU[»åV°»ì YŠÿÿù·¢w9¤\pKêµ)m,ÌçîRÀµË̪ϊXÇ8É‚§›†["Œ[©ê€3Ý6†ÓÁ­æ¹1¢¹ ¶†²‹øÈŠ‹´Hk`ùªp+âm<€?‡š0dϱµ5wÐ:ˆŒ¬4Þ U «e¦à >ŒØ³Rª"WÕJ"±º¨Þ$†7•Ó.z°Ž¹– ™¡±&ܱ‚žýë2úM`±d<‹G Œ“ɪˆÍÓq< _Ëèæ;J=Å3çiê°KéµO)Õ‹‹ëƒd]Ì$eãqú‘˜ó4;O]Ì7n±‹G‡&À¦thÈ6d=L3X®ñ~¢Áú²J¸*‚+äÈûFø¥îtO¹Ž(W*Ä _„EØh±“ª5åaU[ZIŸq˰òõ{Tò²FÀ‚a—Ò„»Z¬N¸‚ØVXñˆs-öÃRÖ¢*Óæ…¿âÇû+\BkM§`—®Þý*¼-ˆ%¼µªBÌräü™X ¼¬´š’狆cåýÃ%Ò’¦à‹4r‘\fß*g¼¨øÔJ2Ì0Úþn½Ã;xòÿ—¯Ég›!¸Î–aî2d !Ýx4{?Y<ÏrÕï¾\dwçp›ÅiÆ`èG³¿Þ‘¨:qyGìl›{&áÖr³š^°Áí¯°’gNõæhÛéÿIsA7ºhIe ¶ ýzAHÝZÉ­õ¦Þ_ÇpsTïé8Åi:›cÝe³1æ}ì¿~_Ý¡§xDž²‘«º×N—HÅB­Ó —Nüúª÷á¦]ô1K³x’þHtô'ä)D÷5o(Ûm˜±Ìí}ºJaiËšòèÄøJù6aVN½óí‘)°aáÎÁ÷ -\ ì©Ô¼übçøû q!IA¤®Ý$ñVkÎ9~¯r-|tS€Å˜'”×`µåŸßÒŠ,î÷ë«7Cc¥€gâ¤c”Â40Û6¥»ÎÁ³i<Ÿ2 ‰AXÁ^Ÿ>‹#Òsv”Å£AÉaRñ×F"cåê®ÓÓrU¶U 5¯¨Zê¤NÙ¨]^,.€Æ¤Aˆ-MoqB~´F©%es(:®…yhÀrW:ÎU˜uìô/ Øíàäç±_w¨zÎ9ÉðèìÜåÙAîåù¹£8—_±õ€=ÃÉ‘=®ÿ>Lr|î«bJØìv†È¾ØžpBpØ4^ í‰{ÖüäGCœ#-Nšˆ n~¹ç1‡J:e¹k^Ýãå€Fœ Á×È_Ç‘Ó!«Wдu)‘ÏHÏq¦Ñ‡ÐÂz-,ºF†Ï°{i÷ª'FU?^qÂOÄÆI"õ¯/è/Οʴ§›+y?ˆ6KH]QûG<ꊒÆFS(móÖ7ƒŽÂM‰MÖuùÐKµ•¹äÄgNs\à. E3ë '³9 ÇSWŒÍ{mýý¹¼óJendstream endobj 1140 0 obj 1470 endobj 1146 0 obj <> stream xœ•WmoÛ6þî_qŸºtµ5½X–ÔA»¢i ¬Y»؇ah™¶¹Ê¢BRI<ô‹ýËwGR¶œ4‚¢0ßî¹çžx—kƒBúçËÍà§ßâq +=áþ_ ®‘=þ§ÜÀÏ3<–Ä0[œiY“" b˜mg¥¬` çÉprž£ðüùì žA‘YÓÑ_gB¿nÅ «xmÀÈsxþC?ނܨ!èËi²‡¯_íøb:gϬ«—Óü° Ó(Ü[”oø»’†«´³fèpÍA‹zUñRhù«W¼Ú|‡‰‹ ór?*ëçÍhÎ4zXŠÊpü®Q\k!ëÿóô]WLëvƒ A.ñx«4ºØÐƒºÝp%JÜ­µaµ ÀƒM Ê,[¨Ì¬á׆+fZÖ ¸lëÒÎîû{ÿ 9A£À`æ§puÃK±ÜÂØæ²†G™2Ä•$ñRèmmØ]¬yÝ_Ç£/åªÿr´GQâ]w°P²ª‚0ÀZ#Ñ£ …-ˆº¬ÚZ$ Ö6¦JÔ_4îº[q+1WLm˜­[m±(*y ýžyVJÞj˜o{¨A·åš‚CDÍí}¾ >òq¤0NÒ\oØÍ,êA‹0-N´Ç“Õ {Zø=OÇö¹>]‹î̪Áî:5¦SJ—èAr$æÓQ¤ÀŸž IŒu?< â\Ìa7³¨ Ie}A’‚Õ‚t{žŽ7ìs}² ÞÕÄ ²ä× „ÈŠ°/D¦'BäÈÄSvÞnÁÇê ýÌ¡„ȲôDˆlw¨nØÂïyvÞ°ÏõéB ÈØ ±7!)1Šc¹Z³œÍ¨4t>‰Æ†ó=–Ó*|ƒj9ì0—„+. ±\rÅë’Ü›[޵…Ù÷;þÐTÃB¶ôÀãK^ zÊÁ¶zOÎ…KA…/=•U4j%ïV Ž5& ߎ¢”ÊF…a©á@PbT/æC˜·æ@÷Š]Á®–Æè9WDœÊÌœJO€«¬ 4[r¸e[*¬ìF ì *‰E®^aØ_p¥¤ÒpKÕÓz¤-YsêÚMM¾:ZsõXåÿà*%\ Œó±JO!ÚÂŽ}ÅÆžI±‚¤1Þ'ÝÒ+¬“¼f~¿éKà MÓÂCª(º7u)H¨º«ÚÔP؈šzÐ6iR²…¶éá#“…9ŒÜÝ¡¼¬Ïcßu¯÷7ØèTU‡‹×T*Ñ©ÎÁÿV?¶”2X £ÿÄN£á+\øëÛš¾çl¸Ÿ˜B)ÐÃwu=i„°›h©ŒÆð7HYhÌ©c û[µ‰jó™ÁÚùj:_~#epùaö{¿kš‹0 ó^ÃN±[à7Ô¦’ŽÖ /¤–®£q¸{—Þ÷ =F¼À}LK%7VXç€2Ùúè줲»ÂOý»Õ.%Ý)Û4ö­]3K'wéïÍ]Dß¾¾úûÓû×Ô½Q†KûÅØ®ËÄæm+[KMó  šµ4Ô£adÎJƒ_®¡Üq¨-ý à»ðx’Aî:lìâF¶+ TŠâðð:üN‹ªendstream endobj 1147 0 obj 1397 endobj 1151 0 obj <> stream xœµWßoÛ6~×_qOYŠ6ªH‰U,²Î[¬mRøa}dY±9ÈV"ÉKô¥ùËw$4ï—·.â#Ï÷ÝÝwäsIÌ Ñ¿ôYo¢—x&`5D ¬"™±€¼Ì³8…_eœ• S3)q]²X‚ä‰ëH&Y,wEÉC·2¨uä–Y3{Ë4÷¨FDTïÑê(2 c­£[LàÇè>b&? zßÍMŽ Íü6²‰3(S´åˆ:ßD§wëêüüíìòÝ/×o.ŸÍ59°B[œqgióet:ûTmîÚfpßq¨<‹9ÌŠNçÕ¢màVµcÓ«í Ô›®o ©Õ>²ê^-š%,aÓTÛº[h5†×ÝvP˦‡e5VPwÛ±R[3®µkÛîWϾ‰XJGãpû]=îúæ r6n\ñ’D†µLx:©e‚±nÅ –vƒÊE†neP]-EY¦a-E)B%q_K§3áxÃ0V]Ë£ê(ÊB“u\v;ÍÆüêí t‰"„Ìó€!% ‰#¡­¸'‚6(W2t+ƒê‰‚Mˆ©ô¨F ˆ …C†a¬Ç!SCƒÚŽðóoµ(ÒÉ­…p·šÄ€»A9’¡[ñðV‹"™Üj÷Ó¡Z1 €tNÜjz,¹¤­)øx@<¤@œ‚cpÁ1 ÀnP–dèVÕS òbB™Cµb@é(2 c=žDÌ úëG¸¾:`!Ë’…Lˆ †AñZ1`ÁnP¢dèVÕ³q1a!cÜ£1`t†±Ïše! o.hàeØEÊ&Q¤ÜuFìeJ†´²¨ž.§‘¾3Z1 t :£G=–žSgÔ÷áûÞÀĤ)²bÚ™ôMÑŠvƒÒ$C·“¦È²iSdÜ7E+ŽÂɦèPå€ |Ô˜n'ö’&öuµ……›Ü8Ÿ»­ž¹CƒC¸ÝmpNï=‡¯>\þðòæúý új»ÂÁûˆ#út=TÛGø­jÕ^Ón óu£úaí'¸ù Úv‡Ó»3ãïºaP ÕªQ5ƒæþi¡)˜p8üÍ»Åîéœì>æ44mSÐw<¬;Ì¿©£Û5úE‚Îë_#Úò€ëæ•°ºc`•¡ŒˆÁg ˆ¿tò‚%_Ñ–A§w¿«Z½ã°|_hÒNN4ê·çÿs¦êœ½à''Úkz´#¦Sâx¶–N«öÊôOÝÁçÏðŸâŸèOŸÀ;õœý Oxüä±²dzO‡N¾x/Oºj_Fµi.D‚?qòôõïYÖö«¾ÁëÙ[ ãöcTÏÑÍÓÿ›ã„gça­êµñ=ì6úüP:êpàš±ÏåHóoG‚/(^ÂY¡'ÚãÌ÷ø›èw +R‚endstream endobj 1152 0 obj 1087 endobj 1156 0 obj <> stream xœQKnÛ0Üó³)â+26EȦE›ЦÑhéÙfA‘ŠHÅɲ=y)ÉȾ 8óf8ï %(§q9›Ž½ÿ)7[#+q—ב=11Cp9šëVAÔ¶p*µ“\£îت·ïäí­Àuý‹I‰BÜp‰ºe«HŽš„!œ#¬Çùd›Ò‰Ð[<7lDhÛ‰XLL¹¹0?Ã@>¹×u&&:Ò€Áø#ÁÙ˜òÖÙÑïCž{jìÁR;Éì­7Ã+ò“I6xü#¡Í€Î¸5Nô²FšdÜ$¼¸½g+ëc"ÓþáøáÈdN|2Ùÿ˜Ý²ïl6Oƒ~{GÇõû\³¦pfUÎL µCÇ„ºÑ\¨åêØã?æ*–TïRÀ—ѧ\ÄWrýœð¬¸Hè7E­5—âs%®çJ‹ì7ßÒË,4¡„œÐÅÔìŒ(ä–oæݛ܈±oM¢ö¾‡gêö¹K¢ZC–åöR@UÐ_J͵ܡØn*®æBÊ·ï<°¿¿+­Œendstream endobj 1157 0 obj 394 endobj 1162 0 obj <> stream xœWÛnÛF}çW ò8€ÌˆºQ ‡©Ó½ ŽŠ>E°"Wâ6$—á’¾ô©É—÷Ì,IQ±Ó4¡aY$wgÎÌ93³þ@Ó0¢)ÿt“"xr9[,éà‚)½Âï!øD²„º?IA/¶²lEQLÛ}à÷FG´Z/Ãm‹àì¢-Mzó”~s¦<Ðë2Õ7ÚQcéÂä®éÒ^;2%)Úª]®oÿ æ Úþœ½m‹BÕ·‰“˜¢ˆÌáL^o3ã(µI[財Ė2¥ƒç÷‘ÝS“ij¼˜¾ö*Ñ´·5íÅ5ã©;ï;Sò–†!8º6M†§5¤@e‡î¥vImªÆØòKzcmîØÂÛàM°¢ë Šf³pÑrµŽ¨¢Åt.c›oÿ#ͽý>ͰÎÄÒ†"×’AâŠ;o{=¸Š×Ó0ž—«Å4œŠ¥ÞÕÅB•çœÄzàQ’È ï49ë¤Ñ)í”ç-…’+•·H3²¥&RØZƒÂ¼-JÇðÏágºŒ×tÍÙaœ¿nBz¡ZåJšV奰‘j‚.[T&?zÜç·2 ¿ºÒ Zï÷&1NH?ÚkgQ¿dÞ-8ÌU}Ðlx?fm™Ö:ä?︼®?MHsLªá„ˆ?GßTµva Z%@‰*õà)·¼Ã:„H i]kàÐ@ӋǵUeëÆyAvPk—¯ ]g†U-ZOIµ-%3·”¶ÂÒQòeO£E5¤µ:.eàe[ì2Ð>*‹ÂªP@¶.t`’«4|™2©5¨@¾bÒ£/vıBø´uê-êPš¦Mê'”êJ—)ÃësæoÝW0‡,e8ª}=Õfº—ˈq¼a•Ï6´¹û6‘o¦áÚÚˆÄÁ€OyUÛòDjƒä#ÿBh½#`_ãŽÒ…e1¨¢Ê,JÛ©Gïö(õÁ>'•à Se¨«ÎeíA‡{Ó@àý©Ôý“Ëù,¦´¡(\K²ˆ†H†-°õyךûêµÉóä1ÜR}±ñ®2!ºú))¿gš¿+}Ã)1Q9HM%ªSqÔž[ûÞËû˜–ŸHýø\ÀïP¢Çœœú éõûP³ƒVj_©Aï”r”ÖF.;Wl²É¸^3Õt‹XÖØ#¡2÷q¯¤n×Õ"¨î*íNq9o’˶˄ÔÓ(–$¥½Ðc(xŽÌ"Ÿ¯c°+wß&rÌæ99ëûm¥˜ºÔÎÂqlˆñÙà+^Åá&þg°ÆbiýÙÐ@n+U÷ ‘6 •æœMŒdFf²L—ó–d:yïå§F,îÆCch™¡8ˆÒ8•t\)“Ë ÒÁ\§£t©k•Oxøy.‹Ö5ÌzéÚ‹B5c¥vu< þžráöÊãñ4u ‰eýŒºö5VÚò¼ï¶÷åò8{þËËÓb`<<Ñ®'è[]Ã?*±B¶å‘ÅG}ÂÏ©-*µ—öNJ¡ ™q·èEH³…?¸=?1I{75œÁ$à:,ÀÑœjT)'uPhFØOðiÓyž;Ë ´!Ñ5©¹­üãn7r·8)Þ0ÎoÁc˜ÏX &a¥œtkž~– <¢[%~(Š*;¸=²dù ‡RF÷•þ%­¨Ÿ\_ùiXŽI!ýZ¢}Èš‘¤™Í~ý)ÿŸÖ WóÍØj{¥¨ÏnGk¸±9‹Í\ ]ãüª,Œ£{9:I§pµÓ83Љþâ·•ÈG«:Éäl‰&òjç ´• ºØ<­/.Š1=2“÷'äc•©O”).*ò©?×ß7.ù8ƉM«è¶<Þ ôÑ€ïpú4WèOϦ¾Mõ®=<‹&ðöl6_¬>LLM8†OýGôç#1Cnè–°î¿í¯›ãW¼ï.,£¯_bè|¸F_Çßÿ‡!ê!Í78K-ÖòŒñ‡èðþâàübÓÚŸÖ:_,9Yh¾Ñl>Ì”7Á¿Ì\éendstream endobj 1163 0 obj 1542 endobj 1170 0 obj <> stream xœíVmkÛ0þî_ñPXÓA«Iò‹dC¾Œvc0š:!¸¶’xÄ΋í’~ÛöË{r².û°ÍÝöa/=aëÎzîtBÇs^ƒ3nÇ~N çÙPz>f•Ãñ’ž™³vD Á~J < æJ…ñÔÙ¹ ( ô™D\8' qÃ0dž¶*<Î9óv"]O?ßSd¦¿îï=¢þ?”'™4.ãªB‘­Ckª'‘‚ûò©óÂ`Ú”Y^­ðÖJkÞÌ ›æuÕåÙv’¤u~“Ô¦/N­™™ëfFújžôíÖÇÇi¾iSڽĸפ@G[Ü‚pGŸÓÛÉö‹Jë{!:Héì^ÔC½s$:YG½zs~ñbü¯¤ÌP-7u„íh8¸‚æ®âÒ4W\H=ÆmûÙW¾ ?òU(]_Ž¿ë£ø¡M‚r97 'oÃøA-m”ŸòÇŸ[Ò¨%˜ï7Ô9]"&‰iÉ<ËK¶‡*a»£”¶#]ÍM *j¤ËES”’A^ffk²SÔsk¤“TVAµ2&Cš”¸607äZ, Ÿm’"©ó4B»Í}&&Ô¿À„ük&ÌûJñò`Þ… †ò›ið»—:Ü_¢ ô®Â4Ó2Ä™çÙv˜9'Bzöïê"v.iÜG=Öxendstream endobj 1171 0 obj 502 endobj 1175 0 obj <> stream xœíVmoÛ6þî_q(°¦Y’_dÈ€¤ÍŠ‚eÞº!Z:Ë\$R!)Ëþ6ç—ïŽr:-i€`Ÿ†¡t"¾Ý=÷Ê#ï! "ùwèÓ²7¸ŠGcÈm/„ôŸ÷î{‘'C—–p¶ ²aœÀ «^ËAÁd6bX”½w@m8›Í‚Ñ”‡0 Ã0%phI~¿øƒƒ),>½ŠüèÕ¿¡ÅÁ$¬!¢nh!™ÇSðtø‘ÄQ09ÀÉaU«LÚ þ¤½NpÖuŽÁJ:{t-³í­H܇'QŸ§.ëœÆ•z†óJ~øïžoTÿ*ªrIM·Ü0´ÎãQL f\ù¾K Šø&£ØW¼Å¡”F¤‚^Tn1ƒ•,©rØóÁæeÌúL!Ô®¥¢Í!ØŠ¶y—'K©„ÙEaÒ5hÅ‹\d‡‘ž»ÍZÒ6›6(tï*ëPx<ÀžU¤jí´.ìðÝZg^ q‡ VF—쉵sÕ|0hš&pK#v6ù@«\“ÒƒÏkTƒ8 ·üè/Žg·N“bº„ÜPÕ_ÕˆôNé¦À,Ç•#Y, °X“è…b7çÍ/Õã‡äEì·>A狚•6¥P)ð^« ‹‰–DauYš-©ìx4Û‡ÚrX„j£ÐƇq5­ÙmRmt±ÁìR¢²…n:áÌtCkºÄ†ð¸¬I)´ÎE€2%³[Ù8áeBª•Ry±°Â†8”m£­kKòýÄ膴{ž@¬ÄùME¾C¶?%Gz»H7ï"QZ?c&W$¾&õaG=åj"Gh$ydéÐH·f3é¤&½öt­ßQØR´¶MÌ>Ë¥¦ò¼²K2¬ÄRsÐ+£=u¡%9º”BËO†ÇCrJ9O4ÄRª”ОYí-lqᯜA[”/êËq!7ð×ÕFùÓ²êÏ`Uˆ³îYî:äà³wø]×ÞŸ Ñ! ( „ª‰pK>ÎyI”ÝW ;LzË)!ìI7Á¾i‘·•a 4AÝ&ëŸçW·|Ù¾_\üzº8'l¤ÑÊŸ†ç€Ì•z) FîÐ>ðŸO¹×¸vUíÀ®uÃSêZe}XÎ:x•üuÈ#~´bG $Ò:ªþˆ|ÅjÿXû‡†Qk2¼ÊÞçg¿|ìÛ–ÐIS_Aéy9gp<šp̲޻(óKÿ|Ñû‰~~,™endstream endobj 1176 0 obj 1121 endobj 1180 0 obj <> stream xœRËr!¼ó}³\e‘…•Xœ[ìòCU¾8æ­HX°YV²ŽÉ—VŠîIQÅL÷4ÓÃ*ÊP•u>7=ùò/–èRá)ïŽ|6Ap>6=îÔkÀÔ–œ¸ ƒ¸åTBõd¶×Ñêµ3H!§~Y´3è\Xkã÷6ߟ~S\«„/(‡z!³û1ÆvÇXßšOÓbk]2ÑúÁ»#!þp°i‡Ç•zÃÚzHEm€ö-¢>Àìs•B5Å*¡ 9éCšèûúаú¬šÌç¬vv@4CŠv“lðèm·KX›ìÃ>?(7£±ÓKÌ=˜ÜÅyPä•H“½uÅÐ&jI™8]yûG?kV^˜ý| ÅÉÇѧÜ€gãÞ'ã&Í“ˆ¼hJ))gÿ£™+Q9Uú+¼*S˜¤ ^€ñ‚Ÿ—AgÜœ/éª%³=$Œï­N¦ýŠoc7æ{}^UÍ™-ÈBæ\RÉo1_Šª|—Ìf\\ºy%$À®žendstream endobj 1181 0 obj 386 endobj 1186 0 obj <> stream xœVÛn7}×W Ї8€ÌhW÷â¢Ia ÒX@AAq©k.¹!¹vôhygH®$Ër‚ìÕ\ÎÌœ3£o0bŒè•?E3xó©œL¡öƒü†ïzðmPDÈ¢_VÑlÅV›Aò-`^Àl1e3X5ƒ‹O²VÖø·pÓò ¸†ô>(¤S¦~½úg0žÀê÷ÁÅM×4Üí^¿ŠaçP¶œ°2~½Ú*•]#MaMàÊxàà“Ø „­„ÎKÊ`ø 6ÖÏÉ]J¾é“ƒjx-1†© ðµ–žANßW•±ý*½pª èþ¾›—’p­í=m­o XðRK²­'èÜ$4€xÙÓ³„ $«Ù>_:Ní)Æ9¥¼ÃVøG ˆ±…ô«§”^5-úÕÒ628%Àoy› ][«%f¶Y+ÃC ™0øk+Íò˜ð"#«!X£wЪïR{lm‡ñîUØ*C­÷rŸÇÉ‘¬ú¹œâI¸Xn F¹~ šýÛiðÏæKÙ¹ÀÒ[­üVb7vÐ`7b£“—K6Z.Ô«jp‘ãûV µQ"õØ{L†%ò~<™dWÙ]Nó|\Âeš< F”öʇÅšH„Æbá}’W1›°Ùhò—üÞ:ìÎ9P‹›Ì‹"Ûá~«Ä6¶ô”ÃÄ YE¼å´`£ùô/uÎUÔ\diÍuÔSÄÛ“ŠëZ®g½ÎŸ¶ ¿öD$_”/‘äGDI÷ÔÖVpý¦Öv³Í£§Ä•r(u—¥zØ»³h½ÂÙIÅzó#{’ "·2€±!€·­4~ŸëC6IÃÙï–Š~,Àµ¤0{f¾M—sXÆÝP°E´d£eü¡œÐòaZ”Cz£Ñã×Ó•Ræð×!ò•šÖZ¬ŸäCZïÂÙ"qëyUITáN¬'åµÓr°ó§µÿöwÍŽaâgxû!D?b–.§îœË QéXdÑnØÃì÷³ÇM kwÁ6ègŒ–æx}qä`q„˜ŒªGÛcîX!:Gp¶«·G©|L«ùˆ¡xFŽ,@+„ŽGæêã5-)œåÙW‰òÓJ¨ w/],ˆ÷G:=ébÁæÑò{ êR:/ŒÓ}¡QÁ¾WÖ}:Ùb¹ŸìO½¡3Ai@òS4Š@íí ³nåîwÀÏw\wòä?`ŒaHšX¶Ïü#µŒ²)#tWåÆZº‹qSÇÉ™´QR¥U¾·Ö%×wdÓGéGóázu“ϧûÚp 8dðÑ»+9îÅgûôðS##/[îxHÇY€[çS/Éýïƒ{ñuxæi‰O±[/9õÙ»œÕÞǵ<_@X2ÊÙiÕ,Ø¢\ÂåbÄ–qÇåœñûÕàO|ý ¶\:hendstream endobj 1187 0 obj 1088 endobj 1191 0 obj <> stream xœ¥WmoÚHþî_1J¤^«Â~C¤~H[Z!!B*Ý©ªN{=Ùk×k–ú%üòξ˜×@r9#Ö‹=ûÌìÌ3³ÃOhZêcïQêüùÕ Ú0“N >ãwæüt\-ö¥ð~‚b¾B&SÇ,u!t¡Ók&©óàrZ0!Š¢,M)N Y^òLФø€K(ç Þ‚ä3ñfò/ê"]˜ À÷·ÍrNsö )4ÀŒ„5ÜŒ]ЯôÃú{3öìSzó‡ã¹¤£±™‘+|€ gP_½ÚÕï_°‘Õ¢kDÙ1ñ¨Þ%DT¨9:-Y/ 6ÃB³‰3ÉŠ{Ã4+ É"š@^d9+JΤ±ëŒY¨åp Ì2˜³‚5@m Õ&Yñ®`1b©ø…àº*2^ ¢–Næ ÙØš3EËËòáv]¢ð ›•L¢˜™‡´o{¤íÕåd%Jº:¢bÓó1KCš†”ñ†”Œ<8Hvù\:>BÈÇiáÚ»ñ¢™‹'מd2ˆwß±ôß±âǩن1œc—Ź ãã8ûÔ;‹‘d¸‡ÕrÎq†ÃÖ„“Yrä tƒõ€€½ë$Ug¢jÄ"©óè–vÚ-»ÆœÂÚÉÉ»è,Æó]´“­gSÕ®ò×vÔ“öÚö.ÿ lkÎú¨<+Ñ=›è£¬d˜à´ÔYñ"J줭=7xš'ЄS‰G‰jj”¸ Êž¼:€t3ÑŸ8_œ, háù‚´|Hì<âúægâÜžl7·ÖÖý&"O#¹$ÐM§íKTúk}{à©Óv½.éº/Òb!ÓHµ.{Wjûú\Z--²=—u;À ¤ú4z‡¤>ðZ»)´Ÿ86ÆIuXd•ÓM' qô9žsKާM̧Sl±µGûöŠ ¶ ¹j .t|.Æ(~=ú¨Žjß*»6ñºXc$Q‘–cTV sñ)ŒÑ¨KÕ&ì!$‹´ú+SæÏµO5evŒ¦][žk’+jk~{ pŽ&`‡…ƒPƒªŠ‹„¶ Xˆ—#¼ áÑB °Tê®ï.[Ùjò¿¡X’ð\²Sy:Azèèš?WfjÂV1e“—JÔ¤´&2¨¡þšä*¬÷Le4JÌp <ÆØ!c@'„®Ñùãõ „öüÅŒÚdÛç7sIendstream endobj 1192 0 obj 1313 endobj 1197 0 obj <> stream xœ¥VmoÛ6þ®_qó€®d.’[ÎIšvº$u\¬Ã°”LËì(Q%©ØòÅþå;’ò[š¶hÇ ¶%Þ=w<>÷òŽHGö¯ýΊàçqÜ?†\Gðÿóàc9h¿²Î'NlQ“Yàu#F0Å$I?¡ë½x#ëyYGÀ@»¨Êë‚•FŸ Bt´•êÚµòOv¡nÞŽo~»¼˜\Ý\ÛÍeMËš|jæöåp}~ò”³aüîÍåx ¿°]_A˜\¾Ÿì„—ÐÀ'ë+¯ÇW/?Uú„ÉÕ›Ëÿ‡pqóûíÙÝÝ÷"ì“sKž3!v× F‚Oíè£pOEÍô/ÈFÃr¦Úg·Ok#-?3*Dƒ™\Þ3eyå`Pu1gŠYªôZk%˘ÖT5œá2-/aÊrÅì#U—0S²ƒä®¤æ†ß£PAsË.]rçë›Û$p5³1£ ¤iÈÚÔ«¨2 gN™j-3îrá‹;˜3:e*Ä-jv t:Å}^T‚gÜàA©†V+bÓfÈki˜Wìu3#EÓT±{îìûS꺪¤ ‘MrŒšO0‚–^¹‘5d´]±ŒÏèd\e‚uåíïö*€¥¯²×wö/¤¨ 4óN[gKû‚öŠ t ÃçpŽ5€Í(–îÐ…d6›+FÚòز¯íOÅfx¸6üf!¡ãCe¼DC$‚s%N°Œ£Ô>ÚMÚ…¬Ò”A­=mÃÁN©¡–q¯Áß,W÷S;Om«À~¨µq*1L9²X»`Kwýöõž²¡©Ø)׺v´mOo­ûÕ@Š¥Ö^:–Í‘èÞ¹bkŽiåÁØ’"#°›ñÒšzÕæY%[lB±‰„¿{w£±jm÷¨•B}ºÂÏ(Äx éÊl2bu4ó6©¢Ù¿ÌX;ÚØËé7°yÖeôŽgöÚKÄÚú`×^ælCŠÍ)w¾aɰÀº) ]~¡1ìù|êQW„õc–Å­;ŒääKhïÃ?×§´,kQëR0Tîž?¿<‰~8襥4Ï—ËLÔS[ä±)¸3oZ×mfy˜g¶X?{ÖªÙüÜ_W¥‡‘¥ð¹&±k Zµ= +“§Çz°X­.·ºÚv;|»‡e; ª§ç©}í,³åÓÚ{jV†U® rµñÌçÅ`‰Ïé„$ñºÇ#Ë"¤A¶l}ütB}tendstream endobj 1198 0 obj 1341 endobj 1204 0 obj <> stream xœVMoã6½ëWÌbÝ,àh-Y¶ãžš¢Ý6@±é&z(z %ÊfC‘^’²b`/É/ï Iù+É"-Çμy3ó8_a˜f0¤¿ø^6ÉÇ›¼ÃÒ&Cø_Ëäk’yˆoe?ͽÙ² æuÎf0Í`2ËÓ ˜7ÉÙgí8¸søÃ×B+°[åØ=4­u°àPêf!¯ nLi´5m…m*üî½tœ°…D¯˜µb©€}˜ÿ“d£4‡ùïÉY®‚µÑknä6…9vÞ#æQ>…AÎ3‚‰gޔ”’?Œ³|@¯løèm÷ùåy , D` ù’Éç‚—¬µ”,7¼ l˜D{@¹ÓæÎ牠4,y ¦n¥„Zp8Ð-¹ˆc—[dÊŸa ½á2òáq€„ _?¼œe4„wモð²)þÔM€Ë×Ì0§…Ki5\b–×H¯ÿ锪"â½´Ðpåð<§rðЭ•Û–^:±Æ*Frø=>Åjje¡dÄ&Ø5/®¨XoXq[±Æ °Z,¶',5 ‹­xw.‘.ü¨ Z7â¼ÔC¤ðçŠc¶%¶[ïM°jXÂjàù]h-9B¹¾óDŒsÆZ§æDɤÜb (§pÖ’•x¼uh•wœ²“¢޼ƒ®½û·!^LðêçE¨Òpb=?XÇŒj µÑ d)ÕxGó'„ÆïYƒ„_®Ó`WlÍí1n…)FK`XÁ¥ØpåXÖì0`ß¶ü{m¤uZcª=í¡oßâoÅp8 W>|üû¥Iº¡Ã¼¯˜ªž ¯xí•AËZK©;âái•¨k=厲°ÿ/Á+²èÙ¿®QÁZfßøžÅùÄÉ^`†€-y·gÚy 3º³Ô›kqÏ%¶åoºãŽ ù¢z- k¬¾Ãö®„¥Vh…]íµå½Å&ñýl)á_æÉ—d¦;œ¦ã1Œ¦Å=ÊÒÑ,|•ÉíÐuô”N½§qZxq¯[U*løG_¶mÈ••n_Š ½p8LÞ§¥ó% ?ÏF3ã<$[%g¨O5ùV6°àÇiß/+¶¡Oµ» zÀ1òZÒY‹'$æ ؽšœ Rß»CYÎÉSEgX/Õ”ÇJ5öcŽPï×­;žé+•Eë{ô‰öÚ÷œ€’f˜04 ÃÊ;¼dðÂb$Ãß“ã=ªê°­H)¿3,oc¤ƒUUÀá§RH®ˆígR„á+&îu#× Çç^Ù_͉¿Cè«Rlmëµ¼Þ2û+eïð8÷^ãÜQ‚°PÈe[ñ ¾ôà¤@©ž¡åèÁ7/Qs»¿æ<|”‘ bÕØ¼ ,NÇLE¡×XŸ…ÂmCgz%6b).5W7—Ÿ>þqs} ‚tŒ®¡Ð?'Mïj_d„ /å%³ü¤›kdË«]²%n.&JsªÜöxx­n7•R/îý]º_\<£Ù,ÍòU‹¤Æ:šî#Q›¥ãb2‹&}Ãx¥%*²‹t‚‹ì^‡Pq*¨qÈä`­Då- ï†ïRè#ö òá$}ÄJÓ„œ¢Êgé¤ØÙ±ÔáønuÚy{*üÖ×1BæEì<ÓÙ¬8õx¦È¾¾Ñc Wq=èîgŒïJ`çà <[82j^­¤ÿò‚~ ÚYÏò[¿Õ w¢Á9¢ýû7`Úh[!ÒÆIv+Q®Ž”'nˆ·eŸLá"LÀEz‘Ïà¼Ç´³ÑPù»ðKò/÷]endstream endobj 1205 0 obj 1361 endobj 1210 0 obj <> stream xœ}U]Oã:}ﯘۇÂJ%7N[JY!-+í®¸Wº{û¶âÁMœÖ+'±Eâ~ùÎØNš¶@ªªÏÇ™3gÆ÷G bú„ß´üý3™Î`m1üÀïzp?`ÎÂOZÀ×¥3›c°ÌÞ—ÁœÁù"‰.`Y Nk±–º„AÈ¥ž ե岨yq:¥®´V‚ïu™&ð•,½½ 3Æ7èr—”)0‡h÷œ¢ ¬ ¶ˆj»ˆŽ˜‚6Æø&ÄþŽê1ïÍ0Égçîwß"º˜ÍÚ…ô…ÄWòâh'Íâh6›u;)“µH­|~MŸŠÒ6ƒ&âhZ°Œe«u⼪uŠ'X57nµÍãhÊpîV[Åk :wº¢%G[æh•\†-÷ÖjȵŽrœ‹_©¬S%^f,ӗůã/xx÷ÞÐ]L\¡û嚟§ö+¶ÖÉC7Ò /×T9¡5–[ÑB÷¡"¸±ôoí[xeÙ‹eÄiÈŒAv¡UÅZª +yuņNx’ôO6üê*ú«Ê¹· ‹DÚk=qßÈŽZ°,Ûá/âFô“Ü q¿a/w®`5•5ywÃý]ŒÇôž=?wQÞòüÜ ²C0ÞøÀyÜó}³Ñ_©Ø’Fùy}ÒMÐ76l¸%¹é:C1 dq+©öêByb¾0Ô á¼ÜÎ ½êK§ßß®?E£¬¬T+/wwEðîÿ-G½áªA# ?3û¨w÷ŠÛúæƒîù1÷eñ~_Úã$v_wü&k7¹#ê‘{ºÛJý:|  à ð ñÕ3Ks—€0¢ƒL¢Ýðºç+ Ä·›šé¸Óì>s5í ¼S°þ-¶ýƒRHÓÑè…„òú^%ØÈTøKøPE!xr>‡ ïs]$¸Ÿ¸¨Ü~bF»çÛrð~þFØ7endstream endobj 1211 0 obj 1142 endobj 1215 0 obj <> stream xœ•WÛn7}×W P qy£]Ý èM -šXO}£v)‰Í.¹!¹¶UäÅþòž!÷&§ Û²µâp.gÎ\ü‰fIJ3þnÿæÕäå‡l±¤£›Ìè ^ÇɧID¨ý“WôËbólM[Ú&ñjJë”VÛe’Ñ®š\¾jõêÕ‚ž=£‡\Ù¼”´L³ð‚¦ÏŸ©û0›…W:{|±û;Ø_Sš²æ,cmï&Wot6 •RÜJ2'’T +5Þ8å¦áÏtP¥—Vé#D”#ç…—Ä~¤ÏÇNgi² ª/ý¿~>ÿo7ïN*?ÌÊOº%ì’7ß4ýðuÛßg|HJá=¹³ö➌.Ï$êºTÒEÄy騧ðxPV•Ñ ;™-Z]¯%U‰£¼vþ\ŽP†‹­ «Ö…4Û&‹ Ó`WL®~‚°Ô¢’O³¹œ%ËårÛŠQ.4¹Zæê'5m®÷Ê즫ðîõÛÝMô!¡·:f3NNÛHîeÉ®ÓÍ,™Í×tÎÙyhð V:HVÂ}Œz?' ŽyHˆáÃMUDÝ—÷«@˜|µqÊ«Û\´ø®³˜Ð_Òjͳ1yŸ—MƒkªA›Ðiy¬g,®'Q–æN ýn¬4·ÒNG®÷+8®0ͼø(uMŒ18ßJ°>ñÆ‹’tSíÁ sh•¹Aø°—Aô¤Ž'fHÄ÷yZD§P($nBÉ`r@JJéØ$©DÀp˶(ü¥’Bx‘°©]‡Ï*KÖe%¨›£€CÆ´” %´UÂ£Ìø®SÿÈ gzØôƒ½ ÔvMé#¸fï…Ò²`Kw'©{Ûc—X®Ë[œW¸ªê²×\d“Ç‹ŠùYÑ`nï[²GBŸÛÓ¡=™ZZ0Àè)çCØ" [pæìàŸŠPk ƒ=ç¢>€ìžDÜ\²ò^Tð¸/Òßv“÷“Ý¡å¬VÉ*£ÅbžR¯·³åËÉÍW{üP¼]“‡¦d4-ÚNht®ò#ÕÖ­¨‘Œ­Ü—1· ¹ÞodŠYêL¬åÅ2(jyèؘ¡X¦J×[EÀ€#Ak[FëS’Ðârk“tQÍœ°>×€j`_‡fºBË6´HWk ™n7Ãã÷! MÉ,\]ó<ˆHÊÕ@²'h ²£ˆ 1»s¿©»Á¿JqvdÍ]`K+Éàd· ¶•ŽE€9'T…›ã41ýýÓÎÑös´ý52_¸Þ”f*ç4¾39Þýi™Ûž‡<ù›ÍÓ©µM­ÂmûîâèÑ/¤Ë­Ús¤“AECa=¨ï’“›Ò QŒöø­î_¬”qöOIú<¡HŽ«g¤¤­Õ8Š öÂè|`rá]×0™¶%ÇØ‚SÈÀ­*¸ÑE±ÇØ-ŸÌÈ›î‡_4ñt@^wBC–>Êó±Eï‡Ïs‡åë艷S°“8:|qÍŽ£UšÝ¸ÊMÅk’ã œJ4ÌËaù]&ÆsñʆF›ÎúÓ¸Ç<¤³)~2^b†3|2›Îé‡öö3çBbŽãÙtñÍÝ'n3qæ)@¯ºÑ4)$Ýè¹ÑT/´Óîãy ÏæÁ67–·Íò|уSÚu‹Ä€ñ´Eí<ìè*»y/KFWÓ¯éVÌ¥›³ÃîúEå¤ÉºßѤ@4Ñú”°4)î¹µ±^„ͳ߯8à|Ðì‚æè¤”F‰×VúQ¢¡.‘É4(‰ãÀ—÷žƒŠˆÆµÈèØÍy*öš^?ï5ìvìÌÅ­vX ï=Ü|ZƇ›Ì‹<54-÷2tÚMÌþ&Ùd¨–-ÿûÂÕ’Î3&shÔï'ÿpõøŸendstream endobj 1216 0 obj 1411 endobj 1222 0 obj <> stream xœÍVMs›H½ëWtù¢¤J"B’õ‘‘e/yãØÔnmmía-˜ d,koÉ/OÏ2 'vªö°¨ 2z¯»§ûuÏ|†‘eÃHª§ŸôÞÜŽ§çªÞ®è/ì}îÙÕÃOàG°ÉxKðv½’jÃ܆Ùò܃—ô^– œ\*_ò,ç©xíýC¦­xÒuоøzÝ×Vn~ùóÎ]9›¶•Œ?` ~šÊ@AºƒTò ÃŽÇ…â"„wýfãý^šq¯«õI0]3~!%ŠÜX)y—ï§xg/ÏGMžút(Yä3GP•c¢jÆù~F/f\9g幫vl?b¬W÷æ§îêöî´Õzã(]\¦ÊÀKÊÆýmíÜv)1È$ì}¥áîèÿ¸hä̹¾Ù¸—îºÍMRŸÿLͪ™S×ìbí­WÞ‡N/²sAv.Œ-ÿØs-ìÉÔHó.CŸïw“*®¥«pÇÿEz0€#ÂUEžƒmkòضæ†îE”) eNAž‚ÄL€ŠX† |&`‹°‹SF?§’r“cˆRU­²Õ~³Ú¯ñ§´k È𡢓o{¢;ü).§,S³B"ˆ"Ùjƒd¼\.>d1÷9 7• Ësý.àýœß£z f)ý½<öhGcAÐîé~·¥Û×ó-]Öò/ŠùïSý¥”›‡|`†"Ð÷E!ÒúãtÿµA ºÄC‰¨Ù…Hp&š¬ É¢ƒâ>)ÇÌ&”w¡IÏ©Z_ÿ+pÇ92n´tœ0zBÉLbÎŒÞÊ¢ÐxÓ¬«juœõÛƒyÝ/'ðAõáöôÝW@ˆ%‹# šÈ¼@f—kVž8n´ˆÑ:xB%O… @É?mR*£’ë±FóÖUíÔ'ûÕIët4²Æ³h¼€ê¢Ï(ÃúݰŒƒÞ»;i™¿ÒŒNXÝ*z{|ÌöN©`Eœ7°&äË”¢ t¤´Ôç˸~EÊ$£rùH–ˆ˜ ©‹¾23¼«sŠÞŽŸj´Åd­# >PLrÏ´feå·âCªQÚ“¨6ñ',V‚±à’b©ß÷Ï@´ÞËJÑf¬³SªzжFË4JðÓ{MÝR$Oï€eífsX”±°ã% —ckbÊdO&:‹k¯÷‘>ßµ&Sendstream endobj 1223 0 obj 1022 endobj 1227 0 obj <> stream xœV[WÛ8~ϯ˜³}(=kLìÜÃSÍn(,ø,gGIÔÊ–‘ä\ö ~ygd‡Ú=ëë2—o¾oäG¨ûÔéSÞã¤vv6[°0µ:\áwQ{¬n ”·8Ï‘[Ö €h^+öÐ  Ý ý.DIí$Zri–[X1™sVgñÌ’eb–”ƒÉx,æ‚Ïp-¾âšIˆ•Ò3‘2‹ó[cybp6–9Ž-úð)ú†Þazä< Èá¤v²„ÃÁ5ã&Ö"³B¥Ÿ>b./ËOñ:\~ú“ ÷ã¾ñõàjt°/^†n@Í!ε橅¹¼Ø7 îÞî“"åLÃ:6À ;Çg‡Æ~ãåŸM>½V½ºqÅ´P¹ó}{±ÝΖ„õz½x¾LÃh<,žFÃÉøöåi<¼»/þ»ýòÏýx8˜üŒS@#ÑsÉ41¶ª÷j£³äax_…»"GÐ7!àž2ÜW:ô°SZØœmK‚W"ba|¸Dˆ÷Ë‹ÂS‹À»ƒ˜|¡5]ÑÁEò4Î*£€MŽêû‚Mß<0*)¥„”Så±è’¢ca÷u{*È3Ý’·‚­Ø²Tzú/× †w7Ñ x! vIQóK¸åÚ<»öKÁ9³sZ…e-¤¤w•JyÈÕÎÛpãÊá:|Ì Šâ-Ýã"Ôò x—dóïÍó’hO¨ÕV¯ßlø½.žá¿·ºýf«¶ý^è¡~ó hÓo£þ.·\܈¯G‰—G‹G‰8nÑ»ÒMÎö±…ít k]¿öà´ÝñÛÍj'A£I¯`£¨ö~~›»6endstream endobj 1228 0 obj 1124 endobj 1232 0 obj <> stream xœ”ßOÛ0ÇßýWÜÛ@*^ü3.{hë&±I@¥=›Ä´™’¸Äi½mù.NRZiC"ªÒÔÍÝ÷s÷u|PI÷îYEÞßp©`H ¼Vä°Ã-«àb‰a‚§0‡å=éS¤ ô\QËŠœlÖÏ¡ÈlùÁ•e± î·Ôj*53É 8^"ùsºü)0ÖIqÞ¥_‘·s5<®ñkãCѾ`ëBñ˨l›­),×ÿ\•Š+m[ì´~\Þ‚}ÂÀ¢†ƒî‹&´ÙàfQå öôab€Ž5ÃÓìù(?¸Ì×9 ærþæ¹kmQº„¬)6C¡øÄîð½ÃÚî}sÞe~Z’k¢á‘pmRª hFWD$‚SÁûeInÿkø‹M£ã¨DÓ¨¤¨Ž¶ß¸–¯‘w$Ž,™ *Ù*Q•FÖÂùʵÍó째¡ògÇÔ$œâÔHþZkQ\,É­ÓI,Ü•FÖÇråî{ЙäFP½ß4©»F'‰JTè×6­ß»¨˜f”Or•ÐEvÀºô¾É‹Ú¶.ôgaOMQMs&È%i*úåÛˆÝÀS,ÿÙX¯+÷¥4•r •¨ŒJ#ëÂoëÜ6… ô¸'5Çš¦…é^—¸|sOjn†Á¶ðÝ„ù¼­[ïË_\¹9h0BÌži ¦±)LT¢&*à¯uîž`œ˜ïâÏæ<ÆqÕ‘““+‹³n»Éq‹ósøîw®ºs °´›º‰ð¤˜~âjøÎO©‰L¨}C×ä/°`jäendstream endobj 1233 0 obj 599 endobj 1242 0 obj <> stream xœV[oÚH~÷¯8Ê˶¸¶Á@’§´K"$”DÚªªVƒ=˜ÙØ3dfð¾Á/ß3š6QµNlcÏ9ç;·ïŒŸ cˆÌŸ¿gUðé>é§P¨ ‚+<‹à)ˆ­ø[VÁç¹@<„ù2pº1 cŒÒpó*øpO‹+**ªesþË`¶"kª€q˜­‰f¤d‚Ã%+5•Œçÿ½>̧Á‡Y]UD6ÿ°pCˆc—ôÃÄ.ÏWLA.²º¢\CNU&Ùë…ÂcƒX‚´ È3a%Y”–B‚òøËØ85¹¿¸üt{3ÂIÙ(¦Bððm´Þ·CHʆô–“3úL%¯äH µ¢9hñâ{ëjsŒá™”,??s®ô’!œZŒ8Y pBgà" ›u† qô"Õ5G+äž~ã@¨{q}ý0}˜yÝm†æ©„ÆßçTþ-IÎj¢Ö/NùóÍ_p8^+o7,×+hV”+ ;‹’îæ—Éý—éø-ÍcŒñt:¹ÿÆåd<ýóÅ;.8uï§“ëñ‘×141lh·|;9Zý ÐÄîÖ*ÜL®ç?Úk¦_¯n®‚0 aË¡á¯Û+ñíuQ–‡rÛž’» [§¦êë¢iÞ¸g»Nj-*lýŒ”e™àØŸÚµ¡Uݬ(JqšQ¥|! „i£žG´9SH˜œ’šGŽº¦[6à%ôŠh5GŒÚ¤¤›•"{Ü0…ü“¢²4] Å4{¦ÐtÉÖ“í@×ùá€ÔpÖzZ+ÃÖ“Làtàù ¨†k²}‡ß,=¾›DÅæbóúVFq4x‰Ì8ý}€èX„ŽØ¿ƒ±0y2ù¯Œc9pâ¨29ÁSÑv7K“9©hÇ¥ 3Îíš‚ªV¤$<£6õÚ 3Å…6ɪ„¤ÇE³¹²%áG¥ÝÛ1c}‡GÚl„Ì]a3¢h—qE¹+O—µ4ÆnÇ:î´\mLÊc"C$l‹n¶"’d†5gO5úºXHúÌl¼hó@·¤Z—hig͵]d-@ÆdV—D†¸z§'K!Â%Óꛟiœ¸3:Ç7»8žÜËöçhz7H£Ž9“hÿýä­jíîj¡1ëåf”#kÏžj&qÖ2mëäõ#}­1DÛí jz Mò]–Œôg[Ì%-K¬:0žwfÃÝC¼&qÔ‡*Hû‰ÿ]³w6äÖó£ 9 L•Ù-)˜½ÕïeNð4¥©Ÿç†Ù¼.qœz¡ÖZoö"Ì¡ò…oËm˜Z¬nîadÈz? ;í4ìÀ†áôµ»„íW»EØñÍ`'‘32ÙÛ~0àÝtÆé ®ë_D}éçܯjßnPIjþSÌÎ[õ<ö|Ð?¸Ÿ¤aä.Öm”rž·ûÛÌš‰—¡¸%ÜoáB©º2ß2GÜ!ÿ6 Ç5Ò37Ín>B°›ZØ"}üIÓAÖà{´j¨g'Ò›æ{'æ ?ìW*@Ž?¢–ì_ ýhÛ:À´C.…x„’=RkÀó( aäò3 GÉ)˜ôlÖãÞÀäÛöä]ð¼Ì›endstream endobj 1243 0 obj 1185 endobj 1247 0 obj <> stream xœ­—MoÛ0 †ïþ¼µÏ’¿â C]ºØÙsd[[%¶²$»m¿|”â|8VZG˜Š6rËG¤ÉW”ºÏ%੯î3¯w_hBÙ:|ÂïÒY;D›@÷‘×ð!E3ŸÆ@Z8”@L JB—BZ;Ð Bý ŒâYâ½>{J wéç3<9žÎLà½wGŽKÌOì°™Ûa‘Úa#Çq óM!®‡Ñ!FúÈ;l¨r= ¨äÒ¶Çõ°Jznb•ôów ¨d6PÉ8l ’qØ@%ã°JÆer ’qu³S 1ô’š$†^23öt…™{‰êcv½„˜{É›˜±—¼zÉÌÐKÆ`v'ŽÝcwÞØ7v§@ìôa'KuÜC}LuoÚ:1þ¤  v€vó…óõ潊1*ñêbEIÜ]¬ÒŠº,)Ãèh˜¸³0TæéÜyü.vGƒÓJ1nì¨û;´U¶bЮXÎ ÎZÈ– Y‰R,³Åbœ-%›®4\Í|Ê$ìØ'¢€–ÿf°Ûò¹¬&ÊñÔÜ$FÇSâ« Ñå¾b¼¬¤ ϶ÞðÝbÓ@Ö”›×RQ ‹> stream xœ–Ûn£0†ïyйëa›s¥½Ø•ªU¥jµmyNâ-àÔ&Móö;ÒMHR; ˜0ߨó{4ö ¸„‚k>ý=¯œëGæ0׎ ¿ð7w^Úš@Ë+ø™¶fP éÌéX …0a$†´rÎÓ‡‹ôokn 1O ç<*/ùÖfëŒ$ Xoz‘-9è%ÏÅLp tÔä¼n¸âd ¼uW°Ùvä TVˆ•Eà®Å_VB¡ƒf¡8‡LÍWšjÒÎñ6uL”k'ÂkÓ*'ðYß/§/ªD$ÆÇÌ0ˆü– o½šµÅ°¦J®ÍBeõà²e%4WTÁ\ñ cj_Á”€·W0:%|ÝE¶Uª€zUM‘‘3œ@ZpôÅuç¢å„¬BÖ˜y.U!ê9 ™n”¬e%rœH.ëWÔQv¹2 OòRæÏks˜)Yµ£/¥xå8äy§1ï+ö.ètƒJžy{÷çé0 ñ˜¼óƒ1×¢,¡”òJñläú€ë¾QæùAʼn{¸g„s?Ó›‘ #|÷†œØþC^bÅ6Pd…6P`ù6g1ˆÚ@6Ál2‚Ùdû˜´mG¡pÆv `¢v Àv o Ú£v f}ʈÔäŽCt ¢Ÿ3â$h/#F©h¯Fœí׈ ¡q¬Ç ‘q²©Ô¦FP›65ljØì`³kÀ—v <%„ÄÝ!!&1K`zæPŠ';êÅï§ÞçzAµendstream endobj 1253 0 obj 708 endobj 1257 0 obj <> stream xœ–ÛnÛ0 †ïýDoÖ‰fËç^nh‡»X7¿€b3ŽRËn’·åSÒ¢Ý)Ë’&¿(|›9`ë×xMKëË/îù+ˆïôÉ­gËéM`¼¤%|MÈÌå!Ĭ­Aê@è@ûŒCRZ·0,ïŽ]¸>'(‹ ù1«ÝËÕŸf79׈îëIeo…ôøN¥å{|ÜÖï‹Æ½çmÕxÈ‚¾jÉAB“aÌ"ß׿IfÝ®%Ùd2ùâ6 Ã(M@mÄAí0•d® %¯Xµ²Aèå h0—uÅ౩ ª[èT'Šâ8+3Àî©l‹ãV]oØ)ìã/=›®KÇÕ-§¸²œŒAV}ÐT(„ý)pU)tsJ.[¡ÐŽZ¤jT $ %ZuEªmd•CÝ€ªKìaéã,bµjðEŠ–¼C½î#æ7U]áN[V»®e@Ý{UÛˆxµÃ±pïÖÖe‘Nå‡VlQW‹ž"ïJªªb}Çz&4~ló ‡~5~p) ;‰oÓuÉÌ(1ƒä*Fh„Bˆ† "b‘ž¼ˆyýlä¸ñ<2>Y†'àendstream endobj 1258 0 obj 793 endobj 1262 0 obj <> stream xœÖ]¯š0ð{>Åsw\rd/—œ,K–e[ø:r(ÆË퓯UŽØÚ"£øÒŸ-}þ^Á±8â1ì³ÚúøÓõ7P0ËÏüYX¯:7a—Õð)áÍ<7„’½u¡BA¼±]HjkÃní™Û‡äïÉŽ ù:ò`>Õf‘ò)o‘r)ô?J2„D‰\W”…ÏkRbh V‘Œ¿¶8#{‚s ÒꔾñdôØô¸[gÍ'Âx»Æ-ìpÏ÷ ôü?Ò¦¨0{Ö§]OšÒþüýžt¬¿üʇ€¼¡Û´É7ùMC†3Úä6$å‘má<Ük \tMÁ÷//"whžc:¬³¬#;,†Ïæ¸èðû°÷­Áút>è)êðáN%©ð¬þ‡ÿó¬þǘfò<$t;¤q|mʘ˜§¾ìè±(]ºÐ?ï}°¿6|£=ÒÀŽö%н˜_ÞþÖ-/ÿ8Ìy†Åh†C²”;QÏ·S‰; ôRß¶J,ª#ʸº ê” ¢ôÀ "Ì’©Ú ™u=„QìL¿G§žýë™›t;[dØ&OãØÄ&ÏH/ZÆB›>ÿ½`Ûè™~Ý™¯e†åfdÞ2æê˜N!‰¡yŒ)1]JtHf®.%Z%3MJ´Ha÷)Ñ#…ݧĠdv—RØ]J HajJLHajJŒJfJJŒHarJÌHf(¾cz¤0)%SJf¡ÌŒHa·)™B 3¬%˜~-yÈôkÉC¦]K3íZò˜™¯8SÌxÁ™TÆëNñ{• „èr«Ù‘ÃÚì’ÜZ!ß·Ü/‰õƒ?þ œp^endstream endobj 1263 0 obj 639 endobj 1267 0 obj <> stream xœ­WÛrÛ6}×Wìx&i;c3"©kÞO/™i;I­N§ R¨AB&@+ê[òå= €2å$mê©lÝ(`/çìžïhš¤4å¿ø^4“¿f³9Õv2¥ð¬'w“Ô/¡øV4ôjƒey¶¤5mªIØšÒ2¥Åzžd´i&_S|,_¦_øøfó'<%+Úüô°}ñåÛ¿zØ5Ò®Ù“våOÚ•=iWú_v1‘KJS¦(˘àºÙIÚ+IV«BRm¤%gÈáª,kI¦òŸ+%u™ÐÆVr¤œ%[˜½¼ô›{Û ­¤,ÿ¦ÙªV–tPnGû;²;±—öQ¤yôlûbGËUWh¸m‰gÛku ƒª­ikŒ–¢%øé„S¦µ ½¿‘’¶R›ƒß ZºØI½§NÖB×rÛ‰‹ ÁO6‹~Þ À7²«L׈9þbœ´/y‰ÿ a™ö)¤õnj$çK{Ó±_¡P¬úëŠjD 8ŒÖ¸~†ÚÎÃ2N}+ Ñ[é—yðvÉLËH¶•j•“¤e[E¿"ø:€keë”Ǽ魣b'‹[Âw:Rg–-'¨ÚBKä÷¾oµº•‘Ž›½¤¾…8ŽZðÄ·oºèµpàq+aNîàü§ÓÛÀ:/ìú–îewdg¤ 8Ó¢«#> ì5ÐÀ‘Íu—¨"å­?ÿvý#50Nq³ƒ— ¼‰˜6ØºÚ +KvI{( z?”SÕ·Eë,"ý9@16¨1Ü &˜5Ù§Ò—þ«û[-Ï‹çuEGÓÙ6}GÕ¹,ö=÷rÆD*Neûü9ÉwûŽ«*ÔÇ#,âœH2t 2öµ3®Ji‡ Súª0{”$*«dwòœ!Ok`HØXj¶×Ž—Þ¶æÐâBçcM1ºñÜ<øe+»q†!÷F•°.‹Þqð’ 7.Oy) Uʑ߄®Á®\ÎL¾Í^'^RªªÆÀáÖ üÝõª ÅÎp×\b o¯_ß@r´ç‡åL¸ôƒTg'‘a«sòãÈtˆ$4øh&eéiøþN^ÄB¡VÊ&—þEt0›®á%N™G`|‘–« &l˜NY²ZöšùÊÒôe>O¦+Z'Ù3.¥4Yü»ãO8`¿ŸŒçÌój,sïza1¦y2Çè!Ûg%¨éWZ·Wh(UÐ~$Œ ZF]ô]ò±2¢˜§hx §ù:YñÌß”“¯Á+” ëx|ýÏæÉ<[­ã:iô Zë¤(ál9 =^àË 0JÓ²ñ«t5Oò|MW¡q`ÕÏ>Ì’“°Ú¨ÁC@§¸³U²ÎO;lxs–'«|9,‰rJ JÓ™æqÀ\ÜÐè´‘FÓÚsu6…æY²\¬F @.î•ACæ> stream xœí—ËnÛ:†÷zŠÙµdV¤î9«h‹E/©^@•h›'ºU—Ø^&OÞ!%ÇŒ#;.gQù&Ãó‘3£ßâÏ_à Ž|LŸYi½½až«Îrà¾VÖ/‹ª˜>²Þ'*,J!YZ#K!¤ÄŒD”ÖëdÍáMò¯ ö1‰|_†'¹õºßG<Jƒ)ºuÚpH‹¢ÞtЉjUphÄ–ˆ R#ÀOÞo8¯à~Kí}€´ÊñœÙ;ö}?clV 9Ï¡noÇsëVξp‡8û‚º„©yù6-›‚_Mù»,„X&Ǩ¬í3&Ÿ¯¿|€{ßl`žÍü‡7¯¦È¸xûrU|.º¦Hw¤ÝÕc`@¬;Þ"5=”¹ž„Qìœ?ÃCÂXÄOùÅ…òä9WäÂã¹± ™@¡ ˜@¾ ä™@® ÄL j™(‚™(‚™(‚™(‚™(‚T=RÄ3F‡N(â9£CóŠ˜athVsŒÍ)b–Ñ :£ˆyF‡ž+â£CÏqŠÑ¡cEœdtèH§zªˆ3Œ=QÄ9F‡tEœetHSÄyF‡ŠxÑ xTÄKŒíñ"£C“"^fthTÄŒ™¬`²j€Éª&«üѪñ!±¾K·¸±B|w©ô~¥å{ìðµ°~œô”Çê`,Yì˜9Ë(|’ ÄF÷ØÔ¢êN‹CÇ"'¾ÀežóïŠ~]«5ô˜ÏýÖÞ=À]Z ]^Ë¡åi1ÚˈľëÃ"RÏUsVCù“·-ÙŠïÛ¡ÊÒ'Á91q¾â­²²rô¬n[Þ5u•cvcn ºÙ¼lô˜Ð5<K!³”9èöò¿ãmZ€êNYZÉ ›¡—Žº®dâ+QWó¬HÛ´Çó`¨ qËU*u+V¢Â®oÞ}!}rÉ«^ÚÀÓl U½ÁìPã¼+qÇ¥eÏÅrÉ[$ö•iw;6Ž@²ÆªÊô{(z¬¼µa©ÊS–|ü²ÄVÉä±S9ïy[Êm&'e;vê%4뺯+µS‰ lÞÈY»º¸jpxÖ—GÒX‡“¯þöõúK2™~®M©-×CŸÒ2Ú®3¿ Ý߈¢Ù •Ò™^¨âP’XïÐNk¼´ëz#/Šõꂜ÷ÿâ¿{‰#èï^b‚þ_{ ïúöooXB¤†·,ÃÂóˆ#oÚò^M=&o¢jmûný®Uˆëendstream endobj 1273 0 obj 942 endobj 1277 0 obj <> stream xœå–KWâ0€÷ýw7Î9›¤4­»™sfÜxtT6³¬JǶÁ¦ˆ,õ—ÏMy(J"dkx”B¾{C¹Ü| ¡¹­£*8½aÑr„pŽüÂXcÔ‹m€øðß¶ÐÀŠ| î1ˆú@á>ˆ»!šzd¢‰tDu¼B>A}*‚úTõ©êSôME°ƒ¡½ñ >>>«Š ÇA>>>>Gõˆ_ÃàÚtøE ð9JSAÒª`±×Ó2¸uî‚ð˜ÇÑ»}w’ƬÛ†S ¦·ŸÞ$bw¾ ±À! ÇÁÉL•Ë\Õ«™ï"³”ˆ”Gë™ §ÙL‚žÉQ1)¤† Ö0,Šv ²i‹¾ÿüD{°¤/€ßOj<©_˜m€BèTZŽMÞ~$HÇÐOH‚¹y—-›·ªÊ0`V–Ë3P5fžªy9†ZµëE,¡Å˜e¦Û.¹|‚VÁìÞÕY%!ÓÝëIÑè–Àz õ¼º“ ¨Év¹fÛĸÿe re©rLà·j@>eÕ¬”½U(e>*ê|ûUÆrRÔÝÕhŠ|ÚBÛY—]r\ñ¢Æ!røÓÜóóŠõÆûçêâïùÕ%<Ó°‡wÓ5zܹ9¾lìþ˜fé]€R©{ eqo®@¡ɸ©_Æ£A,’4t¿Â€UGÿÀñú—‰|ú!÷é‡Ü§rŸ~È}vHîÓ¹O?ä>ýûôCîãLümEÐ=cÄR7´7KœÐþåíµ“y ÅÈv!v,ÚÉØ,ÚÉØ,ÚÉØ,ÚÉØ,ÚÉØ,ÚÉØ,ÚÉØ,ÚÉØ,ÚÉØ,ÚÉØ,ÚÉØ,ÚÉØ,ÚÉØ,ÚÉX,ú…ü}$ôå-ÚiB—ª5”µKCÝÌjÈ%ê٢ЭÃ|†î†FWiY>¢¾ãm²“¹Q£´6Ê:ßh‹$3´E–B?JˆˆBÖÙ*¸ñÈNí¯ƒÿ l½endstream endobj 1278 0 obj 780 endobj 1282 0 obj <> stream xœ¥WÛrÛ6}çWì¸ufd„/ ý渙¶3™ÔIõI¨ÁK*²¥/濫Kd[Fh¼hÏÁ8»³û BB!´õ(ƒ÷_YœÀÜ!ü‰ç<øPgÃ¥(áÃÍ"Æ!%!‹yãYÐPàÒ<#œÃ¸ ®þùŽð€…#6\Ý3µÏÛwãÿ>N¢4JcÇÇI†0þ\¯”ÖдõtYHˆV X-T±e [ÕеJTs-Í´z”0Yvlgz +UÍñ­0`õª‚‰ÔõêÞý~æ2ÂXÎÝ”°;(‹â$åY¾|‡„ÜÂÓüsáø‡·äÂcŠrPæâ> Ô”ø€bPäb> êòQóQóQóQóQóQóQóQóQóQóQ=TýéæС"(=¾> âG zpy”ƒèn|”œ€úãPì3SäóMÌgõ¨Ï>ù(|røäðÉà“#À'G€OŽŸ>9Þ”#>Žƒ/¶h[Ç(IÉ8”A³ý£þ}±´;,Åö¥]%$N¨«íÆ ³Zc9…%–­É ¨Ë‰ªD§êÊ@=ƒFI¬¿ºLÕl&[YuX„‰FØBk9…«FTSq…<-\= ùÝç?ப–zi®¶ ,»-3W öÕ µ•¬Á4²P3U¸ í|­˜*¡ÁȹpI•çü¹Åí|Y¢‡æö§JÎÕgvNеtöξ*dk;`JíÀ Âzµ*;ü…j‹¥mOq¿ãð§øð*ÅÓJ×°^àð„E3ÞáàÈ6øë 'õSÏõñ×¹¤Öª1òÇÊ?SÒ[ñ8›ŒŸÚ¤a!Œ§ÁµSÇÙö€Q²0ì`Ó9Õp6=œ%Š KR– 6 µy–êØ/\¥óM #<ÍâWg™bStkÇtS6Ô¶—*Âö0°4=] ¶BÝùÈõÃÓb¡í£l ¿;ì˜ì”79%4en~„Î$*¡ëy½4–ZÀ½h;i°³š¯0κEmäÇ#PD’¾“ÐJ³Ô–ãï»lmö±>—>vèïd}Ë 6iu[º‚2¬µÄÉl˜Èn%Q~Ý‘ý—/–¦ŸÐ‰ÃýVô·}>XŸ.†•¶èSJoᣇĄô#ëycSÆw‰ý¢µ˜ã-¨)fL.zø2cçÆÎ²Ÿ«Ÿ}ÃØqËdg¨@ryb5DÅÎ’XíÓ|÷è*Nغ“O¢l´|kÃêbw3´Øá(Jñ´74ÅÛ×âñ/LÏ#ˆœpŒVúŒÑ=4n›èlÃŽçA’Ç×nãac°ÃÖ¦>ƒéWm/ž* æ±§¢ ÍænÓ6Se-ÖH¤p®M­&À)¢Îc¶—7ò¿ØÇ¿½÷lä=[yÏfÞ³÷lèßÚÒ¿ÿÊR™Ë÷ EÃr¸‰Có,qéŠÆ±M(®Þùü••"þendstream endobj 1283 0 obj 1128 endobj 1287 0 obj <> stream xœ×[o›0àw~ÅÑ^ÖJ-Åæbàm•ºiRÕ­M*íÕIœ„B ´ÙëöËg’øF’rJ›&ø3&|Ì+x.Oüt¯Ó¹yÂA‹Úñàÿ]8¯j›@÷2-àvÌ›ù˜@äz8 ŒçζA”Ä.!0.œ èÂRW‰àê÷rüÛ!.ÆIÄû½—ºðÓžŒN.?K Ë,Ž8…¡TB[æ‹0¡Â¼TVqìBs2Éʈ¯;;‹SE‘~§0’ªŠ3,Ât ‹$&‰p{gcaª©¨Ï),PY$1|„ù&  ïÙ^µLv†,L?œ…y6–ð <&<¦Ó©ÉP2ŒÅ–œfÄòMjÊÆ"“Ñ]a–,‘U ŒœìQ*óõ;`29 VYÖï·‰²RÒîî^¥2}.Ñ•%êÄ%ÚIDBŠŠÕYrª†´OQD™’ EEZ-è3ª 5Õ²ÒëÎyʤð …>¢îÆÎ£¨Ç‡ð¿A 7AP8a€osgt´j×ü(Ъv€×ƒ¶lØ;«h[d媆MÖ,a–Íç¬b« Z¿À;ÍßX Sº‚ ƒiYL²›A¶‚fÉ ¦kÛ¹0^f5ÔoëuY5µh¸¦U¶ZÀŒ6TûØùxü¶ØÏ«²hýá`Ý\øûµ¬x÷ó²*hÃ?¾-Ë 4åîè’ª—tÍG—­ø^ 5?^κ®® fL\OK–¯Å‡4_°IE?¹ÿ@ƒý¡Å:gW¼ÛUÍXÕŽh^æy¹¯Yå|7°x_ær(KÒ­`¾<<<ß?x-[È/ 7ê"çîþþûÏѯ bMø$„m¦ÜþøÅgH±uÖ¼¤ýÛÎÆKqªõ[ވѶk“å9äeù´îÎä¬ï'>?#'ÞñÿŒ³êâúÌ8Ü7àfò“!(‚ȤO|g¡!óž±ÜÞÚ…Yg=„,JB–I©aA–9ï423éa ld„ÜRQ22Bé½±m¶]°îÞéÈȈýšó22âddÄ9ÈȈs‘HR}ßžžTïuR3B<ÜΔHW®‰ÔŒÀç!b"…öI(²!l12 ­»fH(°"‹‘‘oA6¢ 5#Ú‡>»‘‚†T R5`HÕ€U›'ˆEQƘ/’p×üi’??„0ž9(Åò©]>:ÿƒÈ”#endstream endobj 1288 0 obj 911 endobj 1292 0 obj <> stream xœ¥W]oÛ6}÷¯¸ÀÖ¶&Q²dgèÃZdC€ íZ0 -S67™TD:¶û´æ—ï^R²d7nÝLiõañÜÃËs©{ƒBúk®ùzðã;–Œai!üŠÿ—ƒûAä†@sÉ×ðj†Ãb–A„,ɦ0+Þ@YétdÌÖƒàô*¸ðøaö÷ ›¦hõö``|¹ï ä9 ø9 öPô- ÏwÄiœ&Žï,˜àƒ#éN[vÅ-lWB‡JîD Ò€TÀ@×°Öµ€Z,¥VfÒÒ;^Ï¥­y-Ë=pcäR‰Xp­è-0hƒ˜8—ÞçýF‹¯à“.,:sƒp|^é-šXʯ!×ëJ–¢]Y¹–…¹Ö¥à Ä®ªºEë¸Y’B”Qvq✼sÞç¹@#ÜêÚ<Å‹‚‰?Ûj°û ½`øÿ¯žúreq…S,ÙÙbðbHy¹®JY웜ÁT"—…Ì9¥9DºTµ~ Ì“PÜnj^RÁŽZk£(¤HТØ!).92MLnùÞ€YqŠŽl-„Ék9‹f+aýxGJi¬K£â5_ +j3$_ÞæêÃÛKµ„õ¦´²*{3üÀK¹€gž+µ)7øÓ\ï†Ë:/ÅDYÊÊàM%ñÄÕ*-•5?Q}Ò£ck’5l!ÁiC•zIQô™ ƒ$Œ;&/ví¼JŸ”¶Þ=ÖÁ V’¶+ȱœ|£˜!9èÈ¥ú<š*çñå»…¤÷â'¾„…, Q e;rÜJ‘fØ&?/š¹ÙJtß¡ÖÜüC9a¹ÓjêÖ„{ã ·+?|Yè²Ô[š•véPVö„Ñhœ(íUé ·c’¨åÌ^Y¾»‚nToŒXƧi# „ñ%ç‡×ËÍ“2d ¿˜FtøQ£‹/f?ßÝ}¸ýðž »­ãjß7ך/äÆDÍ•jYs¯¾Š•J‰ú/?ôÆvêåj³ž‹úOoäÕ›ßIýÌÈnÁ~á•áÕ°Û*¼GáâjYŠÇ l”xÚmWïðÔ…plæõÍ»×·×O𩑆†GÇw`p…“¦4+æë¶9P;ZúÁœ³u}{{óöýõÿ¢è‹6.§èíÍõ9¦Ý°È_XƒŠ››¤½?¡‘^n¬ §ãÍÍݬ"Hæß¤Ù«“~1mÖx×kI ¼¨5('î®—`[-%é˜SCÞÌÉÑøc ùGŠG4*d«a&¡ñé&¸I2ÇF:?ˆ! J©£×4|h]»…ùú̓¶˜jvOZbe¸8íirЫ»S• XMÇ­J9ž…6,Ò\Ü#x\§Éƒ»Äæ(j8p !a˜T˜ôf†-pèµ›8ò £ÏWؽE.”s;sAOhÔ€¿ù¦°Á©:pMÆZØyrTyÜÔ´/À9£†mÛ)ðmцw2T{‡!]o àhâŸÜðM» _'œ,¤x‚1mУ1>ž©Üv6°isÖµ¸¦¼|IQÖ›=Ä.î7ä±V_}StAèO"°“-ä“ãnö{Cï%åxî¥ËþìË/ðB]ÛÍ„¤ý™ÞÒŠÂ~IžíNžÅÉ8Í&ÓðËwŸåßÖq»‡$|ÆG<=ûÇYÐäêäÖeWç!ǰ¨ûJ|ÓCõ@í—áHÖ5_†‡Iwœ üwIšÁÄ© Ãùc¸Mâ`3§=Q’’R\Ï¿áßvRÃendstream endobj 1293 0 obj 1334 endobj 1297 0 obj <> stream xœ×ÛŽÛ Ðwżu+m©ãëc¥¶/•ªVùïšMSå²gÕU¿¾`ƒ=âFL®Â  Î ¤ !ÕóùxH>þä"‡mŸ¤ðU½¶ÉK‚C0ø´QÕ2^Bɲ"+lž’±„¡¨K†ºôÜÁYÖ0¹ á†-ÖUØûÍï¤b•j7ƒÍ·©NËpx7!l&ã‘™-PÚ¬¢fÄë%Êl¬ ª¹b> stream xœ×ÝnÚ0àó\Åw¶Vj½ØÎÿá¤i'Ó¤M¹”Èš õòç8&ØqœR´ 2~ösað‡‡±]Ù6°mOðÒ¾³î‰Ÿ ûrøMyÚT¼ ŠæXU•‡Žuò=¨.ÞX²‡èP4͹*Ï奨XÓ?A‰Ê`zój¬¤" dŒÃðËèáI8äO¹ÔCœãÜ-u\º>/m¿‡]yaâ³nÛŠ_²Ù]?u]to÷¼½kÐ Œâ$õןoz¬ç;K›Â¾Ó¼¢éB|³ÞdÉ<ã¬PcqfG:ÔX”­*Ûú¼†Y€Ê4˜ú̳t9yè H…&#*#ó²2dp:Ì’¥8-³Ò9Óïž6Ægɲ2œÆâL½a½´›šÆ¢ŒÞŨÎÂÌ®ôÓi,P˜ì+¾¥ùö`ƨÁä\gdΦ¿Ê°óNÝXâÆb§+‰#§ï »Í8ÍÉaçé°†§Ãz;Ïϯnì–%©Sp%N);Erä”ÿn7›ÀíÎæt5~—XÌêÎÓjäΓD1$þˆ¾µ!)<‡ ˆÏw8¯Þ’á·Ý÷ÜûÍÿc½`endstream endobj 1303 0 obj 682 endobj 1307 0 obj <> stream xœ˜]o£8†ïó+ÎÝv¤„Å6Ÿ•æ¢+uW+ªýÈ\­öÂCœÔ»`R mçræ—ϱ! $i!1Ïñù íûö |€ožÝ1+6?ÿEƒNzãÃoøuÚäØv÷‹0¤íIÍ«Ú c?m²LØ0íîÜ›à-ŒóÈJ¥åATâÜltÓ÷¼'œÙÃÌ…'ùŒÕó·™\ÿ8ÊcþZVo÷†í»iB챈EmSê%øÆÎàßïPób$¼G hì÷dza,pÆŠ*qÉ Ç£A?–/ ›—/·+6n„² Œâ$õ—Ï0^biß­| Þ3KW>†K×bÄÁ’•q±xFFX´ #c,¼eë( V`äc·ì=ŽL`ô]ŒLa±EŽLbþ;™Ähj°yŽÌ`É"Fæ°Øb3™Å¢ŒÌcá> stream xœXKoÛ8¾ûW Úæ@¬ZoK@)¶](‚n×ÝËb´DÛÜJ¢*JqÒ[ûËw†¤eÉ–“2/Gšo8Oj>}ƒ…ゾì߬œ½ýì!lÕlàÏvömæj°²Þ­PÌ÷bˆ?ò£V›™QàBìB”ÄŽKWËÙÀíýý—_þoAß!©qCüøfõŸÕ’h|â,aõqvu·v'¨§ªe€Ÿ:ÅsØ‹v¬^¢Vdkùx²¼¢_Ðî%Ô Ïx.ª-ÔL4 äXÑqõæ7ôÂnÀf_ &aÍ¡{ޠ꺺ÆO…(E«`ƒ;0P¼%-vWe·åÊ[ÈD“œÌ#ýWçF°fÛ•¼²ÊŒvÚÇìØ°\>à­Zðës'H)«¶nK6çâAä Q¡Ýìy¾Å;ªËve­Æ«–5­Þšpd9]Ý`,ZŠ$ý£7'ÕkÙ¡-d]æU~†+Øf¬×î*`EC×á¨ðíçel“¸!{«|vUÝüƒÿ{’î¹™›¬ ˜M7ª•{ô·z%´-¬¨wlÍ[‘A¶c ËZ²ƒcD¹ÞùÕÍ«kPÜø×ð~ñ6s(f´éYÊ¿u+sᩞkká¶PKÙrÂÍ!½:,‡¤eÝ Y±Â†è[Š+öì SQóLlÏGÕ¶!{ÏCÏÆÇœÀ \+c›Á de]ðŽAΓ…AΩ£ð²QÐ÷iÃ"p#ð¨n|£ªÈYxAlZ2¶ Ѓo |£ ó±høƒ‚h©7ûâÁ$çÛ†s•j¯Iqà$^â/I±:A˜Z1€ëùAÅËdñü'Ô:‰z¾ÎqQ±‹Ô±Ë·Ë¹° ÀOÒ‘ô3 X¦çòÓ ˆÓ)ù)ˆDé´ü9ÄÂt ïѺ„°€ IÛ5±??BÎ^:)ßCÎnzAþ a‹€‹ka^2¸vM!,`™NÈ÷!ÂâÀ­#bˆ.NAgaÁ)Àì‚üi€s¾…xƒ°äOG€{#†[XÀ”÷Àp pÛ/ÙäKÛq/Ûdñ¡EÏÇÈŽÑáx1ö§ÆKÙ¶€àx.]¬§Àœ|—Jvð†Gå…®\{Ž‚)ù ?½Ç‡Ç@| HNN{ob å—½üE€?L[|”?œ°“âùh ßÉâùp(ïãÜP¿Êz¿šý‰_ÿ³×åendstream endobj 1313 0 obj 1722 endobj 1317 0 obj <> stream xœ¥“KOÝ0…÷þGwHÄ7qœ8Aê‚J…"Q$JX!ÖoH›qRê¢í/ïØèc×*/Ë9sæËÌä!ºcynZ¶þ(d‚ʲÇtUì–E^‚å±iñ¶ Y,R ©r[ödAEHóŒ+…¢e»W‡MƒÑTuß¡Õö³EYۡѦDÝaº©i§ßÌ­é&ܙѠ2õDïg[wI öŠO”0S¿%IÌCéÒ%ÛÝÎs~Rþ&$U*%Æ~žêÎ@w¥w§È…€’®åÝ4+è±ò»Î3Jq)Š ‘§¹·ú~WO7°ƒÞPähÚþË ¶¥Õ¼òHž‹<Î|©RžG‰@qJ4Xȱ¢ÅÔ÷]»…±ÓÚÝdÈ·õd¯ÏÎ.O// w&ÔŒëžYñõÛÞK¼k¼Ø:€»Æz]íÐË¿û•ºQ^}ÖO†J¡'<ô3ÚÙN°ó04T#Ô­® ú­¯•†±Æš[?ÁK7Úš}h¯QeM5´®ÿ2¼—!H8¿Q½+Ø9KqÇ WÇ)—ZÉXpb{ÞiØÅ¿Œa,¹H"?‡Ç=¦GK…ñÞ4ƒïxJ—ý F1WâÈ” oúJqÒ•æ~™ !SDÂEJ’†; —~°N5µ`J÷àƒ77$Þ‡Cµ„§ ~˜„Èx&rIóÌ%¢ø(‰^¾îœý¥g¬endstream endobj 1318 0 obj 547 endobj 1323 0 obj <> stream xœ•]o›0†ïùg7[+%,6!ܵ]7MªT­EÚ®&9à$Þ§6ÉRi7í/ßÁHÈ*N‘8ïsÎ1~`b˜”¯úgÖÇ;êz°ÔÖ¾àgi=XÄH ¾Ä\FFæ™B´°*–À”€x¶QfÝñåEºäsÅB¸”2å,‡zd÷kV–Ê„ÌõyôËr\ˆn¬³ûM–1õxþÁÔ˜!e êÚÔü­„†DÆ›Œç$\ÇJ̹†bÅa^×aJ«Œ"FÁBä<…T L-໵âZ—em¨Ëì§R÷ðɤ]¨éëãûŠçUv‘/ÕÉG ù–+œ˜^±5¶c;s±Ìæ¦.åûFåµEÕIÔ˜@5.•ÆêÄ©+2ÅáIàŸ*á äp1Oxóç°šˆC§03m;0Àýc6—)Ôq[g†N\h-c½lEQÞ{2yI06±ŽÇíßÝq˜Áw-A.‹.cB‰åª€BBÊE¾o XžK}É™ø³%à»8Åû½åОïðo ùÛÀ–1h½LŸ‘á;–­S>*űâ¬àèŒéßh„\ ]”&Àd2µD{§þ mqLg,Mq‰çr‡¶Êä–'#Ü3ܘi£¹ñú«qMy×£vร­’'åŽjö7Þ+Æ•¡*ìeû<$°}ÜU\²nâÙtÌjÁ«QÃ:Ó‹ÇŽcÏÁ¸òb©†«¯wW7×O„ŒÊ·÷Œ+ýîòöG=àŒüçn=Ód9_ܲ›ÔÜ7s…>aù:u\ÏÇn'§¿µí~ÌÏ'¢òOU/$GÃ>ˆD‡@NtH5 ·: 7ò{¡.Õ€¦C `4 ›¢·Ad2"C :r†@î¨ß' !Ž ýްû¡~Gœ€fö عtÈ3‚ö<#™&ä„%íAZ‹P—:Ê4!/4#ÿEZö‰Ž@x"øSªs6°ƒòXq©íšc…x´<5®#ë¾þNTQendstream endobj 1324 0 obj 762 endobj 1328 0 obj <> stream xœíÖÍn‚@à=Oqºim¢tî 0à®5¦1qÑ^€Z[”øÓt]Ÿ¼ƒZñ®{Ñ` sÎÀÂ&ˆb[ïã‘õÐ“Ž‹ÁÌx6ï5±hyÖ»x„§Ð¦¤F€°o­(A¼Àµ%‘UÃr¤nÚç>ü0²}„Ýö«ë» H "’¤8Èá —ƒ<º"[ÄI„â$¹*Ei4ˆŠ:HYTÀ„øó÷iš6&_ÑtžN§q–"ŽÆxK‘¤ýá8MÍšXžaÓ'I›´:½V·ý#EݼH,p‹›—ÎßR‹ºòÄâÔˆÆ ²<ÿœ™‹ ŸgYþ}îbë!©×Ó~ Î2çÙë«™FÅÙþÑà´œÓ"pZN‹Ài8-§Eà´ˆ8ë*$‚þæ ÚOÑ)µƒÊ‰ òœB•Aûsí&âÀ”ÔÒäsPÀ@RpEö‘ÙA’ƒ9t<w4{æ ý5¢:X#* ÿg/sóö4üÕ½Û·} á¨âÖšX5rUñhÜ­W³ý¨ð1endstream endobj 1329 0 obj 416 endobj 1333 0 obj <> stream xœíÖMo›0à;¿â½­•f›oŽ“ª]rÙÄeG‡¸)Á)¦“vYù !Ô$|Åçš$ËFö‹ý>²1 úhÏin}ýI\öÒBð]}÷Ö“…›&ОÒ¾%ª™Cˆ ¹·ŽC€Á<›@’[7ÐÇ‹í…å6yTÙ!$›NûËõ—&(4A‘rÑ5¨žŒ0®‡™zhÕà$¯ Q¬³¢b¥di•{`œgÉ$¤´€-ƒœî¨ª’æ J¶ÏDCsßnöîÆün³ùGÐJ}pó¡wøÛÔân«ÑûØcÑb\ˆß¨„{Á¹x•µÇõü ŒÐô•ºÏYt¨²^X>†pŒÊôœ1AŽ rM7„ÆBê„ü4‡'\ aÒCá93:ŠâE¢‡0Љ>Âú 99$"ñ¨8ƒrâI¡1 ¹ñ¬i™†êewŽ•†Ôj»ÀÔJC—1¦4tKPd€2AÃkÄ ^#fÐð1ƒ\ƒy"&Ašýwé¡À ÊI·ÿN‹>Š Þ\çªý÷„° "&È1A® º"5û@ŸÙPêóK<7y׳T©{a%å°‚3U'êo¥/©Ò1  U¶ÆOɰ·CɤT—+P¹ZZ2Z1 å6«JZfü¤"?pövìÚ <öÚ!‰`í:õ#ì¬ì¹u}—X?Ôññ/? endstream endobj 1334 0 obj 533 endobj 1338 0 obj <> stream xœíVMsÛ6½ëWl}HŠ%ø!R¾5™´ã™L?2êô ‘ „$¬¬cüË»H…”%W=ôVÓ²,òi÷íÛ‡>Cˆì5¼—Íâ»OqšÁN/"ø_»ÅçqÞÊÞm,B`S/üw äVë8,`Ó,îÛqÙê~çffÏ€7T†¶ØSÉ:ƒaË„<p”=”´ÚuâèÀ²cŠ©4p¼ÝAªŠ©zÍÛtT±ašé·›?$ cØ|\ÜóZV2­©Â0ä_L)^1²¥¦WT@§R±q ëy¶Þ~»ˆÓ!ÜOïà7—bʶ¢ ÷´ÃJ4Pq G M_î¡‘Š«k^rd…±öÔ ül°ݱ’×Gæ®ã Þ`=m/z}@Õ#7‰9O%X:tË7GËΧÅR:AK|‚7ÜJçJê›-SÇŸ˜ÐPîYù'«¬hö¹Mç(‡ðX;•Q8ØIËÅ¥½Èùµ†)ÍJ×¶ÕH׊ÏB¼Õ†Ñj.×÷*¦KÅ·žÁÝž‰ÐŠÉ†uÄ‚mü޵Ïj´Ož‡y£…6Õâþ—Ƕ¥3a%ë…µE`ûPU;6¶²æL ¯”âFƒ.±ÁŒqÇÄq’…Ù*»žx™&$\e–¾=ˆêuO6-€¿¥l¶¼ÅjÖäó+¯7Š¥­5(b¸*r=)ÉGo¥ ½âÝçWË£mŸ»º”ؘ'€-GÃWÑZi\÷ÔŒ˜òÖ„Š×5~@‡ã3ÆÚsÍã" Iž¥//Ô“p½ÊÇ®8ö/ô#aRŒ1Þ|s!ÊG’ˆ ìŠmT Êäˆî„ÜRa¿µL²¥Î&Rã”}å‹’œ}Î…uH²i¢{.ütÔ˜‘–%Ή!¿ž,/Šº–NwÙúA帓$Ól5áî§ßýìiÊýÞQ˜“Wnmà;õ ã­­ŸI³V< ¥$qëÁ…["0ü¼üôþã‡/$(òlÇjtP v¥»ÿWQ@âhr#N£ ‰"ãEðÌ>·O0ýjpŒ!2XA¬ÝÎ8Ü»D`ùÚõ5?É |íš@Ó¯Ðxv½„&'ð?\à ”Ünæ ë¹3*œL ÅÊ~Mª94¿=êêv®ÙÍ @z;ôönA|;WòÏΚm ñx>’†60§u>œýÜ’Æ} Îõùf”â Ì×·Ï£`¨nûàÚöf:s¹q+Îq;‹Ö“‰5¤s:Æüìw_ žåªgÚe<æ&yAnß?í¾ÒûÝ8μt•=Èø"Î䛕áβ‚vúÅ\’† Ú—~Vׯ¡=S¼:§Ãny6/>ûJþ×S-µ² ¹eW„EŒÆVÛ&“,³-ý°YüŠ×ßø±^6endstream endobj 1339 0 obj 1163 endobj 1343 0 obj <> stream xœR]o›0}÷¯8ok¥Åõ“ÇI]W©šÖ?ÀÀI™ n,Ý¿ŸMœ@µNʲ°ÎÇåÞóF9X¨xV-¹ú.…í@nü»%O„OÄ£jñ©ð0)2ä(6ä@åÈ8Ò\Q¢%˜ÎÖ ±Ä‹Š·—Å//O5Š»#ùÌ™y‹›Ë'¨~ ý§Ðì|Õô­¦g¨Z¿[ÀÐä|¨\¿jjaç÷ÊßVX~ÎÃZ…«ôk) ƽÃЖ֚UÓWÖ ({ÓMoìT®˦35öÍøÐt#ËÓJf-á©Ô”§‡OK~ü7÷‹çà+ON¦àß8ŒŸwÝèœðÅØÇÙó`¢OžZk*ø{<½Õ“ÒÑø¶«Í3Žcôs¿ÊÅ„[ù%ÓhîÊaÄî±.GS¯ñÕý6íO¿Už}„`LE4ƒ>¤@S-üh“TOt®ÒÓïÜ“¿Ü7áqendstream endobj 1344 0 obj 433 endobj 1349 0 obj <> stream xœ•VÛrÚH}ç+ú-NȈ;y#”íe—d½ ÚÔ>Ò4ÊŒd¢}³¿|»g™›½±0P};§O÷è´ƒÚôòßqÚ¸^tz}ؘFîð½iüh„ÖüWœÂçÈš B´n8߆! Fý`QÚ¸ZðÍT)˜O°ÌY!˜¼%Tö¶ÈXÁÍÇè{£ÛƒhÞ¸Z–iÊtõñƒ =„0¤Ð^б?G[a Qq™ò¬€„›X‹7Pl9˜œÇb-bÌ‚áÕâ:˜Ê<5M`YbEVpk^\°Æäa×'|d²äè·V8ÚX ‰1D¶ À—»gÂc¹?¹¼PÅëà8BZ³Rç^¶—Ù’pÿÛ?ËÙt2oÂn+â-¤œeÄ+öõåÊ Ž0ñï\À4‡‚=pD£Uj™QZl0±„„,€§¯ k°q "ÿÄ[–møŸÙbr{}¿øs‰¹®DšKN²7‘s_+¹Ì¾Lîn.ÀÜ1×MODð\#=0ÆäŽUÄ䕿k®¡P[º÷¨ ò£ÚDʰæ§Ò`Ël¡0¾XræÑßðÀ«éô9€o¢ØÖY)ÅAbD±F /Ž5cöòób¬ÉG+†Ÿ«ï<.ˆúg_Ñí,Z’ŒxÓ ˜¥ü$ì„”>tU…«\˜¥øÈ“óžp¿­ Ž…<&PÛ\"{dZ0¦¡^I??Xv]R©I%tß`^ÇîÚŠŒðGNÅæ`ÞŽä²Ó¢(xFÙ°K 2¾³aíØˆ¿¤ñ”ÅV•›-šY…DÛW¶Ïh²ªöÚhR× ê…x95¡R%¤¬Úsx8VÔu£üDÔr²[ÂJæ\¤NCdñ2ùn–ǽ ?Â5%«T+&i¹û(v;Þ„˜Ýìc„½`8êy¤óBˆÚ=×*çº ÕÅ 7gF‹Ö™w;C“u«;híñZ09?pµ9hÊ!%ǰM6s²‰…Ž%‡~رï°Ý>Ý\ƒÍuÂD8Fý~ø*<¿\Ü]^ƒLÊzÚ&®•”jgW¡ä®/'¤v{à×ùEV}%dÐê…£ -'üùíúT&+[$ýì7±HSž4²?Q©(Ÿ³>¹îXæm}§Íùð¿½y¹¶«ýè¼Õ5œÎ÷£9`Ü0s[–­Ô#þ“ÑÎ÷ëŒÇ I<8 4>ß¡Ò>Õý2íϯ³ß”–ÉÁã,/³a0´ö³5¼â‚Û±¦l¿¹°þ‚‰ ×™p(éH´» Vœ6€{à ž ªÒ(òÂbÄŠt¨Á# UëÖ­Ó,;¯×x´º0î¼?½NÃÄ¥ÖôdGQœßí½&|Çýö¡ßEÖÌޣ߄ßQ÷¿ìq7™O¦Ñlz\Û[7Óùìþ]³ébyζNjCfÏu|ö±…;—ùìëÍdqê"QELÃ.6dîTeê9C͆0r“> F1´z£ owWØÒÖ¹‰áë?E¦äendstream endobj 1350 0 obj 1189 endobj 1354 0 obj <> stream xœÍVMoã6½ûW zqˆI¶cÅ7w“vÑm"´‡¢ZKl%QKÒ_½%¿¼CJ²åM¶@•a2Þ<μyCê+ø^¾ý4¿IÑ»y GcHuχŸè›ö¾öæ')àÇØÁ&/{ul“nïÆ½«y Œsa„,¯Ál$R3‘@"¥â¢dAï´ÁBCÆÖ Ä8.E‰LÆ ¬ŒÈÅßH/¸–ùZ”é+ÌŸf Ù‡øÏ^0ôBˆ?õ®þÂ݆¨õ>ô)¹a8;›[x‘”¬@8»8êD‰ÊfJ‘¿‡è:‡Á 6ûüåÓüqþðtë–«A.A*‘RÝ9,EްÒT ÌâÏ7³ø×šçþ!~øÿ|Ló}<÷Äsïxº] ÃFšYÊ„í‚$8‚,Ñò¬ôpÞŽk'xCu»§ ½hQ“cÞ»Js¹`¹Uÿh¹È› ÃBiB hI‚‘7‰F —ÉŠ}x¥d…ÊÔ”bQ°’ŠgÊÖ‹|Ú0ï[<£ÈŽG0¨›m  N²n§!e9KLmš&«‰ ŽœF¿}|†/R;ÃÒR%‡g2Ÿ>•4ð&Þ±·Õµ[ÌIºªa …×,_Qö‚€@ä,Ù"'o+LmPÂJò<è ±ôÝI[–¢1HeýØú›cª—RÌœº<¸ÛÛ¶ÍôJW–F¿ëòãë¢Ë/WÅgÃÈÒàÖ 8VXrZ ^4ÚaÎåæµÈχÎUÓ¨Sˆb\°² ©N!U¶Ó‚|ÔèߊS()šâ9nÚ¹;\V8‰¡/9ï_Ðò­XÞÆâËw‚3w/ÜÝ5·U.al]徉ãÅ™;ÛŸ/¡?íƒÐn^€é#_i¬˜bFªzÔQ-–š©Ge7`y0çÎú2“+¥o Q® ê„¥‰K¦kRb±”K¡´Ù—mwÖŠ ZÛÎXcƒ3b«¢%ªŸO™(Ü*ô‚Û+ãÀítw64ÇM&’ X¾a;'E»Þë‡Ä~­÷‡Ã¼œKàOC:ô=ß²ÐÁ鼆Ї¦ÖkúЭ7 É:"µyÔ|Çñ5•¼É’tßd ü,ô‹ïͰáÇ1ïdÑFy¡Ï¹“WãѿϢ9Sù®vèªÆ}Ú¾4«= Ú÷…Å®¶Û­]“ŒžT/ú˜1,ÉjW3 AZ zÃn‘£½ó_ìŸ-ü?Þ?8 d*9ÙÁú—`M_þÏ»ñE<’ƒi×*ª›n…·ˆjLäEá Æ#zoµç}0ŽìÁþ÷~¡Ï?£ø \endstream endobj 1355 0 obj 980 endobj 1359 0 obj <> stream xœ…VMsÛ6½ëWìøµ32KR¢$gÆÅuR·Iš:šÉô‘„†€ŒìÞ’_Þ·©/'©4ú ±Þ¾÷vÁOG Åüî~ójðË}:Éhã1½Âg3ø4H|u?yE/–§3º¢åz¦&4Khz•E)-«ÁODÂnÚJê†ü«.·ªn”Ñ?/ÿÁ’Ñœ–¯9îò𢓫Ÿ‡<Œ]^ÔT«Yº~tx6Z)Ý6Ò‘YAÞG]œE9™]œGgQ…ÜX)÷[Õ?G™=ŒnE¹ök“…1Ì댒„K'̲_h’¢ªKÉÑ­SzCîã#寨BiÑHr®‘•£µ)K³sÏɯµ'?MöDnJ³e˜‹Yô"¹ÊbDs½2”̲(›”ÆQœ$Ù´ð,â2)M~¼ÊïiÇa¤V“¯¢l†Éi„%bOcÒ×zöŒ„ÖmÙº³ñÒÉ1Ù9 iOBCÍVÒË?&Ĉ’w{¬÷‹ÑÞ_ooÀ[^¶…ÅpHVÇæ!¢åV2ùɸÛKô{eÄyípß/:è¼MaÅ®—±¤Úšµ‚XVn`dGµhi5íT³¥ }jâuã=!tAY Ea¾Þ°¸kk*ïMÚ³¿Rpœ•Ä’Ýi U®÷ÇÈã.äZ´es›w !›ÏÒZU0'¸à¹©*ÁNWÚ_÷È]-óˆ:I¦È%OÏ꼄w84$¨ ,'Ðj˜k¥«Ñ–˜s8ÃãjqS7OBtÆ÷$Ž£t:GE. Ô*÷ØËþÞeÀûwkÒæébä}0¹jÊǵ§¦;Äzà!V8‡._0Þ•¤w¿ýýþîfñ:ò=¾ŒÕV@Ô\OW0Ì¿…Ü,ìݛū[âzéç÷]otÊšÀÿÐt#úÐìN9È‹5|Áä¾[å4½¾{{»¸ÿÆJ"z !êû†úá}‚\( &§„]„íEAÙ =o‡œkÑ¡ ¡3ôŽt>Iö¤óµwðFØèñÂ>ŽhŠGÁe(‹4Ìëpé{Cô!‡={O>./»­Ba)íû§;í+Âù“¨7 +éO¥Þ_ƒ)¾ëÔ J÷åqB؇›÷¾Ú„¯³®+õ6çæŠ óøäàãZ@B‹C²¨ >ãñ64Ë’¹²y)¿dI:âO=="eYª,¤1΀Éxž4™EÉ<™òÉÃGÿN‹ï5¼»’X9©sžÍê‰4Î€Š…=d/éžÃàÿѱ¢´”~Zþ¨˜ý’Õak¦­+ @¥9¸ÈSý-5¾ÇäÙãÆõúcF'TîJc¯y ×èæú¢k$8ª5»¨¼ð{Þ´{Öÿ/g>¤£€®Gþ #£$«G©—šMg4O óhž^Ñeºc’]qߺ]þÂû?=AS¦endstream endobj 1360 0 obj 1256 endobj 1364 0 obj <> stream xœRÏoÚ0¾û¯øÔ˨i „I;lÕZª¡j]sÙÑÄà͉Ó8¡pìþòÙ&°]7E‘eûûõžß âˆ#öß°»ù–Ìæ(-‹qïþ’½0 –¢Â§<Ààù–¸ Žt™DòŠVÔÒÝŽP¨¶ÐdÑ[ û»/sôµê,Ì’Ê–Üå j:lM@th´*TXרi U‡[K…©%Z!Uo¯óŒO£ùš^wJŸŒHkÕØ?ZúÛP¡¶Êž#äE]:ª 6C°×ïX2´Mç¥E‡Û¨e+ E'|èʉ¦!ÑZt&¤¾*Œi¥=ÚÍîhU!ôTuŽœ[rT×&_ueìEÖy^êqªŽ":ej;Æ^hå §ÒoQˆBI5µ¢# +¶äÊÜ!ìOU—véóX±§©l£ÅñÂvUmí­Ã:Ó‘oÛ×Õ÷ç‡Ûkœó‡|ÎÙKñÊnÒxº@Åx:Í"žž¶š=ÿã¬Ä³aVîÏx××1.ÍŠtÿ¦Áód’]<³,‹þ?žN)Ê‚ÒÙø¡–tVŸ‚'?ñCìp“dÍK6Z ÷6}#}ßãÑì©ÚP ¾#‰ãù .y~’dQ–,1™OgƒOãKAOì7èüxendstream endobj 1365 0 obj 495 endobj 1370 0 obj <> stream xœÍVKoÛ8¾ëWÌ­)àh-ù%çXlwQ —¶F÷LK”͆"‘ZÇÇö—ïÌP”e# °ÀARä¼¾™ù†O0O3˜ÓÏð¿l’ß¾æË\2‡?ñ÷<%_á_ÙÀ‡_[C¶]Ù 6¬‹Uº†]“Ü}•‡¶7•{\*k€·¢SÒ½ßýHKØ}Nî¾õM#ºóûw¬qYFó,ÝðñïÒ•ÚKG{× ¯„†.(Ü AtŽÂTZV) Ê¢{ƒ¥ ªõ(ykm™æ|ew”p°º’º^K¨mwk³VÚËN™œ„Ã]牳£(…sê@^z‹×%`D¤ÎâŸnH{ ;Ò kÓ7{Œ;ÖZ&q›oRDø"™-G­¼D­£Åp6¸3N}-“úySçÅvróa^pËõá˜)Ktr;T ÈXsdÈ?QÌÁ|>Ÿ"˜g«+s aˆ5,'†Hƒ`ܱÖÁ gÞÁl“G­a9Ap8 îDÁ©¯ÿÁlM3 ômŒú+Bè¦ò”ÈóÉ€ødó _RÇŽ„|"N(¸îlƒ!{d³¡L&0´ÉìbóÒ 4ØŽ =PþjFÐTÍ`È0=×xK@ªÃqo;G=,]$Bi\f¢'4ÀˆK‘fÒÀ3¬!hl@âÛ(Ïc\ú“Dá‰L¤õ8CÁ‘P©…jÂì÷'/Fz`Va^u òYºe’À !93†Ô#?‰á„ròDàØ;Ù^WøÔi[iB^&)žD„È5<•ªk,N×õôØÛç{2:úRBò+ãÊ¡Ö:~„Á ª‚`ŠTžoŠËkðá*„ÛrÅiÑZ}> ¤×s–îÿ0%þ³ Úõe0./‹éa烓ô0àŒb[xð=–H|¿Äö ¯,-k¾ãüê…£bû„— ™> stream xœVQoÛ6~÷¯8dKGµdÇV²‡a)¶¡À0ln(ú@Ë'‰+%ª$ÇÃ^œ_¾;’Š-¯ *Ãq ‘ßÝ}÷ÝG}†Y’ÂŒ?ñ·h&¯ße‹k¨ìd?Ó·š|ž¤~ ÄŸ¢»µ_¶„tërö¦°Ja™_'KX7“Ëwzwºo·ÂH´ ­P{'‹Wë¿ýþ¤)ïÏÒ„p~™\¾¯±…R*‡F¶8±QFïì\° p{0½Š|ÛŠAX(µÙˆ i9>Ø9z,œ_SUôJ8©[Zí^};IçIæãnu‹@OüJl)<ètòÕV¶ŽÒAÛa!…R{øóʈ=à=í³ñ©.R‹{„­´…A‡S(•¦ømE/;-[¶’3²°é¯gÈ·T‚(œÚ'°æ"$ÁŠ–ñ9ÙZ¹Å1);éjM0+a¶à4Hg9…Šý‡@}Ep/T üD„qÂ&c2‚˜®!@èØhªêØÑuJ"‡ãPØÚÞw…ñ” è¾.á¢4)Ú-u`¨exÔè°³õ‹ ¼lt‡…è­'ÈgÕ c[Y–h¨TAitÔp²aJÝ5NÈ:£+#K¬Qš•¼Ç‘ âÀöŠúº;Sæ »È=¡Œß®0$pÊÇPÃ)¬´Ýkú Ò9ìjYÔÐ;©¨DC"Ž {‚„ ©¹ùE„U°Î"T\gc¥OS¯G/iŽl=§3;_øJßú}'szoî-üfH’ˆ†7Ú ÏøA²òiŒ‡ný¥ûÀ«Õ :Ù 8ÉóЉ¶ØÃÝ)MÓ·-³:Çê#ÝÉ–e¨c‚½nâÚÓnEž‡ö}ñëy"F·ˆœ zÒyÓ)Ê"ä—•Z)½#ôÛÀÖ<[ÁM4¨Ü‡‚¡©àк4)iÄ.>lôÃa‘¥7Óyž¯¦KúÌ?^À¿°ãÞ¦³§Íy~3˜g³t‘Ã|uå‹å9‰Y¬êï9C¸šüM@v¥$9U‚RöóÈÈßÂõÞŒ(B ]­ÕưÖ†êbýw½·DO; Ú<å“i¶¨°pD)aòæ£MD<Ü8…N‰";G‹^ÍøÉq,¾‚J^’ù%ÏÑõ+i6ä5ÔÛaNµ‘IIÅ|™ƒ4õÛ¯ÊÓ#s€‹®Þ[ˆïàK _°u¥|zˆI’€ÒŽÏò­e'ì]G gÙ¾k†§7Ñ,7¢øTžHlÓÑiÅ í¸ûäŠÛÛ±ÊâÆ`Mûà¯Î®p÷åBüš°á \Þ°-ÿçO{ijPt¥þï*_¬’Ùlá`þì ¬ŸžÎ‹ ÂC8iÏÔ}4P–à06šõAgá-…T|66âÒI{‰×ª>ónxïëý÷£chÍPX’PÁEÚ%kô§Ô”Ààè0²s8Ät¦'¹g·ñœ:?¡Gé 8‡˜˜‡ñ†O¶þæÔÀBË_Pó3Mþ"ùÃÛš÷•ƒL0™Æ©VÓã{Lpýs‡Û,ú²g$YÆü²å ò1Oòì®V ~ÜN.ÓeÆïˆ?®'¿Óç?p\{endstream endobj 1376 0 obj 1199 endobj 1380 0 obj <> stream xœUMÛ6½ëWÌm7€Wµ>-ÝK€&] Ø&­€Šhi$3¥HE¤Övné/ï %k½Ív †Ç<óÞÌã#ùÖakþÌ¿UüðkœfÐÚ` ïèÛŸƒÈ§ÀüSu𦤴$ÞÀÊ&˜J#ØDo³0†² ®Ò8ÊáÇ[8rHã8~U~"¨°€ò=ÿŸEÊ8$ÅvýêÊ“o Š6ŽŠRßšð(º^á ú½qF[8H·‡ÞXé¤Ñð ÔˆLÇ[æ S ¢Ó-s„낲•‚^X±ÄéŒ|§¶8È/XƒìD‹ÐHåè…nAZ¨eÓà€ÚÔàöÂQ@è啞\z¤‚©öâ¡¢:,÷üd‹^q´hp–&Ú¬8>n9Æk£Õ$ÜÕ¥n'`¹ŠlÅ1÷qãcáãvõ¢˜÷Æá2Ë€ 蛟g¢1QT{|ÀŠ…]°`{¬d#I£ÝÉ+0`Kÿ…P2L‡BÏjœ—Ãz]¸ëdf%:ë v¬*´¶•:l^PˆÕaƒ|•Úýýh¥«9)[rþ×N¾ßA÷¿”Ï¸è‰¤ß ²ÀòÑg+/2ùªr+ØI­ÙzÚ™ÙSKKvz”öRKî†IŸ7Ž´™šZ¨““ÕYw±3Âïµ™ªˆ¹Ô€ð§÷he«¡5B™¯Q²W@]eFí¼QÄdšy¾JµŸ„(/Ç]ºâ=¬,RgŸÔ<Õò;ÇмÆiíH‹´•Ø—óJv’ziºQF8Þµ½!rÌjá9U°Ãì~†|Ùhy˜=9°Â쟥SÊb2Ÿò¬Í, ˆÓvš„£C]Oý 0ëjel> stream xœWÛnÛ8}×W ú°›+R÷û¢M·@6Û&.öY–i›[]\]âxßš/ß^$Å)›"‹9g83ç ý |ÆÁ§ûYTÞ›[F°í<>àßÖûæq½ìGQÁÛ¥^O`¹ñÌ^ ‡8X ËÊ;»•Ûwj³¹ ²•u!;x+ûƒ”5\ uß4ey½†·—W€«USw¯—{AËkïìn¨ª¼=¾þUC%À9A ÎýúìŠV­Ðh¿“°ž¬N@Þ¬» Zc_Ò†¦4Ào>ÝþyçÞ2°hî`ÖƒµïqÍ©;!zÉ_vù½„¾U¨ò¯r:§ƒ/šjŸ÷jUJ8¨~G®¨ö­\Kt½kÚżºjZÄåÅêTµGó#Ù©‚ɼ†¼ÜÊU›¡°K„×JèvÍ€ç_I¨›YèÆå¸ ñÎúCÚn%ë>ï/K Þ¦)Ëæ ê-(„‡Ru=4›'I §T펫JÕ«Yj(hý‚âý~é}öÒ0aDX@5cÁÂ Ò bn0v{õ K cÑÜcì0)GŠÌË~L³|À2é:“lj@8³­ ª¼û ÷y9HÊÍl=k?B‘²$ÎЗåÚ;Û¨¶ëÝçê¹[snê ×Ð`Þ£›X JâH{O5Ï ÝꆂÊXÝOÕyꂈb%‘uaÝ` >óAd,Cç&Pd­ê%å^5ÃÄ'eŠ÷Ÿ‹4fBÌܦp,0@pÈM|м›hM«¶ªÎKxʵå“Q!‰ì›;`¯åFá39Sæû=V?Áޤ|êÚÃu¡¬eK“‡*4ðÄAcŽH¢`€å`}Cõ°ÊòèÂ-×ÄGr]92Úʹz¢³3:ɘ)¿ÌgAæâ¹’›¦•?ˆyøcÌÑzÓ‚,ñªÇ •%ÙåªtؿҕŠ'-ó¾—-39Ìr £Yìòz+éPµV9…bb+÷.×åµRÿàüF•hPK¥*µì,@1ÉfUßÔ›^v½ngª^«{µ0™. ¸R•į¶Ù£±*ï1ú”Ù|-Ù‰ì„ýd'È€™ì„"ô­@ØÇIvì„Q·Ñ´U';!ÏÒ¹ì„;¥µj'ÙqïŒ;nãÜ×ËNÈjœ¥ä¹.ÊE·Éÿtyóîò´>‚”E|ª[„»œ¸¸/óBN}Uª;bå>L•Ÿ?W‚ da;ÐïO!yÊ?!sÔ–R¶y…I”ÆYijPåeMO¥§‰Ž½ðcb¦¬ÕË››/×_îN¡£€ñÀç?‚:j|§VS¦j¿gô X¦öýL1ͺ@$iõåX,YÁ9¶‰Ô€ƒõñ»ðøë/x´¨ áÀ ³Aìãtðø YX…¢\­ÌmÀ&lu¼0R1âÔkBÕUðÄz`°ÃÇÓKC Òš'Ÿ²D—€ºÃõ²Q|I`)Œ®O=Õ+c´²ÿL ‚Sf˜æŒ×"‹²¯E†W„¯E†Ã0Ð>N¼¶†ºn£i«Ž×" Ã9¯EðѪ~œxíÞYwìÆ¹¯/æµ@'‚‘׳°îl2õP­° Áw£ŸþfèñþÖ¢ B·—…Ú(\ðc_é`¬“¢Ì[z¿Ö]tgºè“¦góŒö¬±#¡ v=l­Ø°»#&¾Â¶z'¥ÎôVÖ˜­ï7]1èÛ Šù¨Ç1¼û Ë@$©© ”Bü^¡‡¥w÷‚è !–¡Ì^¸îè.ŠØæ»ÆT-C8ȈǨ¾ÉOA&¨’ڒüÒÍŒ¢‚A2J…`´fvQÁvŒ 0YAÏf…œ $¶˜Ýâ1J0ÍðenQüBnõÿCC_OÆVú»,÷žIGÌ4M™à?ƒÉ‰ÃÚ’þX¯åÃ\8…V<,`Zw.P—u8®s¼m û5].àoTÄhpÂ÷#k N 5⓲TÐu5áÄ4Àãp<Ðgï_?­úîendstream endobj 1387 0 obj 1554 endobj 1393 0 obj <> stream xœ­–MoÛ6ÇïúÏÉM[%ëÅrè‚e(ÐK3==Èes“DG”’fè%ùäûS¤dʼn״â@¤H>/¿ç…º!Ïeäé?ûÌ*ç—kÒV9ýŽÿ­sã°~ ÙGVѯë~[D,¦uᘳŒbFQº­+ç쪫/eµ5?'3õ–®ùVÈšÒ:§uº)9]‰²åz»þË –´þàœýÑUUÚÜ¿}Ó눉1­Ã_º~¿¼Þ E¹ÌºŠ×-åBeR\Q»ã”Éúo¡AQ!̽ÍAoÛë-ŒÞ9qµç™HËòžîD»Ó;Ó&‡< X`µé0Œäž7i+—¬…kþe¿ëò`É)GŒçÔ«/D–³á‚ª%YPJŠ7®a¼‘²äiMüë¾áJé­s,ïSØÂsÚÜë”KëW|ºoêF~Œ@í¡<-Hãû‘ µ . —þ¬A·íðž—÷ó^5Îu*Ýr¹étC-¨¥-=GGUÓL‡¯( ³nA_Ô‡))ÑvFkïQáÏén'`¸h”á©p¨íD+n1©µÆJBr–"!æ–YŸASvMÆ5M@.: §â‘wY&›\§K+©”õv¡ZdŒ~a|ƒ‰ï¯ß]i;8’ɺ5„€îä1[éß:ˆµ&1 F…€jÙ}¨‡’ªÏ–UìÆaŒêZçÎlÑu2Í&†õÀ·ëU§ÎÉl ü˜VzÏ‚±Ð]&+ZøÌMú„ònŸ÷»ôâ‚Í÷ââÂÿr,Þ÷­­@­ãz›–::­<7†Ž:Œä/H¦ÙŒ¬ð7/Ëþtæ©ÌÜÉ;~Ë›ï1n›4:]ú:ÖÀk œ¦”§ôOb7Œ£¨lž÷Ü Y~ø2vW‘ç¿ <MVòæÍñ ç¼,Å^ñß›ã—ÌÃÇÿ7 GúèÛ7zIå‰à<ð¯ßë*F) ƒµX¡sé2CÿL³Ý˜·E-êhvµ¸éP1¹>´oä¶I+EªÃfÄ«èê¬nÕãÓú»>Ѥ‡6͈ç?áµÎovžtM U¿>­g³4\ø³Ù°}ßãD#³ É ‚µD÷ßÜ Ù)ÝgtÓ=ôP Q;Ù•9u­(Å?èkÏSå$ìu)¬›ü°aÀ–n,Y˜ªÓÒš@±6eší$|G«Õ¾äýun²«,å]iw%7ÅõÛÚùè$(«Ø2HÜ€ªqîrEIº,I0BÄ,ñ½a˜9‰·tæ/â•?98Ìz©™3LýÀ…³‡“€6Hí‡:j4kÖ{pjkæÿñ5Rµ_Q«ç<Í _QB_ýø*™ÜçúöjS¡‹Ì”ݼÇ6^®¸sGÇQõCæ^ôÚÎvŒÝ_ESìcO°ðÛ2à vóÂ’µíÌH±#Yž`÷£dj†ìvÍZgNmýqì~4@—5§ÀÔð'ôÔ#>>¹©ÒŸ DÀºå«/u»Å”˜Û>ú!-PWzEáªÎ¿3MNendstream endobj 1394 0 obj 1157 endobj 1398 0 obj <> stream xœVKoÛ8¾ëWÌ©M›+R/*@.ºÝAîúVä@Ë”Í%:¢ä$Çî/ß!))~ »IEÎ7ß|ó !&b÷7~WMôÛŸ,Í`k£¾àÿ6zŒ¨?ãWÕÀíÊ+€RXÕQ°¥PPÈKF8¬šèjµSºAK؉v£¥…~'¡ŸL û¡“ÐÉ­2­<^TFM µÒ½ì,ì;³—~!p×ÃЊf­¶ƒ¬~a­Ú¶ôÓêïˆ&„Áê>ºZ£¥háÓGO1)&ÉŠœ!ÍÕ&ºBÎè$†‚É´½¡54êYng«Ý`¯!Ø%¬€Ò™-³Œ$1g°dÔ6†Ôª·ß+ÕUZþ ñ?É?‹½º¡×ÙùoÆFòNO|ƨ÷'¨eqþ0F|º6ýŠ+uZ¶=ÆwýGgàØ"8󕎾¾½½ŸyÑ­U߉î%ÔÀY:h\2ÏF¹;¹×¢+dßɃŸ!\ä+/H:çëZ-ë¡í1û(aé>íTµÛ‹^nBâ>¯¢oO± cYLhæež‘´žd„rŽë¢@A8‹§Ç*âqJ8eÓ‹KýÕpZyÔ*š–ŽÂ«%c3ªDÔÙcØ錆Ç\«¨~G3– ÚQ’úfTµ×–a}ÉgÔ ›Ç´Ømm/”뿱þ”ë9Ñ›‹Õ¹œ´Ÿ²Çò”¤é¨½é.Rƒdù´M.„§1?ž²äDxŠ£DáñHøðbÔv4œVu>.“ácO¨áñHøq/Й ¹¾_x,oöÂo {kú)ïN@YÎß:͈Û]&IIršâ òÍŠïïZô&z°•lE§Lp~î‹—$ãoLö+ó'aA5{­0€õËåØÄʜÒ–óÔÜïÄÍM:Ž5@ñþtPbkãO÷t°¤Éÿó?¡{Á6§XùÉŒ?¦¹ÔÏ}]}~F|%ÛJ‚Ý™'Äöz÷n>¶¦]V¦iOꀱtRô›Í&”ŒÛ§ ±ZêÁªvë/Líð Æ?ß}C‹5&+wXNvн%N y<¯f\?”›Áö°v¯Z«6²C;¼qÊÕ¨Ð×þ(2 ÷3.pJ+¿ÄËäIj|#ÝM¹“z•ƪ_Žé¸(ÑãMNàVºoÆJë#Á€>kr1ƒ¼°Z°ÎòðëW5îtN)Ñ¢Ç+ [«Ja0ãí?¾>9> stream xœ½X]oÛ6}ׯ¸óËRÀÖ$J¢¤}XWwЦë¢fŠb m:Ö*‹®$ÛñcòËw/E9’â$°; ãÐ&Ïý:÷ð*ßÁ±]pèǼO—Ö/2?€ëÒràw|][ß-Woó6]ÂëDoãà†Ì­ú¬ ¡ < lÉÒ:{»ÎÇùæ%à{¥TV®ÒBåK™Wp%ŠTL2Y¾Hþ±<’wÖÙåz¹ÅîÅÏ;×%læÚ¡þú,§E:‘%T ²¶iÀ`»H§ ˜Š&Ö¥œA¥ i¦ }Jmd!²ìÞ§Œ Ær•q«¶»ªR•÷]óm¦·$=WY¦¶i~ýˆk¢P®W+UTèÖd·÷áeË®†={{ž\þ=þœ\üú~Ü3qÛõÊw2³Î€²7â~ýÙÈõÈŸYí}ÕFuc; ‚ædÇ„ÙùˆCá@¹’ÓtžšbÌä\¬³ äM%ó³¹XJ,‰Ìµ3ãÄúhqØZ±ç@À––ë»Ìæa½Ì¬Ë'¸Öx×p-ö𔋴5\û°’ùí¤%–?Ë0Å耀yŠÎfbú #`U¤D1Àß×Ò†d±.‡&S !6„‹tUJ‰¡l ,\Œÿ_ úT`† Ûé%ˆ °Sk¢¹C%Öñ»QÌìüSøÌ ɦ—Ç…@6# ðA 0p »!­j]™bí(ÚyHs]¶}U|ÏÁ𳯭À 1±ü·Éæ©åWÝj“Ë «{«ÄŸ³HóÓâÄõòhøÜ³cmÌÐr*¨[m8ŸC®ºåÛ3‰‚´MsdŠÈgµ¦t™+²RѶ\U°%©Iš“÷uŸa±éPVÇôðòNohb *!#2¥¾¡^PVhZ3ø<*Ää†z¬Òîí}A朑;% ÆWã‹ärxrp™¼_%¸ÝJ’–!ˆy% bÞPÇS#вÂÖUË\j½QÁBŠ¢úéÎî«Îˆ1ÕŠÖÖ‡OïûòFvˆIo+PÀõG' Ðs~@~ÖË ¦¤+@D:/ ¢–øèåѤóP&ãÿS|>½‡ðÇTÇóݨ¥:zy’êx>{û^uиZò—šÒ‹VQhnÔ,Š9aß“ÈÔ¯/VnÀc;äైëh<s¦WGƒ´5PL#Æ“ZU[q÷F£˜ª‚Q²} ÔíiV¿mF.gúD¯9_Ÿ_üöáÝåƒæ‰mûQÓ=$}Dä˜ùfG­)¡Å‘AÜiv¥=t‚n·—‡'²Gu’æ9Uþ›ÜiÔ‹RwTf\BÇ ±­5±#ºšeC($aWéFf;j&„2s y£"Í„ëÒ0¬/wÌãvä4yBÛS¬û«/¹¸IKw¨ßØ×~:\éÏ÷Ò„îoUA·v÷ž*ƒ f°0Ò—©w«g–Çq‘ðV¦£qï2íÈ£z£œ±‰â×Ë£åŒñÀ´ôîw€ÑNäûvàb‘l¦‘‚Ã6Ý‘­±ˆsgùƒ¬BE9iAÛ¦ F3™¥Ë”Fk,äz™—CMV/ ƒíÙXæÓLÕw9B$OÈ^$ê>1h>~ÚðòF,WÞ°é\‹ëVÐ%­h‰ÞLV7š­øÇçúW áÍ8€ðfØNïM;Âà–à‡}÷èÈIr.1–©ž/ÄlVß8†ÖÝÙ„vèÔR#Ñdñ„Os¥ìyZ•_šiùóõùâõyòÇùç~qÔ?:A¢E!6Wu*ðm?ô~L¡ªUzc¸Ø¢ÄRÕ)|=ÊýGR…ãí}6jÏ^}Ñ®=P(Žs|Kþ+”áÍçP;2­PÌÇqß,÷éi_#yO)”ëDm…ÒË£ŠÄ÷…jì…:ÁN£P÷ÆNV(•ë=z jæ|êà#ò¤±K¸†.zl8¢÷ïžÐ¢†š8áWø<£'°i!E%iÍzNjPàA-D†48úFš_xAE,†Q ÿÕ‚N¸<Üçö£õ/¡êendstream endobj 1405 0 obj 1502 endobj 1420 0 obj <> stream xœÕWMoÛ8½ëW zi ÄZQ_¶ì¡Åº‹,Š"MŒÅAQÐe³•E—¤ìä˜üò¡$ÇŽ6n/»‰ÒpæÍÌ{Cå>ƒ€~ºk¾ð~» ãfÆ àOüyß<æL »ä x3qfC` &¥×îeEf¡?‚ÉÂ;iŒ8ƒW“/h…CÈÈ0dôòw`„õ ÞžO®>¿9Ÿ\œÿƒ(|õrÇqú¡³—5,µ(…u.À*àE!ëp˜J»”7`–"—¥Ì¹•ª&Áó9”²5_—Oà(•òKiÍuëèwñ©C‘v(aƒ0&(…wòúòòõÇ6¯ QæÇ£l„U —ö€ Ûgu['sýÎÞ9ËüQ’°nçsœcÙ¤VõBÔV\K>­DŸ¿0`1H!JÞT–®²–®$ª^ךߺ²`âÞ6µUª2>œ[ÆÁN2?Šãl 6v²Y’g-Ð jÕ9Ú­ú’gY;  Ãăh;Ñ»ûǩƩ?biŸi!µÈ­\ òÉÇñÄû॰öâpøCÉ0‰`á%nÛUå]AZtäÎ9 æ¾Wõ€x ¯]’›°Y@’† ñydíò¸x(’$u¥ÅP;ô²âU#¨]Tă½Æp2“ÅÁ6˜™ÏÍ3Äçš/ PÿIðyÏ‚e ÿë®UŸžÒædŽ€r$×T´„k9pP¯”Ó/IõPúþûrÿ=~?¹ÚãYì û·­WLÈ=;F¯Ïòþ+‚Õ| bE;÷EëP#•FiºÚ)i¶{œhSL%Žw²ÝWmÂü(²É6² !Žp¼ dYš’†ÜòHÍ™;OéŽbw¤‡lHR†™ÏX»3- +ø}‡Fƒô‹[ÔƒÌÉKw³ïê ÁèÿCzüfŽ)@M¿ Ù)´Ñh¥xáFîBÇT¤ ¶¾ž”ƒ¸yCÒâ4>M3Õª±8e|¸ßàÜ3tŽYa,)vŽF KX9FËUm]–VQqƒ¬¶nò˜S4A-1»¸ä†Êˆ{k< Ûÿ_6ý¦jø÷û¢Ü=lUþÝþP>T³n^P-f4sUˆ§Ú·–±±°3Q©dÔ–½~>MÖ¾Õ‡Y OP”êÖ±ô¾£ûCÍ Nʾ`ŽÄ °kuŠ Ê9~äô'"dH1þ•>©TŸi×{OéFnŽbD§ž×©« KG›Sýƒ÷/XZ–endstream endobj 1421 0 obj 1289 endobj 1429 0 obj <> stream xœW]“ÒH}çWÜòE­b"ÂǾ©;ºSëè»/V“4ÐÚIcÒdßf~ùž{“0FEkj Hºïç9§o¡^RÿêÏ8í<¹ê#Z½Äÿ²ó¥Êª?┞ÍdÙ˜Âf‹Nµ7įˆFÓ~0¡YÚy”ë¥q-Œõ:7Ù’b—è€.<™‚ÊB'4ßRáU–œ)ë2MëÜ-s•T”ñŠTAI1íÒfeð+q”9O+u­Iű.ŠÇ³OpôiöªóÈ;ò+M‹2óÎÙ‚¬™ç*ßvÎú}:«&G϶”è…*­ï[à4FuQDãÉ©ðÊd›©ÔÄÍ¢&×a/ Æa½ˆSYêLçÊÚm•ÔÂå´Œcd›®ÕyAÈðÈW8ža4ªÍ ó&¥¶¯Á0˜ôGýÆ[vH3¿³Ðn£¯uÎ[Ï=l˜NZéJQ¤4/M¸ Ê.]nü*¥±–╎?‹í\)MŽôWlȔ孺Š_–"¿£DÃ(è ÆuŒ±Ë¼2™NŽÊ“ý²!4˜S¹®BŸö‚ÉxØ =5Epƒ#ÒÐþ°^öâÝë—O?\½yèrãhW<ñMåÑ“Ùê8£pL¢¨ õTû:»6¹ËRyºV¹Qs«Û@]®)w›³º×܉ \äKa/ F½q+ÊÆ5ì2ÂS¬åKœùB¾¬LáåKªó%qÃø½²ñ-…öBT}5i™RV¦s Â-8 }WÒ¯GÊ“ËbM7&QçÒ(ü›Å>ºJ‰òŠa _m«øÉœ*m³m®Å;o‘…°… £RPÀ•ü€ƒ´ãwPÍݵ™Þ Z÷Üp 2IB ô݈BëêtÔ_UºfÙ†iÃÌa¥äå\–Œ"ºœßvù쬤ˆÓ–ŠIðÎCùÛis+&Å‚SÉ"^AæQ޵šk<˜Ð{‰3× ¦&‹ŽÚÉ@Å„]Îå°¹§k"\ìH%ŸÊÂókIÙ'Qµ:<„õ’žîÀr@7‹Ã²§%êî›ÂÜ·³Ë»²&¼-u·>îÅh}°ªl)aO‡eøm4Dã€ê§ÛÅ«ÙùÕÇçÏ™2êá¨7Ý£#FyöS|<ÑÁ½iÞ‰$—¶J¸<<)p—«g2uÔsˆD:é½pÔ ´¶>Bÿú ©,£-lËß—HÃi3Bgbä˜ ¿—†Ñ´×ÈLµ‚VÎ5z×]ç1nODƧ¶Þ‰AñÕµ2¶²ø†m bÆæF«ö—ü` ©:rþavõôhä£Ñx¦A£äÙ/tý?hš±³FE=Ù ƒhoÇ۔Šánd8!wPÌú˜äþ³Åjž‡Ã.Ÿ‘¶Lt5›V³ÎyÅÆx̳E­ÝM¼"ÅÅÊ•yH¶´+ùøÏõi œ]þõûÅÕa­0´Ž£ýnLøÉ/ôâ'pÐëtíøæC &ùØ;|c¶¸†=Œ—Ñ~P>¡ª‹u©N d±*ñ‰lìøènØx6Ãa0štî»õ™`Ã;#‡ЖáàN•š* ÈöÅî‰O×Õ­öF“ö­¢a¤úf½NäçŸççGÑGAo<:¸r «g¿‰\ü›•mãT;Ëä¬îwÕ¸/úy6‚é lÏI…+ó¸ÂB›ldÝRbVÞ1«À‚Ú.ØöNdˆÂ×£{ÁƒP¥t›^hZ] aÈ7El¶Úó¡9;¼? ©‹Ò Ö=/—Kœ9]øõÂñVˆƒy¶›Úù4ç¿O [×-»³#sŸã¡ÊïÔb4¦‰²7Âgî¤W×+M9‘óYçoüýJ4´endstream endobj 1430 0 obj 1687 endobj 1434 0 obj <> stream xœÁNÃ0 †ï~Šÿ8$b³&ÙŽH0Ò /°­aÒÔ,í€Ç'éʸ",Ë¿¿O>B+†.5öM¤›W™ÖØvdðE ²¬afl‰Í­SlÎcKoy¿¥#ñ€ÀØ6w~ÀX0ÿәͰœ/E9øH“EBŸðpÚ÷)µC{À•ßѽ§å(r¯sN ÿyÿïÌ$åÒ¯øiß„ïAUò,%_•}ÎUR«)|C“çU×ãthV}hæxIŸ!®ÃG^C´®G€±på^Ä)'3TFd°Õ—‡–ôÆÞPKendstream endobj 1435 0 obj 219 endobj 1440 0 obj <> stream xœ•XmÛ6þ®_1ß6bU|ÑÛ}Ë-’CŠÝlŒk‹¢8Èmë"KŠ^â¸ß6¿ü†äPKÕ‡"Æbá!© Žæ™ágˆB‘þ£ßòüðÈe ‡1ˆà_ø>Ì<ôSžàŸ[óX,…í>°º RI‡ lOÁ‹·s;u]3Âý±hê}wx¹ý¯QK1­ÆeÈaû>x±=ÖÞcPv_Ô0®›Ž0,–šz7Ãж2 ã\O º=}ßÔe1Õ];†ðn‚sÝ4°S0÷U1© ŠÎêå]À½²ìÚ©ngS•ú¢š®7fëS?àë—w†°=j3›©ÛhS ]Ã×@Y´úûnF-´üf|8’Ç"‰pœ)¥3i‡Mðñoàt¸88ÑR(Œ¥L{˜Õ Bø]»T¸„kß Ùˆ¥y|c7Y/4Fu[OuѸMžT;iÄÜþ^Y´ëö`Ý©©€A5ª•^[m_bv)£< 1F!r½Cž¥ažÚá;Œò05–âçýý.P\|m„ÈÌs!ÍÆŠ©<£õX(ÞêvRC«·:ænß§3™âCq!Hè´²<”9d"Y–áX°0ƒŒGN,­‘1î&Òœ{Šnd¬– Ó,q£‹fš&ΪѪ{#­Ywœ¢ïkìo@4hE[Ôp>ªn½NõhÃö¨ÊOú´÷Cw‚·u[=}=9œëÆË8©“‰zü$ÏøÙì†î“Â(¸À/øpw! á¯¨Æ ÷QÅM­Pq[´+z¨Ú ŽÝÈX]PѸj,äbÕˆª´Fî¢ïëí¨Æœ›Cµ¨ªZgý9mÚnSöý¦TÙzØ7A|(KÐyN'—ºtm^…7çÙòû"[æYäÌóxuQ”:´¬è°0;E72VÝÈ<‰ý39¢b­’ø|nÜ!Eß×›Ï@æC.õW<ͰŸ[Låêœ5§#¶í&À$ŽAß\ ›§~ž&ñR€|¾2ÅôâA—b÷ “)úN›´â3t4A被 t)+èR-VèAGkä)ú¾Þ]‡¼­Œ¦ `øYc~¯OÅibĘ­û^U¯  ÝdèŸ84 Nó8i&”æ?U]cˆ'ìc3¶Â0ÆMÐn­èah'&R¤‘µº`(3¶ÂP&™³jECZ#ïHÑ÷õv e²B– }ß “&a,:L‚ÜìðóÄJ¢/‘[O§¹¥ÊÄ">†kK³Ø×nÌâûòÈ™Ït"ç+¦¹tLGâóЄÅÜ)ºó™NdùŠéD–9¦#ñù@ÜšuÇ)ú¾Þ| "K‰éÜ‘¸òÍÐÜhNE}­‘ÓÚÒŠóW€Œ±¿‡û{û£š®BZ$©Ïj"ÉV¬&’ܱ‰‚v‚@"E7J}VI¼b5‘H¹X•kVskäNì±ÚbõVA¬fËoh L¨Çð¨ëâ¯þ øÒÕâ×bš(uÅùÏá×kؤð‰HH¹""!cGD$z°Ù B†ÝHøD$$[‘_¬Fk"rkäóˆh±z+l"'"BÔ*Ì”;m2±è†½‰HüÖoûºù÷}Ý<“>eñ,YQV䎲H|™&,ŽNѤOY<+Êâho±Ê×”åÖÈáQÖbõF9ælKY:Ãb R-ur<‰|òá _‘ÇÎÄùmE ;A&E7Š|òáq¾"ŽÕº³jE Z³î8Eß×ÛшSWùÛì.ØŠÚuù®c¦SQëãïÉ”ûÈ3aXmºþÛ5h˜N|ÐDº"ŽIÙmÏŠhv‚p!E7J|‚àB®‚ ‘,VÅš ܹ#=‚X¬Þ šà«VŠÓ®>Ìõt±Å¹F0làIçeÑ”aóú÷×›?ÿÐßq £ÚÔí¨Úë}4Ò¨¯ÈÚWx2îÓgbEœIG$zxÚ ‚Œ݈ûtÁY´¢ åŽ.Hôð¤5r'òèb±z+žQFtñ®Õ¥÷øébËÅJ틹™‹[ =¾6µ¸½¥¨,ÚÇnÆh5.‡A©ëB½ö©ƒeë†åKCâ3„4aQrŠn´êaX¶îaX¶ô0$>CèÖÈ¿‡Y¬Þ!ËÖ=Ìn>º˜Û©Ø5ú¾†Z™íýã¿ßÃQ•àKÑÌJßa ŠZ}¥5Nš`þŽÉª¡aɺ¡aÉÒÐèá˜x St£UCÃ’uCÃ’¥¡!ÑÃ1ñšEÑ÷õv×м®*µ.ć¹m͇»8t™Á}ì°Ö› ¤ÙP…Ë“÷X(ªr6‡`R*¶FïLVý©( ý.w‡» ˜d {JL¦Ѓª@»ã¹è‘µ?Ïõ ôežÎÏ-6¢çnÀ‚Ô”Mo߽߾yüÏÃö·‡7ºòÔŸÄ]yOeÑÞM/ï‚h–ZC§ß4`nŸT9Íö"´V£Nëw¢$…ÌÜ©"»d<‡M¦ H×,eKx|þ…ÚB†endstream endobj 1441 0 obj 1913 endobj 1447 0 obj <> stream xœXÝÛ6÷_A8lŠÆªHJ¢t@rmsÈ!wýØ}(P®DÛjeÉ¥õî½yÿòÉ¡Dfƒ4M†Íxô›o}$iBIjþÃëãæÛ_X–“½Þ¤d¿)3‘䤨Š,áä¸E•d)yžÐ²„sE“’”,õd½)Ó,))ó¢b ?Y­õƳ*¡”¬’¼X´Z´.¿èxh †¶Ö›¼À?77Ô¾Áê#ùÇ}GA@æn·q/NIÅA–Ö»ãæÕ»öQ5ä~Þ“¶'ïÞßÝ’®½åøD¦È®Îä«íW†©'ÕëvèI/J'äë»?6?Üm~ö` ÆBìvŒÇ·td€»@xPП¬Ö;‘Š;ÀÄkud€òÐ m5Ø]‡[Q&…Åí»¡QDö i†z>ª~’“…ð’ûQ)2ä)R§§<}Ru»kÕH.7ßÜ<À$r7Áy|}ÒàKyÂÈ݇Í+ƒyòõ5¬ TöŒ‘-ÏÈ]³yõ“œêùEuJjEh’Aœ_Ú´ö²#®ÈèxÏŸº-MËÐm)ã‘ÛR `Gnsèô'«Õ»-¯*º-¯Êµ"¹ºÍó¬9‹`hëÕnË+a`·ý{h ø Y ù ç¾>\žÉ8ÌSÛ+÷3@xtûø_}’çþòüš´;Ò«Zi ©‘»C« üÕǹAÝnÉ·äW0'É#Ç]:5œäØ€Žó¡íÆáÜk2ŸÀÅæ‡†‘þ,0á¤U}yNÈÛNäè­ýßiÌ{#µ·"╃ÿó}×ÖQ|¤äBsòvÞÏz",Mŧ‘‘Ó"L蜊(¡sZú„Fr ¼@磠?aBç4‹:§<[´ò8¡=ÍÉ‚„^´^”aB#B˜%Æ+€y3×&­·gÙµÓ$k£ úzOÃ)ßïI}ýÞ¤0x¯=‚Ѓ2õ@GA‰zh‡YG1q¯&éI[}ÝÜ€®¿Zä ¯Q˜WËÊÒ%¨?W©M4šæKgj²¦YêéžeÏ•IY$êŽN³yÏÂ&Û"\é¢ÙÑæYüYÏD#½hhs½9ln¯p¥F4Ç\½OòdsKÖ6ü!êßÞ~÷þ=™ L‚7ºùØ“]ÛEíÈÛ ²"ÂM4ÂM€Éþíàæ™˜EVóŠ›à4ÂMÐrÕlé7ÏD£¼hhóá&è ÔvR»íezuG9%K5ð/Éy9†gyäž‹>GŽñL‡ü"ŠG«yu ‡²:†§lÕléÀ1ž‰FyÑÐæ/r ƒØ±Žù:›j¼åQcµ¬¡ë Я/öo­äX Éµx¸ ëâ߉g³‘T}Ü¥kÙÕsgžÖ4m£É¹0øŽjnÔ/ûk–-ýum¬yRwxmU{Ù~x~ቔ†U„¥,ª",徊 xÂ] Ø(èO4¬"´ª¢*B«ÒW$WOxž5g m½Ú´XEÞ÷ú?††Fi½"ï[»xšP·Áÿ1ÞÏG5®: %Ì2¶àØÐ6²&´§óðb/B›E*ʨÀPQùƒäŠ(^ h(èOEX`¨È£CE–.Z³¸Àxš“fÑz-¢‚cÑ0$ŒGu`ãñÕ‚F:ÛM3ÄAQ|Z«½ÙàÍ7Ÿó7æ3Ï:tHm§áX‡F½„7gáGó,âhžû!É^w¢ ?±pˆ£9†8šU~ˆC2€yh †¸Eëµð‚]ö¨×3 ï•â#ày‚šº êQšùBC‰GUO0ëƒùJÚïÍí~°ßP†ÙT‹-”„úÏs«ãÚm?¤Ø·òÑ|xëõ¤dc¿œyÖ“eÙòV‚”Æh–BÙdÙV&ÄÌ N[<öóæ/ÒØáendstream endobj 1448 0 obj 2140 endobj 1452 0 obj <> stream xœ•YK㸾ûW“CO[#R¢ ôa²É‹MìLo ؃,Ѷ2zx$¹Ûέ痧Héâ:À胋¤ªTúªøU‘ý…Åg±þÃߺ_½û(RÉöó*fûU‘æ‘dY™¥QÂz?ÌË(-Y‘ȈŒK¬±ëU§QÁ…›ÈKAÝÈX­Wn˜–ç쪙dÞªÁª£]CwP‘úZ¯vðZ}Yqó} êžýþÉ|cÎ@çi·²ÎY™€®«Oýêíû¦Q «ªþ<³ed»ÓЫi¯´¬†ù4t¨VuÛµšÙ¡zÖsŠÍU¯X=v§~˜#öÛ§¯þø´úÉA— A‘Ì“<@2‡OÁo¶"AÒN X¨èFƪG2óI@ÈYµ"A×ÐT¤¾j$ïC1+¢Ì ø¡=ŠÛÓžµ[Ôyaóéx§Å‚wœÔ³xä ªFMÀqF8wÓØ³­j‡=<6Ö°tTSw¹…5-b kZÊV ß…X‘Àj'9Tt#cÕÚf2€5•ÂYµ"×ÐT¤¾ÞkšF)INånœ`m³mÖöÕ°{ùØž³ô+«††-Õ¶ó)É^Ÿ>üõã_üz‹¢H Š¢I€¢€ÏÀïµ"AÑN P¨èFƪGQˆ$@QðØ[5"A×ÐT¤¾Þ¢ˆ#ÉÙ-jXÅ^ª™ #lçã±»èœÛÎuÕ©wÛÿ¨iÔ{þ[ûY–eF!‹9 ‹Ágü8+È좂Šv„Vd²,8…L–°Ã¬U¯¹5ô©¯wC&Én&4if¶µÙÆuuÒ›³b‘|·íÆú3SÓI {þßbßüÛÿdÏUw‚ÔÜ«AM•Þòvƒ·C5]l‚þpsIˎ̳ ìȼpeÅ+¸8ø¡¢IZvdžeGæ"óVEXvܺ“²ã­Þ n΃’³S_^«õÖnܦ}¶ƒ¾ª§Ñ"ÈÌú+Éia‘R…EÊÄ Vvá@E7â´°È´ ‹L WXP$XášuÇ)R_ïÇ ´³o0à »¶S›®ûM£vú÷ÿÁ%rZ0¤(‚‚!Eé Š.;ˆ ¢å´`H!ƒ‚!E*¼Õ4,n Ý‘¤`x«÷Âüb ÆÏÇÆì¹—zf]»ÌžYe€ç¯‘‰-2Nƒ" c銊;Šn$h1Š€ŒãØ[Ã"àÖÐNŠ€·z'2iYú"pvý‰N5héåÐÖ6UëFÕ¾4Ø^D'Ó©3`Öã4©zé.¬Ý±ãá2·°h¶­åÇz§f†=Üh„ÁmxãŸWoµ­¾Zà§#¤åÅúJxi^šyÂCñŠ=NXx¢„—f!ᥙ'<¯Ø»5t‡ž·z/ö™#¼'h–w¶Ï—a©Îì ”YÎuµoõ¦ÎÇ®­[²+3`Œæõ2žØ¤  ¿@œ†E'u3:3îÆæ×ÄEÐ8¦"lÓÄ7Ž(ÄÒ8:E7 ÇT„c*|ãˆ"A\ÆÑ+R_ïG\„ãfdóK«3àj‡º;A4îv³ZlUÖ§˜aì¡6wPšáÔ­ú8·K;7DšÆAϘÆaϘƾgD‘“žÑ)ºQÐ3¦qØ3¦±ïQ$ƤgôŠÔ×ûŒ}Ïxšv>šÔÔBW]fÖŸº¥Ý4mC€@{^'ßqóØ’äA÷˜a÷˜¾{Dñ NX|œ"Žò {Lò°{Lrß=¢xÏ­¡w´{ôVïLèþ0Ö§ÞžöhÝîÚy™!ûðØw=ëíVXÕÍ;é{£¾33œEQd¤á 2È-Â2`ÔD†ŒšHϨ(„%aT§èF£&2dÔDzFE‘ , £zEêëýKǨþ¼=ë2Fa>¶G„q¹€ôÚF*bÕ¶íÚÅ´Ç NÞõØ÷P¿f‹½Vße ðÚÄwàIX΀l@ða¸¡Ù„4›ðfáiEAhÖ)ºQ@³ i6ážfQ$aà„f½"õõþ0pG³Áµ´HY—ÙJÈvÓ"l¶•¹Õ€Ç;¦÷SÕÏ&:õóå rÉWhNÔ¤X¥ƒ€ŽÄœ…ñFD¹àÒfR{ #Ó¾ÌGU·»V5{ßuö}°çNËÜ6öÎÊ=¬MëÒ:¨ñ4CQµMOeÊd‰~Žlà D¹ôLA¨H\jÄöÐ÷ë\Y^Fqé“Aè(‘ûd€n7‹diâæäk:¸r§ëFÖ²K‘eITú|€bʽa”¯áWÑ)«x|wJˆL{WZþkg}Êm°\˜½HrÂfJ3—kl?uà¶ÐÛ|Ö«ÁV®–ƒÞ—3 C°%çcU›. :QÛ»šóùöÂÀ(¢(iPDž{Ã(“ ¸UëªßMÀ”Ûsäß[õbꑽ“X3ÔÇImt{„·úÁ…t¯vÕ•îÖfÅ•þe Ù²^Úgèa×x¼7„6'öºÆÓþ`ôሡ-·ö];l;Æ¡»Üp+/NCÇË4£¡Ê,ÂN¾†ÎÍØà8]7²–]èxÉ% /ãäjØÊ×ÐùUtʪß:ñOƒÐm:ÒËú«)aç4ì¼f—µš‡éo+ÓuÜô <+bâyϹ'&' q¡B]¡ed–SbâYæ‰ÉÉH·ŠNæWbºÚ½H(xŽ˜>ª~|($Ìý»ÎÌ^Uƒi½`> stream xœ•XMo丽÷¯ œÃN"JdK`x'q0@2ÁÎ8ØÜZb»•ÕG¤v»ö/OY¤Èé¦áƒ‹¤ªTý^ñ±¨o,M8Kñþ×ýæO_2!ÙÓ¼IÙÓ¦E"Ù¶ÚŠ$g½U"*Væ2áe ãŠ'%+³Ô™õ¦LERòÌMU8º‘‰ZoÜPT çlõÌ·>ª1!ª£]£tÈ1̵ÞìàümómÃÍïcô¯îÙ/æ7 |vûÃ9«rðÍ êC¿yw×4ºa»ã°Œc7³g=Íí8°áØ?ê‰-#S]ÇŽ³zÒ¯o¬içC§ÎsÂþøðßÍ_6¿: Š, q+ò"­€ÄéZ3ÀÍN4äèF&ªÇ­H‹7ÀÃEµf€­Q:ä抸]‡Ù¶L¶fú°Ô‚p;6ŸÚ¥Þ35={=,3b׫áüà‰2 Á•ŒÀ“=ýLkà٠‡ÝÈDõà‰­ŒÀ2sQ­€Gk”9†¹^ž‰0à=ì5ÛµÝÕõ»>ŸÆ©aÓxúÆ›‡Ã8vs;Øîàì{†Úf3*ˆZŒ¼Œ½ö¨*¨iìRÚºEõQô|ƒ;Q†ÚžÌS/¥‘&Eµ•&—,©¤¬LÕ7ú½÷¾…-ÑP³þoððíëìk=6Úl*šƒÞô–A ,ûv†íâö]­f}¡s"/ _±B^ʰó´äU™dÂrFvP 4Ct“¯ÙȾr))×bÈa³úÈÖÊÁ­RVäå|}A@_!ÄH69Ђ:‘C¤õØÁ±ÛsQí`°'äI?_n2ž•¸¨O!¸\n=dàÒ ÁG¾nd#{p9Ђ‹2å#[;×­RVäå|=¸i1ÅEC¤‡ºg@îîëÇOŸd¶Bä©Qýv˜x=€òÌÞ?°šØƒ®Û] à‚ ÚΊ}ùË/ÑqV¯–‹ÂÎ )Bìób[…Øçt%„³WìÝŒE×ùº‘ì°Ï‹¼ ±Ï‹¬X#[{ÅÞ¯RVäå|5öyŠLØÚAaRoEøÕtÅBÑi‡ç±{6ÐCa¯bs‹rdk˜é n‹D ã·0Ý\”x.AäB˜%ü¼f)RÙÌ4C@’¯ÙÈfQÌpHøÈd0»U›•ór¾fpß:ý8½žà UCǃuþ¨ÙS ¢áŽgh.ñèµ·XóäKýÙ¬Îg‘—„ÝupôLºŸ±È±‰Õó2µæN•9ð·‡·˜û°‹/†—šØp:àÁе}»ØÝ‚±zõâ>C@6ãAÖõr³ð<ªœËH¨r¾õBåì€Eš!žÈ×òH¨ržEB•sÎ×Èü;¡ò«”UÕùZyê…Ê6`ê±íÚ匰馅ÎJ5 ö]^ô-4¶M»;¿Á-N5ö¾r¿à¹oÏ œggÚlgs2 N­ïø:‚o0ÏÔpµÁܶÙx5èiR€=ØãØ4s¯Ô‡[Âç¥i‡ ³bé]V‘Þeˆ?íì•B7cIr¾n´ô.ÃÏM…~qò‘óïôίRV"л5ò•fEæõîÞ}xÃMH§óŒ8n†AMgfú&àÖõÙ¯;5/o^UWNÜ!öy{Ò'ì«þîâÒ¼$û¥ï°¹¾vLÓÐÀ5Ž {ýi4¼½›/¸É«¨ÉÊD5Y™à¾ÉrvÀ ÍúäK#Šì¹#$â&ßú&ËÙ7n•²,‚&k|-7\\Ç cw…!ØŠÚ#[†s©q4ÄŸ«ˆ|à8Iáêr’Âu1ä$Â#GvÀ ÍêäëF6²ç$…n+à„Weå";{åįRVäå|5'4I£Æwm{kÕÕh’ÆÐ]{s§ðЇ’ù¦m¾¹¨î¤Î3(ò5éC§jmpЧˆßY˜ï†Ê|wœÇº5·™@F_uò”°ß>~}³/°‘­üBÇñjï5¶Ù«œc3ÞÔðÃÂOî5áMªÞã— x¶Q \„χ‹ï \òhSr™E›Ž1¿)½€›±;_7âѦäøU9,¼˜ºÈdàVmVÎ7ÊùúwñC`?¤,nxñëœ=ê(ÓÍ|­?µÙeø½?3«6‹pošÎQ”¼ÊØëý¿>ÿçwÿþòÏßÞði»!ÛmÁJL6KáúŸUì½)? Ù¼ã…ðý毛ÿ. …Ëendstream endobj 1458 0 obj 2237 endobj 1462 0 obj <> stream xœ•XKoä6¾÷¯¨Ûz±"QÔ+@Înf0À™xœMÁ"`«ÙÝZë5"åvçfÿò-¾$²}jÌÀ]$U¥ÒWÅUüq”@¬þÙߺÛ|÷@h±‰á°)ieW9Rè–aQE´‚2Í¢¤,q\%Q %‰XoʘFeBÜDQOÑ´Õzã†´Š’VÍ4_¬j­.o4kÖ«èûZoöøŸ6ß6‰þ>°?u?>êo,u÷óá T)ê´úØmn>6/|ÛùM‡fP?§cSΟ`âržz|$Æ!9ÛÁ°yäPÏÓÄ{ Û³ä8·\Â~˜`׈'Ø7-üýñ›Ÿ7¿8< B|x‹´à-ðû,Fôà5A«èFÚêo¼›³jD^»fÝ±Š¾¯ Þë ÍË(×ÐÞívˆÛ~îë¡ç0NÃabÈF>!PèyÁÙ„h=<Ü}€ò§Û¹ë…ŠƒŸ¿Â¶éÙtɶ-*-cTZe¨~•ý|#z š ‹›Ut#mu•æY*͈³jDT»fÝ±Š¾¯×ƒJiDßçë8´çÃЀ±áÀúLƒdR­/˜¹˜Î½ÊDɧ¦?èäÔ xíõíŸ? à/¬–íYl›ž+x“4"ðø¯ÍÍ–Ëç=ÈÓýÐß>óI65km©ñq˜š¿†^âŒYBã'>qØrõJV×|T5˜¸]Ô{Þ0‚ ˜Ä¹À„$A“4uPÑ  ™°1²Šn¤­.Œ‘žüÆEé¬Ñ  ]3î8Eß×ë^ø\¸FüÃl ˆy…IM.¬?¨8õà „d2Ë4toÑÈæ™Ã °—FÀ? ý?LŸÕñŸ{>ëDy©!QE’LG´æâ¶n‡úéÔþ˜€ÝPϲßEðxägÄàó&xõ9‚û¿Ç)š®iÙõåpB+ÛqÜàÞ—L;QáǶœ 4Š·iÿfèf,Êaêmê!½¨R¬ÅlžTbÓäŽ#C4ýš|BEœjðÙÓ‘÷øæ›ïùĤ²åEʬBȼ tjÉIC+.S2£EÅÕ’“-óˆKNf´*£¬Òéãä5+ÝŒÉ<§ëFƲËËŒfYTÁªJÓÕ°‘×Ä\V­SF5ðøêÌÌÐ$-*±oGøC±õAœ‰ÜŒ°+gm­Dá"`Vùl¸=òHþÂëYGáUá¾Ã¸«Ñ[@/|‡|\ò &¯|Bè•=äíŒÅÖêÚ‘µ¼ —‰|œW‹a+{È»Uë¤Q <¾y¤’Ø"ÿëˆ*ðÿj›­B9‰ðô5gRÏ!)”ú-!p›âQ°ÛÜ|a*8vC) ¯ÚÜ=Òñ×»ŸuÂ#ƒ³e× =òïÅùI³$ó§YûˆÓŒŒ“WÄÝŒÁÔ麑±ì§´ª<Ä)-‹Å°•WÄ—Uã”U <¾qŠê¥Eüsï’ P罘Çq˜L7 ¤H1òºÙ7¸Ä¦ƒ¦GÏ ÓÉËàœrrÛD'b¼>˦ð0U§¡ú4´ÖX'.ûg%'íK«Þ|÷ðé:Ž(üûµCŽ­§áaÑ„„E“, ,šä a9Ù ¢±a²ºnD¢ ñ ‹&IºN.kYµN‘•°V»×ϵ Âê± Á£™‡ëú{lÙùÍÒ–jÚzjFf9ÎR³’yú]5™–˜hi•PÈ´"¹û^'¯@º•Óµ#kÙ™–eê™–Hàΰ•W —Uë¤Q <¾ÈTŸK>õ‘×OBo€g65Ã,@žG¬-Ï·-ëŸl5ù¾³Ió, íÛ‡¶¼\hÛÉlvÆcuÝ( h;Í©OÛiNªÕ0¹ íeÕ:EWÚ^í^ [NÚ6°™- ÷?ÿ¯®-ÄÒú¹ÛòéMïßß>?þô§~ä45ríÕƒ˜ŸªmT90†e¨ËÝžŒ¿6Á‚ÃG;Å=â@±²‡¶±xZ]72–´I^øh,9œa+{h»Uë”Q <¾m<Ðs‹¶+Bp¯·ÖœžkßæfÂÕ…3þWÇœÕWîž{¦•TÅåÊå—äË_F´ °P|ŸÕqȪi²j¯¬êdçØgU§ëF!«¦qÀªi¼²ª“=œcŸUjàñõ8Ç—¬úñ×û?UJUÙùqî?÷ûá—¯šX͵ˆRªû3©®ˆB÷”ªwïñ/²­é9±2‰°wfíЍq÷ûç¯ä]_Hò<à’—§uyaAròо›1ø:]7ÊN!yæs ÉÓj5œ^pʲjÊVNYí^‰>Ú\8åÑON—ò®BP !öÒí¼Ã¤r‡Õbt4Mßà8:¾KbBIPßJƒúލë ÷µVö`´3(«ëF$¨ïýúޤÕRß9كѭZ§âµ¾[í^ cZ.õ‚ûö»{vÙâ@ÝËAcënØÙêNª«¨}s˜±ç•M§rZÍH†i̱‚ÀTÆ.\ÎæhÔIU—au7ÕGäõ7&úßcÝ«ûU|öÁ8bG«î¾„id·êneâÝð¬ï‹ô³€|HœäCÔ-…ƒ×Ê^Ü쌌Õu£, §>ù˜¤«arA>˪u*]Égµ{mÜâ䲤ëÂæÓpʦ‚ƒnne3┾hý _ņ3T1´cï¿t÷É@ð‘©fÕd>ÄŽ?ë‚]Ÿ"#BÇØÖ:°EcXÊcÎHÃkgkûc%y0V¢î™½%E¼0–“×¹§ëFEÀXIžûŒ•äta,'¯![V­SùÊX«Ý+C†6/ª ¶mÚFžU°Ÿ‚žŸ@AÞq â+ž _ÔðË,_°"Ú«‹Ué;uV7{Ü&¬ÖÛOägU~¶ç LxNóéy=Ãõ-2 ÌV§Ëûàt°Ó§²§îqÉÝÝë•§êÚiÜ1}ïõz× uwuãUØÎ#ï×PYð?E×\*[öCÀr ¹Â ·]T’ n1fyQfºmOŠlaè_6ÿ¦©[9endstream endobj 1463 0 obj 2314 endobj 1467 0 obj <> stream xœ•YmoÛ8þî_AäKº@­J¢$K-z@Ú¦Ýr»·q‹»bQÐmëV–\½4Í~K~ùÍCŠLÚŒÉÔŒFÏ3œ2_XD,Äô»<,^|Œ“”í†EÈv‹àÃâË"RßÇèWy`oÖêW tÖÛ…þðˆtc°º>,ž]T•¬˜ØÔM=Þ±±c›©n*6ìEóM½éE_Ë!`¿×ãž-—²›F.õúë;9<÷Ÿ½cõ lŒðsdm7²iUðÓú¿‹ˆ1[_/ž}×VS·~ÏΣ‹;Q·ÃÈî{ùeª{9°cßeÏpV4ë®e¢­^t=¾’uÛŸÎÏ®ß}¾¾zóñâã¿?ÿóbýóCÀ`ör½øÍPœ¤¹Ëx²âãIžn´è0®'ˆTR4#eÕ2ž$Üc<ᡵªD‡qZ#wHÑõ?í$Fà-Û˯ìSÙ5Ó¡ýƒ ÓñØõ#2¿Ú²6tlÜ‹‘•Ý„ÃPe#2ÅJѲd¢,§Ãˆƒ­i¨Ûû*š Ùö݉&? [i_ ÚÂ4RÜ 6eYokPÖN°{¤PŠ (ƒ7KVÉ­˜ €J4Þîe¯lÁQîzÑh¿02\?¶ÀºåžÉ¯WÁi ÚÄD_/w*O"!-Ò,ˆS i±Š‚$±¡9V©bÍÈs0˜M¸Ñ5#mÙ„CZ$QflÖóÙ²–瀰«äéz>Ÿ)$«¢H @öe‹› @>`<”¢)º ƾ««ÝÂÎl5„»ßÔ-nSëÚæp½h „„²Jáåí~¤JÐû–า/€×v Å"ŠCP Å¢Ò<öˆ´=¢²°°p’ìE3Déš‘¶l‰J³•GTš&Ö2ÉQf•¼"]ÏçÓ‰›)õ¾þXm¦lŠBýØ«`W0—¥†íÔ°-¤^Ù㦄ݤ7Ø¿ÛÒ'Ί¾wÏ‘Tž„¨ŸŽuê„õ…ÛǨ6óüÝ9Æí#L÷ÐÀBÑðøxáåÀÇs8;8ðñûý‘Fžá33 £kFÚ²çÔ…X]èþ­e-ÏðÙUòÊí`fË'ÂÇ!år¾%dh¡gщ«>ˆ6õªíÔg XÇ£„©nptÔÏÞó:$‹oõ @µ¾Áª-Ù½¼öžºúÇŇKT}sõËúâÍõ%èPÒ¿×öó¤H=f Êz̤1·ø‘ì0C3„=éÒˆ,[f’<ô˜I²ÜZ&ÙaƬ’—¹S®g˧2“€Þ›Ò‰!¾_ß¼½¸V,­ÿsùñ×èï!ð‘ê+öK7R—äܼª ¬9fpbVыƻ£Ä¦ªÜ‹v'+EqYv‡CWa°~È`Ì]Qñüêü‘òùßÏŸãgúG…Ÿ~wþ`‹'zïCt–¥Ú f*œÕ— ÐñA‚¤3Ò€m÷»¿-õ:÷º/ŸÆº©ÿ’xý`޲èñð$öâ<‡ {q¾ÎW6öâ¼Ö !FžcÏÌèè2ºf¤-›Ø‹ó$æ ˆß` ky=»JNiUÏã“#/†óOVä߉< zÅ·ŠÜÙ@_}ÿ ÂQA0ŒýTŽXŸLçx_2 «^ŽSßÚÛèÅ{é%<üÔ»©›†öƒ›e'Í«î­ÕúW°È+[ï!ÄàÕµ"™vZ¡³®ß½Ö–º­öø +¾ñØ@S{ û/u 3 ™ÖpÏj¨`Ïk~äðtåE_Å^ä@b·“ìDÍPl®iË6r8T'rx\̆µìDŽY%§´ªçñé‘Ãã ¤Èù›šÛ¾V%6h_m^ £èñAUƒçv/â¹CW’AágãÆ¤VàÉ^îD›{L8ÜÖÕ¸÷b‡ÌE•Þß]_áµGݨûI`­-ÕDòA@‘{²Ï#¼rØŠŠÂßça4ïs’¶hFóatÍ(÷öyTdî>‡Ã˜ÝçFžÙ²«äT6ïóÙî‰lEEb÷¹nSÝ Óˆ~§‰0‘ª$­¨l]ÌÝPêjé+¬o•Ôñð¬éÚÝlØlýÈØy\Aÿúy|‚=Þ÷¸Øgqâbe<³‘{µÃòGwEتb„6¥ws1 íÁQgÁ^n!­¶°¨+¯ŸK§~ù·m×} ÿx­äo¯ìTDSw¯Ì=¡ÍmÇ¥¾ªä† 5x Åiè1g±’d‡!š!H׌´eËP‡.C1ôùÖ°–†Ì*9¥U=Og(*‚Ü«‚ﯮח?¿}}ñá†ÉökÝwí¯°ÍP‡6ˆ¾ÙónX—KÄz©—e‰µÅ£ìÑÛFì áõ‚ŽêÍ [¯[즼I7ô¥=[ [)ßÂó‡#lÕ^1¨a]YcöÃH_{Î6:ÁêšÙJŒ;õÇS)X‚›,‘%ËM=ÎxbÎቛ¶}­Ë `›At ´q˜9±„%)ò„­«Å³h•ÙÓ×o‹ÿ¹#endstream endobj 1468 0 obj 2513 endobj 1472 0 obj <> stream xœ•XMsã6¾ûWðЙl;¿â‡DéÐCv7éd¦ûÑÄ;Óé¥#Ë´­weÉ•ä8é-ûË ’  ¾~{ðä4 èðâ_,™s–Ø?ü_ífÿy*e›a–°Í,Wzž²¬ÈÔ\²Ý´ÔÅ\,—éœç9¬ >ÏY.’ V³ä×ÙLQ¾:v´–½±ÞŒeÝ‚9x´å _þ°­)W¦Ÿ³OÝÑ:GlèÚnœÜh3 öøÇ«ÙTw?_öàÿÀÖM)ð 8nëj˪r0Μµ`}Ø—}¹3£é}^ôf×=™ÕwÈ‹+š©–”‚R­" Ju(ÅSZà†|P +I)(Õ<¢ T'j²šÄÎÐN(h²zaZ¤Ytž;Ó»´°î{ódÚ~aw-ˆÝš­kEH×»gq¾^¿e×Ç·¬ëÙõ3ŽõU:Dùá2â0˜Õè2¥µ˜JÕb*óP‹(Ðý⊊a•ÒZL¥Šj1•2™¬Ê¸Ãº£H-NV/bõoµè¥-/X¬êa?%±E˧ñÞTuÙ°«Ú+èÍa×Zþ[žŠ©­º¾7ÕØ¼œq]ÊyFñå’GørxAD‹_¿¢bX9«¾<á¾Iž«^$øâºƒŠÔ×ËñMr‚îÐõ#ëö#ôŠñ[’ÙuwšŒõ ºäÚ§2 4Ɔúoã±l™-h-O5†ŒÒ:ç…`¯6zÀs‡Þòܦ엖Û:0×ëÁœñŒÒŠòŒÒiÄ3JggP<…7<êA1¬å¥EÄ3Js5Yå1Ï„3tGž™¬^¥“ˆgBÂ×£áº}êš'K+w÷‹GBçW¿_±×e=®kÓ8†Ž³Y¥ xTÊ£‰Æ0ñ H óˆ*†UB'¥òhâQI°êEžyw‚"õõrèT†O Ý¡­ÚÑB‡‰LºiÙn,3»<,WuM°å”¦|qx¢ ÛüÛ(“w‡f¬÷@E{°R²a[îÁ¢³ãørÆÝŠ Ê-Š«ˆ[O· H¢á7pT +A¹Eqq‹JŠÀ-(’hàºÃ ·LV/FRœÇÂaäñÞ×¶%ºQ©ý™ /@6Ï]Èõ~ÀМ t¤²é Ìø½][6ã´íbOT½lHÀ9=l·E#7œ²—Aøj÷ØÞl€ÿ7lR§”¤Î"þ‘ZþAñ6Üð‘ Ša•Rþ‘ö;Œ„Mj¡&«"æŸp†îHÂ?“Õ Ã&5GþY¸ÛÄYV•\z(À ’»n˜4le*ˆ »ò~8Øf°ƒ!±6ÜÚYzmÙ4]UÚ‰hÝõqéx­ŸlÓèÖ¯ Ëê9|w`SqÝ‚W:7`b…¹)í°å>^†}YkuzþÿyêY¥¦s“”E47I•„¹ ED¿qBŰÒtn’2‹æ&)Ó07¡H‚ˆgèNFæ¦Éê¥A” ç&(v÷õÓŸo~÷õîñþ[øü{ªû†Vø€y*ûÚ…Ùµl?×»Ú}«X\¡NÖk¨9 » ÿ2.ºSAÛ5+¼È°q³MÊ•)ä˺„Ú´‘L?.Ï"“$ôFH&<º’‰ 7B(’Èø Ã*¡7B¢È£!Qèp#„â)2á̹3)R_/ŽŒ(2¼ úÅ´¦wˆ}é†ñÑ_YbüòáŽ=A¯wŸãÈ\[Óì<7f8ëìBg””„Ö) RBñ„n 0¨V%%a¿Ì(jZªÉªŒI)œ¡;ŠÒdõRÔ`Vð¤ôÑ~€²Ï_÷Ÿ?=Úà¦Õ¥0ìµ[¦½nL»·/ßÙ‡ÛÇ÷÷î·ÓO¡ íÊöß°L’|·DX¦*LI(,ýÂ…Ša%è”$Ò$š’„*”„"ÁÏЄLI“ÕK±Ty¸‚2F¶Æòµ9^ï€åMß³ºk#÷Ûâœo»+{5Ï•„=VÐŲ/û—ðÅmž¡K·eQ„½´;éWt<‹&!Áu˜„P$ˆû ÃJÑIHØO0Š8çùd•Ç“P8Cw$™„&«—"nwï}Mlgg‘ݾn€Weß¾¶´C¿†¦¶ò“6UÅ®?‹³låEÄ—¼ˆù’_¢xÂ7<> stream xœWmk7þ¾¿bpÁIÀÞêe_]MK\BhC¡%ÝžînË®ö²/q ùû—wô¶§µë`‡8œFÚž™yFú$¦@ô?÷[µÑïX’Âvˆ¼ÂÿÛècDÍ'à~ª~¹0Ÿe@s¸ØDV—BN!+Ò8ƒ‹6zú‡«¼“ƒ³˜Ã5eð»P“诀’Ü<»ø7zy½Š$SȲ”àgí,fiœ”Pð4¦EržÇŒøa$‰ 4ë&ò’Š^2V«È‹Ú…ƒ&c³U3D«óŽv͹ãC_«hó „rÀï„JŽz4N B¯¤’½åZ¡`/¶r€Mßµ0î$ìÆ¶±s1\ì$B(z µFÑ4¨"¦±kÅXW(^a5ÕÍƺ•1܆5!EkÂøÖ; `µ9§è%cu†•—|+/ˆ·j‡¬nͺãC_+Ïcf`ýu'Ô2X© Aí60ìûZ›ë;T(íûn”Õb+´ ¹ÙȺO²ß4Ýå]4i–…hÒ‚.Фxwn; д0§è%cuF“¦t&åÅlÕ 4ÝšsÇ)†¾>MÊ –¿ÕŸu®šÚ•ÆdU×îëÇ—¢WµÚˆ3¨N¾xóþ|^î ––, PKK^†¨¥%ºmÏç†ÔÜ„Æ+zÉXõ¨¥%)CÔҢ̼U;< æ×œ;N1ôõѨ¥…ŽƒÆí\U½æ½5¼ÿëŸ×ço^b)÷¢•#÷I4“´…N Kt &}1ˆ…´zÊœräŠõÿ²éŠ"Ÿ–ðbÚN˜µH§ü6¦„`^4TȲ0IIi‚¤(‹Ù²B0/:§¼jèó÷„íútJÂ5«qDâz¸u‡ Ruã÷…st°¨c݉Jçœù¨èÕSžg1ÉK8µõ´Öµ‹¦Maa­tIo^!יðîcÝL¡š‰ªk¦V¹RtGg›«ÎG˜”hWõvꦡ¹Z”®À£o•Ý`ÕuH¨Jlx&¤qVfåϤù/aК^i|Ö¼0i"0zÈsPBǨƄáÁ™nhFÙª‹7õ8ü]Õ}ÕÈkJNðßœìëçô,ýp{o¼ºƒ ÆñÙ¾µúzaÕZ9¹eüƒ;ñ£¦VõMS~œjìTRx¾³ltk8>‚'aS✅M‰s¾hJœ'¾)¹á¡)¹ Ûw¼¢—XØ”8'‹¦ÄYé›’š’_sî )ÍVÙ”8+\Sús'ÞªfZ›¦ƒù¬ÑµÕ4箩µ+ÓCvâ^óÛ}SãØ´0úö?À0õ}7©µîk8ÕÚ;z³LoßÂôf&:(ûâÆ¬¿ìæBº–ñ67ôQ2µå&Àëãeá Õ?# ö;ñ<9Kv{Þ—aXèÍ­ÙªN¦ë…£_¾h?“÷n…×y)ÖÈ ÝäÞ=îÛB¦BþN{?dSPñ–¥@3¾Ë(>¶ÂR Yêßenx(7a³Ý+z‰…ï2Šwù°hFÈl•,ße~͹CƒwÙlõ‘¥@ÓÒÝ~s> stream xœ•XMsÛ8½ëW`|Ù™ª±†~椒Tª2“ŒÇ¹ì%S„ EjÒ²÷fÿòí&`ïE•rÔØÍæ{àC7ÿaÙš³ ÿÑosXýv#rÅvn•±ÝªÊ˵bE]äkÉ˰¬×yÍ*©Ö¼ª`\óuÅ*‘³YUY¾®¸e-"Ç0š£6«0Ìë5çìì)‹%êlBÔåŽ~Ò!Ç8×fµ…ø¸úgÅççcôÓØÛÛùK>·Û•pÎj ¾¢ÞV?¿Ùl̆5ú¨ïlkÇG6öl:nôhظ7ì^·“aý–鎙ëFÛíØQú`F30½ÅÿOƒçÑaÔw-8 ÌôÎürûŸ—kÁn?¯~~ÒÎM‡pa?Çiô—1ë˜fë~°­%wÇî ^;˜L3B–¶ƒäô|Éóšýò¯ÕûÛÕ_*Ug1sE¦æ ^Œ½1ç'ˆr¤‘º0§J•0§ ¢z3bŽÖ(;rŒsEæ.cMAj3kŸÇ¡¿HöºÛ´P´˜ uÆT’cŽƒqÎöÌ€4™W1h² h²¦ÇófšŸ \È1Œæ¨ hRÊ4)²%êlF Ñ¥CŽq®—ƒ&9î?íƒ}Ä4»›vˆßyO]?2sÀ=ÃVÛ!L¸xÚÛfÏ;4-  Ã_7µ–ì¸gƒÞØÉ!æœ!jËNf0 B%Þo``ªÌfÍþìYÓOÝè#v°™£Ù©ŸÚ ìv¶…5ÜåÌMpsÊæåFWuK”ª«T¢²l‘(oFœù OKp £2–(U«D¢T‰"óÌYX£tT$QKÔ 9Sµ$yzÁÙvê„oa•Ù°l;:/X Pa"÷Ø5ÌnÙajG{u Le ]îh»µp¿'Û¹ÑèÍ,|Ì‹-Já ‡CqÒMœÏq&÷JŠà3TðDŠ@‚‘yfˆ&ˆr £,–"¥ªDŠ”*ƒ‘1Dk>àçz9Cª )zûÈ6f«Ü_‘ñ#¼$m‹r~lõ#ª¶Ù:œ,ši ¨í5¹)|û÷»7ŸßÏoÅÛ¿¿ùÂö€¾z–SÇákÃPÕà­}¾E ¾Èy¾P2ÀäÍ|?Aø’cÍQðç ø¼®BToFàÓ¥CŽq®—ƒÏëèì¾þ̨¾ =2€Ð¡I¬õp§a-œÞø^ôøê Èë*•¼®QQ¢Bf„šŸðÀÇ0ªbQÉë"•¼VATÈ<£Ö("•%ê…¨åuN¢òNÍ ‡;¯ƒ=…¯ù,$™í ûþaêÞÍrò·i¡ô@4_L½†_Q…ú¶)®›Ãq¯ýo*)ã^C‰3b5ƒçŒ†]kï±¶¢[½Ü½yÁcéÈ ‘HG§n@Ì›gh‚ &Ç0â±tä Ò ª ÒAfÄ­ùt‚cœëå<¨’¤0mtÛ4'ÖìMóÃÍHvn°úÔÉú $ã¬Ï05oççõÆ–E\áä²J*œ\Ö¡Â!3ÔOfäFE\áäR%N.ól‰š§NX£tTTá,Q/TÊPá m?x`Y¬ÆçãqjúÃjç –$;Óø ¤A³«ï߯PR·ö9Ð÷½…® ï¶­m@¦±êI66x × û°‡7ç½Üβ®YɲDVòLY!3BßOÀäèG5 /±×ŠÐ—ud…Ì3úa²+#YY¢^ˆ¾ß%ˆþ·®ßnmcú©sv‡Ð¸}ûôéÎŽP'þ~Í‹çøDüA°…MX?`£Ó>'X8žÅúø€<·b¯±/D,%P¡'R"‹bùµ4i;3Î_ à óŸ=ÅôÁôˆÌ0ôÃÕš}éî§’)xK¦àu"™BdA2ÉŒˆð„59†QK¦àE"™‚« ™dFDÐ¥SD’¹D½”ž‡êk&‚k¨¾M—6Ö Í3†Â«ñb)>ÍæPó»‚øen.¨¡­Ó ço{èÞíÐZé«ÓvÔWúê嫯D¢>¼’A}È<³AðàFY¬>¼¬õáeÔ‡Ì3aͧã\/fBþ_.>´“Û°ùñóžn§? á×${å¼)Žz“OXT|…voæ"þ ë ”qiaFÐ8ä2T02´¯(È¥ˆ)Èá'¦‚–7# ü¡LŽa4G](Èy™P£AQg3¢€Ö(rŒs½œ·Â·Óm>šR{æ– y7ëÆ“.èüÖëõóŒ,B[hîºq›^Žºq`Ë/§*w-Ï4àkU${º·¨é¾-lö_”ïon¾Ü@“to‡¾;ÀÆXÊoÿ! ³(Y…O)`SV¢f×pHø£ vírøüµúãJoendstream endobj 1483 0 obj 2176 endobj 1487 0 obj <> stream xœ˜moÜ6€¿ï¯(’+bE¤¨·ü¡i4‡$nm8ÐZî®.’¸•´ÞøcòËoø*2NîjÀ—5Ãá£áÌBšHÕŸýmúÕ³+ÊrØM«v«Š•IE]°$ƒÞwË:a5TYžªÂ~M’ *šºf³ªR–T„ºeMA×ÓZ›•ë²:!ɬðZuµú͘5Ç †¶6«-.àåêÏÑëûÓôð|­×Xʬ·+³pu†²µ®ûՓﺦ™>nàÅq˜¥ì&8Œr7ò~‚f/š÷°•#¼¼¸ºº¼1Ü´£z1ÌpÃÇ–_w®¾!`óÜ;؉qD‰mÇw ümýŸÕÅzõ³CZR.³2"\â- Ó ›¢t=­Õ.Ó2"ŒäœVÓ Û1kŽ mU„ïG·¨’BÓ}'{†F/¦‰ïÄüZgh‡ÞµÅ®•ðqwTL'8 $9È¡*–‡±f±¹Ë‘UiÈ‘ÕyÄ1Ç…Ø›fÀÑ<°¨¬ ëi­ž#+òˆ#Ë©ÓjšG;fͱ‚¡­÷çÈXÂ4ǯÖïàÀÑ%Å,ÆéÙ^ð þ"§4r@ïë¡W.ØtrÝ-Ì´Œsí¿/ü 8¡…6,Ë* Ñ÷óLÁ i޿רÇeTØe©k7ø.U4–AB#QÛÕšÕÛ¶O3d&é¢Y·Õ»nZ;hr¢¡ÍÍj¿zwœ„(Ñ4¡šçóŽïὸ=Éqƒ.‰äæQpt4tL˜÷¸—5œø-𠾿|óæâ-ÒD–ðã«wë˫ߠáJÒSuÖ‘ºˆˆRB"¢ãÖmÚQ7hyQÓ5š¢¤"Q‚»Îi6퀨´F:ÑÐæ%fŸÿk}ñöݫ˷1RåâoftH´fþÛ(÷…Nâξƒ.ÍY„.-ê]Z¿@ÓйAÃÆ‹ÚnÎ"tiVGèRZ,ši£sƒÖ('Úü t)±)èñÅch'À¨xÐqšqwƒÜÂcñX¹ã¶“\畃ÄXhÂæžî(îú_^BÌkZ†ó:«ÝRm{è5¥EÔv !æU]†óªb^³i/ý 1Ê‹†6?b^•6Óüôýå/o×z‡¾´Mô@Ë´‘ã(´ªLÞö˜‡Ð1g1L˜{¾±,ÓbYåIJ.ýRM;€è %/j»eA,ó<‚X2ºhf4†è­QN4´ùAË̦™ µ8_Gî¨RpÏÇ[0Iç.­‚FI$/X”Dò"÷IĶZnÐàð¢¶K£$’$J"y‘¦‹æ4N"~ÐEÂ$â5?€V^Û$òÅ´€ wÔÔÙûj…Ké*€”J×cp–!ï :-Ÿ›=\‰NðII(ç)ƒïy4M³OŸ•=yÊŠ ìÉÓ‚„eV6™-Pls){ìSÙ8A×cEPöäiF²'OIåµ’**{ܘ5Ç †¶Þ»ìA•šï¯èÆÝ¢ëÚòQ˜¯åüŽméh+FW-ÊëLÆ—MÚ “Ô·²ëä _TTÑ!ð;¾^=ÁjÓÎZÇÓ€V‡u–L#GgeÅVVVQleeíc«m/Žîµ'/¢¶[F±••y[YÉØ¢™Å±ÕZ£ò0¶zÍ÷wt†îbb«Bgëô–CÓA4í¶5µÒa;µ ïë©Á“ÄôßXJÝ«L`!@¬™#€EîãªmÝ !äEm7‹â*+HWfñEsÇU?h"a\õš#ó7|æ°mñ´ˆþ6óv@~¯×ož½^ÿꫦ§Ð&"Áÿ³}ÝÉæ=¾vjç=~Å}V•½R'Çv‡˜;­7rg=Çç®›åQYʲ2*KYVù²Ô¶ònРõ¢¶›Ge)ËXT–²ŒV‹f—¥~ÐŲÔk~ùŒzîö(oÄx4>Ì[¸á"ÁÃúö84x}ªz\Çß3JáÌðÝ|5, S󺠄囉8coÎ^Ï®2ZB­L¥ºòÃO^ÉÀ“kœÂ5…$I”×ü·]'þÀªEFL…A%Ò8è(œŒH‡« EB@x–7‚á å3¨´3U÷Ú`þóþÇN »yÿÉU˜:.[ÝOŸ6Ñ8‡(¡œ¦¶? ãÙ)Âe³óJC½\94B?ˆ±»ý”À?•o«°kñky£·ˆ ɉŸwñ'Œ8a¨™ø g{ÒâB&¡¤Á,Ã_,(•7bœ?K ÛQö_Öˆ 5iËÔ§PSèä8È;± äv Ä*¬$>®˜ OË2¼.¤e]Ò*u×…¶¹T#ö)8œ ë•áu!-ó躖Ì]ÚæR¸1kN\z­÷¬F¨®šT4Y+ GtÌég[˜0,cõ¦¹ÓñpãìScÕï*—6Uà™{J¸ãúÒsàjƒ¡÷«Eqs›£|vh•ûª«tI£èVGýùö ¾ª9çÝÿˆ±Å~Ñs½¡µûÚÝ<â[/БèÉø¶®z¾« \ý#x/ȹ™€}@í©_‹CÚ7ÿâlsÛ‹óo-n~þM¶ùŸº“GŒ*“„•‡ö|}Ä9nÚÍÑfRÅtBjC)¯×—h׸ûñü3ë»Þõ‹Ë«7ads·Àúc*·ƒþ2ÊÎ7òˆþm ƒ‹s}äwÝœã±ßuÄÜ$þ?QZ”Pé±7­á «'“¿H•úÂìçÕáéý¯endstream endobj 1488 0 obj 2163 endobj 1492 0 obj <> stream xœ•WmÛ¸þî_10pi.ðª")ÉÒ¶[$¹&‡W´—ìg, Ú¢ÖleÉåõºÈ—Ý_Þ‘´©Ýïáb¾h†£g>3ú qÄ ¦ÿÜïj3ùóGž¤pk&1üˆÿßN>OØð¸ŸÕÞ^ãc‚Ï¡€ëjbM²"8\o&/ÿª]Sj³…‹ ¦¿úމˆWðáê;QN!Š¢ï¯ÿ3œ6ÆÈçdûÓäåõZA[—°mîuÛ\”j«šR5=˜CÓË{Ðp­S+Ù«2‚ïÿ4yw=ùy’'ó(…,åI$`sœŠ"J ÈE±<ÇyÊ¢rûáj’ÇI”3îæ ýlðºšøi\D÷Ñ2)2ïÕÑ«?Ñí¹pœaëjR}ç@!ÐIŽ è÷ä½®khÚ=l;@µ»$ÝÜÖ Xv±Ô=<´NÃGØ5Fß6ªz¸Â «¶Þmد[£ ”½¤õìmJ¥oHË~s®~{œ¡½é•,¡­ìÉx"ða? NY­egž%Š¥q˜(–¥£D±ùÜCj‡A¢ì‚Ë…3ô³Áë1QŒÜ‰bÈ3ïu‰r{.gÆz~¢‹›(}@,w·‚¬WëãÙKƒ©Ã„-1Y} ´XË`¦*­ð&øl@'÷ îè&ÔÚô„(f&€4-â<€4-¸!M Ø—wänÁ¢æ ýlðê!MóB„¦y{¯vx‚ÔïÙp¼aëÙ¦ù܉̿:u§Û©3DT5XÓ-• ì 1|³­õJ÷õ—Щ[M ê~¼UéºWšït³«*Õ¨_uí†nŠÄbTCòt§û2¿ÅÔm"¸^£4­1K…áT”ò§¬OSÊSš&#yJÓÌË“)² . ÎÐÏD(O¨c#yJÓ8;zÇòä÷\8,§£×sS„¡åëQT×È6Òü÷J¢R™½îñ`Ü%xNeŽoà$âù'Á ÿFvàdÎÐͬ×#Nu$ĉg‰÷j‡NnÏEç ÃXÏlj§Qæp˜§›U½+Q™AÎ Ñ÷pÜèÕ}Z߯IàQU›[â{ÓôX I†ib‰L|TZ誇qy%ñ¾(wEº 2oY ªâ^¡ê´ /–]Tz˜nõÕ›—wx¸³–WW|J§5ô²þeÕÖu»§Oî ÈNú¼Ów²F%»¤û´œ(NR 1]¼¦^¼ ~3¥Ê2%­œ.†^¼°çßLÑ‹G.†öå‹÷ñM'_¾NÂógtü,0 8œˆ4äp"²‡1÷vÇ݂¥©7ô³4äp"ĈÉàÉÑ+sØï¹pDÀá£×39œväpP᜔š­ZéJc£FškËÞJ¤“ðéÝ¿Ç$ÜÉNv·æÂô,N¡©,*ä}k):bïIÔ<ë(D1ËŸ(ŠQùKâØ—?7 ð¶ Roègó°ü‰"•?Q¤¾ü¹á o¿çÂÉ‚òwôz&Þ¢H\ùûe[Rÿ û•Áv`‰ˆ’"B¬œ’‹ Øœ\\p{‘ çn‰u>ªZQ)cø| <ÈÄãX<>‘cчÐ&ÔØœ  6 ;ýª‘e¼í+"èi¶iKšÑ ¯,£ÍÌ7kÏþ詆Þýñ/öÖdsȇ÷ /^À–«¤,gGüyò:ÝÔæendstream endobj 1493 0 obj 1845 endobj 1497 0 obj <> stream xœ­X[oÛÆ~ׯ¤@“¢6Ã].)*@œ4éÉÛ¸ŽŠ(ŠbE­¥mx+—Œ¤¾Ù¿¼³7j™Ô­Õ–ÄÙË g¿¹íø7ˆ#±þs=½¦,…šÅ°™ål¥-2%PÃù"b È“4"yŽã‰rÈiìÉb–Ç,Ê õó ýÈH-f~È!päL²Qª!QêøE»æÔqŒ¡®Åìðõì·1ç÷**x±4gœò,oföà òR”º¬fO.Ök±5´mÓõpÓt õV²æÝz¾*…‚ÕЦªj^ ny7CmÖá\Á#\'z…(Š4Q?2ÔË_g¯–³ï<¨sJCŒçÉ|‚ñéаd€±p0:F?2RGŒçñ|‚1bç¥Z2ÀØ­9uc¨«Æø4|³<Ê|û­€×ßûËõÅPñ¢k`·•Åö _¢Þ¶¥Ô»³ñ‘Fø´¼Ãw/:hnàõP_éñ×¢W·wgR’D–—³'臮V†7Ï‹-n,4_ÇwðúÍò¼[ƒ¬U/øZKkêò`¶àå ÐB'JX(É’‰’yê¡´d` ;álàýÈH ”$ÉÄ@ G©† äÖœ:Ž1Ôõt%D£÷§P4b¯CÀy¼AIÁNö[WR£ˆLÄ«Ÿbòó—g ¢MôÌ8ýÓë„Îa¡?MunÐÆ¸U=ïõy¼"„Ü=¯â˜ BMÑë¬m¯:ñA6ƒ*g¨c±uÞrã-+ª…¼ÑÞ#kX#]ñò š¢7¯¶bÿ±}Ó,Ëû¦YNBû¦˜sœ%y´¯›°&ôŒ~d¤zû¦YJBû¦Y’R y´¯_sê8ÆPדí‹"u_¢-K ¢©…ûC+àñåc¸-›,xy§ÑÃd¶–ª^0od‰A¤ÝÍqcFi˜z1'©—ÑÔ§^GÐØ wzÇèG4L½Œ’IêedáS¯#hÜšS‡©w”z*4dqOaíðú¡Ýró»lãšvg$ÕãBäŠæC‘À-eðN´½¨îóÅ$cafN²t’™“lî3³#€» ‹©gô#fæ$£“Ìœd$¥’ifökNdæQꉀ'Y<¹ÌÛ+IY6; 6/ ­ã}Ó)í˜ØÈ&¨nuUQ[ÞŠg`Þm†JÔ½z†Ù‚ÄãžsýØ-–ÖnÁ¥oÿì äE#Ü{¿#pØ|S|Û–a¿«‘®á–×›RÜ=DHÙ &Éý®z$·êç?ÙbóóTÐË7×//_ý¹ Ž@guèj˜<ŸÒý¦T^×C9¨“u­_¨¾uîöêòòÍÕ»Wÿ§¿òPœ‚СŒ†iœê”„öÎ>;ò:nÂF‡gô#¦qÌc“4NYRãi÷kN¤ñQꉡCñ¾Eï Zì°„Ök´×í•pñíWpa w÷ÏCéïé£0zy…¾ðv5FEÿÙýC±GMe§;ýSëŸÀÑŒþ.’ gŽ"úg."ÚO´Dí!w(vÕì»ýÂDYÊV‰©Û‘4 K$IÓI‰$x³wâÈ£Û¹ ëYžÑ’°D’”NJ$Iã|”OK¤_sêРDŽROt;yO‰<6ØÈm°:š´€’º±Í¼Y°}àȯoùùJöºÙ#™¡ŽÛÔäºw¼9šŽV_¹9´x×,AÚ8–k_7Ý’¾ÚÛm·º7êµ\@%¼ùcºÁÊ®ó {Äw,QœUU‰¢×RíÔžm˜…ÔÒ´ ýyã´Jþn> stream xœ•XKã8¾çWºHy,ËÏÙSõ`fPÀÀ/›/¦Ÿè§9ÂÇGýŒ Îã~cœAÅQ7A«Ç͇û¶-¼ÿGÿæöKßÊéÍÐ-Ǧ“hä^6õ,‡^×]7œA]ÒÕö0Œ­ìëžënjCÔÍŒxÑ©ž&Ù`~ß=~Þ0%ðøëæÃ^v³#øîýæ§ÇÍŸ鬊}àó8 €ÏYa!2¢¼Ù lI‘Vƪ>+²ø,O¬U#zÀÓyGо¯ øÛ@ÏÐ5ôfh…uZN§aœa³HA‡ y¬&ѨLˆBéÃÆÓÒ‡ç<€£ßô€Fô`3„ )Ú•¶ê`㜰ñ$vVµèÁFgä)ú¾Þg*u¶ŸåW„m·&8?I̳Ó(žE?ãæ ÚqÕ§ºGøÜúñáÁCV¼…Ź!KX!Ãg ‡5¢¡Ù ”HÑ®´UaŒäàC¥µjDB:3îXEß×Û!Œ‹@š¦ž,è 4õ¢KÕ€SW? ÄvhÄ4‰I¥èN4ÃQÀ·á¸“âmfe@›YÒfV:Ú$qÅ6 LVÑ®ÚÌÊ6³ÒÑ&‰+†öŒÜñiÓY½ì´”饡ìAgàš?@Ý÷K·`ŠÊù /èѱn%î =Æð"#m¡†FŽM'^á\O˜ ŸU‰c ´9£¬@&gâ(ã•v(‰ò4¯4“6ƒaßcôµý.ø?‚ûn¶p’¸P÷‡NÐÍ뾞ÇW÷œTlÍ#xÐŒ³ÖÓ‹ˆ’u‹#ó¥oPë[B ý0ÓJ¤üI'ЮÇéšê3Å5¥—-ƒ'k¶pÌÎM`Iöò…v('H×®Œe—1ŠqòtÍŽYá,ÙË{J^‘nàóíYÓ¨È8åÂtBœÎP78Ípè†vOñµél†§Lô‡eÆpaùGìÊ RæO=‰­Âƒ%ºÖ’œœ‚v+§NŠ6‚ǧzÆÃ-¼»3™÷òu{ÙŽ¯ïpÄ—Eb W™ŒÕþNü'\]¸17×ÑL«² ¢cö£cw¶˜“ìE“v(^¤kVÖ²fZ©Í´ÂM–­¼FÓ’—¤ø|s4Ó*‹¸‹¦bVT¤:Â;cTzdKX&<Ä"«¯Bü†:Ó<üÒ3ÍÃ/-°MÛ§$yÅÏîB¤kWƲïàI€_­ÚY6²‡Ÿ=%¯H7ðùvü lf„ß½%Åñ4_ *¿Gà v›£æAEXAd°¾»¼šn„¸bºJÛ÷1»‡Y·2yèUÿÿ&Æ!(Lír!Ýd]]ÑLæ4/†Jy0TšÆŽ¡¬ìÅ„vuÒµ«"`¨”gC¥ ÑÓç ¥§w{!Zw° *a6¿^ó}’eÁ “¨×}~|/q ‘ìÁO;0éÚUÌ0I–3L¢æCg™_Í0J½fµ|+üYâf˜5}éâ˾ÎÈ ]=+<·ªúÏ¢ëÔo„ê_ü[ÝÀŸþYþ¿ >Š»€¾±Á£§WüíŃUEÀȬªFNÔœhQ#Ù‹íÄ­®]#35%zñ`UæÙÊk<Ü)y•{Œ¼Z¾1¬J×™Hý°žÌê Ñå 0P#²ð(U 4õ8Öýúñá÷Çû¿þô)‚¿Õ›ŸŠW«š9 d*|1Øcs—Šóû;¬0cGõI Ûö¸43½ñOæsÊY¶‡+5Ô^×rj@],gu1õùÆ"Jò+»CÑ ]»ŠêbYPË G]VöbeOWV7ðùöXeùÕ¬¤f$iLŒÝÅ|D™§ üç0âôƒœ?"‰É^¬ƒÔ(péÕ•ÈpHlrëñ» ¾Æß)%š®t|ÂO§ºù¾Õvd¯;²òJ=ú c—IwUegºYÉ]‰ý¹ù:N’Éendstream endobj 1503 0 obj 2018 endobj 1507 0 obj <> stream xœ•—ÛnÛF†ïõ#HS ¦¹ÓÕääÒ BXÔ~Ëɗ ënúHWðjÚÝ‹a:Ÿô¾ bQ:LW“ï•<¾”…µæ0Ç•°c.„J—๮wÿãôŸÉ¯ÓɇIÄNQºŽ«a…NÀ!ñC‡% ®ãØI ñ\c¦“Ä œ„yf#æžåhV]Ôtb–:ƒ½§ç Q;£Oì¯ÑqÈÑ>k:™?'¼ßÂÃ}ôcNÐá9Í2™È²¼É«R.ezóJÁ_y™U›úäý4Ìó¢‘êä­(¥™nb3 <Ä,@ƒ¾]oZÌú ÂBŽfÕE˜ùÜ1ó×DíM‹]ëcí³Î̯cöçz¡„ÆöµÈg€ÿ”P[ÍH×W»y~YÕÎ s%%Ô2mUÞlaYò¾‡g×í±çÁ±ùȾ]®^ çr¦Zý”oUl˜x‘E?LfÓ“Ð'NdîéÓFØ8šUÕÐÆlúa̵7÷ôÍ5:9Úg=˜>†ìØŸ-E¹@ôTŽkU¥²®Oéò³U¥_î‹ë*Ï + iUyÅ›¼YÂÙv±ÉKÈË´h3©ÈGå"pÈùp„ßPô¦¸ß †ähV]Ôpñ`Ü0Q{ÓL×è8ähŸõpÀ!>Ö’„c5B‘ÔXÛr)E¦Í,¯×…Ø‚( Ð{RÕœ¿ž~´ðRàx˜§ ÷lþ.‹Gü]R½iñï719šUÕðxÛü•Ì=s­;ÎàhŸõ`þ¨cç7CÃZ¨?ê š¥h Ç¿‹²R²†¬æp¤ÚBª#eG¼iŽ`%Ô•ÎIU[h×:eÍR×µª¸+…ýgØmD­3_Kڛɋ.h^.ôí…èîÔBõƒ… òl‘P¹í,QhDžÌ}hƒ@“£Yy¶È‰|¹îÕ‹¼¹FÇa–ÈQÍBÈIä§íí«7ïÎþÐ9@áÐÙÀBŸçM½=Ñ•Ÿ‰F8) J¤¦±©…ìç…HáÝGøv+quþUB5Ç7$“)Þ„¹M—BðÏÚ9v ¹Ò‘`&A̪¶ü³> ß{›^ÉFÀþuÂùiÂÎgð»(¿û:ùœÙræso$g>Œœ‘¹O$mô¹2ŽfÅl9ó>’3?IŒœ‘¹O¤¹ÖÇ8Úg=8‘~“œõ¯Ó¬]`öUemŠKLd*Š´-Dƒ«×—§çðfz×¢he§g=KÿQ+ð£Ø–"?JFRäGÜH™»~ƒð£YŶùQ8’"? ‚!j0–"sŽZR4D=”]䤨g÷@‘ùµÖ‹ªðQÖ-:›¥,¡ÙT t—ÆÑ¨npS*ÝuW³¼Ä`]ÓE½Õ¿¼YyŠâ6«pD¨Rk©DS©Ÿúâ÷qâú”ž®>íðLw%ÝàÙÇ£O7¿„Ì{þ|‹ì%šŸè­1ßgh’º2­”’iƒú(Rþ"¿’O<È~ÌÎ~ÎýííNÞýSO«Ý9«ùÿ|=  Ìnoÿ+þë²DXÅK ø½ªÕJb;hëNu²˜6Yb'¨eýPØmagœ„%Ä;™ûš¦¾l£YŶ°3„ñÐ;™ûš6×è8‘%ìCÔkšñ€„Ýn¯øsæ­ÓM8Ü¢ÔR}V­Öâ œ륱Xù»™ª®°²g[ÝKsÕ·È´EµsšÞ? ûöPÎâp4”³82C9™{¨´AÜÈѬ|{(g±7ÊYì&CTw<”›ktÏʇ¨‡BÝé¥\U×{V²(RüM´À!EÎó²ûiY÷LZ•s,ÈÆ(A‹v“£²ïL4àvÛb¡;j[,ôLÛ"Ó"Úo4r¤Uu Ä£¶Å‚È´-2-¢tN[mkˆz(Ñ Má³B”W(PeWg(]N-»1|S©+ªBÞpº^ãOÍaê ¹Þ,s=¼ãs”Á…Hªæ^£^=”ßn„QR4ZÑ1¢€»;ÀMÌîµB'îtTOšf*‰bH:Ar…ÇáÛZÔ&, †~˜ü Ò4KCendstream endobj 1508 0 obj 1638 endobj 1512 0 obj <> stream xœ•X[Û¶~÷¯˜ÓmÐuDR×}H{6mŠ\N7{‚ô)%ÚfWW—8Û7ï/ïÊä.p#ˆw†ÔŒ¨o†ß ùDk‘þG«võü†Ç ìÆU»UgëÒ"×ÚEÍŠu\@.’5ËsÔ ¶Î!ç‘«UÅëœq7Ü3tšñZ­œkÆàl)ÒÅ«ÑëòF;GË!C­Õj‹ðËê¯3ßô§já§[ó Ííve?œA!Ж£×Ûvõìe]ËTW5s-¡ßB{7L²=¬÷0õ‹Rie''¨ú®V“껲A¹=¨¦ÔlûÞ–¼ÿði ÿ¾ýsu}»úÝ¡˜q‰,5ï¢Ï·¢ª ÜÈÐiÆëje¨–ójETš£å¡¿V êe€¦ù:õçá&ƒËÕÕQMû«¿µÑ0nÕ4Þ̯̫/'¨Çœ›æQNAìpäp¯ƒalNeWC×O°™>7í¥˜‰5‡Û7«gæYÕY¿ˆþ÷ø"Î}ðE*ðE–8˜¬èo_2tšñº€/„ÀÉýD>ñ$qO3G<$zÀÛ– I³^àEO"RG<$zÀÓ­.óˆgñz)ðèÚÏ+õb§á´(Á¡F9èã^i,ÝÄIR?Oú Ù? O5MÔÁh[Y«r’Í=lîu`zŒT9õà Ú‚gPèUp]ït*5T¸¹ýýø|‡‘x~ã¶1²(Çëtxä$^1‹8Íþø#sÛÏ}ëc\?¸uÄñ©#&…I¡¡¯t²t;›#JW%—š>õ(}rÕƒ¬¦æþIyŠ3yYg<ñ³$ÖUÇÆ“Äs–ЀMgè4ãÕeIœ‰Ÿ%qšsçÕŠç,qsv9ÎÐ_ëÅY§˜À&K^ïº^ï@y„o&ä»o50ê‹´EÄîÒV£Z'Ö§‡‹9QÀ)þ¿”3îW¥˜ÅAUŠY⪉æv€`%C§q¿*ÅŒU ó,Z¼FaUrs´æU¥Å류GU¥·%¶Vm_«­ªL»4ê>À•¤5®[-Íœƒ…qüUrx’«"ÏýR"Š((%¢`®”xÆ,4Î4ëÕá&ò,(%"O\)!ñŒ››£Õe^)Y¼^ˆº :S,ÒseQó!s V†©ï›Ö£jpÿ7Çò~„}‰ M›¾­Ñ¬Óu¿‚Úñêï>¼¾ùðúý»@+o_þöþæÑÐëwþvÈmÆò¿/oþõó›ë×o—!rŸT„(Rº¢¤Vôe(dè´Ü'!Ò€T„H©èŠæh9©G*‹×K%b"•—ºxÀ·î1NX?LI6”‚¥»l*ÍÖ»¡lmö4³™ðA°$`ÁRÇ$z€Ù„ &|FŒŒ ‹¯,d7GËá#,^/ =ZF@Ll¿Ó!nó¡F¼°3Âìáçÿ|úü|)›‡€u Û4}uÛ²Â2ü9ž>'ð‚œÀ î8Ä3r4`Áq†¤Y¯9žç'ð„»âéÍÒ„¯7­¼}C0W¶æÚ¦Ûw$ü˜4ƒÜÛ"¤^À•¹ÓäÇòd!¶ßWÿ 8endstream endobj 1513 0 obj 1909 endobj 1517 0 obj <> stream xœ•XMo丽÷¯ ö2³€-‹¤¤–Èav7 X$Ø9j‰Ý­¬¾V¤¦í¹Ù¿ ÎÍë­Ås"Í¿y4L­ÿ€|Z¦»°¹¯…YÀôz¸Ô¸â aýåkÅ>uÿ¬mëìh£êÖlìCfšY¯¾©Þµ|€oVå"À7«Š}ˆo†çC‚†W|iÁAè ýÌzõøf•܇øf•È6¯vxÅ×ïQ8dÆz3¾ …÷{kàÃâçÛ†—sל-V‡É˜i¸&m xŸTï UؘÔ#Ðéõ8®ýª¡¬¡›GÖL+0ìAE;tZÃû.g5R Øg!QÓØ?ÊÞpéZeùÃ2€;/á­ï°,߇ôšåUD¯žK„«Ùr ”2ô³}H¯Y^Dôšå¹§WÙ¢= §èuózk¶ò,¢×û‘éKg0;f èÒ0=9¨L}€tàq£ÏôÍ뾃‡Ã³E@6g„Õf¹£T½è/çîߪ=©û~²__ß%@¤!e‚Gt” é鈆AÜaL†~–†t”ñ2¢£Œï=Ñ0Hí¹p¼aëí àÑ%à1N@ÛéùÎ÷ÎÝ–ØœVç¶“6õráð°´,ìrõ²j<ëƒ*J‚žç4dÏ\”žê×aÄW€ƒû£RíuÏ&¶”i’×7I’¥ ež,³HæÉ2÷2†×$т˃7ô3Êîc˜3Ó ê.8æÜkmtÁ)—°Ï½v·ï sm´»;6 ß10ø¶·%ë"lU^í£VåUé[•†×’¡WÞÐÏŠ°Uẵ*¯¤Ø¼Ê¸Uý…“­ºy½±d8‘ÅE£Ÿ!éh‹æŠªd¨‚²)Aè0oX uß0õ4/xÎozÁe²îY_Ã#gruŒËÈìe8ÁŸTóm†'}YW %Ùi²3çÅJ}NØËæö2-pC¶?­°_þùÕFuv*â¨.°Òb]:cœƒ~§9^5‚$gE$8¶;¥Ã ƒ$»Ê#úYŠžÉH$ðL›W‹¿GáÈ@$l^oMrÆ#‘àde²™Zõ5£Ó‹Ý .ThDI†ëN+âõwÙ7¼0€$·é×Ö_}áŒÄò²ØÎÜßwÿ‰L ¥endstream endobj 1518 0 obj 2182 endobj 1522 0 obj <> stream xœ•Ár¤6†ïzŠ®½¬s° „ ·Mboœr¯M.¹¤dÐÌ(a€±öí'$$F$—85U3Ý«õuÓóL ±ÿ[ч{š1ØO(=*2ŽäežáŽ«ËKœ•P¤ “¢0~IpM‚Y£"ÉpAhXà%„ÁsQkܬĄÀY™ækTgš¨ë‰ËžOÇ ã\k´3ø„¾ âîþ§>Âw•»#£©vh¹825Zj¢VGtñýAt{ÙÀ£¿¥`êçendstream endobj 1523 0 obj 860 endobj 241 0 obj <> /Annots[248 0 R 249 0 R 250 0 R 251 0 R 252 0 R 253 0 R 254 0 R 255 0 R 256 0 R 257 0 R 258 0 R 259 0 R 260 0 R 261 0 R 262 0 R 263 0 R 264 0 R 265 0 R 266 0 R]/Contents 243 0 R >> endobj 270 0 obj <> /Annots[273 0 R 274 0 R 275 0 R 276 0 R 277 0 R 278 0 R 279 0 R 280 0 R 281 0 R 282 0 R 283 0 R 284 0 R 285 0 R 286 0 R 287 0 R 288 0 R 289 0 R 290 0 R 291 0 R 292 0 R 293 0 R 294 0 R 295 0 R 296 0 R 297 0 R 298 0 R 299 0 R 300 0 R 301 0 R 302 0 R 303 0 R 304 0 R 305 0 R 306 0 R 307 0 R 308 0 R 309 0 R 310 0 R 311 0 R]/Contents 271 0 R >> endobj 314 0 obj <> /Annots[317 0 R 318 0 R 319 0 R]/Contents 315 0 R >> endobj 322 0 obj <> >> endobj 323 0 obj <> /Annots[326 0 R 328 0 R 329 0 R 330 0 R 331 0 R 332 0 R 333 0 R 334 0 R 335 0 R 336 0 R 337 0 R 338 0 R 339 0 R 340 0 R 341 0 R]/Contents 324 0 R >> endobj 344 0 obj <> /Contents 345 0 R >> endobj 349 0 obj <> /Contents 350 0 R >> endobj 354 0 obj <> /Annots[357 0 R 358 0 R]/Contents 355 0 R >> endobj 361 0 obj <> /Contents 362 0 R >> endobj 366 0 obj <> /Contents 367 0 R >> endobj 371 0 obj <> /Contents 372 0 R >> endobj 376 0 obj <> /Annots[379 0 R 380 0 R]/Contents 377 0 R >> endobj 383 0 obj <> /Annots[386 0 R]/Contents 384 0 R >> endobj 389 0 obj <> /Annots[392 0 R 393 0 R]/Contents 390 0 R >> endobj 396 0 obj <> /Contents 397 0 R >> endobj 401 0 obj <> /Contents 402 0 R >> endobj 406 0 obj <> /Contents 407 0 R >> endobj 411 0 obj <> /Contents 412 0 R >> endobj 416 0 obj <> /Contents 417 0 R >> endobj 421 0 obj <> /Contents 422 0 R >> endobj 426 0 obj <> /Contents 427 0 R >> endobj 431 0 obj <> /Contents 432 0 R >> endobj 437 0 obj <> /Annots[440 0 R 441 0 R 442 0 R]/Contents 438 0 R >> endobj 445 0 obj <> /Contents 446 0 R >> endobj 450 0 obj <> /Annots[453 0 R 454 0 R 455 0 R 456 0 R]/Contents 451 0 R >> endobj 459 0 obj <> /Contents 460 0 R >> endobj 464 0 obj <> /Contents 465 0 R >> endobj 469 0 obj <> /Contents 470 0 R >> endobj 474 0 obj <> /Contents 475 0 R >> endobj 479 0 obj <> /Contents 480 0 R >> endobj 484 0 obj <> /Contents 485 0 R >> endobj 489 0 obj <> /Annots[492 0 R 493 0 R]/Contents 490 0 R >> endobj 496 0 obj <> /Contents 497 0 R >> endobj 501 0 obj <> /Annots[504 0 R 505 0 R 506 0 R 507 0 R]/Contents 502 0 R >> endobj 510 0 obj <> /Contents 511 0 R >> endobj 515 0 obj <> /Contents 516 0 R >> endobj 520 0 obj <> /Annots[523 0 R 524 0 R 525 0 R]/Contents 521 0 R >> endobj 528 0 obj <> /Annots[531 0 R 532 0 R 533 0 R 534 0 R]/Contents 529 0 R >> endobj 537 0 obj <> /Annots[540 0 R]/Contents 538 0 R >> endobj 543 0 obj <> /Contents 544 0 R >> endobj 548 0 obj <> /Contents 549 0 R >> endobj 553 0 obj <> /Annots[556 0 R 557 0 R]/Contents 554 0 R >> endobj 560 0 obj <> /Contents 561 0 R >> endobj 565 0 obj <> /Contents 566 0 R >> endobj 570 0 obj <> /Annots[573 0 R 574 0 R]/Contents 571 0 R >> endobj 577 0 obj <> /Contents 578 0 R >> endobj 582 0 obj <> /Contents 583 0 R >> endobj 587 0 obj <> /Contents 588 0 R >> endobj 592 0 obj <> /Annots[595 0 R]/Contents 593 0 R >> endobj 598 0 obj <> /Annots[601 0 R 602 0 R 603 0 R]/Contents 599 0 R >> endobj 606 0 obj <> /Contents 607 0 R >> endobj 612 0 obj <> /Contents 613 0 R >> endobj 617 0 obj <> /Contents 618 0 R >> endobj 622 0 obj <> /Annots[625 0 R]/Contents 623 0 R >> endobj 628 0 obj <> /Annots[631 0 R 632 0 R]/Contents 629 0 R >> endobj 635 0 obj <> /Annots[638 0 R]/Contents 636 0 R >> endobj 641 0 obj <> /Annots[644 0 R 645 0 R 646 0 R 647 0 R 648 0 R 649 0 R 650 0 R 651 0 R 652 0 R 653 0 R]/Contents 642 0 R >> endobj 656 0 obj <> /Annots[659 0 R 660 0 R 661 0 R 662 0 R 663 0 R 664 0 R]/Contents 657 0 R >> endobj 667 0 obj <> /Annots[670 0 R 671 0 R 672 0 R 673 0 R 674 0 R 675 0 R]/Contents 668 0 R >> endobj 678 0 obj <> /Annots[681 0 R 682 0 R 683 0 R 684 0 R]/Contents 679 0 R >> endobj 687 0 obj <> /Annots[690 0 R 691 0 R 692 0 R 693 0 R 694 0 R 695 0 R 696 0 R 697 0 R 698 0 R 699 0 R 700 0 R 701 0 R]/Contents 688 0 R >> endobj 704 0 obj <> /Annots[707 0 R 708 0 R 709 0 R 710 0 R 711 0 R 712 0 R 713 0 R 714 0 R 715 0 R 716 0 R 717 0 R 718 0 R 719 0 R 720 0 R 721 0 R]/Contents 705 0 R >> endobj 724 0 obj <> /Annots[727 0 R 728 0 R 729 0 R 730 0 R 731 0 R 732 0 R 733 0 R 734 0 R]/Contents 725 0 R >> endobj 737 0 obj <> /Annots[740 0 R 741 0 R 742 0 R 743 0 R 744 0 R]/Contents 738 0 R >> endobj 747 0 obj <> /Annots[750 0 R 751 0 R 752 0 R]/Contents 748 0 R >> endobj 755 0 obj <> /Annots[758 0 R]/Contents 756 0 R >> endobj 761 0 obj <> /Annots[764 0 R 765 0 R 766 0 R 767 0 R 768 0 R 769 0 R]/Contents 762 0 R >> endobj 772 0 obj <> /Annots[775 0 R]/Contents 773 0 R >> endobj 778 0 obj <> /Annots[781 0 R 782 0 R]/Contents 779 0 R >> endobj 785 0 obj <> /Annots[788 0 R 789 0 R]/Contents 786 0 R >> endobj 792 0 obj <> /Contents 793 0 R >> endobj 797 0 obj <> /Annots[800 0 R 801 0 R 802 0 R 803 0 R 804 0 R]/Contents 798 0 R >> endobj 807 0 obj <> /Annots[810 0 R 811 0 R 812 0 R]/Contents 808 0 R >> endobj 815 0 obj <> /Annots[818 0 R 819 0 R 820 0 R 821 0 R 822 0 R 823 0 R 824 0 R]/Contents 816 0 R >> endobj 827 0 obj <> /Annots[830 0 R 831 0 R 832 0 R]/Contents 828 0 R >> endobj 835 0 obj <> /Annots[838 0 R 839 0 R]/Contents 836 0 R >> endobj 842 0 obj <> /Annots[845 0 R 846 0 R 847 0 R 848 0 R 849 0 R]/Contents 843 0 R >> endobj 852 0 obj <> /Contents 853 0 R >> endobj 857 0 obj <> /Annots[860 0 R 861 0 R 862 0 R 863 0 R]/Contents 858 0 R >> endobj 866 0 obj <> /Annots[869 0 R]/Contents 867 0 R >> endobj 872 0 obj <> /Annots[875 0 R 876 0 R 878 0 R]/Contents 873 0 R >> endobj 881 0 obj <> /Contents 882 0 R >> endobj 886 0 obj <> /Contents 887 0 R >> endobj 891 0 obj <> /Contents 892 0 R >> endobj 896 0 obj <> /Contents 897 0 R >> endobj 901 0 obj <> /Annots[904 0 R]/Contents 902 0 R >> endobj 907 0 obj <> /Annots[910 0 R 911 0 R 912 0 R 913 0 R 914 0 R 915 0 R]/Contents 908 0 R >> endobj 918 0 obj <> /Contents 919 0 R >> endobj 923 0 obj <> /Annots[926 0 R 927 0 R 928 0 R 929 0 R 930 0 R 931 0 R 932 0 R 933 0 R 934 0 R]/Contents 924 0 R >> endobj 937 0 obj <> /Annots[940 0 R 941 0 R 942 0 R 943 0 R 944 0 R 945 0 R 946 0 R 947 0 R 948 0 R 949 0 R]/Contents 938 0 R >> endobj 952 0 obj <> /Annots[955 0 R 956 0 R 957 0 R 958 0 R 959 0 R]/Contents 953 0 R >> endobj 962 0 obj <> /Annots[965 0 R 966 0 R 967 0 R 968 0 R 969 0 R]/Contents 963 0 R >> endobj 972 0 obj <> /Annots[975 0 R 976 0 R 977 0 R]/Contents 973 0 R >> endobj 980 0 obj <> /Annots[983 0 R]/Contents 981 0 R >> endobj 986 0 obj <> /Annots[989 0 R]/Contents 987 0 R >> endobj 992 0 obj <> /Annots[995 0 R 996 0 R]/Contents 993 0 R >> endobj 999 0 obj <> /Contents 1000 0 R >> endobj 1004 0 obj <> /Contents 1005 0 R >> endobj 1009 0 obj <> /Contents 1010 0 R >> endobj 1014 0 obj <> /Annots[1017 0 R]/Contents 1015 0 R >> endobj 1020 0 obj <> /Contents 1021 0 R >> endobj 1025 0 obj <> /Annots[1028 0 R]/Contents 1026 0 R >> endobj 1031 0 obj <> /Annots[1034 0 R 1035 0 R 1036 0 R]/Contents 1032 0 R >> endobj 1039 0 obj <> /Annots[1042 0 R]/Contents 1040 0 R >> endobj 1045 0 obj <> /Contents 1046 0 R >> endobj 1050 0 obj <> /Contents 1051 0 R >> endobj 1055 0 obj <> /Contents 1056 0 R >> endobj 1060 0 obj <> /Contents 1061 0 R >> endobj 1065 0 obj <> /Contents 1066 0 R >> endobj 1070 0 obj <> /Contents 1071 0 R >> endobj 1075 0 obj <> /Contents 1076 0 R >> endobj 1080 0 obj <> /Contents 1081 0 R >> endobj 1085 0 obj <> /Contents 1086 0 R >> endobj 1090 0 obj <> /Annots[1093 0 R]/Contents 1091 0 R >> endobj 1096 0 obj <> /Contents 1097 0 R >> endobj 1101 0 obj <> /Contents 1102 0 R >> endobj 1106 0 obj <> /Contents 1107 0 R >> endobj 1111 0 obj <> /Contents 1112 0 R >> endobj 1116 0 obj <> /Contents 1117 0 R >> endobj 1121 0 obj <> /Annots[1124 0 R]/Contents 1122 0 R >> endobj 1127 0 obj <> /Annots[1130 0 R]/Contents 1128 0 R >> endobj 1133 0 obj <> /Contents 1134 0 R >> endobj 1138 0 obj <> /Annots[1141 0 R 1142 0 R]/Contents 1139 0 R >> endobj 1145 0 obj <> /Contents 1146 0 R >> endobj 1150 0 obj <> /Contents 1151 0 R >> endobj 1155 0 obj <> /Annots[1158 0 R]/Contents 1156 0 R >> endobj 1161 0 obj <> /Annots[1164 0 R 1165 0 R 1166 0 R]/Contents 1162 0 R >> endobj 1169 0 obj <> /Contents 1170 0 R >> endobj 1174 0 obj <> /Contents 1175 0 R >> endobj 1179 0 obj <> /Annots[1182 0 R]/Contents 1180 0 R >> endobj 1185 0 obj <> /Contents 1186 0 R >> endobj 1190 0 obj <> /Annots[1193 0 R]/Contents 1191 0 R >> endobj 1196 0 obj <> /Annots[1199 0 R 1200 0 R]/Contents 1197 0 R >> endobj 1203 0 obj <> /Annots[1206 0 R]/Contents 1204 0 R >> endobj 1209 0 obj <> /Contents 1210 0 R >> endobj 1214 0 obj <> /Annots[1217 0 R 1218 0 R]/Contents 1215 0 R >> endobj 1221 0 obj <> /Contents 1222 0 R >> endobj 1226 0 obj <> /Contents 1227 0 R >> endobj 1231 0 obj <> /Annots[1234 0 R 1235 0 R 1236 0 R 1237 0 R 1238 0 R]/Contents 1232 0 R >> endobj 1241 0 obj <> /Contents 1242 0 R >> endobj 1246 0 obj <> /Contents 1247 0 R >> endobj 1251 0 obj <> /Contents 1252 0 R >> endobj 1256 0 obj <> /Contents 1257 0 R >> endobj 1261 0 obj <> /Contents 1262 0 R >> endobj 1266 0 obj <> /Contents 1267 0 R >> endobj 1271 0 obj <> /Contents 1272 0 R >> endobj 1276 0 obj <> /Contents 1277 0 R >> endobj 1281 0 obj <> /Contents 1282 0 R >> endobj 1286 0 obj <> /Contents 1287 0 R >> endobj 1291 0 obj <> /Contents 1292 0 R >> endobj 1296 0 obj <> /Contents 1297 0 R >> endobj 1301 0 obj <> /Contents 1302 0 R >> endobj 1306 0 obj <> /Contents 1307 0 R >> endobj 1311 0 obj <> /Contents 1312 0 R >> endobj 1316 0 obj <> /Annots[1319 0 R]/Contents 1317 0 R >> endobj 1322 0 obj <> /Contents 1323 0 R >> endobj 1327 0 obj <> /Contents 1328 0 R >> endobj 1332 0 obj <> /Contents 1333 0 R >> endobj 1337 0 obj <> /Contents 1338 0 R >> endobj 1342 0 obj <> /Annots[1345 0 R]/Contents 1343 0 R >> endobj 1348 0 obj <> /Contents 1349 0 R >> endobj 1353 0 obj <> /Contents 1354 0 R >> endobj 1358 0 obj <> /Contents 1359 0 R >> endobj 1363 0 obj <> /Annots[1366 0 R]/Contents 1364 0 R >> endobj 1369 0 obj <> /Contents 1370 0 R >> endobj 1374 0 obj <> /Contents 1375 0 R >> endobj 1379 0 obj <> /Annots[1382 0 R]/Contents 1380 0 R >> endobj 1385 0 obj <> /Annots[1388 0 R 1389 0 R]/Contents 1386 0 R >> endobj 1392 0 obj <> /Contents 1393 0 R >> endobj 1397 0 obj <> /Annots[1400 0 R]/Contents 1398 0 R >> endobj 1403 0 obj <> /Annots[1406 0 R 1407 0 R 1408 0 R 1409 0 R 1410 0 R 1411 0 R 1412 0 R 1413 0 R 1414 0 R 1415 0 R 1416 0 R]/Contents 1404 0 R >> endobj 1419 0 obj <> /Annots[1422 0 R 1423 0 R 1424 0 R 1425 0 R]/Contents 1420 0 R >> endobj 1428 0 obj <> /Contents 1429 0 R >> endobj 1433 0 obj <> /Annots[1436 0 R]/Contents 1434 0 R >> endobj 1439 0 obj <> /Annots[1442 0 R 1443 0 R]/Contents 1440 0 R >> endobj 1446 0 obj <> /Contents 1447 0 R >> endobj 1451 0 obj <> /Contents 1452 0 R >> endobj 1456 0 obj <> /Contents 1457 0 R >> endobj 1461 0 obj <> /Contents 1462 0 R >> endobj 1466 0 obj <> /Contents 1467 0 R >> endobj 1471 0 obj <> /Contents 1472 0 R >> endobj 1476 0 obj <> /Contents 1477 0 R >> endobj 1481 0 obj <> /Contents 1482 0 R >> endobj 1486 0 obj <> /Contents 1487 0 R >> endobj 1491 0 obj <> /Contents 1492 0 R >> endobj 1496 0 obj <> /Contents 1497 0 R >> endobj 1501 0 obj <> /Contents 1502 0 R >> endobj 1506 0 obj <> /Contents 1507 0 R >> endobj 1511 0 obj <> /Contents 1512 0 R >> endobj 1516 0 obj <> /Contents 1517 0 R >> endobj 1521 0 obj <> /Annots[1524 0 R]/Contents 1522 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 241 0 R 270 0 R 314 0 R 322 0 R 323 0 R 344 0 R 349 0 R 354 0 R 361 0 R 366 0 R 371 0 R 376 0 R 383 0 R 389 0 R 396 0 R 401 0 R 406 0 R 411 0 R 416 0 R 421 0 R 426 0 R 431 0 R 437 0 R 445 0 R 450 0 R 459 0 R 464 0 R 469 0 R 474 0 R 479 0 R 484 0 R 489 0 R 496 0 R 501 0 R 510 0 R 515 0 R 520 0 R 528 0 R 537 0 R 543 0 R 548 0 R 553 0 R 560 0 R 565 0 R 570 0 R 577 0 R 582 0 R 587 0 R 592 0 R 598 0 R 606 0 R 612 0 R 617 0 R 622 0 R 628 0 R 635 0 R 641 0 R 656 0 R 667 0 R 678 0 R 687 0 R 704 0 R 724 0 R 737 0 R 747 0 R 755 0 R 761 0 R 772 0 R 778 0 R 785 0 R 792 0 R 797 0 R 807 0 R 815 0 R 827 0 R 835 0 R 842 0 R 852 0 R 857 0 R 866 0 R 872 0 R 881 0 R 886 0 R 891 0 R 896 0 R 901 0 R 907 0 R 918 0 R 923 0 R 937 0 R 952 0 R 962 0 R 972 0 R 980 0 R 986 0 R 992 0 R 999 0 R 1004 0 R 1009 0 R 1014 0 R 1020 0 R 1025 0 R 1031 0 R 1039 0 R 1045 0 R 1050 0 R 1055 0 R 1060 0 R 1065 0 R 1070 0 R 1075 0 R 1080 0 R 1085 0 R 1090 0 R 1096 0 R 1101 0 R 1106 0 R 1111 0 R 1116 0 R 1121 0 R 1127 0 R 1133 0 R 1138 0 R 1145 0 R 1150 0 R 1155 0 R 1161 0 R 1169 0 R 1174 0 R 1179 0 R 1185 0 R 1190 0 R 1196 0 R 1203 0 R 1209 0 R 1214 0 R 1221 0 R 1226 0 R 1231 0 R 1241 0 R 1246 0 R 1251 0 R 1256 0 R 1261 0 R 1266 0 R 1271 0 R 1276 0 R 1281 0 R 1286 0 R 1291 0 R 1296 0 R 1301 0 R 1306 0 R 1311 0 R 1316 0 R 1322 0 R 1327 0 R 1332 0 R 1337 0 R 1342 0 R 1348 0 R 1353 0 R 1358 0 R 1363 0 R 1369 0 R 1374 0 R 1379 0 R 1385 0 R 1392 0 R 1397 0 R 1403 0 R 1419 0 R 1428 0 R 1433 0 R 1439 0 R 1446 0 R 1451 0 R 1456 0 R 1461 0 R 1466 0 R 1471 0 R 1476 0 R 1481 0 R 1486 0 R 1491 0 R 1496 0 R 1501 0 R 1506 0 R 1511 0 R 1516 0 R 1521 0 R ] /Count 191 >> endobj 4 0 obj << /Count 200 /First 5 0 R /Last 209 0 R >> endobj 1 0 obj <> endobj 6 0 obj << /Title(Funtools: FITS Users Need Tools) /Dest/63 /Parent 5 0 R /Next 7 0 R >> endobj 7 0 obj << /Title(Summary) /Dest/64 /Parent 5 0 R /Prev 6 0 R /Next 8 0 R >> endobj 11 0 obj << /Title(Last updated: January 6, 2006) /Dest/66 /Parent 10 0 R >> endobj 10 0 obj << /Title() /Dest/66 /Count -1 /Parent 9 0 R /First 11 0 R /Last 11 0 R >> endobj 9 0 obj << /Title() /Dest/66 /Count -1 /Parent 8 0 R /First 10 0 R /Last 10 0 R >> endobj 8 0 obj << /Title(Description) /Dest/65 /Count 1 /Parent 5 0 R /Prev 7 0 R /First 9 0 R /Last 9 0 R >> endobj 5 0 obj << /Title() /Dest/63 /Count 4 /Parent 4 0 R /Next 12 0 R /First 6 0 R /Last 8 0 R >> endobj 13 0 obj << /Title(Funtools Programs) /Dest/67 /Parent 12 0 R /Next 14 0 R >> endobj 14 0 obj << /Title(Summary) /Dest/68 /Parent 12 0 R /Prev 13 0 R /Next 15 0 R >> endobj 15 0 obj << /Title(funcalc - Funtools calculator \(for binary tables\)) /Dest/69 /Parent 12 0 R /Prev 14 0 R /Next 16 0 R >> endobj 16 0 obj << /Title(funcen - find centroid \(for binary tables\)) /Dest/70 /Parent 12 0 R /Prev 15 0 R /Next 17 0 R >> endobj 17 0 obj << /Title(funcnts - count photons in specified regions, with bkgd subtraction) /Dest/71 /Parent 12 0 R /Prev 16 0 R /Next 18 0 R >> endobj 18 0 obj << /Title(funcone - cone search of a binary table containing RA, Dec columns) /Dest/72 /Parent 12 0 R /Prev 17 0 R /Next 19 0 R >> endobj 19 0 obj << /Title(fundisp - display data in a Funtools data file) /Dest/73 /Parent 12 0 R /Prev 18 0 R /Next 20 0 R >> endobj 20 0 obj << /Title(funhead - display a header in a Funtools file) /Dest/74 /Parent 12 0 R /Prev 19 0 R /Next 21 0 R >> endobj 21 0 obj << /Title(funhist - create a 1D histogram of a column \(from a FITS binary table or raw event file\) or an image) /Dest/75 /Parent 12 0 R /Prev 20 0 R /Next 22 0 R >> endobj 22 0 obj << /Title(funimage - create a FITS image from a Funtools data file) /Dest/76 /Parent 12 0 R /Prev 21 0 R /Next 23 0 R >> endobj 23 0 obj << /Title(funindex - create an index for a column of a FITS binary table) /Dest/77 /Parent 12 0 R /Prev 22 0 R /Next 24 0 R >> endobj 24 0 obj << /Title(funjoin - join two or more FITS binary tables on specified columns) /Dest/78 /Parent 12 0 R /Prev 23 0 R /Next 25 0 R >> endobj 25 0 obj << /Title(funmerge - merge one or more Funtools table files) /Dest/79 /Parent 12 0 R /Prev 24 0 R /Next 26 0 R >> endobj 26 0 obj << /Title(funsky - convert between image and sky coordinates) /Dest/80 /Parent 12 0 R /Prev 25 0 R /Next 27 0 R >> endobj 27 0 obj << /Title(funtable - copy selected rows from a Funtools file to a FITS binary table) /Dest/81 /Parent 12 0 R /Prev 26 0 R /Next 28 0 R >> endobj 31 0 obj << /Title(Last updated: April 1, 2007) /Dest/83 /Parent 30 0 R >> endobj 30 0 obj << /Title() /Dest/83 /Count -1 /Parent 29 0 R /First 31 0 R /Last 31 0 R >> endobj 29 0 obj << /Title() /Dest/83 /Count -1 /Parent 28 0 R /First 30 0 R /Last 30 0 R >> endobj 28 0 obj << /Title(funtbl - extract a table from Funtools ASCII output) /Dest/82 /Count 1 /Parent 12 0 R /Prev 27 0 R /First 29 0 R /Last 29 0 R >> endobj 12 0 obj << /Title() /Dest/67 /Count 17 /Parent 4 0 R /Prev 5 0 R /Next 32 0 R /First 13 0 R /Last 28 0 R >> endobj 33 0 obj << /Title(FunDS9: Funtools and DS9 Image Display) /Dest/85 /Parent 32 0 R /Next 34 0 R >> endobj 34 0 obj << /Title(Summary) /Dest/86 /Parent 32 0 R /Prev 33 0 R /Next 35 0 R >> endobj 38 0 obj << /Title(Last updated: November 16, 2005) /Dest/88 /Parent 37 0 R >> endobj 37 0 obj << /Title() /Dest/88 /Count -1 /Parent 36 0 R /First 38 0 R /Last 38 0 R >> endobj 36 0 obj << /Title() /Dest/88 /Count -1 /Parent 35 0 R /First 37 0 R /Last 37 0 R >> endobj 35 0 obj << /Title(Description) /Dest/87 /Count 1 /Parent 32 0 R /Prev 34 0 R /First 36 0 R /Last 36 0 R >> endobj 32 0 obj << /Title() /Dest/85 /Count 4 /Parent 4 0 R /Prev 12 0 R /Next 39 0 R /First 33 0 R /Last 35 0 R >> endobj 40 0 obj << /Title(FunLib: the Funtools Programming Interface) /Dest/91 /Parent 39 0 R /Next 41 0 R >> endobj 41 0 obj << /Title(Summary) /Dest/92 /Parent 39 0 R /Prev 40 0 R /Next 42 0 R >> endobj 42 0 obj << /Title(Introduction to the Funtools Programming Interface) /Dest/93 /Parent 39 0 R /Prev 41 0 R /Next 43 0 R >> endobj 43 0 obj << /Title(Funtools Programming Tutorial) /Dest/94 /Parent 39 0 R /Prev 42 0 R /Next 44 0 R >> endobj 44 0 obj << /Title(Compiling and Linking) /Dest/95 /Parent 39 0 R /Prev 43 0 R /Next 45 0 R >> endobj 45 0 obj << /Title(A Short Digression on Subroutine Order) /Dest/96 /Parent 39 0 R /Prev 44 0 R /Next 46 0 R >> endobj 46 0 obj << /Title(Funtools Programming Examples) /Dest/97 /Parent 39 0 R /Prev 45 0 R /Next 47 0 R >> endobj 47 0 obj << /Title(The Funtools Programming Reference Manual) /Dest/98 /Parent 39 0 R /Prev 46 0 R /Next 48 0 R >> endobj 48 0 obj << /Title(FunOpen - open a Funtools data file) /Dest/99 /Parent 39 0 R /Prev 47 0 R /Next 49 0 R >> endobj 49 0 obj << /Title(FunImageGet - get an image or image section) /Dest/100 /Parent 39 0 R /Prev 48 0 R /Next 50 0 R >> endobj 50 0 obj << /Title(FunImagePut - put an image to a Funtools file) /Dest/101 /Parent 39 0 R /Prev 49 0 R /Next 51 0 R >> endobj 51 0 obj << /Title(FunImageRowGet - get row\(s\) of an image) /Dest/102 /Parent 39 0 R /Prev 50 0 R /Next 52 0 R >> endobj 52 0 obj << /Title(FunImageRowPut - put row\(s\) of an image) /Dest/103 /Parent 39 0 R /Prev 51 0 R /Next 53 0 R >> endobj 53 0 obj << /Title(FunColumnSelect - select Funtools columns) /Dest/104 /Parent 39 0 R /Prev 52 0 R /Next 54 0 R >> endobj 54 0 obj << /Title(FunColumnActivate - activate Funtools columns) /Dest/105 /Parent 39 0 R /Prev 53 0 R /Next 55 0 R >> endobj 55 0 obj << /Title(FunColumnLookup - lookup a Funtools column) /Dest/106 /Parent 39 0 R /Prev 54 0 R /Next 56 0 R >> endobj 56 0 obj << /Title(FunTableRowGet - get Funtools rows) /Dest/107 /Parent 39 0 R /Prev 55 0 R /Next 57 0 R >> endobj 57 0 obj << /Title(FunTableRowPut - put Funtools rows) /Dest/108 /Parent 39 0 R /Prev 56 0 R /Next 58 0 R >> endobj 58 0 obj << /Title(FunParamPut - put a Funtools param value) /Dest/109 /Parent 39 0 R /Prev 57 0 R /Next 59 0 R >> endobj 59 0 obj << /Title(FunInfoGet - get information from Funtools struct) /Dest/110 /Parent 39 0 R /Prev 58 0 R /Next 60 0 R >> endobj 60 0 obj << /Title(FunInfoPut - put information into a Funtools struct) /Dest/111 /Parent 39 0 R /Prev 59 0 R /Next 61 0 R >> endobj 61 0 obj << /Title(FunFlush - flush data to output file) /Dest/112 /Parent 39 0 R /Prev 60 0 R /Next 62 0 R >> endobj 62 0 obj << /Title(FunClose - close a Funtools data file) /Dest/113 /Parent 39 0 R /Prev 61 0 R /Next 63 0 R >> endobj 63 0 obj << /Title(FunRef: the Funtools Reference Handle) /Dest/114 /Parent 39 0 R /Prev 62 0 R /Next 64 0 R >> endobj 64 0 obj << /Title(Summary) /Dest/115 /Parent 39 0 R /Prev 63 0 R /Next 65 0 R >> endobj 68 0 obj << /Title(Last updated: December 1, 2005) /Dest/117 /Parent 67 0 R >> endobj 67 0 obj << /Title() /Dest/117 /Count -1 /Parent 66 0 R /First 68 0 R /Last 68 0 R >> endobj 66 0 obj << /Title() /Dest/117 /Count -1 /Parent 65 0 R /First 67 0 R /Last 67 0 R >> endobj 65 0 obj << /Title(Description) /Dest/116 /Count 1 /Parent 39 0 R /Prev 64 0 R /First 66 0 R /Last 66 0 R >> endobj 39 0 obj << /Title() /Dest/91 /Count 27 /Parent 4 0 R /Prev 32 0 R /Next 69 0 R /First 40 0 R /Last 65 0 R >> endobj 70 0 obj << /Title(FunFiles: Funtools Data Files) /Dest/120 /Parent 69 0 R /Next 71 0 R >> endobj 71 0 obj << /Title(Summary) /Dest/121 /Parent 69 0 R /Prev 70 0 R /Next 72 0 R >> endobj 72 0 obj << /Title(Description) /Dest/122 /Parent 69 0 R /Prev 71 0 R /Next 73 0 R >> endobj 73 0 obj << /Title(Supported Data Formats) /Dest/123 /Parent 69 0 R /Prev 72 0 R /Next 74 0 R >> endobj 74 0 obj << /Title(FITS Images and Binary Tables) /Dest/124 /Parent 69 0 R /Prev 73 0 R /Next 75 0 R >> endobj 75 0 obj << /Title(Non-FITS Raw Event Files) /Dest/125 /Parent 69 0 R /Prev 74 0 R /Next 76 0 R >> endobj 76 0 obj << /Title(Non-FITS Array Files) /Dest/126 /Parent 69 0 R /Prev 75 0 R /Next 77 0 R >> endobj 77 0 obj << /Title(Specifying Image Sections) /Dest/127 /Parent 69 0 R /Prev 76 0 R /Next 78 0 R >> endobj 78 0 obj << /Title(Binning FITS Binary Tables and Non-FITS Event Files) /Dest/128 /Parent 69 0 R /Prev 77 0 R /Next 79 0 R >> endobj 79 0 obj << /Title(Table and Spatial Region Filters) /Dest/129 /Parent 69 0 R /Prev 78 0 R /Next 80 0 R >> endobj 80 0 obj << /Title(Disk Files and Other Supported File Types) /Dest/130 /Parent 69 0 R /Prev 79 0 R /Next 81 0 R >> endobj 84 0 obj << /Title(Last updated: February 15, 2006) /Dest/132 /Parent 83 0 R >> endobj 83 0 obj << /Title() /Dest/132 /Count -1 /Parent 82 0 R /First 84 0 R /Last 84 0 R >> endobj 82 0 obj << /Title() /Dest/132 /Count -1 /Parent 81 0 R /First 83 0 R /Last 83 0 R >> endobj 81 0 obj << /Title(Lists of Files) /Dest/131 /Count 1 /Parent 69 0 R /Prev 80 0 R /First 82 0 R /Last 82 0 R >> endobj 69 0 obj << /Title() /Dest/120 /Count 13 /Parent 4 0 R /Prev 39 0 R /Next 85 0 R /First 70 0 R /Last 81 0 R >> endobj 86 0 obj << /Title(Funtext: Support for Column-based Text Files) /Dest/134 /Parent 85 0 R /Next 87 0 R >> endobj 87 0 obj << /Title(Summary) /Dest/135 /Parent 85 0 R /Prev 86 0 R /Next 88 0 R >> endobj 88 0 obj << /Title(Description) /Dest/136 /Parent 85 0 R /Prev 87 0 R /Next 89 0 R >> endobj 89 0 obj << /Title(Standard Text Files) /Dest/137 /Parent 85 0 R /Prev 88 0 R /Next 90 0 R >> endobj 90 0 obj << /Title(Comments Convert to Header Params) /Dest/138 /Parent 85 0 R /Prev 89 0 R /Next 91 0 R >> endobj 91 0 obj << /Title(Multiple Tables in a Single File) /Dest/139 /Parent 85 0 R /Prev 90 0 R /Next 92 0 R >> endobj 92 0 obj << /Title(TEXT\(\) Specifier) /Dest/140 /Parent 85 0 R /Prev 91 0 R /Next 93 0 R >> endobj 93 0 obj << /Title(Text\(\) Keyword Options) /Dest/141 /Parent 85 0 R /Prev 92 0 R /Next 94 0 R >> endobj 94 0 obj << /Title(Environment Variables) /Dest/142 /Parent 85 0 R /Prev 93 0 R /Next 95 0 R >> endobj 98 0 obj << /Title(Last updated: August 3, 2007) /Dest/144 /Parent 97 0 R >> endobj 97 0 obj << /Title() /Dest/144 /Count -1 /Parent 96 0 R /First 98 0 R /Last 98 0 R >> endobj 96 0 obj << /Title() /Dest/144 /Count -1 /Parent 95 0 R /First 97 0 R /Last 97 0 R >> endobj 95 0 obj << /Title(Restrictions and Problems) /Dest/143 /Count 1 /Parent 85 0 R /Prev 94 0 R /First 96 0 R /Last 96 0 R >> endobj 85 0 obj << /Title() /Dest/134 /Count 11 /Parent 4 0 R /Prev 69 0 R /Next 99 0 R /First 86 0 R /Last 95 0 R >> endobj 100 0 obj << /Title(Funview: Database View Support for Tables) /Dest/146 /Parent 99 0 R /Next 101 0 R >> endobj 101 0 obj << /Title(Summary) /Dest/147 /Parent 99 0 R /Prev 100 0 R /Next 102 0 R >> endobj 102 0 obj << /Title(Description) /Dest/148 /Parent 99 0 R /Prev 101 0 R /Next 103 0 R >> endobj 103 0 obj << /Title(Database Views) /Dest/149 /Parent 99 0 R /Prev 102 0 R /Next 104 0 R >> endobj 104 0 obj << /Title(Funtools View Attributes) /Dest/150 /Parent 99 0 R /Prev 103 0 R /Next 105 0 R >> endobj 105 0 obj << /Title(Invoking a Funtools View \(in Place of an Input File\)) /Dest/151 /Parent 99 0 R /Prev 104 0 R /Next 106 0 R >> endobj 106 0 obj << /Title(Basic View Matching Rules) /Dest/152 /Parent 99 0 R /Prev 105 0 R /Next 107 0 R >> endobj 107 0 obj << /Title(More on View Matching Rules: Single vs. Multiple Matches) /Dest/153 /Parent 99 0 R /Prev 106 0 R /Next 108 0 R >> endobj 108 0 obj << /Title(View Lists: Applying a View to Any File) /Dest/154 /Parent 99 0 R /Prev 107 0 R /Next 109 0 R >> endobj 109 0 obj << /Title(Overriding Values Associated with a View) /Dest/155 /Parent 99 0 R /Prev 108 0 R /Next 110 0 R >> endobj 110 0 obj << /Title(Environment Variables) /Dest/156 /Parent 99 0 R /Prev 109 0 R /Next 111 0 R >> endobj 114 0 obj << /Title(Last updated: August 3, 2007) /Dest/158 /Parent 113 0 R >> endobj 113 0 obj << /Title() /Dest/158 /Count -1 /Parent 112 0 R /First 114 0 R /Last 114 0 R >> endobj 112 0 obj << /Title() /Dest/158 /Count -1 /Parent 111 0 R /First 113 0 R /Last 113 0 R >> endobj 111 0 obj << /Title(Restrictions and Problems) /Dest/157 /Count 1 /Parent 99 0 R /Prev 110 0 R /First 112 0 R /Last 112 0 R >> endobj 99 0 obj << /Title() /Dest/146 /Count 13 /Parent 4 0 R /Prev 85 0 R /Next 115 0 R /First 100 0 R /Last 111 0 R >> endobj 116 0 obj << /Title(Funfilters: Filtering Rows in a Table) /Dest/165 /Parent 115 0 R /Next 117 0 R >> endobj 117 0 obj << /Title(Summary) /Dest/166 /Parent 115 0 R /Prev 116 0 R /Next 118 0 R >> endobj 118 0 obj << /Title(Description) /Dest/167 /Parent 115 0 R /Prev 117 0 R /Next 119 0 R >> endobj 119 0 obj << /Title(Filter Expressions) /Dest/168 /Parent 115 0 R /Prev 118 0 R /Next 120 0 R >> endobj 120 0 obj << /Title(Separators Also Are Operators) /Dest/169 /Parent 115 0 R /Prev 119 0 R /Next 121 0 R >> endobj 121 0 obj << /Title(Range Lists) /Dest/170 /Parent 115 0 R /Prev 120 0 R /Next 122 0 R >> endobj 122 0 obj << /Title(Math Operations and Functions) /Dest/171 /Parent 115 0 R /Prev 121 0 R /Next 123 0 R >> endobj 123 0 obj << /Title(Include Files) /Dest/172 /Parent 115 0 R /Prev 122 0 R /Next 124 0 R >> endobj 124 0 obj << /Title(Header Parameters) /Dest/173 /Parent 115 0 R /Prev 123 0 R /Next 125 0 R >> endobj 128 0 obj << /Title(Last updated: November 17, 2005) /Dest/175 /Parent 127 0 R >> endobj 127 0 obj << /Title() /Dest/175 /Count -1 /Parent 126 0 R /First 128 0 R /Last 128 0 R >> endobj 126 0 obj << /Title() /Dest/175 /Count -1 /Parent 125 0 R /First 127 0 R /Last 127 0 R >> endobj 125 0 obj << /Title(Examples) /Dest/174 /Count 1 /Parent 115 0 R /Prev 124 0 R /First 126 0 R /Last 126 0 R >> endobj 115 0 obj << /Title() /Dest/165 /Count 11 /Parent 4 0 R /Prev 99 0 R /Next 129 0 R /First 116 0 R /Last 125 0 R >> endobj 130 0 obj << /Title(Funidx: Using Indexes to Filter Rows in a Table) /Dest/177 /Parent 129 0 R /Next 131 0 R >> endobj 131 0 obj << /Title(Summary) /Dest/178 /Parent 129 0 R /Prev 130 0 R /Next 132 0 R >> endobj 135 0 obj << /Title(Last updated: August 3, 2007) /Dest/180 /Parent 134 0 R >> endobj 134 0 obj << /Title() /Dest/180 /Count -1 /Parent 133 0 R /First 135 0 R /Last 135 0 R >> endobj 133 0 obj << /Title() /Dest/180 /Count -1 /Parent 132 0 R /First 134 0 R /Last 134 0 R >> endobj 132 0 obj << /Title(Description) /Dest/179 /Count 1 /Parent 129 0 R /Prev 131 0 R /First 133 0 R /Last 133 0 R >> endobj 129 0 obj << /Title() /Dest/177 /Count 4 /Parent 4 0 R /Prev 115 0 R /Next 136 0 R /First 130 0 R /Last 132 0 R >> endobj 137 0 obj << /Title(Regions: Spatial Region Filtering) /Dest/182 /Parent 136 0 R /Next 138 0 R >> endobj 138 0 obj << /Title(Summary) /Dest/183 /Parent 136 0 R /Prev 137 0 R /Next 139 0 R >> endobj 139 0 obj << /Title(Description) /Dest/184 /Parent 136 0 R /Prev 138 0 R /Next 140 0 R >> endobj 140 0 obj << /Title(Region Expressions) /Dest/185 /Parent 136 0 R /Prev 139 0 R /Next 141 0 R >> endobj 141 0 obj << /Title(Columns Used in Region Filtering) /Dest/186 /Parent 136 0 R /Prev 140 0 R /Next 142 0 R >> endobj 142 0 obj << /Title(Region Algebra) /Dest/187 /Parent 136 0 R /Prev 141 0 R /Next 143 0 R >> endobj 143 0 obj << /Title(Region Separators Also Are Operators) /Dest/188 /Parent 136 0 R /Prev 142 0 R /Next 144 0 R >> endobj 144 0 obj << /Title(Region Exclusion) /Dest/189 /Parent 136 0 R /Prev 143 0 R /Next 145 0 R >> endobj 145 0 obj << /Title(Include Files) /Dest/190 /Parent 136 0 R /Prev 144 0 R /Next 146 0 R >> endobj 146 0 obj << /Title(Global and Local Properties of Regions) /Dest/191 /Parent 136 0 R /Prev 145 0 R /Next 147 0 R >> endobj 147 0 obj << /Title(Coordinate Systems) /Dest/192 /Parent 136 0 R /Prev 146 0 R /Next 148 0 R >> endobj 151 0 obj << /Title(Last updated: November 17, 2005) /Dest/194 /Parent 150 0 R >> endobj 150 0 obj << /Title() /Dest/194 /Count -1 /Parent 149 0 R /First 151 0 R /Last 151 0 R >> endobj 149 0 obj << /Title() /Dest/194 /Count -1 /Parent 148 0 R /First 150 0 R /Last 150 0 R >> endobj 148 0 obj << /Title(Specifying Positions, Sizes, and Angles) /Dest/193 /Count 1 /Parent 136 0 R /Prev 147 0 R /First 149 0 R /Last 149 0 R >> endobj 136 0 obj << /Title() /Dest/182 /Count 13 /Parent 4 0 R /Prev 129 0 R /Next 152 0 R /First 137 0 R /Last 148 0 R >> endobj 153 0 obj << /Title(RegGeometry: Geometric Shapes in Spatial Region Filtering) /Dest/196 /Parent 152 0 R /Next 154 0 R >> endobj 154 0 obj << /Title(Summary) /Dest/197 /Parent 152 0 R /Prev 153 0 R /Next 155 0 R >> endobj 155 0 obj << /Title(Geometric shapes) /Dest/198 /Parent 152 0 R /Prev 154 0 R /Next 156 0 R >> endobj 159 0 obj << /Title(Last updated: March 12, 2007) /Dest/200 /Parent 158 0 R >> endobj 158 0 obj << /Title() /Dest/200 /Count -1 /Parent 157 0 R /First 159 0 R /Last 159 0 R >> endobj 157 0 obj << /Title() /Dest/200 /Count -1 /Parent 156 0 R /First 158 0 R /Last 158 0 R >> endobj 156 0 obj << /Title(Region accelerators) /Dest/199 /Count 1 /Parent 152 0 R /Prev 155 0 R /First 157 0 R /Last 157 0 R >> endobj 152 0 obj << /Title() /Dest/196 /Count 5 /Parent 4 0 R /Prev 136 0 R /Next 160 0 R /First 153 0 R /Last 156 0 R >> endobj 161 0 obj << /Title(RegAlgebra: Boolean Algebra on Spatial Regions) /Dest/202 /Parent 160 0 R /Next 162 0 R >> endobj 162 0 obj << /Title(Summary) /Dest/203 /Parent 160 0 R /Prev 161 0 R /Next 163 0 R >> endobj 166 0 obj << /Title(Last updated: November 17, 2005) /Dest/205 /Parent 165 0 R >> endobj 165 0 obj << /Title() /Dest/205 /Count -1 /Parent 164 0 R /First 166 0 R /Last 166 0 R >> endobj 164 0 obj << /Title() /Dest/205 /Count -1 /Parent 163 0 R /First 165 0 R /Last 165 0 R >> endobj 163 0 obj << /Title(Description) /Dest/204 /Count 1 /Parent 160 0 R /Prev 162 0 R /First 164 0 R /Last 164 0 R >> endobj 160 0 obj << /Title() /Dest/202 /Count 4 /Parent 4 0 R /Prev 152 0 R /Next 167 0 R /First 161 0 R /Last 163 0 R >> endobj 168 0 obj << /Title(RegCoords: Spatial Region Coordinates) /Dest/207 /Parent 167 0 R /Next 169 0 R >> endobj 169 0 obj << /Title(Summary) /Dest/208 /Parent 167 0 R /Prev 168 0 R /Next 170 0 R >> endobj 170 0 obj << /Title(Pixel coordinate systems) /Dest/209 /Parent 167 0 R /Prev 169 0 R /Next 171 0 R >> endobj 171 0 obj << /Title(World Coordinate Systems) /Dest/210 /Parent 167 0 R /Prev 170 0 R /Next 172 0 R >> endobj 172 0 obj << /Title(WCS Positions and Sizes) /Dest/211 /Parent 167 0 R /Prev 171 0 R /Next 173 0 R >> endobj 176 0 obj << /Title(Last updated: November 17, 2005) /Dest/213 /Parent 175 0 R >> endobj 175 0 obj << /Title() /Dest/213 /Count -1 /Parent 174 0 R /First 176 0 R /Last 176 0 R >> endobj 174 0 obj << /Title() /Dest/213 /Count -1 /Parent 173 0 R /First 175 0 R /Last 175 0 R >> endobj 173 0 obj << /Title(NB: The Meaning of Pure Numbers Are Context Sensitive) /Dest/212 /Count 1 /Parent 167 0 R /Prev 172 0 R /First 174 0 R /Last 174 0 R >> endobj 167 0 obj << /Title() /Dest/207 /Count 7 /Parent 4 0 R /Prev 160 0 R /Next 177 0 R /First 168 0 R /Last 173 0 R >> endobj 178 0 obj << /Title(RegBounds: Region Boundaries) /Dest/215 /Parent 177 0 R /Next 179 0 R >> endobj 179 0 obj << /Title(Summary) /Dest/216 /Parent 177 0 R /Prev 178 0 R /Next 180 0 R >> endobj 180 0 obj << /Title(Description) /Dest/217 /Parent 177 0 R /Prev 179 0 R /Next 181 0 R >> endobj 181 0 obj << /Title(Image boundaries : radially-symmetric shapes \(circle, annuli, ellipse\)) /Dest/218 /Parent 177 0 R /Prev 180 0 R /Next 182 0 R >> endobj 182 0 obj << /Title(Image Boundaries: non-radially symmetric shapes \(polygons, boxes\)) /Dest/219 /Parent 177 0 R /Prev 181 0 R /Next 183 0 R >> endobj 183 0 obj << /Title(Row Boundaries are Analytic) /Dest/220 /Parent 177 0 R /Prev 182 0 R /Next 184 0 R >> endobj 187 0 obj << /Title(Last updated: November 16, 2005) /Dest/222 /Parent 186 0 R >> endobj 186 0 obj << /Title() /Dest/222 /Count -1 /Parent 185 0 R /First 187 0 R /Last 187 0 R >> endobj 185 0 obj << /Title() /Dest/222 /Count -1 /Parent 184 0 R /First 186 0 R /Last 186 0 R >> endobj 184 0 obj << /Title(Image Boundaries vs. Row Boundaries: Practical Considerations) /Dest/221 /Count 1 /Parent 177 0 R /Prev 183 0 R /First 185 0 R /Last 185 0 R >> endobj 177 0 obj << /Title() /Dest/215 /Count 8 /Parent 4 0 R /Prev 167 0 R /Next 188 0 R /First 178 0 R /Last 184 0 R >> endobj 189 0 obj << /Title(RegDiff:Differences Between Funtools and IRAF Regions) /Dest/224 /Parent 188 0 R /Next 190 0 R >> endobj 190 0 obj << /Title(Summary) /Dest/225 /Parent 188 0 R /Prev 189 0 R /Next 191 0 R >> endobj 194 0 obj << /Title(Last updated: November 16, 2005) /Dest/227 /Parent 193 0 R >> endobj 193 0 obj << /Title() /Dest/227 /Count -1 /Parent 192 0 R /First 194 0 R /Last 194 0 R >> endobj 192 0 obj << /Title() /Dest/227 /Count -1 /Parent 191 0 R /First 193 0 R /Last 193 0 R >> endobj 191 0 obj << /Title(Description) /Dest/226 /Count 1 /Parent 188 0 R /Prev 190 0 R /First 192 0 R /Last 192 0 R >> endobj 188 0 obj << /Title() /Dest/224 /Count 4 /Parent 4 0 R /Prev 177 0 R /Next 195 0 R /First 189 0 R /Last 191 0 R >> endobj 196 0 obj << /Title(FunCombine: Combining Region and Table Filters) /Dest/230 /Parent 195 0 R /Next 197 0 R >> endobj 197 0 obj << /Title(Summary) /Dest/231 /Parent 195 0 R /Prev 196 0 R /Next 198 0 R >> endobj 201 0 obj << /Title(Last updated: November 16, 2005) /Dest/233 /Parent 200 0 R >> endobj 200 0 obj << /Title() /Dest/233 /Count -1 /Parent 199 0 R /First 201 0 R /Last 201 0 R >> endobj 199 0 obj << /Title() /Dest/233 /Count -1 /Parent 198 0 R /First 200 0 R /Last 200 0 R >> endobj 198 0 obj << /Title(Comma Conventions) /Dest/232 /Count 1 /Parent 195 0 R /Prev 197 0 R /First 199 0 R /Last 199 0 R >> endobj 195 0 obj << /Title() /Dest/230 /Count 4 /Parent 4 0 R /Prev 188 0 R /Next 202 0 R /First 196 0 R /Last 198 0 R >> endobj 203 0 obj << /Title(FunEnv: Funtools Environment Variables) /Dest/235 /Parent 202 0 R /Next 204 0 R >> endobj 204 0 obj << /Title(Summary) /Dest/236 /Parent 202 0 R /Prev 203 0 R /Next 205 0 R >> endobj 208 0 obj << /Title(Last updated: November 16, 2005) /Dest/238 /Parent 207 0 R >> endobj 207 0 obj << /Title() /Dest/238 /Count -1 /Parent 206 0 R /First 208 0 R /Last 208 0 R >> endobj 206 0 obj << /Title() /Dest/238 /Count -1 /Parent 205 0 R /First 207 0 R /Last 207 0 R >> endobj 205 0 obj << /Title(Description) /Dest/237 /Count 1 /Parent 202 0 R /Prev 204 0 R /First 206 0 R /Last 206 0 R >> endobj 202 0 obj << /Title() /Dest/235 /Count 4 /Parent 4 0 R /Prev 195 0 R /Next 209 0 R /First 203 0 R /Last 205 0 R >> endobj 210 0 obj << /Title(Funtools ChangeLog) /Dest/239 /Parent 209 0 R /Next 211 0 R >> endobj 211 0 obj << /Title(Patch Release 1.4.5 \(internal ds9 release\)) /Dest/240 /Parent 209 0 R /Prev 210 0 R /Next 212 0 R >> endobj 212 0 obj << /Title(Patch Release 1.4.4 \(internal ds9 release\)) /Dest/241 /Parent 209 0 R /Prev 211 0 R /Next 213 0 R >> endobj 213 0 obj << /Title(Patch Release 1.4.3 \(internal ds9 release\)) /Dest/242 /Parent 209 0 R /Prev 212 0 R /Next 214 0 R >> endobj 214 0 obj << /Title(Patch Release 1.4.2 \(internal ds9 release\)) /Dest/243 /Parent 209 0 R /Prev 213 0 R /Next 215 0 R >> endobj 215 0 obj << /Title(Patch Release 1.4.1 \(internal ds9 release\)) /Dest/244 /Parent 209 0 R /Prev 214 0 R /Next 216 0 R >> endobj 216 0 obj << /Title(Public Release 1.4.0 \(15 August 2007\)) /Dest/245 /Parent 209 0 R /Prev 215 0 R /Next 217 0 R >> endobj 217 0 obj << /Title(Release 1.3.0b[n] \(mainly internal SAO beta releases\)) /Dest/246 /Parent 209 0 R /Prev 216 0 R /Next 218 0 R >> endobj 218 0 obj << /Title(Patch Release 1.2.4 \(internal SAO and beta release only\)) /Dest/247 /Parent 209 0 R /Prev 217 0 R /Next 219 0 R >> endobj 219 0 obj << /Title(Patch Release 1.2.3 \(12 January 2004\)) /Dest/248 /Parent 209 0 R /Prev 218 0 R /Next 220 0 R >> endobj 220 0 obj << /Title(Patch Release 1.2.3b1 \(19 August 2003\)) /Dest/249 /Parent 209 0 R /Prev 219 0 R /Next 221 0 R >> endobj 221 0 obj << /Title(Patch Release 1.2.2 \(18 May 2003\)) /Dest/250 /Parent 209 0 R /Prev 220 0 R /Next 222 0 R >> endobj 222 0 obj << /Title(Patch Release 1.2.1 \(24 April 2003\)) /Dest/251 /Parent 209 0 R /Prev 221 0 R /Next 223 0 R >> endobj 223 0 obj << /Title(Public Release 1.2.0 \(24 March 2003\)) /Dest/252 /Parent 209 0 R /Prev 222 0 R /Next 224 0 R >> endobj 224 0 obj << /Title(Beta Release 1.2.b3 \(4 February 2003\)) /Dest/253 /Parent 209 0 R /Prev 223 0 R /Next 225 0 R >> endobj 225 0 obj << /Title(Beta Release 1.2.b2 \(7 October 2002\)) /Dest/254 /Parent 209 0 R /Prev 224 0 R /Next 226 0 R >> endobj 226 0 obj << /Title(Beta Release 1.2.b1 \(24 September 2002\)) /Dest/255 /Parent 209 0 R /Prev 225 0 R /Next 227 0 R >> endobj 227 0 obj << /Title(Public Release 1.1.0 \(22 April 2002\)) /Dest/256 /Parent 209 0 R /Prev 226 0 R /Next 228 0 R >> endobj 228 0 obj << /Title(Pre-Release 1.1.0e \(10 April 2002\)) /Dest/257 /Parent 209 0 R /Prev 227 0 R /Next 229 0 R >> endobj 229 0 obj << /Title(Pre-Release 1.1.0e \(19 March 2002\)) /Dest/258 /Parent 209 0 R /Prev 228 0 R /Next 230 0 R >> endobj 230 0 obj << /Title(Pre-Release 1.1.0e \(27 February 2002\)) /Dest/259 /Parent 209 0 R /Prev 229 0 R /Next 231 0 R >> endobj 231 0 obj << /Title(Pre-Release 1.1.0e \(11 February 2002\)) /Dest/260 /Parent 209 0 R /Prev 230 0 R /Next 232 0 R >> endobj 232 0 obj << /Title(Beta Release 1.0.1b5 \(31 January 2002\)) /Dest/261 /Parent 209 0 R /Prev 231 0 R /Next 233 0 R >> endobj 233 0 obj << /Title(Beta Release 1.0.1b4 \(26 January 2002\)) /Dest/262 /Parent 209 0 R /Prev 232 0 R /Next 234 0 R >> endobj 234 0 obj << /Title(Beta Release 1.0.1b3 \(4 January 2002\)) /Dest/263 /Parent 209 0 R /Prev 233 0 R /Next 235 0 R >> endobj 235 0 obj << /Title(Beta Release 1.0.1b2 \(14 November 2001\)) /Dest/264 /Parent 209 0 R /Prev 234 0 R /Next 236 0 R >> endobj 236 0 obj << /Title(Beta Release 1.0.1b1 \(6 November 2001\)) /Dest/265 /Parent 209 0 R /Prev 235 0 R /Next 237 0 R >> endobj 240 0 obj << /Title(Last updated: 22 April 2002) /Dest/267 /Parent 239 0 R >> endobj 239 0 obj << /Title() /Dest/267 /Count -1 /Parent 238 0 R /First 240 0 R /Last 240 0 R >> endobj 238 0 obj << /Title() /Dest/267 /Count -1 /Parent 237 0 R /First 239 0 R /Last 239 0 R >> endobj 237 0 obj << /Title(Public Release 1.0.0 \(31 July 2001\)) /Dest/266 /Count 1 /Parent 209 0 R /Prev 236 0 R /First 238 0 R /Last 238 0 R >> endobj 245 0 obj <>endobj 248 0 obj <>endobj 249 0 obj <>endobj 250 0 obj <>endobj 251 0 obj <>endobj 252 0 obj <>endobj 253 0 obj <>endobj 254 0 obj <>endobj 255 0 obj <>endobj 256 0 obj <>endobj 257 0 obj <>endobj 258 0 obj <>endobj 259 0 obj <>endobj 260 0 obj <>endobj 261 0 obj <>endobj 262 0 obj <>endobj 263 0 obj <>endobj 264 0 obj <>endobj 265 0 obj <>endobj 266 0 obj <>endobj 268 0 obj <> endobj 269 0 obj <> endobj 273 0 obj <>endobj 274 0 obj <>endobj 275 0 obj <>endobj 276 0 obj <>endobj 277 0 obj <>endobj 278 0 obj <>endobj 279 0 obj <>endobj 280 0 obj <>endobj 281 0 obj <>endobj 282 0 obj <>endobj 283 0 obj <>endobj 284 0 obj <>endobj 285 0 obj <>endobj 286 0 obj <>endobj 287 0 obj <>endobj 288 0 obj <>endobj 289 0 obj <>endobj 290 0 obj <>endobj 291 0 obj <>endobj 292 0 obj <>endobj 293 0 obj <>endobj 294 0 obj <>endobj 295 0 obj <>endobj 296 0 obj <>endobj 297 0 obj <>endobj 298 0 obj <>endobj 299 0 obj <>endobj 300 0 obj <>endobj 301 0 obj <>endobj 302 0 obj <>endobj 303 0 obj <>endobj 304 0 obj <>endobj 305 0 obj <>endobj 306 0 obj <>endobj 307 0 obj <>endobj 308 0 obj <>endobj 309 0 obj <>endobj 310 0 obj <>endobj 311 0 obj <>endobj 312 0 obj <> endobj 313 0 obj <> endobj 317 0 obj <>endobj 318 0 obj <>endobj 319 0 obj <>endobj 320 0 obj <> endobj 321 0 obj <> endobj 326 0 obj <>endobj 328 0 obj <>endobj 329 0 obj <>endobj 330 0 obj <>endobj 331 0 obj <>endobj 332 0 obj <>endobj 333 0 obj <>endobj 334 0 obj <>endobj 335 0 obj <>endobj 336 0 obj <>endobj 337 0 obj <>endobj 338 0 obj <>endobj 339 0 obj <>endobj 340 0 obj <>endobj 341 0 obj <>endobj 342 0 obj <> endobj 343 0 obj <> endobj 347 0 obj <> endobj 348 0 obj <> endobj 352 0 obj <> endobj 353 0 obj <> endobj 357 0 obj <>endobj 358 0 obj <>endobj 359 0 obj <> endobj 360 0 obj <> endobj 364 0 obj <> endobj 365 0 obj <> endobj 369 0 obj <> endobj 370 0 obj <> endobj 374 0 obj <> endobj 375 0 obj <> endobj 379 0 obj <>endobj 380 0 obj <>endobj 381 0 obj <> endobj 382 0 obj <> endobj 386 0 obj <>endobj 387 0 obj <> endobj 388 0 obj <> endobj 392 0 obj <>endobj 393 0 obj <>endobj 394 0 obj <> endobj 395 0 obj <> endobj 399 0 obj <> endobj 400 0 obj <> endobj 404 0 obj <> endobj 405 0 obj <> endobj 409 0 obj <> endobj 410 0 obj <> endobj 414 0 obj <> endobj 415 0 obj <> endobj 419 0 obj <> endobj 420 0 obj <> endobj 424 0 obj <> endobj 425 0 obj <> endobj 429 0 obj <> endobj 430 0 obj <> endobj 435 0 obj <> endobj 436 0 obj <> endobj 440 0 obj <>endobj 441 0 obj <>endobj 442 0 obj <>endobj 443 0 obj <> endobj 444 0 obj <> endobj 448 0 obj <> endobj 449 0 obj <> endobj 453 0 obj <>endobj 454 0 obj <>endobj 455 0 obj <>endobj 456 0 obj <>endobj 457 0 obj <> endobj 458 0 obj <> endobj 462 0 obj <> endobj 463 0 obj <> endobj 467 0 obj <> endobj 468 0 obj <> endobj 472 0 obj <> endobj 473 0 obj <> endobj 477 0 obj <> endobj 478 0 obj <> endobj 482 0 obj <> endobj 483 0 obj <> endobj 487 0 obj <> endobj 488 0 obj <> endobj 492 0 obj <>endobj 493 0 obj <>endobj 494 0 obj <> endobj 495 0 obj <> endobj 499 0 obj <> endobj 500 0 obj <> endobj 504 0 obj <>endobj 505 0 obj <>endobj 506 0 obj <>endobj 507 0 obj <>endobj 508 0 obj <> endobj 509 0 obj <> endobj 513 0 obj <> endobj 514 0 obj <> endobj 518 0 obj <> endobj 519 0 obj <> endobj 523 0 obj <>endobj 524 0 obj <>endobj 525 0 obj <>endobj 526 0 obj <> endobj 527 0 obj <> endobj 531 0 obj <>endobj 532 0 obj <>endobj 533 0 obj <>endobj 534 0 obj <>endobj 535 0 obj <> endobj 536 0 obj <> endobj 540 0 obj <>endobj 541 0 obj <> endobj 542 0 obj <> endobj 546 0 obj <> endobj 547 0 obj <> endobj 551 0 obj <> endobj 552 0 obj <> endobj 556 0 obj <>endobj 557 0 obj <>endobj 558 0 obj <> endobj 559 0 obj <> endobj 563 0 obj <> endobj 564 0 obj <> endobj 568 0 obj <> endobj 569 0 obj <> endobj 573 0 obj <>endobj 574 0 obj <>endobj 575 0 obj <> endobj 576 0 obj <> endobj 580 0 obj <> endobj 581 0 obj <> endobj 585 0 obj <> endobj 586 0 obj <> endobj 590 0 obj <> endobj 591 0 obj <> endobj 595 0 obj <>endobj 596 0 obj <> endobj 597 0 obj <> endobj 601 0 obj <>endobj 602 0 obj <>endobj 603 0 obj <>endobj 604 0 obj <> endobj 605 0 obj <> endobj 610 0 obj <> endobj 611 0 obj <> endobj 615 0 obj <> endobj 616 0 obj <> endobj 620 0 obj <> endobj 621 0 obj <> endobj 625 0 obj <>endobj 626 0 obj <> endobj 627 0 obj <> endobj 631 0 obj <> /Subtype/Link>>endobj 632 0 obj <> /Subtype/Link>>endobj 633 0 obj <> endobj 634 0 obj <> endobj 638 0 obj <>endobj 639 0 obj <> endobj 640 0 obj <> endobj 644 0 obj <>endobj 645 0 obj <>endobj 646 0 obj <>endobj 647 0 obj <>endobj 648 0 obj <>endobj 649 0 obj <>endobj 650 0 obj <>endobj 651 0 obj <>endobj 652 0 obj <>endobj 653 0 obj <>endobj 654 0 obj <> endobj 655 0 obj <> endobj 659 0 obj <>endobj 660 0 obj <>endobj 661 0 obj <>endobj 662 0 obj <>endobj 663 0 obj <>endobj 664 0 obj <>endobj 665 0 obj <> endobj 666 0 obj <> endobj 670 0 obj <>endobj 671 0 obj <>endobj 672 0 obj <>endobj 673 0 obj <>endobj 674 0 obj <>endobj 675 0 obj <>endobj 676 0 obj <> endobj 677 0 obj <> endobj 681 0 obj <>endobj 682 0 obj <>endobj 683 0 obj <>endobj 684 0 obj <>endobj 685 0 obj <> endobj 686 0 obj <> endobj 690 0 obj <>endobj 691 0 obj <>endobj 692 0 obj <>endobj 693 0 obj <>endobj 694 0 obj <>endobj 695 0 obj <>endobj 696 0 obj <>endobj 697 0 obj <>endobj 698 0 obj <>endobj 699 0 obj <>endobj 700 0 obj <>endobj 701 0 obj <>endobj 702 0 obj <> endobj 703 0 obj <> endobj 707 0 obj <>endobj 708 0 obj <>endobj 709 0 obj <>endobj 710 0 obj <>endobj 711 0 obj <>endobj 712 0 obj <>endobj 713 0 obj <>endobj 714 0 obj <>endobj 715 0 obj <>endobj 716 0 obj <>endobj 717 0 obj <>endobj 718 0 obj <>endobj 719 0 obj <>endobj 720 0 obj <>endobj 721 0 obj <>endobj 722 0 obj <> endobj 723 0 obj <> endobj 727 0 obj <>endobj 728 0 obj <>endobj 729 0 obj <>endobj 730 0 obj <>endobj 731 0 obj <>endobj 732 0 obj <>endobj 733 0 obj <>endobj 734 0 obj <>endobj 735 0 obj <> endobj 736 0 obj <> endobj 740 0 obj <>endobj 741 0 obj <>endobj 742 0 obj <>endobj 743 0 obj <>endobj 744 0 obj <>endobj 745 0 obj <> endobj 746 0 obj <> endobj 750 0 obj <>endobj 751 0 obj <>endobj 752 0 obj <>endobj 753 0 obj <> endobj 754 0 obj <> endobj 758 0 obj <>endobj 759 0 obj <> endobj 760 0 obj <> endobj 764 0 obj <>endobj 765 0 obj <>endobj 766 0 obj <>endobj 767 0 obj <>endobj 768 0 obj <>endobj 769 0 obj <>endobj 770 0 obj <> endobj 771 0 obj <> endobj 775 0 obj <>endobj 776 0 obj <> endobj 777 0 obj <> endobj 781 0 obj <>endobj 782 0 obj <>endobj 783 0 obj <> endobj 784 0 obj <> endobj 788 0 obj <>endobj 789 0 obj <>endobj 790 0 obj <> endobj 791 0 obj <> endobj 795 0 obj <> endobj 796 0 obj <> endobj 800 0 obj <>endobj 801 0 obj <>endobj 802 0 obj <>endobj 803 0 obj <>endobj 804 0 obj <>endobj 805 0 obj <> endobj 806 0 obj <> endobj 810 0 obj <>endobj 811 0 obj <>endobj 812 0 obj <>endobj 813 0 obj <> endobj 814 0 obj <> endobj 818 0 obj <>endobj 819 0 obj <>endobj 820 0 obj <>endobj 821 0 obj <>endobj 822 0 obj <>endobj 823 0 obj <>endobj 824 0 obj <>endobj 825 0 obj <> endobj 826 0 obj <> endobj 830 0 obj <>endobj 831 0 obj <>endobj 832 0 obj <>endobj 833 0 obj <> endobj 834 0 obj <> endobj 838 0 obj <>endobj 839 0 obj <>endobj 840 0 obj <> endobj 841 0 obj <> endobj 845 0 obj <>endobj 846 0 obj <>endobj 847 0 obj <>endobj 848 0 obj <>endobj 849 0 obj <>endobj 850 0 obj <> endobj 851 0 obj <> endobj 855 0 obj <> endobj 856 0 obj <> endobj 860 0 obj <>endobj 861 0 obj <>endobj 862 0 obj <>endobj 863 0 obj <>endobj 864 0 obj <> endobj 865 0 obj <> endobj 869 0 obj <>endobj 870 0 obj <> endobj 871 0 obj <> endobj 875 0 obj <>endobj 876 0 obj <>endobj 878 0 obj <>endobj 879 0 obj <> endobj 880 0 obj <> endobj 884 0 obj <> endobj 885 0 obj <> endobj 889 0 obj <> endobj 890 0 obj <> endobj 894 0 obj <> endobj 895 0 obj <> endobj 899 0 obj <> endobj 900 0 obj <> endobj 904 0 obj <>endobj 905 0 obj <> endobj 906 0 obj <> endobj 910 0 obj <>endobj 911 0 obj <>endobj 912 0 obj <>endobj 913 0 obj <> /Subtype/Link>>endobj 914 0 obj <> /Subtype/Link>>endobj 915 0 obj <>endobj 916 0 obj <> endobj 917 0 obj <> endobj 921 0 obj <> endobj 922 0 obj <> endobj 926 0 obj <>endobj 927 0 obj <>endobj 928 0 obj <>endobj 929 0 obj <>endobj 930 0 obj <>endobj 931 0 obj <>endobj 932 0 obj <>endobj 933 0 obj <>endobj 934 0 obj <>endobj 935 0 obj <> endobj 936 0 obj <> endobj 940 0 obj <>endobj 941 0 obj <>endobj 942 0 obj <>endobj 943 0 obj <>endobj 944 0 obj <>endobj 945 0 obj <>endobj 946 0 obj <>endobj 947 0 obj <>endobj 948 0 obj <>endobj 949 0 obj <>endobj 950 0 obj <> endobj 951 0 obj <> endobj 955 0 obj <>endobj 956 0 obj <>endobj 957 0 obj <>endobj 958 0 obj <>endobj 959 0 obj <>endobj 960 0 obj <> endobj 961 0 obj <> endobj 965 0 obj <>endobj 966 0 obj <>endobj 967 0 obj <>endobj 968 0 obj <>endobj 969 0 obj <>endobj 970 0 obj <> endobj 971 0 obj <> endobj 975 0 obj <>endobj 976 0 obj <>endobj 977 0 obj <>endobj 978 0 obj <> endobj 979 0 obj <> endobj 983 0 obj <>endobj 984 0 obj <> endobj 985 0 obj <> endobj 989 0 obj <>endobj 990 0 obj <> endobj 991 0 obj <> endobj 995 0 obj <>endobj 996 0 obj <>endobj 997 0 obj <> endobj 998 0 obj <> endobj 1002 0 obj <> endobj 1003 0 obj <> endobj 1007 0 obj <> endobj 1008 0 obj <> endobj 1012 0 obj <> endobj 1013 0 obj <> endobj 1017 0 obj <>endobj 1018 0 obj <> endobj 1019 0 obj <> endobj 1023 0 obj <> endobj 1024 0 obj <> endobj 1028 0 obj <>endobj 1029 0 obj <> endobj 1030 0 obj <> endobj 1034 0 obj <>endobj 1035 0 obj <>endobj 1036 0 obj <>endobj 1037 0 obj <> endobj 1038 0 obj <> endobj 1042 0 obj <>endobj 1043 0 obj <> endobj 1044 0 obj <> endobj 1048 0 obj <> endobj 1049 0 obj <> endobj 1053 0 obj <> endobj 1054 0 obj <> endobj 1058 0 obj <> endobj 1059 0 obj <> endobj 1063 0 obj <> endobj 1064 0 obj <> endobj 1068 0 obj <> endobj 1069 0 obj <> endobj 1073 0 obj <> endobj 1074 0 obj <> endobj 1078 0 obj <> endobj 1079 0 obj <> endobj 1083 0 obj <> endobj 1084 0 obj <> endobj 1088 0 obj <> endobj 1089 0 obj <> endobj 1093 0 obj <>endobj 1094 0 obj <> endobj 1095 0 obj <> endobj 1099 0 obj <> endobj 1100 0 obj <> endobj 1104 0 obj <> endobj 1105 0 obj <> endobj 1109 0 obj <> endobj 1110 0 obj <> endobj 1114 0 obj <> endobj 1115 0 obj <> endobj 1119 0 obj <> endobj 1120 0 obj <> endobj 1124 0 obj <>endobj 1125 0 obj <> endobj 1126 0 obj <> endobj 1130 0 obj <>endobj 1131 0 obj <> endobj 1132 0 obj <> endobj 1136 0 obj <> endobj 1137 0 obj <> endobj 1141 0 obj <>endobj 1142 0 obj <>endobj 1143 0 obj <> endobj 1144 0 obj <> endobj 1148 0 obj <> endobj 1149 0 obj <> endobj 1153 0 obj <> endobj 1154 0 obj <> endobj 1158 0 obj <>endobj 1159 0 obj <> endobj 1160 0 obj <> endobj 1164 0 obj <>endobj 1165 0 obj <>endobj 1166 0 obj <>endobj 1167 0 obj <> endobj 1168 0 obj <> endobj 1172 0 obj <> endobj 1173 0 obj <> endobj 1177 0 obj <> endobj 1178 0 obj <> endobj 1182 0 obj <>endobj 1183 0 obj <> endobj 1184 0 obj <> endobj 1188 0 obj <> endobj 1189 0 obj <> endobj 1193 0 obj <>endobj 1194 0 obj <> endobj 1195 0 obj <> endobj 1199 0 obj <>endobj 1200 0 obj <>endobj 1201 0 obj <> endobj 1202 0 obj <> endobj 1206 0 obj <>endobj 1207 0 obj <> endobj 1208 0 obj <> endobj 1212 0 obj <> endobj 1213 0 obj <> endobj 1217 0 obj <>endobj 1218 0 obj <>endobj 1219 0 obj <> endobj 1220 0 obj <> endobj 1224 0 obj <> endobj 1225 0 obj <> endobj 1229 0 obj <> endobj 1230 0 obj <> endobj 1234 0 obj <>endobj 1235 0 obj <>endobj 1236 0 obj <>endobj 1237 0 obj <>endobj 1238 0 obj <>endobj 1239 0 obj <> endobj 1240 0 obj <> endobj 1244 0 obj <> endobj 1245 0 obj <> endobj 1249 0 obj <> endobj 1250 0 obj <> endobj 1254 0 obj <> endobj 1255 0 obj <> endobj 1259 0 obj <> endobj 1260 0 obj <> endobj 1264 0 obj <> endobj 1265 0 obj <> endobj 1269 0 obj <> endobj 1270 0 obj <> endobj 1274 0 obj <> endobj 1275 0 obj <> endobj 1279 0 obj <> endobj 1280 0 obj <> endobj 1284 0 obj <> endobj 1285 0 obj <> endobj 1289 0 obj <> endobj 1290 0 obj <> endobj 1294 0 obj <> endobj 1295 0 obj <> endobj 1299 0 obj <> endobj 1300 0 obj <> endobj 1304 0 obj <> endobj 1305 0 obj <> endobj 1309 0 obj <> endobj 1310 0 obj <> endobj 1314 0 obj <> endobj 1315 0 obj <> endobj 1319 0 obj <>endobj 1320 0 obj <> endobj 1321 0 obj <> endobj 1325 0 obj <> endobj 1326 0 obj <> endobj 1330 0 obj <> endobj 1331 0 obj <> endobj 1335 0 obj <> endobj 1336 0 obj <> endobj 1340 0 obj <> endobj 1341 0 obj <> endobj 1345 0 obj <>endobj 1346 0 obj <> endobj 1347 0 obj <> endobj 1351 0 obj <> endobj 1352 0 obj <> endobj 1356 0 obj <> endobj 1357 0 obj <> endobj 1361 0 obj <> endobj 1362 0 obj <> endobj 1366 0 obj <>endobj 1367 0 obj <> endobj 1368 0 obj <> endobj 1372 0 obj <> endobj 1373 0 obj <> endobj 1377 0 obj <> endobj 1378 0 obj <> endobj 1382 0 obj <>endobj 1383 0 obj <> endobj 1384 0 obj <> endobj 1388 0 obj <>endobj 1389 0 obj <>endobj 1390 0 obj <> endobj 1391 0 obj <> endobj 1395 0 obj <> endobj 1396 0 obj <> endobj 1400 0 obj <>endobj 1401 0 obj <> endobj 1402 0 obj <> endobj 1406 0 obj <>endobj 1407 0 obj <>endobj 1408 0 obj <>endobj 1409 0 obj <>endobj 1410 0 obj <>endobj 1411 0 obj <>endobj 1412 0 obj <>endobj 1413 0 obj <>endobj 1414 0 obj <>endobj 1415 0 obj <>endobj 1416 0 obj <>endobj 1417 0 obj <> endobj 1418 0 obj <> endobj 1422 0 obj <>endobj 1423 0 obj <>endobj 1424 0 obj <>endobj 1425 0 obj <>endobj 1426 0 obj <> endobj 1427 0 obj <> endobj 1431 0 obj <> endobj 1432 0 obj <> endobj 1436 0 obj <>endobj 1437 0 obj <> endobj 1438 0 obj <> endobj 1442 0 obj <> /Subtype/Link>>endobj 1443 0 obj <> /Subtype/Link>>endobj 1444 0 obj <> endobj 1445 0 obj <> endobj 1449 0 obj <> endobj 1450 0 obj <> endobj 1454 0 obj <> endobj 1455 0 obj <> endobj 1459 0 obj <> endobj 1460 0 obj <> endobj 1464 0 obj <> endobj 1465 0 obj <> endobj 1469 0 obj <> endobj 1470 0 obj <> endobj 1474 0 obj <> endobj 1475 0 obj <> endobj 1479 0 obj <> endobj 1480 0 obj <> endobj 1484 0 obj <> endobj 1485 0 obj <> endobj 1489 0 obj <> endobj 1490 0 obj <> endobj 1494 0 obj <> endobj 1495 0 obj <> endobj 1499 0 obj <> endobj 1500 0 obj <> endobj 1504 0 obj <> endobj 1505 0 obj <> endobj 1509 0 obj <> endobj 1510 0 obj <> endobj 1514 0 obj <> endobj 1515 0 obj <> endobj 1519 0 obj <> endobj 1520 0 obj <> endobj 1524 0 obj <>endobj 1525 0 obj <> endobj 1526 0 obj <> endobj 609 0 obj <> endobj 877 0 obj <> endobj 1527 0 obj <> endobj 246 0 obj <> endobj 1528 0 obj <> endobj 434 0 obj <> endobj 247 0 obj <> endobj 1529 0 obj <> endobj 267 0 obj <> endobj 327 0 obj <> endobj 1530 0 obj <> endobj 209 0 obj << /Title() /Dest/239 /Count 29 /Parent 4 0 R /Prev 202 0 R /First 210 0 R /Last 237 0 R >> endobj 242 0 obj <>endobj 1531 0 obj <>stream GPL Ghostscript 8.70 () 2011-04-14T18:19:25-04:00 2011-04-14T18:19:25-04:00 html2ps version 1.0 beta5 The Funtools Help Facility()() endstream endobj 2 0 obj <>endobj xref 0 1532 0000000000 65535 f 0000322441 00000 n 0000416289 00000 n 0000320705 00000 n 0000322382 00000 n 0000323116 00000 n 0000322561 00000 n 0000322657 00000 n 0000323006 00000 n 0000322916 00000 n 0000322825 00000 n 0000322741 00000 n 0000325640 00000 n 0000323216 00000 n 0000323301 00000 n 0000323389 00000 n 0000323521 00000 n 0000323646 00000 n 0000323794 00000 n 0000323941 00000 n 0000324068 00000 n 0000324194 00000 n 0000324377 00000 n 0000324514 00000 n 0000324657 00000 n 0000324804 00000 n 0000324934 00000 n 0000325065 00000 n 0000325485 00000 n 0000325393 00000 n 0000325301 00000 n 0000325219 00000 n 0000326335 00000 n 0000325756 00000 n 0000325862 00000 n 0000326220 00000 n 0000326128 00000 n 0000326036 00000 n 0000325950 00000 n 0000329782 00000 n 0000326451 00000 n 0000326561 00000 n 0000326649 00000 n 0000326780 00000 n 0000326890 00000 n 0000326992 00000 n 0000327111 00000 n 0000327221 00000 n 0000327343 00000 n 0000327459 00000 n 0000327584 00000 n 0000327711 00000 n 0000327834 00000 n 0000327957 00000 n 0000328080 00000 n 0000328207 00000 n 0000328331 00000 n 0000328447 00000 n 0000328563 00000 n 0000328685 00000 n 0000328816 00000 n 0000328949 00000 n 0000329067 00000 n 0000329186 00000 n 0000329305 00000 n 0000329666 00000 n 0000329573 00000 n 0000329480 00000 n 0000329394 00000 n 0000331471 00000 n 0000329899 00000 n 0000329997 00000 n 0000330086 00000 n 0000330179 00000 n 0000330283 00000 n 0000330394 00000 n 0000330500 00000 n 0000330602 00000 n 0000330709 00000 n 0000330842 00000 n 0000330956 00000 n 0000331352 00000 n 0000331259 00000 n 0000331166 00000 n 0000331079 00000 n 0000332923 00000 n 0000331589 00000 n 0000331702 00000 n 0000331791 00000 n 0000331884 00000 n 0000331985 00000 n 0000332100 00000 n 0000332214 00000 n 0000332314 00000 n 0000332420 00000 n 0000332793 00000 n 0000332700 00000 n 0000332607 00000 n 0000332523 00000 n 0000334708 00000 n 0000333041 00000 n 0000333153 00000 n 0000333245 00000 n 0000333341 00000 n 0000333440 00000 n 0000333549 00000 n 0000333688 00000 n 0000333798 00000 n 0000333939 00000 n 0000334063 00000 n 0000334188 00000 n 0000334574 00000 n 0000334477 00000 n 0000334380 00000 n 0000334294 00000 n 0000336162 00000 n 0000334829 00000 n 0000334938 00000 n 0000335031 00000 n 0000335128 00000 n 0000335232 00000 n 0000335347 00000 n 0000335444 00000 n 0000335559 00000 n 0000335658 00000 n 0000336044 00000 n 0000335947 00000 n 0000335850 00000 n 0000335761 00000 n 0000336897 00000 n 0000336284 00000 n 0000336403 00000 n 0000336776 00000 n 0000336679 00000 n 0000336582 00000 n 0000336496 00000 n 0000338619 00000 n 0000337019 00000 n 0000337124 00000 n 0000337217 00000 n 0000337314 00000 n 0000337418 00000 n 0000337536 00000 n 0000337636 00000 n 0000337758 00000 n 0000337860 00000 n 0000337959 00000 n 0000338083 00000 n 0000338470 00000 n 0000338373 00000 n 0000338276 00000 n 0000338187 00000 n 0000339475 00000 n 0000338742 00000 n 0000338871 00000 n 0000338964 00000 n 0000339346 00000 n 0000339249 00000 n 0000339152 00000 n 0000339066 00000 n 0000340212 00000 n 0000339597 00000 n 0000339715 00000 n 0000340091 00000 n 0000339994 00000 n 0000339897 00000 n 0000339808 00000 n 0000341311 00000 n 0000340334 00000 n 0000340443 00000 n 0000340536 00000 n 0000340646 00000 n 0000340756 00000 n 0000341148 00000 n 0000341051 00000 n 0000340954 00000 n 0000340865 00000 n 0000342601 00000 n 0000341433 00000 n 0000341533 00000 n 0000341626 00000 n 0000341723 00000 n 0000341881 00000 n 0000342034 00000 n 0000342430 00000 n 0000342333 00000 n 0000342236 00000 n 0000342147 00000 n 0000343345 00000 n 0000342723 00000 n 0000342848 00000 n 0000343224 00000 n 0000343127 00000 n 0000343030 00000 n 0000342941 00000 n 0000344088 00000 n 0000343467 00000 n 0000343585 00000 n 0000343961 00000 n 0000343864 00000 n 0000343767 00000 n 0000343678 00000 n 0000344817 00000 n 0000344210 00000 n 0000344320 00000 n 0000344696 00000 n 0000344599 00000 n 0000344502 00000 n 0000344413 00000 n 0000405216 00000 n 0000344939 00000 n 0000345029 00000 n 0000345159 00000 n 0000345289 00000 n 0000345419 00000 n 0000345549 00000 n 0000345679 00000 n 0000345804 00000 n 0000345945 00000 n 0000346089 00000 n 0000346214 00000 n 0000346340 00000 n 0000346461 00000 n 0000346584 00000 n 0000346708 00000 n 0000346833 00000 n 0000346957 00000 n 0000347084 00000 n 0000347208 00000 n 0000347330 00000 n 0000347452 00000 n 0000347577 00000 n 0000347702 00000 n 0000347828 00000 n 0000347954 00000 n 0000348079 00000 n 0000348206 00000 n 0000348611 00000 n 0000348514 00000 n 0000348417 00000 n 0000348332 00000 n 0000285360 00000 n 0000405325 00000 n 0000000015 00000 n 0000003502 00000 n 0000348758 00000 n 0000404586 00000 n 0000404810 00000 n 0000348801 00000 n 0000348904 00000 n 0000349008 00000 n 0000349111 00000 n 0000349215 00000 n 0000349319 00000 n 0000349423 00000 n 0000349527 00000 n 0000349631 00000 n 0000349736 00000 n 0000349841 00000 n 0000349946 00000 n 0000350051 00000 n 0000350156 00000 n 0000350261 00000 n 0000350366 00000 n 0000350471 00000 n 0000350575 00000 n 0000350680 00000 n 0000404982 00000 n 0000350783 00000 n 0000350818 00000 n 0000285686 00000 n 0000003524 00000 n 0000008688 00000 n 0000350879 00000 n 0000350984 00000 n 0000351088 00000 n 0000351193 00000 n 0000351298 00000 n 0000351403 00000 n 0000351508 00000 n 0000351613 00000 n 0000351718 00000 n 0000351823 00000 n 0000351928 00000 n 0000352033 00000 n 0000352138 00000 n 0000352243 00000 n 0000352348 00000 n 0000352453 00000 n 0000352558 00000 n 0000352663 00000 n 0000352767 00000 n 0000352872 00000 n 0000352977 00000 n 0000353082 00000 n 0000353185 00000 n 0000353290 00000 n 0000353395 00000 n 0000353500 00000 n 0000353605 00000 n 0000353709 00000 n 0000353814 00000 n 0000353918 00000 n 0000354023 00000 n 0000354128 00000 n 0000354233 00000 n 0000354338 00000 n 0000354443 00000 n 0000354548 00000 n 0000354653 00000 n 0000354758 00000 n 0000354862 00000 n 0000354965 00000 n 0000355000 00000 n 0000286172 00000 n 0000008710 00000 n 0000009448 00000 n 0000355048 00000 n 0000355153 00000 n 0000355258 00000 n 0000355363 00000 n 0000355398 00000 n 0000286370 00000 n 0000286479 00000 n 0000009469 00000 n 0000011446 00000 n 0000355459 00000 n 0000405048 00000 n 0000355563 00000 n 0000355667 00000 n 0000355772 00000 n 0000355877 00000 n 0000355982 00000 n 0000356087 00000 n 0000356192 00000 n 0000356298 00000 n 0000356404 00000 n 0000356510 00000 n 0000356616 00000 n 0000356721 00000 n 0000356826 00000 n 0000356931 00000 n 0000357040 00000 n 0000357075 00000 n 0000286773 00000 n 0000011468 00000 n 0000013291 00000 n 0000357149 00000 n 0000357184 00000 n 0000286939 00000 n 0000013313 00000 n 0000015022 00000 n 0000357258 00000 n 0000357293 00000 n 0000287105 00000 n 0000015044 00000 n 0000017017 00000 n 0000357367 00000 n 0000357475 00000 n 0000357584 00000 n 0000357619 00000 n 0000287295 00000 n 0000017039 00000 n 0000018130 00000 n 0000357693 00000 n 0000357728 00000 n 0000287461 00000 n 0000018152 00000 n 0000019320 00000 n 0000357802 00000 n 0000357837 00000 n 0000287627 00000 n 0000019342 00000 n 0000021154 00000 n 0000357911 00000 n 0000357946 00000 n 0000287793 00000 n 0000021176 00000 n 0000022954 00000 n 0000358020 00000 n 0000358129 00000 n 0000358233 00000 n 0000358268 00000 n 0000287983 00000 n 0000022976 00000 n 0000024444 00000 n 0000358342 00000 n 0000358450 00000 n 0000358485 00000 n 0000288165 00000 n 0000024466 00000 n 0000026296 00000 n 0000358559 00000 n 0000358668 00000 n 0000358777 00000 n 0000358812 00000 n 0000288355 00000 n 0000026318 00000 n 0000027547 00000 n 0000358886 00000 n 0000358921 00000 n 0000288521 00000 n 0000027569 00000 n 0000028778 00000 n 0000358995 00000 n 0000359030 00000 n 0000288687 00000 n 0000028800 00000 n 0000029980 00000 n 0000359104 00000 n 0000359139 00000 n 0000288853 00000 n 0000030002 00000 n 0000031250 00000 n 0000359213 00000 n 0000359248 00000 n 0000289019 00000 n 0000031272 00000 n 0000032153 00000 n 0000359322 00000 n 0000359357 00000 n 0000289185 00000 n 0000032174 00000 n 0000033368 00000 n 0000359431 00000 n 0000359466 00000 n 0000289351 00000 n 0000033390 00000 n 0000035304 00000 n 0000359540 00000 n 0000359575 00000 n 0000289517 00000 n 0000035326 00000 n 0000036919 00000 n 0000404747 00000 n 0000359649 00000 n 0000359684 00000 n 0000289683 00000 n 0000036941 00000 n 0000038787 00000 n 0000359771 00000 n 0000359879 00000 n 0000359983 00000 n 0000360092 00000 n 0000360127 00000 n 0000289881 00000 n 0000038809 00000 n 0000040897 00000 n 0000360201 00000 n 0000360236 00000 n 0000290047 00000 n 0000040919 00000 n 0000042356 00000 n 0000360297 00000 n 0000360405 00000 n 0000360514 00000 n 0000360614 00000 n 0000360723 00000 n 0000360758 00000 n 0000290253 00000 n 0000042378 00000 n 0000043412 00000 n 0000360832 00000 n 0000360867 00000 n 0000290419 00000 n 0000043433 00000 n 0000045172 00000 n 0000360941 00000 n 0000360976 00000 n 0000290585 00000 n 0000045194 00000 n 0000045975 00000 n 0000361050 00000 n 0000361085 00000 n 0000290751 00000 n 0000045996 00000 n 0000047036 00000 n 0000361159 00000 n 0000361194 00000 n 0000290917 00000 n 0000047057 00000 n 0000048518 00000 n 0000361268 00000 n 0000361303 00000 n 0000291083 00000 n 0000048540 00000 n 0000050065 00000 n 0000361377 00000 n 0000361412 00000 n 0000291249 00000 n 0000050087 00000 n 0000051719 00000 n 0000361486 00000 n 0000361593 00000 n 0000361702 00000 n 0000361737 00000 n 0000291439 00000 n 0000051741 00000 n 0000053372 00000 n 0000361811 00000 n 0000361846 00000 n 0000291605 00000 n 0000053394 00000 n 0000054916 00000 n 0000361907 00000 n 0000362015 00000 n 0000362124 00000 n 0000362233 00000 n 0000362335 00000 n 0000362370 00000 n 0000291811 00000 n 0000054938 00000 n 0000056110 00000 n 0000362444 00000 n 0000362479 00000 n 0000291977 00000 n 0000056132 00000 n 0000057072 00000 n 0000362553 00000 n 0000362588 00000 n 0000292143 00000 n 0000057093 00000 n 0000058456 00000 n 0000362662 00000 n 0000362773 00000 n 0000362883 00000 n 0000362994 00000 n 0000363029 00000 n 0000292341 00000 n 0000058478 00000 n 0000060540 00000 n 0000363103 00000 n 0000363212 00000 n 0000363316 00000 n 0000363425 00000 n 0000363528 00000 n 0000363563 00000 n 0000292547 00000 n 0000060562 00000 n 0000061778 00000 n 0000363637 00000 n 0000363746 00000 n 0000363781 00000 n 0000292729 00000 n 0000061800 00000 n 0000062827 00000 n 0000363842 00000 n 0000363877 00000 n 0000292895 00000 n 0000062848 00000 n 0000063834 00000 n 0000363951 00000 n 0000363986 00000 n 0000293061 00000 n 0000063855 00000 n 0000065499 00000 n 0000364060 00000 n 0000364168 00000 n 0000364277 00000 n 0000364312 00000 n 0000293251 00000 n 0000065521 00000 n 0000067388 00000 n 0000364386 00000 n 0000364421 00000 n 0000293417 00000 n 0000067410 00000 n 0000068712 00000 n 0000364495 00000 n 0000364530 00000 n 0000293583 00000 n 0000068734 00000 n 0000070807 00000 n 0000364604 00000 n 0000364715 00000 n 0000364826 00000 n 0000364861 00000 n 0000293773 00000 n 0000070829 00000 n 0000072248 00000 n 0000364935 00000 n 0000364970 00000 n 0000293939 00000 n 0000072270 00000 n 0000073373 00000 n 0000365044 00000 n 0000365079 00000 n 0000294105 00000 n 0000073395 00000 n 0000074118 00000 n 0000365140 00000 n 0000365175 00000 n 0000294271 00000 n 0000074139 00000 n 0000075501 00000 n 0000365249 00000 n 0000365358 00000 n 0000365393 00000 n 0000294453 00000 n 0000075523 00000 n 0000076967 00000 n 0000365467 00000 n 0000365576 00000 n 0000365685 00000 n 0000365789 00000 n 0000365824 00000 n 0000294651 00000 n 0000076989 00000 n 0000079003 00000 n 0000404354 00000 n 0000365911 00000 n 0000365946 00000 n 0000294817 00000 n 0000079025 00000 n 0000080825 00000 n 0000366033 00000 n 0000366068 00000 n 0000294983 00000 n 0000080847 00000 n 0000082089 00000 n 0000366142 00000 n 0000366177 00000 n 0000295149 00000 n 0000082111 00000 n 0000082883 00000 n 0000366238 00000 n 0000366341 00000 n 0000366376 00000 n 0000295331 00000 n 0000082904 00000 n 0000084682 00000 n 0000366450 00000 n 0000366612 00000 n 0000366779 00000 n 0000366814 00000 n 0000295521 00000 n 0000084704 00000 n 0000085534 00000 n 0000366888 00000 n 0000366991 00000 n 0000367026 00000 n 0000295703 00000 n 0000085555 00000 n 0000087320 00000 n 0000367087 00000 n 0000367191 00000 n 0000367295 00000 n 0000367399 00000 n 0000367503 00000 n 0000367607 00000 n 0000367711 00000 n 0000367815 00000 n 0000367919 00000 n 0000368023 00000 n 0000368127 00000 n 0000368162 00000 n 0000295957 00000 n 0000087342 00000 n 0000088868 00000 n 0000368236 00000 n 0000368344 00000 n 0000368452 00000 n 0000368561 00000 n 0000368670 00000 n 0000368779 00000 n 0000368883 00000 n 0000368918 00000 n 0000296179 00000 n 0000088890 00000 n 0000090392 00000 n 0000368992 00000 n 0000369101 00000 n 0000369210 00000 n 0000369314 00000 n 0000369422 00000 n 0000369531 00000 n 0000369640 00000 n 0000369675 00000 n 0000296401 00000 n 0000090414 00000 n 0000092238 00000 n 0000369736 00000 n 0000369845 00000 n 0000369954 00000 n 0000370063 00000 n 0000370171 00000 n 0000370206 00000 n 0000296607 00000 n 0000092260 00000 n 0000094951 00000 n 0000370280 00000 n 0000370389 00000 n 0000370493 00000 n 0000370602 00000 n 0000370710 00000 n 0000370820 00000 n 0000370931 00000 n 0000371042 00000 n 0000371153 00000 n 0000371263 00000 n 0000371374 00000 n 0000371485 00000 n 0000371592 00000 n 0000371627 00000 n 0000296877 00000 n 0000094973 00000 n 0000096557 00000 n 0000371701 00000 n 0000371812 00000 n 0000371922 00000 n 0000372033 00000 n 0000372144 00000 n 0000372255 00000 n 0000372365 00000 n 0000372476 00000 n 0000372587 00000 n 0000372696 00000 n 0000372807 00000 n 0000372918 00000 n 0000373029 00000 n 0000373140 00000 n 0000373251 00000 n 0000373362 00000 n 0000373397 00000 n 0000297171 00000 n 0000096579 00000 n 0000098593 00000 n 0000373471 00000 n 0000373580 00000 n 0000373687 00000 n 0000373795 00000 n 0000373903 00000 n 0000374012 00000 n 0000374121 00000 n 0000374230 00000 n 0000374338 00000 n 0000374373 00000 n 0000297409 00000 n 0000098615 00000 n 0000100748 00000 n 0000374447 00000 n 0000374554 00000 n 0000374663 00000 n 0000374772 00000 n 0000374881 00000 n 0000374989 00000 n 0000375024 00000 n 0000297623 00000 n 0000100770 00000 n 0000102050 00000 n 0000375098 00000 n 0000375207 00000 n 0000375311 00000 n 0000375420 00000 n 0000375455 00000 n 0000297821 00000 n 0000102072 00000 n 0000103768 00000 n 0000375516 00000 n 0000375624 00000 n 0000375659 00000 n 0000298003 00000 n 0000103790 00000 n 0000106026 00000 n 0000375733 00000 n 0000375842 00000 n 0000375950 00000 n 0000376058 00000 n 0000376166 00000 n 0000376275 00000 n 0000376384 00000 n 0000376419 00000 n 0000298225 00000 n 0000106048 00000 n 0000107884 00000 n 0000376493 00000 n 0000376602 00000 n 0000376637 00000 n 0000298407 00000 n 0000107906 00000 n 0000109731 00000 n 0000376711 00000 n 0000376820 00000 n 0000376928 00000 n 0000376963 00000 n 0000298597 00000 n 0000109753 00000 n 0000111802 00000 n 0000377037 00000 n 0000377146 00000 n 0000377255 00000 n 0000377290 00000 n 0000298787 00000 n 0000111824 00000 n 0000114020 00000 n 0000377364 00000 n 0000377399 00000 n 0000298953 00000 n 0000114042 00000 n 0000116436 00000 n 0000377473 00000 n 0000377579 00000 n 0000377690 00000 n 0000377796 00000 n 0000377907 00000 n 0000378018 00000 n 0000378053 00000 n 0000299167 00000 n 0000116458 00000 n 0000117780 00000 n 0000378127 00000 n 0000378231 00000 n 0000378340 00000 n 0000378449 00000 n 0000378484 00000 n 0000299365 00000 n 0000117802 00000 n 0000119983 00000 n 0000378558 00000 n 0000378667 00000 n 0000378775 00000 n 0000378883 00000 n 0000378987 00000 n 0000379096 00000 n 0000379205 00000 n 0000379309 00000 n 0000379344 00000 n 0000299595 00000 n 0000120005 00000 n 0000121651 00000 n 0000379418 00000 n 0000379527 00000 n 0000379636 00000 n 0000379745 00000 n 0000379780 00000 n 0000299793 00000 n 0000121673 00000 n 0000122849 00000 n 0000379854 00000 n 0000379963 00000 n 0000380072 00000 n 0000380107 00000 n 0000299983 00000 n 0000122871 00000 n 0000125033 00000 n 0000380168 00000 n 0000380272 00000 n 0000380381 00000 n 0000380489 00000 n 0000380598 00000 n 0000380707 00000 n 0000380742 00000 n 0000300197 00000 n 0000125055 00000 n 0000126008 00000 n 0000380816 00000 n 0000380851 00000 n 0000300363 00000 n 0000126029 00000 n 0000127744 00000 n 0000380912 00000 n 0000381021 00000 n 0000381129 00000 n 0000381237 00000 n 0000381345 00000 n 0000381380 00000 n 0000300569 00000 n 0000127766 00000 n 0000130259 00000 n 0000381454 00000 n 0000381562 00000 n 0000381597 00000 n 0000300751 00000 n 0000130281 00000 n 0000132291 00000 n 0000381671 00000 n 0000381780 00000 n 0000404423 00000 n 0000381889 00000 n 0000381998 00000 n 0000382033 00000 n 0000300949 00000 n 0000132313 00000 n 0000133482 00000 n 0000382120 00000 n 0000382155 00000 n 0000301115 00000 n 0000133504 00000 n 0000135047 00000 n 0000382229 00000 n 0000382264 00000 n 0000301281 00000 n 0000135069 00000 n 0000136471 00000 n 0000382338 00000 n 0000382373 00000 n 0000301447 00000 n 0000136493 00000 n 0000138354 00000 n 0000382447 00000 n 0000382482 00000 n 0000301613 00000 n 0000138376 00000 n 0000139769 00000 n 0000382556 00000 n 0000382660 00000 n 0000382695 00000 n 0000301795 00000 n 0000139791 00000 n 0000141612 00000 n 0000382769 00000 n 0000382878 00000 n 0000382987 00000 n 0000383096 00000 n 0000383268 00000 n 0000383433 00000 n 0000383542 00000 n 0000383577 00000 n 0000302017 00000 n 0000141634 00000 n 0000142989 00000 n 0000383651 00000 n 0000383686 00000 n 0000302183 00000 n 0000143011 00000 n 0000145037 00000 n 0000383747 00000 n 0000383856 00000 n 0000383964 00000 n 0000384073 00000 n 0000384181 00000 n 0000384285 00000 n 0000384393 00000 n 0000384502 00000 n 0000384611 00000 n 0000384720 00000 n 0000384755 00000 n 0000302429 00000 n 0000145059 00000 n 0000147456 00000 n 0000384829 00000 n 0000384938 00000 n 0000385047 00000 n 0000385156 00000 n 0000385265 00000 n 0000385374 00000 n 0000385483 00000 n 0000385592 00000 n 0000385701 00000 n 0000385809 00000 n 0000385912 00000 n 0000385947 00000 n 0000302683 00000 n 0000147478 00000 n 0000148881 00000 n 0000386021 00000 n 0000386130 00000 n 0000386234 00000 n 0000386343 00000 n 0000386452 00000 n 0000386560 00000 n 0000386595 00000 n 0000302897 00000 n 0000148903 00000 n 0000150393 00000 n 0000386669 00000 n 0000386778 00000 n 0000386887 00000 n 0000386996 00000 n 0000387105 00000 n 0000387213 00000 n 0000387248 00000 n 0000303111 00000 n 0000150415 00000 n 0000152074 00000 n 0000387322 00000 n 0000387431 00000 n 0000387540 00000 n 0000387649 00000 n 0000387684 00000 n 0000303309 00000 n 0000152096 00000 n 0000152388 00000 n 0000387758 00000 n 0000387861 00000 n 0000387896 00000 n 0000303491 00000 n 0000152409 00000 n 0000154282 00000 n 0000387957 00000 n 0000388066 00000 n 0000388101 00000 n 0000303673 00000 n 0000154304 00000 n 0000156349 00000 n 0000388175 00000 n 0000388283 00000 n 0000388391 00000 n 0000388426 00000 n 0000303863 00000 n 0000156371 00000 n 0000157691 00000 n 0000388500 00000 n 0000388536 00000 n 0000304032 00000 n 0000157714 00000 n 0000159529 00000 n 0000388611 00000 n 0000388647 00000 n 0000304202 00000 n 0000159552 00000 n 0000161381 00000 n 0000388735 00000 n 0000388771 00000 n 0000304372 00000 n 0000161404 00000 n 0000163136 00000 n 0000388846 00000 n 0000388951 00000 n 0000388987 00000 n 0000304559 00000 n 0000163159 00000 n 0000164464 00000 n 0000389062 00000 n 0000389098 00000 n 0000304729 00000 n 0000164487 00000 n 0000166468 00000 n 0000389160 00000 n 0000389269 00000 n 0000389305 00000 n 0000304916 00000 n 0000166491 00000 n 0000168311 00000 n 0000389380 00000 n 0000389485 00000 n 0000389590 00000 n 0000389699 00000 n 0000389735 00000 n 0000305121 00000 n 0000168334 00000 n 0000169642 00000 n 0000389810 00000 n 0000389914 00000 n 0000389950 00000 n 0000305308 00000 n 0000169665 00000 n 0000169879 00000 n 0000390025 00000 n 0000390061 00000 n 0000305478 00000 n 0000169901 00000 n 0000171478 00000 n 0000390110 00000 n 0000390146 00000 n 0000305648 00000 n 0000171501 00000 n 0000172743 00000 n 0000390221 00000 n 0000390257 00000 n 0000305818 00000 n 0000172766 00000 n 0000174140 00000 n 0000390332 00000 n 0000390368 00000 n 0000305988 00000 n 0000174163 00000 n 0000175245 00000 n 0000390443 00000 n 0000390479 00000 n 0000306158 00000 n 0000175268 00000 n 0000176610 00000 n 0000390554 00000 n 0000390590 00000 n 0000306328 00000 n 0000176633 00000 n 0000177766 00000 n 0000390652 00000 n 0000390688 00000 n 0000306498 00000 n 0000177789 00000 n 0000179182 00000 n 0000390750 00000 n 0000390786 00000 n 0000306668 00000 n 0000179205 00000 n 0000180298 00000 n 0000390861 00000 n 0000390897 00000 n 0000306838 00000 n 0000180321 00000 n 0000180927 00000 n 0000390972 00000 n 0000391076 00000 n 0000391112 00000 n 0000307025 00000 n 0000180949 00000 n 0000182366 00000 n 0000391187 00000 n 0000391223 00000 n 0000307195 00000 n 0000182389 00000 n 0000183721 00000 n 0000391298 00000 n 0000391334 00000 n 0000307365 00000 n 0000183744 00000 n 0000185261 00000 n 0000391409 00000 n 0000391445 00000 n 0000307535 00000 n 0000185284 00000 n 0000186717 00000 n 0000391520 00000 n 0000391556 00000 n 0000307705 00000 n 0000186740 00000 n 0000187909 00000 n 0000391631 00000 n 0000391667 00000 n 0000307875 00000 n 0000187932 00000 n 0000189129 00000 n 0000391742 00000 n 0000391846 00000 n 0000391882 00000 n 0000308062 00000 n 0000189152 00000 n 0000190768 00000 n 0000391957 00000 n 0000392065 00000 n 0000392101 00000 n 0000308249 00000 n 0000190791 00000 n 0000191944 00000 n 0000392189 00000 n 0000392225 00000 n 0000308419 00000 n 0000191967 00000 n 0000193513 00000 n 0000392287 00000 n 0000392395 00000 n 0000392505 00000 n 0000392541 00000 n 0000308615 00000 n 0000193536 00000 n 0000195009 00000 n 0000392629 00000 n 0000392665 00000 n 0000308785 00000 n 0000195032 00000 n 0000196195 00000 n 0000392740 00000 n 0000392776 00000 n 0000308955 00000 n 0000196218 00000 n 0000196688 00000 n 0000392838 00000 n 0000392942 00000 n 0000392978 00000 n 0000309142 00000 n 0000196710 00000 n 0000198328 00000 n 0000393040 00000 n 0000393150 00000 n 0000393258 00000 n 0000393363 00000 n 0000393399 00000 n 0000309347 00000 n 0000198351 00000 n 0000198929 00000 n 0000393474 00000 n 0000393510 00000 n 0000309517 00000 n 0000198951 00000 n 0000200148 00000 n 0000393572 00000 n 0000393608 00000 n 0000309687 00000 n 0000200171 00000 n 0000200633 00000 n 0000393670 00000 n 0000393774 00000 n 0000393810 00000 n 0000309874 00000 n 0000200655 00000 n 0000201819 00000 n 0000393872 00000 n 0000393908 00000 n 0000310044 00000 n 0000201842 00000 n 0000203231 00000 n 0000393983 00000 n 0000394093 00000 n 0000394129 00000 n 0000310231 00000 n 0000203254 00000 n 0000204671 00000 n 0000394204 00000 n 0000394314 00000 n 0000394424 00000 n 0000394460 00000 n 0000310427 00000 n 0000204694 00000 n 0000206131 00000 n 0000394535 00000 n 0000394644 00000 n 0000394680 00000 n 0000310614 00000 n 0000206154 00000 n 0000207372 00000 n 0000394755 00000 n 0000394791 00000 n 0000310784 00000 n 0000207395 00000 n 0000208882 00000 n 0000394866 00000 n 0000394975 00000 n 0000395084 00000 n 0000395120 00000 n 0000310980 00000 n 0000208905 00000 n 0000210003 00000 n 0000395195 00000 n 0000395231 00000 n 0000311150 00000 n 0000210026 00000 n 0000211226 00000 n 0000395306 00000 n 0000395342 00000 n 0000311320 00000 n 0000211249 00000 n 0000211924 00000 n 0000395404 00000 n 0000395514 00000 n 0000395624 00000 n 0000395734 00000 n 0000395839 00000 n 0000395943 00000 n 0000395979 00000 n 0000311543 00000 n 0000211946 00000 n 0000213207 00000 n 0000396054 00000 n 0000396090 00000 n 0000311713 00000 n 0000213230 00000 n 0000213999 00000 n 0000396165 00000 n 0000396201 00000 n 0000311883 00000 n 0000214021 00000 n 0000214805 00000 n 0000396276 00000 n 0000396312 00000 n 0000312053 00000 n 0000214827 00000 n 0000215696 00000 n 0000396387 00000 n 0000396423 00000 n 0000312223 00000 n 0000215718 00000 n 0000216433 00000 n 0000396498 00000 n 0000396534 00000 n 0000312393 00000 n 0000216455 00000 n 0000217945 00000 n 0000396596 00000 n 0000396632 00000 n 0000312563 00000 n 0000217968 00000 n 0000218986 00000 n 0000396707 00000 n 0000396743 00000 n 0000312733 00000 n 0000219008 00000 n 0000219864 00000 n 0000396831 00000 n 0000396867 00000 n 0000312903 00000 n 0000219886 00000 n 0000221090 00000 n 0000396929 00000 n 0000396965 00000 n 0000313073 00000 n 0000221113 00000 n 0000222100 00000 n 0000397027 00000 n 0000397063 00000 n 0000313243 00000 n 0000222122 00000 n 0000223532 00000 n 0000397112 00000 n 0000397148 00000 n 0000313413 00000 n 0000223555 00000 n 0000224343 00000 n 0000397223 00000 n 0000397259 00000 n 0000313583 00000 n 0000224365 00000 n 0000225123 00000 n 0000397308 00000 n 0000397344 00000 n 0000313753 00000 n 0000225145 00000 n 0000226359 00000 n 0000397393 00000 n 0000397429 00000 n 0000313923 00000 n 0000226382 00000 n 0000228180 00000 n 0000397491 00000 n 0000397527 00000 n 0000314093 00000 n 0000228203 00000 n 0000228826 00000 n 0000397589 00000 n 0000397695 00000 n 0000397731 00000 n 0000314280 00000 n 0000228848 00000 n 0000229686 00000 n 0000397806 00000 n 0000397842 00000 n 0000314450 00000 n 0000229708 00000 n 0000230200 00000 n 0000397917 00000 n 0000397953 00000 n 0000314620 00000 n 0000230222 00000 n 0000230831 00000 n 0000398015 00000 n 0000398051 00000 n 0000314790 00000 n 0000230853 00000 n 0000232092 00000 n 0000398113 00000 n 0000398149 00000 n 0000314960 00000 n 0000232115 00000 n 0000232624 00000 n 0000398224 00000 n 0000398328 00000 n 0000398364 00000 n 0000315147 00000 n 0000232646 00000 n 0000233911 00000 n 0000398439 00000 n 0000398475 00000 n 0000315317 00000 n 0000233934 00000 n 0000234990 00000 n 0000398550 00000 n 0000398586 00000 n 0000315487 00000 n 0000235012 00000 n 0000236344 00000 n 0000398661 00000 n 0000398697 00000 n 0000315657 00000 n 0000236367 00000 n 0000236938 00000 n 0000398772 00000 n 0000398876 00000 n 0000398912 00000 n 0000315844 00000 n 0000236960 00000 n 0000238316 00000 n 0000398974 00000 n 0000399010 00000 n 0000316014 00000 n 0000238339 00000 n 0000239614 00000 n 0000399072 00000 n 0000399108 00000 n 0000316184 00000 n 0000239637 00000 n 0000240609 00000 n 0000399183 00000 n 0000399287 00000 n 0000399323 00000 n 0000316371 00000 n 0000240631 00000 n 0000242261 00000 n 0000399398 00000 n 0000399507 00000 n 0000399611 00000 n 0000399647 00000 n 0000316567 00000 n 0000242284 00000 n 0000243517 00000 n 0000399722 00000 n 0000399758 00000 n 0000316737 00000 n 0000243540 00000 n 0000244668 00000 n 0000399833 00000 n 0000399937 00000 n 0000399973 00000 n 0000316924 00000 n 0000244691 00000 n 0000246269 00000 n 0000400048 00000 n 0000400153 00000 n 0000400262 00000 n 0000400372 00000 n 0000400476 00000 n 0000400581 00000 n 0000400690 00000 n 0000400800 00000 n 0000400910 00000 n 0000401015 00000 n 0000401125 00000 n 0000401230 00000 n 0000401266 00000 n 0000317201 00000 n 0000246292 00000 n 0000247657 00000 n 0000401341 00000 n 0000401451 00000 n 0000401555 00000 n 0000401664 00000 n 0000401769 00000 n 0000401805 00000 n 0000317415 00000 n 0000247680 00000 n 0000249443 00000 n 0000401880 00000 n 0000401916 00000 n 0000317585 00000 n 0000249466 00000 n 0000249761 00000 n 0000401978 00000 n 0000402082 00000 n 0000402118 00000 n 0000317772 00000 n 0000249783 00000 n 0000251772 00000 n 0000402180 00000 n 0000402354 00000 n 0000402533 00000 n 0000402569 00000 n 0000317968 00000 n 0000251795 00000 n 0000254011 00000 n 0000402631 00000 n 0000402667 00000 n 0000318138 00000 n 0000254034 00000 n 0000256447 00000 n 0000402729 00000 n 0000402765 00000 n 0000318308 00000 n 0000256470 00000 n 0000258783 00000 n 0000402814 00000 n 0000402850 00000 n 0000318478 00000 n 0000258806 00000 n 0000261196 00000 n 0000402899 00000 n 0000402935 00000 n 0000318648 00000 n 0000261219 00000 n 0000263808 00000 n 0000402997 00000 n 0000403033 00000 n 0000318818 00000 n 0000263831 00000 n 0000266096 00000 n 0000403082 00000 n 0000403118 00000 n 0000318988 00000 n 0000266119 00000 n 0000267826 00000 n 0000403167 00000 n 0000403203 00000 n 0000319158 00000 n 0000267849 00000 n 0000270101 00000 n 0000403278 00000 n 0000403314 00000 n 0000319328 00000 n 0000270124 00000 n 0000272363 00000 n 0000403376 00000 n 0000403412 00000 n 0000319498 00000 n 0000272386 00000 n 0000274307 00000 n 0000403487 00000 n 0000403523 00000 n 0000319668 00000 n 0000274330 00000 n 0000276236 00000 n 0000403598 00000 n 0000403634 00000 n 0000319838 00000 n 0000276259 00000 n 0000278353 00000 n 0000403709 00000 n 0000403745 00000 n 0000320008 00000 n 0000278376 00000 n 0000280090 00000 n 0000403807 00000 n 0000403843 00000 n 0000320178 00000 n 0000280113 00000 n 0000282098 00000 n 0000403918 00000 n 0000403954 00000 n 0000320348 00000 n 0000282121 00000 n 0000284379 00000 n 0000404042 00000 n 0000404078 00000 n 0000320518 00000 n 0000284402 00000 n 0000285338 00000 n 0000404153 00000 n 0000404256 00000 n 0000404292 00000 n 0000404510 00000 n 0000404671 00000 n 0000404896 00000 n 0000405130 00000 n 0000414669 00000 n trailer << /Size 1532 /Root 1 0 R /Info 2 0 R /ID [<9EBF60A8D1419AC45B1F64B46CA22F50><9EBF60A8D1419AC45B1F64B46CA22F50>] >> startxref 416516 %%EOF funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/funtools.ps000066400000000000000000020136761256243640000234770ustar00rootroot00000000000000%!PS %%Title: The Funtools Help Facility %%Creator: html2ps version 1.0 beta5 %%EndComments save 2000 dict begin /d {bind def} bind def /D {def} d /t true D /f false D /FL [/Times-Roman /Times-Italic /Times-Bold /Times-BoldItalic /Courier /Courier-Oblique /Courier-Bold /Courier-BoldOblique /Helvetica /Helvetica-Oblique /Helvetica-Bold /Helvetica-BoldOblique] D /WF t D /WI 0 D /F 1 D /IW 471 F div D /IL 621 F div D /PS 791 D /EF [0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 2 2] D /EZ [11 9 19 17 15 13 12 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 8 8] D /Ey [0 0 2 2 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] D /EG [-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1] D /Tm [1 1 0.8 0.8 0.8 0.8 0.8 0.8 0 0 0 0 0 0 0.5 1 1 1 1 0 0 1.3 0 0] D /Bm [1 1 0.5 0.5 0.5 0.5 0.5 0.5 0 0 0 0 0 0 0.5 1 1 1 1 0 0 1 0 0] D /Lm [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 2 0 0 2 0 0 0] D /Rm [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0] D /EU [-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 0 0] D /NO t D /YY [[{()}1][{()}0][{()}2]] D /ZZ [[{()}1][{()}0][{()}2]] D /Ts EZ 0 get D /TU f D /Xp t D /AU t D /SN 0 D /Cf f D /Tp f D /Fe f D /TI 1 Ts mul D /Fm 14 D /xL 71 D /xR 71 D /yL 706 D /yR 706 D /Wl 471 F div D /Wr 471 F div D /hL 621 F div D /hR 621 F div D /FE {newpath Fm neg Fm M CP BB IW Fm add Fm L IW Fm add IL Fm add neg L CP BB Fm neg IL Fm add neg L closepath} D /LA {PM 0 eq{/IW Wl D /IL hL D}{/IW Wr D /IL hR D}ie /W IW D /LL W D /LS W D TU PM 0 eq and{IW 56 F div add SA{Sf div}if 0 translate} {PM 0 eq{xL yL}{xR yR}ie translate F SA{Sf mul}if dup scale CS CF FS Cf{CA CL get VC}if /Bb f D}ie 0 0 M TF not Tc or {Cf{gsave SA{1 Sf div dup scale}if Cb VC FE fill grestore}if}if}D /Pi 0 Ts mul D /SG [0.8 1 1] D /Ab 15 D /J 0 D /Tc t D /NH 6 D /Nf f D /Pa f D /LH 1.2 D /XR f D /Xr {/pN E D ( [p ) WB pN WB (] )WB} D /Db [16#FF 16#FF 16#FF] D /Dt [16#00 16#00 16#00] D /eA f D /Fi f D /bT f D /Lc t D /Dl [16#00 16#00 16#00] D /LX f D /Br 0.25 D /IA ([IMAGE]) D /DS {/PF f D()WB NL NP()pop RC ZF} D /Gb f D /Mb t D /Hc [16#00 16#00 16#00] D /Bl 3 D /MI -15.2 D /DX (DRAFT) D /Di 0 D /Tt 113.385826771654 D /Th {()2 Al()BR ( ) 0 1 -1 H()4 FZ Ti ES()EH ( ) 0 2 -1 H() ME 0 get join EH()Ea()BR()} D /tH {()0 1 -1 H (Table of Contents) EH()} D /FD 2 D /Dy 2 D /cD [16#F0 16#F0 16#F0] D /FW 0.6 D /FU [16#00 16#00 16#00] D /ET {/RM f D /A0 0 D /PN SN D /OU t D /Ou t D /W IW D /LL W D D1 Ms not TP and{Ip}if /TF f D} D [{true statusdict/setduplexmode get exec} stopped cleartomark %-- End of variable part -- /MySymbol 10 dict dup begin /FontType 3 D /FontMatrix [.001 0 0 .001 0 0 ] D /FontBBox [25 -10 600 600] D /Encoding 256 array D 0 1 255{Encoding exch /.notdef put}for Encoding (e) 0 get /euro put /Metrics 2 dict D Metrics begin /.notdef 0 D /euro 651 D end /BBox 2 dict D BBox begin /.notdef [0 0 0 0] D /euro [25 -10 600 600] D end /CharacterDefs 2 dict D CharacterDefs begin /.notdef {} D /euro{newpath 114 600 moveto 631 600 lineto 464 200 lineto 573 200 lineto 573 0 lineto -94 0 lineto 31 300 lineto -10 300 lineto closepath clip 50 setlinewidth newpath 656 300 moveto 381 300 275 0 360 arc stroke -19 350 moveto 600 0 rlineto -19 250 moveto 600 0 rlineto stroke}d end /BuildChar{0 begin /char E D /fontdict E D /charname fontdict /Encoding get char get D fontdict begin Metrics charname get 0 BBox charname get aload pop setcachedevice CharacterDefs charname get exec end end}D /BuildChar load 0 3 dict put /UniqueID 1 D end definefont pop /Cd {aload length 2 idiv dup dict begin {D} repeat currentdict end} D /EX {EC cvx exec} D /DU {} d /BB {pop pop}d /ie {ifelse} d /E {exch} d /M {moveto} d /R {rmoveto} d /L {lineto} d /RL {rlineto} d /CP {currentpoint} d /SW {stringwidth} d /GI {getinterval} d /PI {putinterval} d /Sg {setgray} d /LW {setlinewidth} d /S {dup () ne OU and{0 Co R AT 3 eq LB and HF not and A1 0 ne A2 0 ne or and {A2 0 32 A1 0 6 -1 roll awidthshow}{show}ie 0 Co neg R}{pop}ie OU PH 3 eq or{/Ms t D}if} D /U {OU{gsave CP currentfont /FontInfo get /UnderlinePosition get 0 E currentfont /FontMatrix get dtransform E pop add newpath M dup SW pop CJ 0 RL stroke grestore}if} D /B {OU Br 0 gt and{CP Ts neg Ts .33 mul R gsave 0 Sg CP newpath Ts Br mul 0 360 arc closepath UI 2 mod 0 eq{stroke}{fill}ie grestore M CP E Ts Br 1 add mul sub E BB /Ms t D}if}D /NP {Ms TP not or PA and OU and{TP{OR}if f1{mF k2 /mF E D /YC 0 D}if TP TU not PM 0 eq or and{showpage}if DU Ip TE not{LA}if 0.6 LW /CI 0 D /TP t D /Hs f D /hl 6 D /Hv 6 D /HI hi D /Ms f D}if Bs XO BO M} D /Np {LE sub CP E pop gt PL 0 eq and{NP}if}D /Ip {/PN PN 1 add D /Pn RM{1}{4}ie PN Ns D /PM PN SN sub 2 mod D} D /GP {E dup 3 -1 roll get PN 1 add 2 mod get dup type /integertype eq {get 0 get}{E pop}ie}d /Fc {dup 2 GP exec SW pop /S1 E D dup 1 GP exec SW pop /S2 E D 0 GP exec SW pop /S3 E D S1 0 gt{S2 2 mul S1 add S3 2 mul S1 add 2 copy lt{E}if pop}{0}ie S2 S3 add 2 copy lt{E}if pop IW .9 mul div dup 1 gt{1 E div}{pop 1}ie}D /OR {Df{Sd}if tp not{gsave SA{1 Sf div dup scale}if Fe{Cf{FU VC}if FW LW 1 setlinejoin FE stroke}if /YO {60 F div dup 40 gt{pop 40}if}D /cs CS D /cf CF D /CF 0 D /pf PF D /PF f D /Fn FN D /At AT D /AT 0 D /FN EF Hf 1 add get D Fz Fs FS ZZ Fc Fz mul Fs FS EU Hf 1 add get dup type /arraytype eq Cf and{VC}{pop 0 Sg}ie IW IL neg YO sub M ZZ 1 GP exec dup SW pop neg 0 R Sh 0 IL neg YO sub M ZZ 0 GP exec Sh ZZ 2 GP exec dup SW pop IW E sub 2 div IL neg YO sub M Sh Fz Fs FS NO{/AW IW Pn SW pop sub D AW 2 div IL neg YO sub S1 0 gt S2 AW .45 mul gt or S3 AW .45 mul gt or{Fz 2 mul sub}if M Pn Sh}if EU Hf get dup type /arraytype eq Cf and{VC}{pop 0 Sg}ie YY Fc /FN EF Hf get D Hz mul HS FS IW YO M YY 1 GP exec dup SW pop neg 0 R Sh 0 YO M YY 0 GP exec Sh YY 2 GP exec dup SW pop IW E sub 2 div YO M Sh /FN Fn D /AT At D t Pb XO SZ SL get neg R /PF pf D grestore /CF 0 D cs cf FS}if}D /Sh {dup () ne{CP Hz 4 div sub BB show CP CS add BB}{pop}ie}D /Pb {/OU E D /Ou OU D /PB t D 0 0 M Ba{/Sa save D /BP t D /Fl t D RC /PL 0 D /PH 0 D /W IW D /LE IL .7 mul D /EO 0 D SI ZF /YA 0 D /BO 0 D /C1 () D BA 0 Ts neg R Bb{Xl Yl Xh Yh}if Bb CP Sa restore M {/Yh E D /Xh E D /Yl E D /Xl E D}if /Fl t D}if BL /OU t D /HM f D /Ou t D /PB f D} D /Bs {/BP Ba not D}D /reencodeISO { dup dup findfont dup length dict begin{1 index /FID ne{D}{pop pop}ie}forall /Encoding ISOLatin1Encoding D currentdict end definefont} D /ISOLatin1Encoding [ /.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 ] D [128/backslash 129/parenleft 130/parenright 141/circumflex 142/tilde 143/perthousand 144/dagger 145/daggerdbl 146/Ydieresis 147/scaron 148/Scaron 149/oe 150/OE 151/guilsinglleft 152/guilsinglright 153/quotesinglbase 154/quotedblbase 155/quotedblleft 156/quotedblright 157/endash 158/emdash 159/trademark] aload length 2 idiv 1 1 3 -1 roll{pop ISOLatin1Encoding 3 1 roll put}for /colorimage where{pop}{ /colorimage { pop pop /Pr E D {/Cv Pr D /Gr Cv length 3 idiv string D 0 1 Gr length 1 sub {Gr E dup /i E 3 mul D Cv i get 0.299 mul Cv i 1 add get 0.587 mul add Cv i 2 add get 0.114 mul add cvi put}for Gr} image} D }ie /pdfmark where{pop}{userdict /pdfmark /cleartomark load put}ie WF{FL{reencodeISO D}forall}{4 1 FL length 1 sub{FL E get reencodeISO D}for}ie /Symbol dup dup findfont dup length dict begin {1 index /FID ne{D}{pop pop}ie}forall /Encoding [Encoding aload pop] dup 128 /therefore put D currentdict end definefont D /SF {/CS E D SZ SL CS put FO SL FN put /YI CS LH neg mul D dup ST cvs ( ) join CS ST cvs join C1 E join ( NF ) join /C1 E D CS NF /Wf WF FN 0 gt or D /BW Wf{( ) SW pop}{0}ie D}D /NF {/cS E D /cF E D cF 0 ge{FL cF get}{cF -1 eq{/Symbol}{/MySymbol}ie}ie findfont cS scalefont setfont} D /FS {CF or /CF E D FR SL CF put CF CF 0 ge{FN 4 mul add}if E SF} D /PC {SH /BP f D fin not GL not and{NL}if /HM t D /LL LS D} D /BS {/TX E D Wf{/fin f D /CW 0 D /LK 0 D /SC 0 D /RT TX D {RT ( ) search{/NW E D pop /RT E D /WH NW SW pop D CW WH add LL gt {TX SC LK SC sub 1 sub NN GI GL{SH cF cS OC 2 copy cS ne E cF ne or{NF}{pop pop}ie}{PC /CW WH BW add D}ie /SC LK D} {GL{JC}if /CW CW WH add BW add D /HM t D}ie /GL f D /Ph f D /LK LK NW length 1 add add D}{pop exit}ie}loop /fin t D TX SC LK SC sub GI SH RT () ne{GL not{CC}if}if /LC TX length D /WH RT SW pop D CW WH add Hy{HC SW pop add}if LL gt {RT GL{SH cF cS OC 2 copy cS ne E cF ne or{NF}{pop pop}ie Hy{/Ph t D}if /LL LS D}{NL /LL LS D SH}ie} {RT PC Hy{CC}if /Ph Ph Hy or D}ie RT () ne{/GL t D /HM t D}if} {TX SW pop LL le{TX SH}{/NW () D 0 2 TX length 1 sub {/CW E D TX 0 CW GI dup SW pop LL gt{pop NW SH /HM t D NL/LL W XO sub MR sub D /CW CW 2 sub NN D /TX TX CW TX length CW sub GI D TX BS exit} {/NW E D}ie}for}ie}ie /HM t D}D /CC {C0 length 0 gt{JC}if /C0 [C1 L1 YA YB Mf NS NB TB AF Bw] D /C1 () D /L0 L1 D /YA 0 D /YB 0 D /Mf 0 D /NS 0 D /NB 0 D}D /JC {C0 aload length 0 gt{pop pop pop NB add /NB E D NS add /NS E D dup Mf gt{/Mf E D}{pop}ie dup YB gt{/YB E D}{pop}ie dup YA gt{/YA E D}{pop}ie pop C1 join /C1 E D /C0 [] D}if}D /OC {C0 length 0 gt{C1 L1 L0 sub YA YB Mf NS NB TB AF Bw GL C0 aload pop /Bw E D /AF E D /TB E D /NB E D /NS E D /Mf E D /YB E D /YA E D /C0 [] D /L1 E D /C1 E D Ph{HC SH}if NL /GL E D /Bw E D /AF E D /TB E D /NB E D /NS E D /Mf E D /YB E D /YA E D /L1 E D /LL W L1 sub XO sub MR sub WH sub D /CW 0 D C1 E join /C1 E D}if}D /BT {/LB t D dup length string copy RS dup dup () ne E ( ) ne and {/CI 0 D /LS LL D /LL W L1 sub XO sub MR sub D BS} {dup ( ) eq{/GL f D}if dup () eq L1 0 eq or{pop}{SH /BP f D /Ph f D}ie}ie /LB f D} D /BL {CP E pop XO E M} D /NL {JC /GL f D /SK W XO sub MR sub L1 sub TB{Bw add}if D /YA LF{Mf HM Fl not and PF or{LH mul}if}{0 /LF t D}ie YA 2 copy lt{E}if pop D C1 () ne{/FB YB Mf SA{Sf mul}if 4 div 2 copy lt{E}if pop D}if Fl{/Ya YA D}if CP E pop YA sub YB sub LE neg lt Fl not and PB not and{NP}if NT TL BL OU PF not and PB or{/RE L1 TB{Bw sub}if W XO sub MR sub div YA YB add LE BO add div 2 copy lt{E}if pop D RE 1 gt{BL 1 RE div dup scale}if}if AT 2 le{SK AT mul 2 div YA neg R}if AT 3 eq{0 YA neg R TB{/NB NB 1 sub D /NS NS 1 sub D}if /NB NB 1 sub NN D /A3 NS 6 mul NB add D NS NB add 0 eq {/A1 0 D /A2 0 D} {NS 0 eq{/A1 SK NB div dup J gt{pop 0}if D /A2 0 D}{J A3 mul SK lt {/A1 J D /A2 SK J NB mul sub NS div dup Ab gt{/A1 0 D pop 0}if D} {/A1 SK A3 div D /A2 A1 6 mul D}ie}ie}ie /A1 A1 NN D /A2 A2 NN D}if AT 4 eq{0 YA neg R PH 2 le{PD 0 lt{/PD L1 D}if PD M1 gt{/M1 PD D}if L1 PD sub M2 gt{/M2 L1 PD sub D}if}{DV ID 1 sub get 0 ge{Lo 0 R}if}ie}if F0 cF ne Cs cS ne or{F0 Cs NF}if /ms Ms D /Ms f D CP FB sub C1 cvx exec XO EO sub L1 add TB{BW sub}if dup LM gt{/LM E D}{pop}ie PH 0 eq PH 4 eq or Ms and{HF not{/PO t D /AH t D}if BB CP YA add E AT 3 eq LB and{A1 sub}if TB{BW sub}if E BB} {pop pop}ie Ms HM PH 3 eq and or{/BP f D /Fl f D}if /Lo 0 D /L1 0 D /F0 cF D /Cs cS D BP not{0 YB NN neg R}if OU f1 and mF not and{k2 /f1 f D}if OU PF not and PB or{RE 1 gt{RE dup scale}if}if /Ms ms Ms or D /C1 AF{(Cp )}{()}ie D /YA 0 D /YB 0 D BL AT 4 eq LB not and PH 3 ge and {ID DV length lt{DV ID get dup 0 ge{DO E sub /Lo E D /L1 Lo D}{pop}ie /ID ID 1 add D}if}if /T t D CD{/LN LN 1 add D PD}if /PD -1 D /NS 0 D /NB 0 D /TB f D /Ph f D /Mf 0 D /HM f D} D /RS {/TM E D /CN 0 D TM{10 eq{TM CN ( ) PI}if /CN CN 1 add D}forall /CN 0 D /BK HM EN and{0}{1}ie D TM {dup 32 ne{TM CN 3 2 roll put /CN CN 1 add D /BK 0 D} {pop BK 0 eq{TM CN 32 put /CN CN 1 add D}if /BK 1 D}ie}forall TM 0 CN GI dup dup () ne E ( ) ne and {dup CN 1 sub get 32 eq{/EN f D}{/EN t D}ie}if} D /join {2 copy length E length add string dup 4 2 roll 2 index 0 3 index PI E length E PI}d /WR {(\n) search{dup () ne BP not or {Li 4 le CP E pop YI Li mul add LE add 0 lt and PL 0 eq and{NP}if SH NL pop /Li Li 1 sub D WR}{pop pop WR}ie}{SH}ie /CI 0 D /BP f D} D /SH {dup dup () ne E ( ) ne and PF or CS Mf gt and{/Mf CS D}if T not Wf and{( ) E join /T t D}if dup BP{/MF CS D}if AT 3 eq{2 copy length dup 0 gt{/NB E NB add D {( ) search{/NS NS 1 add D pop pop}{pop exit}ie}loop}{pop pop}ie}if CD PD 0 lt and{dup DC search{SW pop /PD E L1 add D pop pop}{pop}ie}if 0 Np dup SW pop L1 add /L1 E D dup () ne {C1 (\() join E join (\)) join AU AF and UF or Wf and{( U ) join}if sF{( s ) join}if ( S ) join /C1 E D dup length 1 sub get 32 eq /TB E D /Bw BW D}{pop pop}ie} D /BG {AI LG BC add add 0 eq} D /ON {OU{Ty AR AI NN get dup 1 add Ln Ns Ty 2 mod 0 eq{(. )}{(\) )}ie join dup SW pop neg 0 R CP E 0 lt{0 E M}{pop}ie CP BB show /Ms t D}if} D /Ln {AR AI 3 -1 roll put}D /SP {dup CI lt BP not and{dup CI sub 0 E R /CI E D}{pop}ie} D /BN {PF{WR /HM f D}{BT NL}ie} D /NN {dup 0 lt{pop 0}if} D /h {(h) HI ST cvs join cvx exec dup 1 get E Nf{0 get E join}{pop}ie} D /H {/fn FN D /Hi E 1 add D 1 sub /HL E D /H2 HL 2 add D /GS EZ H2 get D E Tm H2 get GS mul BE dup 0 gt{1 sub}{pop EG H2 get dup 0 lt{pop AT}if}ie NA WW Np /SL SL 1 add D /FN EF H2 get D GS Ey H2 get FS EU H2 get Sc Hs not HL Hl lt and Hs HL hl lt and or Hi 0 eq or {/HI Hi D /Hs t D /hl HL D /Hv HL D}if HL Hl lt{/hi Hi D}if Nf HI 0 gt and{(h) Hi ST cvs join cvx exec 0 get WB}if /HF t D /AH f D /PO f D} D /EH {Bm H2 get GS mul BE OA /SL SL 1 sub NN D /CF 0 D /FN fn D SZ SL get FR SL get FS /HF f D /GS Ts D ()Ec} D /P {E PF{WR}{PO{EP}{BN}ie Ts 4 mul Np AE not{Tm 0 get Ts mul neg SP}if dup 0 ge AH and{Pi Pd}if}ie 1 sub dup 0 lt{pop AV AL get}if /AT E D /PO t D} D /EP {PF{WR}{BN Ts 4 mul Np}ie AE not{Bm 0 get Ts mul neg SP}if /AT AV AL get D /PO f D} D /BE {E PO{EP}{BN}ie Ts 4 mul Np neg SP} D /HR {/Aw W EO sub D /RW E dup 0 gt{Aw mul}{neg}ie dup Aw gt{pop Aw}if D /RZ E D E BN Ts neg SP 1 sub 2 div Aw RW sub mul EO add CP E pop M PF{0 Ps neg R}if 0 Np OU{gsave RZ LW Cf{Hc VC}{0 Sg}ie CP BB RW 0 RL CP BB stroke grestore}if /CI 0 D /BP f D PF not{Ts neg SP}if /Ms t D} D /AD {I NL EG 14 get dup 0 lt{pop AT}if NA /AE t D Tm 14 get Ts mul neg SP Cf{EU 14 get dup -1 eq{pop CA CL get}if Sc}if} D /DA {BN ()ES OA /AE f D ()Ec Bm 14 get Ts mul neg SP} D /PR {/MW E D /Li E D Tm 1 get Ps mul BE 0 NA /FN Fp D /PF t D SI /SL SL 1 add D /CF 0 D Ps CS mul Ts div MW WC mul CS mul Ts div dup LL gt PL 0 eq and {LL div div}{pop}ie Ey 1 get FS CP E pop LE add YI neg div cvi dup Li lt AH and{4 lt YI Li mul 5 mul LE add 0 gt or PL 0 eq and{NP}if}{pop}ie EU 1 get Sc /GS Ps D}D /RP {WR NL () /PF f D SI /FN 0 D ES Bm 1 get Ps mul neg SP OA /GS Ts D} D /SI {/XO Lm 15 get BC NN mul Lm 16 get AI UI sub NN mul add Lm 17 get UI NN mul add Lm 20 get LG NN mul add Ts mul PF{Lm 1 get Ps mul add}if EO add D /MR Rm 15 get BC NN mul Rm 16 get AI UI sub NN mul add Rm 17 get UI NN mul add Rm 20 get LG NN mul add Ts mul PF{Rm 1 get Ps mul add}if D /LL W XO sub MR sub D} D /DT {/cC E D BN /LG LG 1 sub D SI /LG LG 1 add D WW 2 div Np BL} D /DD {WB Cc 0 eq cC 0 eq and L1 0 eq or Lm 20 get Ts mul L1 sub TB{BW add}if Ts 2 div lt or NL /LF E D SI BL /cC 0 D} D /DL {Dc LG Cc put /Cc E D BG{Tm 18 get Ts mul BE}{BN}ie /LG LG 1 add D BL} D /LD {BN LG 0 gt{/LG LG 1 sub D}if /Cc Dc LG get D SI BG{()Bm 18 get Ts mul BE}if BL} D /UL {BG{Tm 17 get Ts mul BE}{BN}ie NR AI NN 0 put /UI UI 1 add D /AI AI 1 add D SI BL} D /LU {BN /UI UI 1 sub D /AI AI 1 sub D SI BG{()Bm 17 get Ts mul BE}if BL} D /OL {E BG{Tm 16 get Ts mul BE}{BN}ie TR AI NN Ty put /Ty E D NR AI NN 1 put /AI AI 1 add D SI BL 1 Ln} D /LO {BN /AI AI 1 sub D /Ty TR AI get D SI BG{()Bm 16 get Ts mul BE}if BL} D /LI {E BN -1 SP /BP f D /CI 0 D 0 Np NR AI 1 sub NN get 1 eq {dup dup 0 gt E 4 le and{/Ty E D}{pop}ie /L1 L1 Ty AR AI NN get Ns SW pop XO sub dup 0 lt{pop 0}if add D ( ON )} {pop ( B )}ie C1 E join /C1 E D CS Mf gt{/Mf CS D}if BL} D /BQ {Tm 15 get Ts mul BE /BC BC 1 add D SI BL} D /QB {Bm 15 get Ts mul BE /BC BC 1 sub D SI BL} D /Al {E EP 1 sub dup 0 lt{pop AV AL get}if NA} D /Ea {EP OA} D /WB {PF{WR}{BT}ie} D /F1 {WB /FN 0 D CS 0 FS} D /F2 {WB /FN WI D CS 0 FS} D /HY {/Hy t D WB /Hy f D} D /YH {WB} D /A {/LT E D LT 1 eq{/RN E D}if /Lh E D WB /C1 C1 ( Cp ) join D Lc AF not and{Cl Sc}if /AF t D} D /EA {Lc AF and{Ec}{WB}ie TL Pa AF and Lh 0 ne and {( \() Lh join (\)) join /AF f D WB}if /AF f D} D /TL {C1 ( Tl ) apa /C1 E D} d /apa {AF OU and Lh 0 ne LT 1 eq or and{LT 1 eq{RN ( /) E ST cvs join} {(\() Lh join (\)) join}ie E join join}{pop}ie} d /Cp {/Xc CP /Yc E D D} D /SS {Cf{dup 0 ge{EU E get dup -1 eq{pop CA CL get}if}{pop CA CL get}ie Sc} {pop}ie SZ SL get /SL SL 1 add D} D /I {WB 8 SS 1 FS} D /EM {WB 8 SS /CF CF 1 xor D 0 FS} D /BD {WB 9 SS 2 FS} D /TT {WB 10 SS /FN Fp D 0 FS} D /KB {WB 11 SS /FN Fp D 2 FS} D /CT {WB 12 SS 1 FS} D /SM {WB 13 SS /FN Fp D 0 FS} D /Q {/QL QL 1 add D QO QL 2 mod get La get join WB} D /EQ {QC QL 2 mod get La get join WB /QL QL 1 sub D} D /RO {WB -1 SS /CF 0 D 0 FS} D /SY {WB -1 SS -1 FS} D /MY {WB -1 SS -2 FS} D /ES {WB /SL SL 1 sub NN D /CF 0 D /FN FO SL get D SZ SL get FR SL get FS ()Ec}D /FZ {3 sub 1.2 E exp GS mul E WB TL /C1 C1 ( Cp ) join D /SL SL 1 add D 0 FS} D /Ef {WB TL ()ES /C1 C1 ( Cp ) join D} D /BZ {dup /Bf E D FZ}D /Sc {dup -1 ne Cf and{/CL CL 1 add D dup 0 eq{pop [0 0 0]}if dup CA E CL E put VS ( VC ) join C1 E join /C1 E D}{pop}ie} D /Ec {WB Cf{/CL CL 1 sub NN D CA CL get VS ( VC ) join C1 E join /C1 E D}if} D /VS {dup type /arraytype eq{([) E {ST cvs join ( ) join}forall (]) join}if} D /VC {{255 div}forall setrgbcolor} D /Sl {dup type /integertype ne{Ds}if /La E D WB}d /UN {WB /UF t D} D /NU {WB /UF f D} D /SE {WB /sF t D} D /XE {WB /sF f D} D /sM {/C1 C1 ( k1 ) join D}d /eM {/C1 C1 ( k2 ) join D}d /k1 {/YC CP E pop Ts add D /mF t D /f1 t D}d /k2 {gsave 3 LW -9 CP E pop Ts 0.2 mul sub M -9 YC L stroke grestore /mF f D}d /Ac {/AC E D WB}d /Ca {eA{( \()join AC join(\) )join}if WB}d /s {OU{gsave 0 CS .25 mul R dup SW pop CJ 0 RL stroke grestore}if}D /CJ {AT 3 eq LB and{E dup dup length 1 sub A1 mul E {( ) search{pop pop E A2 add E}{pop exit}ie}loop 3 -1 roll add W CP pop sub 2 copy gt{E}if pop}if}D /So {/Co E D} D /SO {C1 Yo ST cvs join ( So ) join /C1 E D (j) SW pop 2 div Pd} D /Se {E WB CS E div Pd}D /Pd {dup type /stringtype eq{SW pop}if dup /L1 E L1 add D ST cvs ( 0 R ) join C1 E join /C1 E D} D /Sp {0.35 CO} D /Sb {-0.2 CO} D /CO {OV Io Yo put /Yo E CS mul Yo add D /Io Io 1 add D -1.5 Io mul 3 add FZ SO CS Yo add dup YA gt{/YA E D}{pop}ie Yo neg dup YB gt{/YB E D}{pop}ie} D /Es {ES /Io Io 1 sub NN D /Yo OV Io get D SO} D /SB {/N2 0 D 0 1 NI{/N E D{IX N2 get 0 lt{/N2 N2 1 add D}{exit}ie}loop /K WS N get FC N get mul D /NY AY N2 get D /BV NY array D 0 1 NY 1 sub{/TM K string D currentfile TM readhexstring pop pop BV E TM put} for BM N BV put /N2 N2 1 add D}for} D /IC [{/MA E D /MB 0 D}{2 div /MA E D /MB MA D}{/MB E CS sub D /MA CS D} {pop /MA YS AB mul D /MB 1 AB sub YS mul D}{pop /MA 0 D /MB 0 D}] D /IP {BV N get /N N 1 add D} D /II {/K E D IX K get 0 lt{/EC E D}if /TY E D TY 4 eq{/Y E D /X E D}if TY 3 eq{/AB E D}if /XW AX K get D /YW AY K get D /IS SG IT K get get D /XS XW IS mul D /YS YW IS mul D YS IC TY get exec /MA MA Fl not{3 add}if D} D /IM {II /ty TY D /xs XS D /ys YS D /ya YA D /yb YB D /ma MA D /mb MB D /k K D /ec EC D /BP f D /CI 0 D WB TL L1 xs add dup XO add MR add W gt {pop /ma ma Fl{3 add}if D NL /YA ma D /YB mb D /YS ys D /L1 xs D} {/L1 E D ma YA gt{/YA ma D}if mb YB gt{/YB mb D}if}ie /TB f D OU{CP E pop YS sub LE neg lt Fl not and PB not and{NP /YA ma D /YB mb D}if /BP f D ty ST cvs ( ) join IX k get 0 lt{(\() join ec join (\) ) join}if k ST cvs join ty 3 eq{AB ST cvs ( ) join E join}if ty 4 eq{X ST cvs ( ) join Y ST cvs join ( ) join E join}if C1 E join ( DI ) join FP 2 eq FP 1 eq AF and or{( FM ) join}if ( Il Cp ) apa /C1 E D /EN f D}if /HM t D /T f D} D /DI {II /Xc CP /Yc E D D /YN YW neg D /HM t D /CI 0 D /K2 IX K get D gsave TY 4 eq{OX X IS mul add OY FY add YS sub Y IS mul sub} {/FY YS D CP MB sub 2 copy /OY E D /OX E D}ie translate K2 0 ge{/DP AZ K2 get D /BV BM K2 get D XS YS scale /N 0 D XW YW DP [XW 0 0 YN 0 YW] {IP} FC K2 get 1 eq{image}{f 3 colorimage}ie} {EX}ie grestore XS 0 R /Ms t D} D /FM {gsave 0 Sg CP MB sub translate XS neg 0 M 0 YS RL XS 0 RL 0 YS neg RL XS neg 0 RL stroke grestore} D /NA {/AT E D /AL AL 1 add D AV AL AT put} D /OA {AL 0 gt{/AL AL 1 sub D /AT AV AL get D}if} D /D1 {/BR {CP E pop E BN Mb{CP E pop eq{0 YI R}if}{pop}ie} D /Sn {OU{C1 E ST cvs join ( Ld ) join /C1 E D}{pop}ie} D} D /D1 {/BR {BN} D /Sn {OU {C1 E ST cvs join ( Ld ) join /C1 E D} {pop} ie} D} D /TC {/TF t D /ML 0 D HN{SW pop dup ML gt{/ML E D}{pop}ie}forall NP /RM RM not D RC /OU Tc D Ep /PN 0 D Ms not TP and{Ip}if /W IW ML sub Ts sub D /A0 0 D TH{/BR {( ) join BT} D /Sn {pop} D /Au () D}if} D /TN {0 eq{E EA PF HF or not XR and{HN E get Xr}{pop}ie} {OU{Tn 0 ge{() BN}if /Tn E D}{pop}ie WB}ie} D /NT {OU LB not and Tn 0 ge and{PL 0 eq{Ms not{CS CF FS}if CP dup /y E YA sub D W 9 sub CS -1.8 mul XO L1 add 2 add{y M (.) show}for HN Tn get dup SW pop IW E sub y M show CP BB M}if /Tn -1 D}if} D /Ld {/DN E D HN DN Pn put [/View [/XYZ -4 Fl{PS}{CP YA add US E pop}ie null] /Dest DN ST cvs cvn /DEST pdfmark} D /C {ND 1 eq{1 sub}if TI mul /XO E D NL Nf not{pop()}if 0 3 -1 roll 1 A} D /OP {BP not{NP}if PN 2 mod 0 eq{/Ms t D NP}if}D /Ep {Xp PN 2 mod 0 eq and OU and{/Pn (-) D showpage /PM 1 D LA}if}D /Dg [73 86 88 76 67 68 77] D /Rd [0 [1 1 0][2 1 0][3 1 0][2 1 1][1 1 1][2 2 1][3 3 1][4 4 1][2 1 2]] D /Ns {/m E D /c E 32 mul D /j m 1000 idiv D /p j 12 add string D c 96 le m 0 gt and{c 32 le {/i 0 D /d 77 D /l 100 D /m m j 1000 mul sub D j -1 1 {pop p i d c add put /i i 1 add D}for 4 -2 0 {/j E D /n m l idiv D /m m n l mul sub D /d Dg j get D n 0 gt {/x Rd n get D x 0 get -1 1 {pop p i d c add put /i i 1 add D}for p i x 1 get sub Dg x 2 get j add get c add put}if /l l 10 idiv D }for p 0 i GI} {/i ST length 1 sub D m {1 sub dup 0 ge{dup 26 mod c add 1 add ST i 3 -1 roll put 26 idiv dup 0 eq{pop exit}if}if /i i 1 sub D}loop ST i ST length i sub GI}ie} {m p cvs}ie} D /US {matrix currentmatrix matrix defaultmatrix matrix invertmatrix matrix concatmatrix transform} D /GB {Gb{US}if}D /Tl {/Rn E D Xc CP pop ne{ [/Rect [Xc 1 sub Yc cS 0.25 mul sub GB CP E 1 add E cS 0.85 mul add GB] /Subtype /Link /Border [0 0 Cf Lc and LX and AU or{0}{1}ie] Rn type /nametype eq {/Dest Rn}{/Action [/Subtype /URI /URI Rn] Cd}ie /ANN pdfmark}if} D /Il {/Rn E D [/Rect [Xc Yc GB Xc XS add Yc YS add GB] /Subtype /Link /Border [0 0 0] Rn type /nametype eq{/Dest Rn} {/Action [/Subtype /URI /URI Rn] Cd}ie /ANN pdfmark} D /XP {[{/Z Bz 2 div D Z 0 R Z Z RL Z neg Z RL Z neg Z neg RL Z Z neg RL Fi cH 1 eq and{fill}if} {Bz 0 RL 0 Bz RL Bz neg 0 RL 0 Bz neg RL Fi cH 1 eq and{fill}if} {0 -5 R Bz 0 RL 0 21 RL Bz neg 0 RL 0 -21 RL}]} D /MS {/Sm E D WB}D /O {BN()Sm BX} D /O {BN()0 Sm BX} D /BX {/Bt E D Bt 2 lt{/Ch E D CS 0.8 mul}{11 mul}ie W XO sub MR sub 2 copy gt{E}if pop /HZ E D Bt 2 eq{Fi not{pop()}if ( )E join /Ft E D TT /PF t D /MW 1 D /Li 1 D /Fw Ft SW pop D Fw HZ gt{/HZ Fw 8 add D}if HZ ST cvs( )join}{WB Ch ST cvs( )join}ie L1 HZ add XO add MR add W gt{NL}if Bt 2 eq{Ft ES Fw neg HM{CS sub}if Pd}if Bt ST cvs join( Bx )join Bt 2 eq HM and{CS Pd}if C1 E join /C1 E D /L1 L1 HZ add D /T f D ( ) Pd /PF f D Bt 2 lt{YA CS .8 mul lt{/YA CS .8 mul D}if} {YB 5 lt{/YB 5 D}if YA 21 lt{/YA 21 D}if}ie /CI 0 D} D /Bx {dup 2 eq{E /Bz E D}{E /cH E D /Bz CS .8 mul D}ie OU {gsave 0 Sg XP E get exec stroke grestore}{pop}ie Bz 0 R /Ms t D}D /SD {FD 4 mul Dy add DZ NF newpath 0 0 M DX t charpath pathbbox 3 -1 roll sub /DY E D E dup /X1 E D sub WM mul WX DY mul add WM DG mul E div /DF E D /DR WX DF mul DY mul WM div 2 div D} d /Sd {gsave 0 IL Di mul neg translate IL IW atan Di 0 eq{neg}if rotate FD 4 mul Dy add DZ NF DR X1 sub DY 2 div neg M cD VC DX show grestore} d /Pt {/tp t D Tp{NP /Pn (TP) D 0 Tt neg R Th BN NP Ep ET RC ZF}if /tp f D} D /RC {/AI 0 D /LG 0 D /BC 0 D /UI 0 D /PF f D /Cc 0 D /cC 0 D /Dc 10 array D /NR [0 1 9{pop 0}for] D /La Ds D /AR 10 array D /TR 10 array D /AV 30 array D SI /AL -1 D /AT A0 D AT NA /OV 9 array D /Yo 0 D /Co 0 D /Io 0 D /Hy f D /Ph f D /CL -1 D Ct Sc}D /ZF {/FR [0 1 30{pop 0}for] D /SZ [0 1 30{pop 0}for] D /FO [0 1 30{pop 0}for] D /SL 0 D /CF 0 D /FN 0 D 0 Ts SF}D /QO [[(\234)(\233)(\253\240)(\232)(\273)(\253)][(')(`)(\253\240)(\231)(\273)(\253)]] D /QC [[(\234)(\234)(\240\273)(\233)(\253)(\273)][(')(')(\240\273)(`)(\253)(\273)]] D /Hf EF length 2 sub D /Hz EZ Hf get D /HS Ey Hf get D /Fz EZ Hf 1 add get D /Fs Ey Hf 1 add get D /LE IL D /Ps EZ 1 get D /Fp EF 1 get D /XO 0 D /YI 0 D /CI 0 D /FP 0 D /WW Ts 7 mul D /Mf 0 D /YA 0 D /YB 0 D /Cs Ts D /GS Ts D /F0 0 D /NS 0 D /NB 0 D /N 0 D /C0 [] D /C1 () D /Lo 0 D /L1 0 D /LM 0 D /PH 0 D /EC 0 D /Lh 0 D /LT 0 D /CH 1 string D /ST 16 string D /CA 9 array D /HC (\255) D /HM f D /PF f D /EN f D /TB f D /UF f D /sF f D /AE f D /AF f D /BP t D /CD f D /PA t D /GL f D /T t D /HF f D /AH f D /SA f D /PB f D /f1 f D /mF f D /OX 0 D /OY 0 D /FY 0 D /EO 0 D /FB 0 D /PL 0 D /Bw 0 D /PD -1 D /TP f D /tp f D /TH f D /Ty 4 D /Tn -1 D /Fl t D /LB t D /PM 1 D /Ms f D /Ba f D /Bb f D /Hl 3 D /hl 6 D /Hv 6 D /Hs f D /HI 0 D /hi 0 D /PO t D /TE f D /LF t D /BO 0 D /Sm 1 D /Bf 3 D /A1 0 D /A2 0 D /Ds 1 D /QL -1 D /Cb Db D /Ct Dt D /Cl Dl D [/Creator (html2ps version 1.0 beta5) /Author () /Keywords () /Subject () /Title (The Funtools Help Facility) /DOCINFO pdfmark /ND 18 D /HN [(1) (1) (1) (1) (8) (9) (19) (21) (28) (30) (33) (37) (38) (41) (42) (45) (48) (51) (53) (??) (54) (56) (56) (87) (57) (58) (60) (62) (64) (65) (76) (77) (66) (73) (75) (82) (85) (78) (80) (86) (87) (57) (91) (91) (92) (92) (94) (102) (111) (95) (96) (100) (117) (123) (127) (136) (152) (157) (161) (164) (165) (167) (171) (1) (1) (1) (3) (1) (1) (1) (8) (9) (19) (21) (28) (30) (33) (37) (38) (41) (42) (45) (48) (50) (51) (51) (51) (51) (52) (53) (53) (53) (53) (53) (54) (56) (56) (57) (57) (58) (60) (62) (64) (65) (66) (73) (75) (76) (77) (80) (82) (85) (86) (87) (87) (87) (88) (90) (91) (98) (91) (91) (91) (91) (92) (92) (94) (95) (96) (98) (99) (100) (101) (102) (102) (102) (102) (102) (103) (104) (105) (105) (108) (109) (110) (111) (111) (111) (111) (111) (111) (112) (113) (114) (114) (115) (116) (116) (116) (117) (119) (119) (120) (120) (120) (117) (117) (117) (117) (119) (119) (120) (120) (120) (121) (122) (123) (123) (123) (123) (126) (127) (127) (127) (127) (127) (129) (129) (130) (131) (131) (132) (132) (133) (135) (136) (136) (136) (136) (146) (151) (152) (152) (152) (152) (156) (157) (157) (157) (157) (157) (158) (159) (160) (161) (161) (161) (161) (161) (161) (162) (162) (163) (164) (164) (164) (164) (164) (165) (165) (165) (165) (165) (166) (167) (167) (167) (167) (170) (171) (171) (171) (171) (171) (172) (172) (172) (175) (178) (178) (179) (180) (181) (181) (182) (182) (183) (183) (184) (184) (184) (184) (185) (185) (185) (186) (187) (187)] D /h0 [()(Table of Contents)] D /h1 [(0.1\240\240)(Funtools: FITS Users Need Tools)] D /h2 [(0.2\240\240)(Summary)] D /h3 [(0.3\240\240)(Description)] D /h4 [(0.3.0.0.1\240\240)(Last updated: January 6, 2006)] D /h5 [(0.4\240\240)(Funtools Programs)] D /h6 [(0.5\240\240)(Summary)] D /h7 [(0.6\240\240)(funcalc - Funtools calculator \(for binary tables\))] D /h8 [(0.7\240\240)(funcen - find centroid \(for binary tables\))] D /h9 [(0.8\240\240)(funcnts - count photons in specified regions, with bkgd subtraction)] D /h10 [(0.9\240\240)(funcone - cone search of a binary table containing RA, Dec columns)] D /h11 [(0.10\240\240)(fundisp - display data in a Funtools data file)] D /h12 [(0.11\240\240)(funhead - display a header in a Funtools file)] D /h13 [(0.12\240\240)(funhist - create a 1D histogram of a column \(from a FITS binary table or raw event file\) or an image)] D /h14 [(0.13\240\240)(funimage - create a FITS image from a Funtools data file)] D /h15 [(0.14\240\240)(funindex - create an index for a column of a FITS binary table)] D /h16 [(0.15\240\240)(funjoin - join two or more FITS binary tables on specified columns)] D /h17 [(0.16\240\240)(funmerge - merge one or more Funtools table files)] D /h18 [(0.17\240\240)(funsky - convert between image and sky coordinates)] D /h19 [(0.18\240\240)(funtable - copy selected rows from a Funtools file to a FITS binary table)] D /h20 [(0.19\240\240)(funtbl - extract a table from Funtools ASCII output)] D /h21 [(0.19.0.0.1\240\240)(Last updated: April 1, 2007)] D /h22 [(0.20\240\240)(FunDS9: Funtools and DS9 Image Display)] D /h23 [(0.21\240\240)(Summary)] D /h24 [(0.22\240\240)(Description)] D /h25 [(0.22.0.0.1\240\240)(Last updated: November 16, 2005)] D /h26 [(0.23\240\240)(FunLib: the Funtools Programming Interface)] D /h27 [(0.24\240\240)(Summary)] D /h28 [(0.25\240\240)(Introduction to the Funtools Programming Interface)] D /h29 [(0.26\240\240)(Funtools Programming Tutorial)] D /h30 [(0.27\240\240)(Compiling and Linking)] D /h31 [(0.28\240\240)(A Short Digression on Subroutine Order)] D /h32 [(0.29\240\240)(Funtools Programming Examples)] D /h33 [(0.30\240\240)(The Funtools Programming Reference Manual)] D /h34 [(0.31\240\240)(FunOpen - open a Funtools data file)] D /h35 [(0.32\240\240)(FunImageGet - get an image or image section)] D /h36 [(0.33\240\240)(FunImagePut - put an image to a Funtools file)] D /h37 [(0.34\240\240)(FunImageRowGet - get row\(s\) of an image)] D /h38 [(0.35\240\240)(FunImageRowPut - put row\(s\) of an image)] D /h39 [(0.36\240\240)(FunColumnSelect - select Funtools columns)] D /h40 [(0.37\240\240)(FunColumnActivate - activate Funtools columns)] D /h41 [(0.38\240\240)(FunColumnLookup - lookup a Funtools column)] D /h42 [(0.39\240\240)(FunTableRowGet - get Funtools rows)] D /h43 [(0.40\240\240)(FunTableRowPut - put Funtools rows)] D /h44 [(0.41\240\240)(FunParamPut - put a Funtools param value)] D /h45 [(0.42\240\240)(FunInfoGet - get information from Funtools struct)] D /h46 [(0.43\240\240)(FunInfoPut - put information into a Funtools struct)] D /h47 [(0.44\240\240)(FunFlush - flush data to output file)] D /h48 [(0.45\240\240)(FunClose - close a Funtools data file)] D /h49 [(0.46\240\240)(FunRef: the Funtools Reference Handle)] D /h50 [(0.47\240\240)(Summary)] D /h51 [(0.48\240\240)(Description)] D /h52 [(0.48.0.0.1\240\240)(Last updated: December 1, 2005)] D /h53 [(0.49\240\240)(FunFiles: Funtools Data Files)] D /h54 [(0.50\240\240)(Summary)] D /h55 [(0.51\240\240)(Description)] D /h56 [(0.52\240\240)(Supported Data Formats)] D /h57 [(0.53\240\240)(FITS Images and Binary Tables)] D /h58 [(0.54\240\240)(Non-FITS Raw Event Files)] D /h59 [(0.55\240\240)(Non-FITS Array Files)] D /h60 [(0.56\240\240)(Specifying Image Sections)] D /h61 [(0.57\240\240)(Binning FITS Binary Tables and Non-FITS Event Files)] D /h62 [(0.58\240\240)(Table and Spatial Region Filters)] D /h63 [(0.59\240\240)(Disk Files and Other Supported File Types)] D /h64 [(0.60\240\240)(Lists of Files)] D /h65 [(0.60.0.0.1\240\240)(Last updated: February 15, 2006)] D /h66 [(0.61\240\240)(Funtext: Support for Column-based Text Files)] D /h67 [(0.62\240\240)(Summary)] D /h68 [(0.63\240\240)(Description)] D /h69 [(0.64\240\240)(Standard Text Files)] D /h70 [(0.65\240\240)(Comments Convert to Header Params)] D /h71 [(0.66\240\240)(Multiple Tables in a Single File)] D /h72 [(0.67\240\240)(TEXT\(\) Specifier)] D /h73 [(0.68\240\240)(Text\(\) Keyword Options)] D /h74 [(0.69\240\240)(Environment Variables)] D /h75 [(0.70\240\240)(Restrictions and Problems)] D /h76 [(0.70.0.0.1\240\240)(Last updated: August 3, 2007)] D /h77 [(0.71\240\240)(Funview: Database View Support for Tables)] D /h78 [(0.72\240\240)(Summary)] D /h79 [(0.73\240\240)(Description)] D /h80 [(0.74\240\240)(Database Views)] D /h81 [(0.75\240\240)(Funtools View Attributes)] D /h82 [(0.76\240\240)(Invoking a Funtools View \(in Place of an Input File\))] D /h83 [(0.77\240\240)(Basic View Matching Rules)] D /h84 [(0.78\240\240)(More on View Matching Rules: Single vs. Multiple Matches)] D /h85 [(0.79\240\240)(View Lists: Applying a View to Any File)] D /h86 [(0.80\240\240)(Overriding Values Associated with a View)] D /h87 [(0.81\240\240)(Environment Variables)] D /h88 [(0.82\240\240)(Restrictions and Problems)] D /h89 [(0.82.0.0.1\240\240)(Last updated: August 3, 2007)] D /h90 [(0.83\240\240)(Funfilters: Filtering Rows in a Table)] D /h91 [(0.84\240\240)(Summary)] D /h92 [(0.85\240\240)(Description)] D /h93 [(0.86\240\240)(Filter Expressions)] D /h94 [(0.87\240\240)(Separators Also Are Operators)] D /h95 [(0.88\240\240)(Range Lists)] D /h96 [(0.89\240\240)(Math Operations and Functions)] D /h97 [(0.90\240\240)(Include Files)] D /h98 [(0.91\240\240)(Header Parameters)] D /h99 [(0.92\240\240)(Examples)] D /h100 [(0.92.0.0.1\240\240)(Last updated: November 17, 2005)] D /h101 [(0.93\240\240)(Funidx: Using Indexes to Filter Rows in a Table)] D /h102 [(0.94\240\240)(Summary)] D /h103 [(0.95\240\240)(Description)] D /h104 [(0.95.0.0.1\240\240)(Last updated: August 3, 2007)] D /h105 [(0.96\240\240)(Regions: Spatial Region Filtering)] D /h106 [(0.97\240\240)(Summary)] D /h107 [(0.98\240\240)(Description)] D /h108 [(0.99\240\240)(Region Expressions)] D /h109 [(0.100\240\240)(Columns Used in Region Filtering)] D /h110 [(0.101\240\240)(Region Algebra)] D /h111 [(0.102\240\240)(Region Separators Also Are Operators)] D /h112 [(0.103\240\240)(Region Exclusion)] D /h113 [(0.104\240\240)(Include Files)] D /h114 [(0.105\240\240)(Global and Local Properties of Regions)] D /h115 [(0.106\240\240)(Coordinate Systems)] D /h116 [(0.107\240\240)(Specifying Positions, Sizes, and Angles)] D /h117 [(0.107.0.0.1\240\240)(Last updated: November 17, 2005)] D /h118 [(0.108\240\240)(RegGeometry: Geometric Shapes in Spatial Region Filtering)] D /h119 [(0.109\240\240)(Summary)] D /h120 [(0.110\240\240)(Geometric shapes)] D /h121 [(0.111\240\240)(Region accelerators)] D /h122 [(0.111.0.0.1\240\240)(Last updated: March 12, 2007)] D /h123 [(0.112\240\240)(RegAlgebra: Boolean Algebra on Spatial Regions)] D /h124 [(0.113\240\240)(Summary)] D /h125 [(0.114\240\240)(Description)] D /h126 [(0.114.0.0.1\240\240)(Last updated: November 17, 2005)] D /h127 [(0.115\240\240)(RegCoords: Spatial Region Coordinates)] D /h128 [(0.116\240\240)(Summary)] D /h129 [(0.117\240\240)(Pixel coordinate systems)] D /h130 [(0.118\240\240)(World Coordinate Systems)] D /h131 [(0.119\240\240)(WCS Positions and Sizes)] D /h132 [(0.120\240\240)(NB: The Meaning of Pure Numbers Are Context Sensitive)] D /h133 [(0.120.0.0.1\240\240)(Last updated: November 17, 2005)] D /h134 [(0.121\240\240)(RegBounds: Region Boundaries)] D /h135 [(0.122\240\240)(Summary)] D /h136 [(0.123\240\240)(Description)] D /h137 [(0.124\240\240)(Image boundaries : radially-symmetric shapes \(circle, annuli, ellipse\))] D /h138 [(0.125\240\240)(Image Boundaries: non-radially symmetric shapes \(polygons, boxes\))] D /h139 [(0.126\240\240)(Row Boundaries are Analytic)] D /h140 [(0.127\240\240)(Image Boundaries vs. Row Boundaries: Practical Considerations)] D /h141 [(0.127.0.0.1\240\240)(Last updated: November 16, 2005)] D /h142 [(0.128\240\240)(RegDiff:Differences Between Funtools and IRAF Regions)] D /h143 [(0.129\240\240)(Summary)] D /h144 [(0.130\240\240)(Description)] D /h145 [(0.130.0.0.1\240\240)(Last updated: November 16, 2005)] D /h146 [(0.131\240\240)(FunCombine: Combining Region and Table Filters)] D /h147 [(0.132\240\240)(Summary)] D /h148 [(0.133\240\240)(Comma Conventions)] D /h149 [(0.133.0.0.1\240\240)(Last updated: November 16, 2005)] D /h150 [(0.134\240\240)(FunEnv: Funtools Environment Variables)] D /h151 [(0.135\240\240)(Summary)] D /h152 [(0.136\240\240)(Description)] D /h153 [(0.136.0.0.1\240\240)(Last updated: November 16, 2005)] D /h154 [(0.137\240\240)(Funtools ChangeLog)] D /h155 [(0.138\240\240)(Patch Release 1.4.5 \(internal ds9 release\))] D /h156 [(0.139\240\240)(Patch Release 1.4.4 \(internal ds9 release\))] D /h157 [(0.140\240\240)(Patch Release 1.4.3 \(internal ds9 release\))] D /h158 [(0.141\240\240)(Patch Release 1.4.2 \(internal ds9 release\))] D /h159 [(0.142\240\240)(Patch Release 1.4.1 \(internal ds9 release\))] D /h160 [(0.143\240\240)(Public Release 1.4.0 \(15 August 2007\))] D /h161 [(0.144\240\240)(Release 1.3.0b[n] \(mainly internal SAO beta releases\))] D /h162 [(0.145\240\240)(Patch Release 1.2.4 \(internal SAO and beta release only\))] D /h163 [(0.146\240\240)(Patch Release 1.2.3 \(12 January 2004\))] D /h164 [(0.147\240\240)(Patch Release 1.2.3b1 \(19 August 2003\))] D /h165 [(0.148\240\240)(Patch Release 1.2.2 \(18 May 2003\))] D /h166 [(0.149\240\240)(Patch Release 1.2.1 \(24 April 2003\))] D /h167 [(0.150\240\240)(Public Release 1.2.0 \(24 March 2003\))] D /h168 [(0.151\240\240)(Beta Release 1.2.b3 \(4 February 2003\))] D /h169 [(0.152\240\240)(Beta Release 1.2.b2 \(7 October 2002\))] D /h170 [(0.153\240\240)(Beta Release 1.2.b1 \(24 September 2002\))] D /h171 [(0.154\240\240)(Public Release 1.1.0 \(22 April 2002\))] D /h172 [(0.155\240\240)(Pre-Release 1.1.0e \(10 April 2002\))] D /h173 [(0.156\240\240)(Pre-Release 1.1.0e \(19 March 2002\))] D /h174 [(0.157\240\240)(Pre-Release 1.1.0e \(27 February 2002\))] D /h175 [(0.158\240\240)(Pre-Release 1.1.0e \(11 February 2002\))] D /h176 [(0.159\240\240)(Beta Release 1.0.1b5 \(31 January 2002\))] D /h177 [(0.160\240\240)(Beta Release 1.0.1b4 \(26 January 2002\))] D /h178 [(0.161\240\240)(Beta Release 1.0.1b3 \(4 January 2002\))] D /h179 [(0.162\240\240)(Beta Release 1.0.1b2 \(14 November 2001\))] D /h180 [(0.163\240\240)(Beta Release 1.0.1b1 \(6 November 2001\))] D /h181 [(0.164\240\240)(Public Release 1.0.0 \(31 July 2001\))] D /h182 [(0.164.0.0.1\240\240)(Last updated: 22 April 2002)] D /Hr [-63 63 64 65 -66 -66 66 -67 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 -83 -83 83 -85 85 86 87 -88 -88 88 -91 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 -117 -117 117 -120 120 121 122 123 124 125 126 127 128 129 130 131 -132 -132 132 -134 134 135 136 137 138 139 140 141 142 143 -144 -144 144 -146 146 147 148 149 150 151 152 153 154 155 156 157 -158 -158 158 -165 165 166 167 168 169 170 171 172 173 174 -175 -175 175 -177 177 178 179 -180 -180 180 -182 182 183 184 185 186 187 188 189 190 191 192 193 -194 -194 194 -196 196 197 198 199 -200 -200 200 -202 202 203 204 -205 -205 205 -207 207 208 209 210 211 212 -213 -213 213 -215 215 216 217 218 219 220 221 -222 -222 222 -224 224 225 226 -227 -227 227 -230 230 231 232 -233 -233 233 -235 235 236 237 -238 -238 238 -239 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 -267 -267 267]D /HV [1 2 2 2 3 4 5 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 4 5 1 2 2 2 3 4 5 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 4 5 1 2 2 2 2 2 2 2 2 2 2 2 2 3 4 5 1 2 2 2 2 2 2 2 2 2 2 3 4 5 1 2 2 2 2 2 2 2 2 2 2 2 2 3 4 5 1 2 2 2 2 2 2 2 2 2 2 3 4 5 1 2 2 2 3 4 5 1 2 2 2 2 2 2 2 2 2 2 2 2 3 4 5 1 2 2 2 2 3 4 5 1 2 2 2 3 4 5 1 2 2 2 2 2 2 3 4 5 1 2 2 2 2 2 2 2 3 4 5 1 2 2 2 3 4 5 1 2 2 2 3 4 5 1 2 2 2 3 4 5 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 4 5]D /Cn [3 0 0 1 1 1 0 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 3 0 0 1 1 1 0 26 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 12 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 10 0 0 0 0 0 0 0 0 0 1 1 1 0 12 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 10 0 0 0 0 0 0 0 0 0 1 1 1 0 3 0 0 1 1 1 0 12 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 4 0 0 0 1 1 1 0 3 0 0 1 1 1 0 6 0 0 0 0 0 1 1 1 0 7 0 0 0 0 0 0 1 1 1 0 3 0 0 1 1 1 0 3 0 0 1 1 1 0 3 0 0 1 1 1 0 28 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0]D Hr length 0 gt{[/PageMode /UseOutlines /DOCVIEW pdfmark}if /Hn 1 D 0 1 Hr length 1 sub{ /Bn E D [Cn Bn get dup 0 gt{/Count E HV Bn get Bl ge{neg}if}{pop}ie /Dest Hr Bn get dup abs ST cvs cvn E 0 ge{(h)Hn ST cvs join cvx exec dup 1 get E Nf{0 get E join}{pop}ie /Hn Hn 1 add D}{()}ie /Title E dup length 255 gt{0 255 getinterval}if /OUT pdfmark}for ZF /FN Fp D Ps 0 FS /WC Wf{( )}{}ie SW pop D ET RC ZF /Df f D /R1 (http://hea-www.harvard.edu/saord/ds9/index.html) D /R2 (http://hea-www.harvard.edu/saord/xpa/index.html) D /R3 (ftp://cfa-ftp.harvard.edu/pub/gsc/WCSTools/home.html) D /R4 (http://tdc-www.harvard.edu/software/wcstools/) D /R5 (http://hea-www.harvard.edu/RD/funtools/changelog.html) D /R6 (http://hea-www.harvard.edu/RD/funtools/changelog_beta.html) D /Ba f D /BO 0 D Bs /UR (help.html) D /Ti (The Funtools Help Facility) D /Au () D /Df f D /ME [()] D TC /Cb Db D /Ct [16#00 16#00 16#00] D /Cl [16#00 16#00 16#00] D /CL -1 D Ct Sc /Ba f D /BO 0 D Bs /UR (help.html) D /Ti (The Funtools Help Facility) D /Au () D /Df f D /ME [()] D TC NP RC ZF ()1 Sl()WB 0 Sn( )0 2 0 H(Funtools:)WB 63 Sn()WB 1 Sn( FITS Users Need Tools)EA()EH( )0 2 1 H(Summary)WB 64 Sn()EH( This document is the Table of Contents for Funtools. )0 2 2 H(Description)WB 65 Sn()EH( Funtools, is a "minimal buy-in" FITS library and utility package developed at the the High Energy Astrophysics Division of SAO. The Funtools library provides simplified access to a wide array of file types: standard astronomical FITS images and binary tables, raw arrays and binary event lists, and even tables of ASCII column data. A sophisticated region filtering library \201compatible with ds9\202 filters images and tables using boolean operations between geometric shapes, support world coordinates, etc. Funtools also supports advanced capabilities such as optimized data searching using index files. The main goal of the Funtools project has been to develop a minimal buy-in FITS library for researchers who are occasional \201but serious\202 coders. In this case, "minimal buy-in" means "easy to learn, easy to use, and easy to re-learn next month". We have tried to achieve this goal by emphasizing two essential capabilities. The first is the ability to develop FITS programs without knowing much about FITS, i.e., without having to deal with the arcane rules for generating a properly formatted FITS file. The second is to support the use of already-familiar C/Unix facilities, especially C structs and Unix stdio. Taken together, these two capabilities should allow researchers to leverage their existing programming expertise while minimizing the need to learn new and complex coding rules. )0 P(Choose from the following topics: )0 P()UL()-1 LI()0 2 1 A(Funtools User Programs)2 1 TN TL()Ec /AF f D( )UL()-1 LI()0 3 1 A(funcalc: Funtools calculator \201for binary tables\202)3 1 TN TL()Ec /AF f D( )-1 LI()0 4 1 A(funcen: find centroid \201for binary tables\202)4 1 TN TL()Ec /AF f D( )-1 LI()0 5 1 A(funcnts: count photons in specified regions)5 1 TN TL()Ec /AF f D( )-1 LI()0 6 1 A(funcone: cone search on RA, Dec columns)6 1 TN TL()Ec /AF f D( )-1 LI()0 7 1 A(fundisp: display data in a Funtools data file)7 1 TN TL()Ec /AF f D( )-1 LI()0 8 1 A(funhead: display a header in a Funtools file)8 1 TN TL()Ec /AF f D( )-1 LI()0 9 1 A(funhist: create a 1D histogram of a column)9 1 TN TL()Ec /AF f D( )-1 LI()0 10 1 A(funimage: create a FITS image from a Funtools data file)10 1 TN TL()Ec /AF f D( )-1 LI()0 11 1 A(funindex: create an index on a column in a binary table)11 1 TN TL()Ec /AF f D( )-1 LI()0 12 1 A(funjoin: join two or more FITS binary tables on specified columns)12 1 TN TL()Ec /AF f D( )-1 LI()0 13 1 A(funmerge: merge one or more Funtools table files)13 1 TN TL()Ec /AF f D( )-1 LI()0 14 1 A(funsky: convert between image and sky coordinates, using WCS info from a FITS header)14 1 TN TL()Ec /AF f D( )-1 LI()0 15 1 A(funtable: copy selected rows from a Funtools file to a FITS binary table)15 1 TN TL()Ec /AF f D( )-1 LI()0 16 1 A(funtbl: extract a table from Funtools ASCII output)16 1 TN TL()Ec /AF f D( )-1 LI()0 17 1 A(funtools and ds9 image display)17 1 TN TL()Ec /AF f D( )LU( )-1 LI()0 18 1 A(Funtools Programming)18 1 TN TL()Ec /AF f D( )UL()-1 LI()0 19 1 A(Funtools Programming Summary)19 1 TN TL()Ec /AF f D( )-1 LI()0 20 1 A(Funtools Programming Tutorial)20 1 TN TL()Ec /AF f D( )-1 LI()0 21 1 A(A Short Digression on Subroutine Order)21 1 TN TL()Ec /AF f D( )-1 LI()0 22 1 A(Compiling and Linking)22 1 TN TL()Ec /AF f D( )-1 LI()0 23 1 A(The Funtools Reference Handle)23 1 TN TL()Ec /AF f D( )-1 LI()0 24 1 A(The Funtools Programming Reference Manual)24 1 TN TL()Ec /AF f D( )UL()-1 LI( )0 25 1 A(FunOpen: open a Funtools file)25 1 TN TL()Ec /AF f D( )-1 LI()0 26 1 A(FunImageGet: retrieve image data)26 1 TN TL()Ec /AF f D( )-1 LI()0 27 1 A(FunImagePut: output image data)27 1 TN TL()Ec /AF f D( )-1 LI()0 28 1 A(FunImageRowGet: retrieve image data by row)28 1 TN TL()Ec /AF f D( )-1 LI()0 29 1 A(FunImageRowPut: output image data by row)29 1 TN TL()Ec /AF f D( )-1 LI()0 30 1 A(FunTableRowGet: retrieve rows from a table)30 1 TN TL()Ec /AF f D( )-1 LI()0 31 1 A(FunTableRowPut: output rows to a table)31 1 TN TL()Ec /AF f D( )-1 LI()0 32 1 A(FunColumnSelect: select columns in a table for access)32 1 TN TL()Ec /AF f D( )-1 LI()0 33 1 A(FunColumnActivate: activate columns in a table for read/write)33 1 TN TL()Ec /AF f D( )-1 LI()0 34 1 A(FunColumnLookup: lookup info about the columns in a table)34 1 TN TL()Ec /AF f D( )-1 LI()0 35 1 A(FunInfoGet: get info about an image or table)35 1 TN TL()Ec /AF f D( )-1 LI()0 36 1 A(FunInfoPut: put info about an image or table)36 1 TN TL()Ec /AF f D( )-1 LI()0 37 1 A(FunParamGet: get header param)37 1 TN TL()Ec /AF f D( )-1 LI()0 38 1 A(FunParamPut: put header param)38 1 TN TL()Ec /AF f D( )-1 LI()0 39 1 A(FunFlush: flush I/O in a Funtools file)39 1 TN TL()Ec /AF f D( )-1 LI()0 40 1 A(FunClose: close a Funtools file)40 1 TN TL()Ec /AF f D( )LU( )-1 LI()0 41 1 A(Funtools Programming Examples)41 1 TN TL()Ec /AF f D( )UL( )-1 LI()0 2 A(evmerge: merge new columns with existing columns)EA( )-1 LI()0 2 A(evcols: add column and rows to binary tables)EA( )-1 LI()0 2 A(imblank: blank out image values below a threshold)EA()LU()LU( )-1 LI()0 42 1 A(Funtools Data Files)42 1 TN TL()Ec /AF f D( )UL( )-1 LI()0 43 1 A(Supported Data Formats)43 1 TN TL()Ec /AF f D( )UL()-1 LI()0 44 1 A(FITS File and Extensions)44 1 TN TL()Ec /AF f D( )-1 LI()0 45 1 A(Non-FITS Raw Event Files)45 1 TN TL()Ec /AF f D( )-1 LI()0 46 1 A(Non-FITS Array Files)46 1 TN TL()Ec /AF f D( )-1 LI()0 47 1 A(Column-based Text \201ASCII\202 Files)47 1 TN TL()Ec /AF f D( )-1 LI()0 48 1 A(Database Views of Tables)48 1 TN TL()Ec /AF f D()LU( )-1 LI()0 49 1 A(Image Sections and Blocking)49 1 TN TL()Ec /AF f D( )-1 LI()0 50 1 A(Binning FITS Binary Tables and Non-FITS Event Files)EH( )-1 LI()0 51 1 A(Disk Files and Other Supported File Types)50 1 TN TL()Ec /AF f D()LU( )-1 LI(Funtools Data Filtering )UL()-1 LI()0 52 1 A(Table Filtering)51 1 TN TL()Ec /AF f D( )-1 LI()0 53 1 A(Fast Table Filtering using Indexes)52 1 TN TL()Ec /AF f D( )-1 LI()0 54 1 A(Spatial Region Filtering)53 1 TN TL()Ec /AF f D( )UL()-1 LI()0 55 1 A(Region Geometry)54 1 TN TL()Ec /AF f D( )-1 LI()0 56 1 A(Region Algebra)55 1 TN TL()Ec /AF f D( )-1 LI()0 57 1 A(Region Coordinates)56 1 TN TL()Ec /AF f D( )-1 LI()0 58 1 A(Region Boundaries)57 1 TN TL()Ec /AF f D( )-1 LI()0 59 1 A(Differences Between Funtools and IRAF Regions)58 1 TN TL()Ec /AF f D( )LU( )-1 LI()0 60 1 A(Combining Table and Region Filters)59 1 TN TL()Ec /AF f D( )LU( )-1 LI( Miscellaneous )UL()-1 LI()0 61 1 A(Funtools Environment Variables)60 1 TN TL()Ec /AF f D( )-1 LI()0 62 1 A(Funtools ChangeLog)61 1 TN TL()Ec /AF f D()LU( )LU( )0 5 3 H(Last)WB 66 Sn( updated: January 6, 2006)EH( )WB NL NP Ep ET /Tc f D /Cb Db D /Ct [16#00 16#00 16#00] D /Cl [16#00 16#00 16#00] D /CL -1 D Ct Sc DS /Ba f D /BO 0 D Bs /UR (programs.html) D /Ti (Funtools Programs) D /Au () D /Df f D /ME [()] D 0 BO R ()1 Sl()WB 2 Sn( )0 2 4 H(Funtools)WB 67 Sn( Programs)EH( )0 2 5 H(Summary)WB 68 Sn()EH( )0 P() 27 129 PR()0 3 1 A(funcalc)3 0 TN TL()Ec /AF f D( [-n] [-a argstr] [-e expr] [-f file] [-l link] [-p prog] [-u] [oname [columns]] )0 4 1 A(funcen)4 0 TN TL()Ec /AF f D( [-i] [-n iter] [-t tol] [-v lev] )0 5 1 A(funcnts)5 0 TN TL()Ec /AF f D( [switches] [source_region] [bkgd_file] [bkgd_region|bkgd_cnts] )0 6 1 A(funcone)6 0 TN TL()Ec /AF f D( [-n] [-x|-X|-j|-J] [[-l|-L] list] [-r ra_col] [-d dec_col] [columns] )0 7 1 A(fundisp)7 0 TN TL()Ec /AF f D( [-f format] [-l] [-n] [-T] [columns|bitpix=n] )0 8 1 A(funhead)8 0 TN TL()Ec /AF f D( [-a] [-l] [-s] [-t] [-L] [oname ename] )0 9 1 A(funhist)9 0 TN TL()Ec /AF f D( [-n|-w|-T] [column] [[lo_edge:hi_edge:]bins] )0 10 1 A(funimage)10 0 TN TL()Ec /AF f D( [-a] [-l] [-p x|y] [bitpix=n] )0 11 1 A(funindex)11 0 TN TL()Ec /AF f D( [oname] )0 12 1 A(funjoin)12 0 TN TL()Ec /AF f D( [switches] ... )0 13 1 A(funmerge)13 0 TN TL()Ec /AF f D( ... )0 14 1 A(funsky)14 0 TN TL()Ec /AF f D( [switches] [ ] )0 15 1 A(funtable)15 0 TN TL()Ec /AF f D( [-a] [-i|-z] [-m] [-s cols] [columns] )0 16 1 A(funtbl)16 0 TN TL()Ec /AF f D( [-c cols] [-h] [-n table] [-p prog] [-s sep] [-T] )RP( )0 2 6 H(funcalc)WB 69 Sn()WB 3 Sn( - Funtools calculator \201for binary tables\202)EA()EH( )BD() 1 90 PR(funcalc [-n] [-a argstr] [-e expr] [-f file] [-l link] [-p prog] [oname [columns]])RP()ES( )0 P() 7 73 PR( -a argstr # user arguments to pass to the compiled program -e expr # funcalc expression -f file # file containing funcalc expression -l libs # libs to add to link command -n # output generated code instead of compiling and executing -p prog # generate named program, no execution -u # die if any variable is undeclared \201don't auto-declare\202)RP( )0 P()BD(funcalc)ES( is a calculator program that allows arbitrary expressions to be constructed, compiled, and executed on columns in a Funtools table \201FITS binary table or raw event file\202. It works by integrating user-supplied expression\201s\202 into a template C program, then compiling and executing the program. )BD(funcalc)ES( expressions are C statements, although some important simplifications \201such as automatic declaration of variables\202 are supported. )0 P()BD(funcalc)ES( expressions can be specified in three ways: on the command line using the )BD(-e [expression])ES( switch, in a file using the )BD(-f [file])ES( switch, or from stdin \201if neither )BD(-e)ES( nor )BD(-f)ES( is specified\202. Of course a file containing )BD(funcalc)ES( expressions can be read from stdin. )0 P(Each invocation of )BD(funcalc)ES( requires an input Funtools table file to be specified as the first command line argument. The output Funtools table file is the second optional argument. It is needed only if an output FITS file is being created \201i.e., in cases where the )BD(funcalc)ES( expression only prints values, no output file is needed\202. If input and output file are both specified, a third optional argument can specify the list of columns to activate \201using )0 33 1 A(FunColumnActivate\201\202)33 0 TN TL()Ec /AF f D(\202. Note that )BD(funcalc)ES( determines whether or not to generate code for writing an output file based on the presence or absence of an output file argument. )0 P(A )BD(funcalc)ES( expression executes on each row of a table and consists of one or more C statements that operate on the columns of that row \201possibly using temporary variables\202. Within an expression, reference is made to a column of the )BD(current)ES( row using the C struct syntax )BD(cur->[colname])ES(, e.g. cur->x, cur->pha, etc. Local scalar variables can be defined using C declarations at very the beginning of the expression, or else they can be defined automatically by )BD(funcalc)ES( \201to be of type double\202. Thus, for example, a swap of columns x and y in a table can be performed using either of the following equivalent )BD(funcalc)ES( expressions: ) 4 18 PR( double temp; temp = cur->x; cur->x = cur->y; cur->y = temp;)RP( or: ) 3 18 PR( temp = cur->x; cur->x = cur->y; cur->y = temp;)RP( When this expression is executed using a command such as: ) 1 40 PR( funcalc -f swap.expr itest.ev otest.ev)RP( the resulting file will have values of the x and y columns swapped. )0 P(By default, the data type of the variable for a column is the same as the data type of the column as stored in the file. This can be changed by appending ":[dtype]" to the first reference to that column. In the example above, to force x and y to be output as doubles, specify the type 'D' explicitly: ) 3 20 PR( temp = cur->x:D; cur->x = cur->y:D; cur->y = temp;)RP( Data type specifiers follow standard FITS table syntax for defining columns using TFORM: )UL()-1 LI(A: ASCII characters )-1 LI(B: unsigned 8-bit char )-1 LI(I: signed 16-bit int )-1 LI(U: unsigned 16-bit int \201not standard FITS\202 )-1 LI(J: signed 32-bit int )-1 LI(V: unsigned 32-bit int \201not standard FITS\202 )-1 LI(E: 32-bit float )-1 LI(D: 64-bit float )-1 LI(X: bits \201treated as an array of chars\202)LU( Note that only the first reference to a column should contain the explicit data type specifier. )0 P(Of course, it is important to handle the data type of the columns correctly. One of the most frequent cause of error in )BD(funcalc)ES( programming is the implicit use of the wrong data type for a column in expression. For example, the calculation: ) 1 43 PR( dx = \201cur->x - cur->y\202/\201cur->x + cur->y\202;)RP( usually needs to be performed using floating point arithmetic. In cases where the x and y columns are integers, this can be done by reading the columns as doubles using an explicit type specification: ) 1 47 PR( dx = \201cur->x:D - cur->y:D\202/\201cur->x + cur->y\202;)RP( Alternatively, it can be done using C type-casting in the expression: ) 1 75 PR( dx = \201\201double\202cur->x - \201double\202cur->y\202/\201\201double\202cur->x + \201double\202cur->y\202;)RP( )0 P(In addition to accessing columns in the current row, reference also can be made to the )BD(previous)ES( row using )BD(prev->[colname])ES(, and to the )BD(next)ES( row using )BD(next->[colname])ES(. Note that if )BD(prev->[colname])ES( is specified in the )BD(funcalc)ES( expression, the very first row is not processed. If )BD(next->[colname])ES( is specified in the )BD(funcalc)ES( expression, the very last row is not processed. In this way, )BD(prev)ES( and )BD(next)ES( are guaranteed always to point to valid rows. For example, to print out the values of the current x column and the previous y column, use the C fprintf function in a )BD(funcalc)ES( expression: ) 1 46 PR( fprintf\201stdout, "%d %d\200n", cur->x, prev->y\202;)RP( )0 P(New columns can be specified using the same )BD(cur->[colname])ES( syntax by appending the column type \201and optional tlmin/tlmax/binsiz specifiers\202, separated by colons. For example, cur->avg:D will define a new column of type double. Type specifiers are the same those used above to specify new data types for existing columns. )0 P(For example, to create and output a new column that is the average value of the x and y columns, a new "avg" column can be defined: ) 1 36 PR( cur->avg:D = \201cur->x + cur->y\202/2.0)RP( Note that the final ';' is not required for single-line expressions. )0 P(As with FITS TFORM data type specification, the column data type specifier can be preceded by a numeric count to define an array, e.g., "10I" means a vector of 10 short ints, "2E" means two single precision floats, etc. A new column only needs to be defined once in a )BD(funcalc)ES( expression, after which it can be used without re-specifying the type. This includes reference to elements of a column array: ) 2 41 PR( cur->avg[0]:2D = \201cur->x + cur->y\202/2.0; cur->avg[1] = \201cur->x - cur->y\202/2.0;)RP( )0 P(The 'X' \201bits\202 data type is treated as a char array of dimension \201numeric_count/8\202, i.e., 16X is processed as a 2-byte char array. Each 8-bit array element is accessed separately: ) 2 24 PR( cur->stat[0]:16X = 1; cur->stat[1] = 2;)RP( Here, a 16-bit column is created with the MSB is set to 1 and the LSB set to 2. )0 P(By default, all processed rows are written to the specified output file. If you want to skip writing certain rows, simply execute the C "continue" statement at the end of the )BD(funcalc)ES( expression, since the writing of the row is performed immediately after the expression is executed. For example, to skip writing rows whose average is the same as the current x value: ) 4 41 PR( cur->avg[0]:2D = \201cur->x + cur->y\202/2.0; cur->avg[1] = \201cur->x - cur->y\202/2.0; if\201 cur->avg[0] == cur->x \202 continue;)RP( )0 P(If no output file argument is specified on the )BD(funcalc)ES( command line, no output file is opened and no rows are written. This is useful in expressions that simply print output results instead of generating a new file: ) 5 73 PR( fpv = \201cur->av3:D-cur->av1:D\202/\201cur->av1+cur->av2:D+cur->av3\202; fbv = cur->av2/\201cur->av1+cur->av2+cur->av3\202; fpu = \201\201double\202cur->au3-cur->au1\202/\201\201double\202cur->au1+cur->au2+cur->au3\202; fbu = cur->au2/\201double\202\201cur->au1+cur->au2+cur->au3\202; fprintf\201stdout, "%f\200t%f\200t%f\200t%f\200n", fpv, fbv, fpu, fbu\202;)RP( In the above example, we use both explicit type specification \201for "av" columns\202 and type casting \201for "au" columns\202 to ensure that all operations are performed in double precision. )0 P(When an output file is specified, the selected input table is processed and output rows are copied to the output file. Note that the output file can be specified as "stdout" in order to write the output rows to the standard output. If the output file argument is passed, an optional third argument also can be passed to specify which columns to process. )0 P(In a FITS binary table, it sometimes is desirable to copy all of the other FITS extensions to the output file as well. This can be done by appending a '+' sign to the name of the extension in the input file name. See )BD(funtable)ES( for a related example. )0 P()BD(funcalc)ES( works by integrating the user-specified expression into a template C program called )0 2 A(tabcalc.c)EA(. The completed program then is compiled and executed. Variable declarations that begin the )BD(funcalc)ES( expression are placed in the local declaration section of the template main program. All other lines are placed in the template main program's inner processing loop. Other details of program generation are handled automatically. For example, column specifiers are analyzed to build a C struct for processing rows, which is passed to )0 32 1 A(FunColumnSelect\201\202)32 0 TN TL()Ec /AF f D( and used in )0 30 1 A(FunTableRowGet\201\202)30 0 TN TL()Ec /AF f D(. If an unknown variable is used in the expression, resulting in a compilation error, the program build is retried after defining the unknown variable to be of type double. )0 P(Normally, )BD(funcalc)ES( expression code is added to )BD(funcalc)ES( row processing loop. It is possible to add code to other parts of the program by placing this code inside special directives of the form: ) 3 26 PR( [directive name] ... code goes here ... end)RP( The directives are: )UL()-1 LI()BD(global)ES( add code and declarations in global space, before the main routine. )-1 LI()BD(local)ES( add declarations \201and code\202 just after the local declarations in main )-1 LI()BD(before)ES( add code just before entering the main row processing loop )-1 LI()BD(after)ES( add code just after exiting the main row processing loop)LU( Thus, the following )BD(funcalc)ES( expression will declare global variables and make subroutine calls just before and just after the main processing loop: ) 16 62 PR( global double v1, v2; double init\201void\202; double finish\201double v\202; end before v1 = init\201\202; end ... process rows, with calculations using v1 ... after v2 = finish\201v1\202; if\201 v2 < 0.0 \202{ fprintf\201stderr, "processing failed %g -> %g\200n", v1, v2\202; exit\2011\202; } end)RP( Routines such as init\201\202 and finish\201\202 above are passed to the generated program for linking using the )BD(-l [link directives ...])ES( switch. The string specified by this switch will be added to the link line used to build the program \201before the funtools library\202. For example, assuming that init\201\202 and finish\201\202 are in the library libmysubs.a in the /opt/special/lib directory, use: ) 1 47 PR( funcalc -l "-L/opt/special/lib -lmysubs" ...)RP( )0 P(User arguments can be passed to a compiled funcalc program using a string argument to the "-a" switch. The string should contain all of the user arguments. For example, to pass the integers 1 and 2, use: ) 1 22 PR( funcalc -a "1 2" ...)RP( The arguments are stored in an internal array and are accessed as strings via the ARGV\201n\202 macro. For example, consider the following expression: ) 11 60 PR( local int pmin, pmax; end before pmin=atoi\201ARGV\2010\202\202; pmax=atoi\201ARGV\2011\202\202; end if\201 \201cur->pha >= pmin\202 && \201cur->pha <= pmax\202 \202 fprintf\201stderr, "%d %d %d\200n", cur->x, cur->y, cur->pha\202;)RP( This expression will print out x, y, and pha values for all rows in which the pha value is between the two user-input values: ) 11 51 PR( funcalc -a '1 12' -f foo snr.ev'[cir 512 512 .1]' 512 512 6 512 512 8 512 512 5 512 512 5 512 512 8 funcalc -a '5 6' -f foo snr.ev'[cir 512 512 .1]' 512 512 6 512 512 5 512 512 5)RP( )0 P(Note that it is the user's responsibility to ensure that the correct number of arguments are passed. The ARGV\201n\202 macro returns a NULL if a requested argument is outside the limits of the actual number of args, usually resulting in a SEGV if processed blindly. To check the argument count, use the ARGC macro: ) 12 42 PR( local long int seed=1; double limit=0.8; end before if\201 ARGC >= 1 \202 seed = atol\201ARGV\2010\202\202; if\201 ARGC >= 2 \202 limit = atof\201ARGV\2011\202\202; srand48\201seed\202; end if \201 drand48\201\202 > limit \202 continue;)RP( )0 P(The macro WRITE_ROW expands to the FunTableRowPut\201\202 call that writes the current row. It can be used to write the row more than once. In addition, the macro NROW expands to the row number currently being processed. Use of these two macros is shown in the following example: ) 7 41 PR( if\201 cur->pha:I == cur->pi:I \202 continue; a = cur->pha; cur->pha = cur->pi; cur->pi = a; cur->AVG:E = \201cur->pha+cur->pi\202/2.0; cur->NR:I = NROW; if\201 NROW < 10 \202 WRITE_ROW;)RP( )0 P(If the )BD(-p [prog])ES( switch is specified, the expression is not executed. Rather, the generated executable is saved with the specified program name for later use. )0 P(If the )BD(-n)ES( switch is specified, the expression is not executed. Rather, the generated code is written to stdout. This is especially useful if you want to generate a skeleton file and add your own code, or if you need to check compilation errors. Note that the comment at the start of the output gives the compiler command needed to build the program on that platform. \201The command can change from platform to platform because of the use of different libraries, compiler switches, etc.\202 )0 P(As mentioned previously, )BD(funcalc)ES( will declare a scalar variable automatically \201as a double\202 if that variable has been used but not declared. This facility is implemented using a sed script named )0 2 A(funcalc.sed)EA(, which processes the compiler output to sense an undeclared variable error. This script has been seeded with the appropriate error information for gcc, and for cc on Solaris, DecAlpha, and SGI platforms. If you find that automatic declaration of scalars is not working on your platform, check this sed script; it might be necessary to add to or edit some of the error messages it senses. )0 P(In order to keep the lexical analysis of )BD(funcalc)ES( expressions \201reasonably\202 simple, we chose to accept some limitations on how accurately C comments, spaces, and new-lines are placed in the generated program. In particular, comments associated with local variables declared at the beginning of an expression \201i.e., not in a )BD(local...end)ES( block\202 will usually end up in the inner loop, not with the local declarations: ) 8 69 PR( /* this comment will end up in the wrong place \201i.e, inner loop\202 */ double a; /* also in wrong place */ /* this will be in the the right place \201inner loop\202 */ if\201 cur->x:D == cur->y:D \202 continue; /* also in right place */ a = cur->x; cur->x = cur->y; cur->y = a; cur->avg:E = \201cur->x+cur->y\202/2.0;)RP( Similarly, spaces and new-lines sometimes are omitted or added in a seemingly arbitrary manner. Of course, none of these stylistic blemishes affect the correctness of the generated code. )0 P(Because )BD(funcalc)ES( must analyze the user expression using the data file\201s\202 passed on the command line, the input file\201s\202 must be opened and read twice: once during program generation and once during execution. As a result, it is not possible to use stdin for the input file: )BD(funcalc)ES( cannot be used as a filter. We will consider removing this restriction at a later time. )0 P(Along with C comments, )BD(funcalc)ES( expressions can have one-line internal comments that are not passed on to the generated C program. These internal comment start with the )BD(#)ES( character and continue up to the new-line: ) 7 56 PR( double a; # this is not passed to the generated C file # nor is this a = cur->x; cur->x = cur->y; cur->y = a; /* this comment is passed to the C file */ cur->avg:E = \201cur->x+cur->y\202/2.0;)RP( )0 P(As previously mentioned, input columns normally are identified by their being used within the inner event loop. There are rare cases where you might want to read a column and process it outside the main loop. For example, qsort might use a column in its sort comparison routine that is not processed inside the inner loop \201and therefore not implicitly specified as a column to be read\202. To ensure that such a column is read by the event loop, use the )BD(explicit)ES( keyword. The arguments to this keyword specify columns that should be read into the input record structure even though they are not mentioned in the inner loop. For example: ) 1 17 PR( explicit pi pha)RP( will ensure that the pi and pha columns are read for each row, even if they are not processed in the inner event loop. The )BD(explicit)ES( statement can be placed anywhere. )0 P(Finally, note that )BD(funcalc)ES( currently works on expressions involving FITS binary tables and raw event files. We will consider adding support for image expressions at a later point, if there is demand for such support from the community. )0 2 7 H(funcen)WB 70 Sn()WB 4 Sn( - find centroid \201for binary tables\202)EA()EH( )BD() 1 56 PR(funcen [-i] [-n iter] [-t tol] [-v lev] )RP()ES( )0 P() 4 64 PR( -i # use image filtering \201default: event filtering\202 -n iter # max number of iterations \201default: 0\202 -t tol # pixel tolerance distance \201default: 1.0\202 -v [0,1,2,3] # output verbosity level \201default: 0\202)RP( )0 P()BD(funcen)ES( iteratively calculates the centroid position within one or more regions of a Funtools table \201FITS binary table or raw event file\202. Starting with an input table, an initial region specification, and an iteration count, the program calculates the average x and y position within the region and then uses this new position as the region center for the next iteration. Iteration terminates when the maximum number of iterations is reached or when the input tolerance distance is met for that region. A count of events in the final region is then output, along with the pixel position value \201and, where available, WCS position\202. )0 P(The first argument to the program specifies the Funtools table file to process. Since the file must be read repeatedly, a value of "stdin" is not permitted when the number of iterations is non-zero. Use )0 42 1 A(Funtools Bracket Notation)42 0 TN TL()Ec /AF f D( to specify FITS extensions and filters. )0 P(The second required argument is the initial region descriptor. Multiple regions are permitted. However, compound regions \201accelerators, variable argument regions and regions connected via boolean algebra\202 are not permitted. Points and polygons also are illegal. These restrictions might be lifted in a future version, if warranted. )0 P(The )BD(-n)ES( \201iteration number\202 switch specifies the maximum number of iterations to perform. The default is 0, which means that the program will simply count and display the number of events in the initial region\201s\202. Note that when iterations is 0, the data can be input via stdin. )0 P(The )BD(-t)ES( \201tolerance\202 switch specifies a floating point tolerance value. If the distance between the current centroid position value and the last position values is less than this value, iteration terminates. The default value is 1 pixel. )0 P(The )BD(-v)ES( \201verbosity\202 switch specifies the verbosity level of the output. The default is 0, which results in a single line of output for each input region consisting of the following values: ) 1 30 PR( counts x y [ra dec coordsys])RP( The last 3 WCS values are output if WCS information is available in the data file header. Thus, for example: ) 5 47 PR( [sh] funcen -n 0 snr.ev "cir 505 508 5" 915 505.00 508.00 345.284038 58.870920 j2000 [sh] funcen -n 3 snr.ev "cir 505 508 5" 1120 504.43 509.65 345.286480 58.874587 j2000)RP( The first example simply counts the number of events in the initial region. The second example iterates the centroid calculation three times to determine a final "best" position. )0 P( Higher levels of verbosity obviously imply more verbose output. At level 1, the output essentially contains the same information as level 0, but with keyword formatting: [sh] funcen -v 1 -n 3 snr.ev "cir 505 508 5" event_file: snr.ev initial_region: cir 505 508 5 tolerance: 1.0000 iterations: 1 events: 1120 x,y\201physical\202: 504.43 509.65 ra,dec\201j2000\202: 345.286480 58.874587 final_region1: cir 504.43 509.65 5)RP( Level 2 outputs results from intermediate calculations as well. )0 P(Ordinarily, region filtering is performed using analytic \201event\202 filtering, i.e. that same style of filtering as is performed by )BD(fundisp)ES( and )BD(funtable)ES(. Use the )BD(-i)ES( switch to specify image filtering, i.e. the same style filtering as is performed by )BD(funcnts)ES(. Thus, you can perform a quick calculation of counts in regions, using either the analytic or image filtering method, by specifying the )BD(-n 0)ES( and optional )BD(-i)ES( switches. These two method often give different results because of how boundary events are processed: ) 5 46 PR( [sh] funcen snr.ev "cir 505 508 5" 915 505.00 508.00 345.284038 58.870920 j2000 [sh] funcen -i snr.ev "cir 505 508 5" 798 505.00 508.00 345.284038 58.870920 j2000)RP( See )0 58 1 A(Region Boundaries)58 0 TN TL()Ec /AF f D( for more information about how boundaries are calculated using these two methods. )0 2 8 H(funcnts)WB 71 Sn()WB 5 Sn( - count photons in specified regions, with bkgd subtraction)EA()EH( )BD() 1 86 PR(funcnts [switches] [source_region] [bkgd_file] [bkgd_region|bkgd_value])RP()ES( )0 P() 16 79 PR( -e "source_exposure[;bkgd_exposure]" # source \201bkgd\202 FITS exposure image using matching files -w "source_exposure[;bkgd_exposure]" # source \201bkgd\202 FITS exposure image using WCS transform -t "source_timecorr[;bkgd_timecorr]" # source \201bkgd\202 time correction value or header parameter name -g # output using nice g format -G # output using %.14g format \201maximum precision\202 -i "[column;]int1;int2..." # column-based intervals -m # match individual source and bkgd regions -p # output in pixels, even if wcs is present -r # output inner/outer radii \201and angles\202 for annuli \201and pandas\202 -s # output summed values -v "scol[;bcol]" # src and bkgd value columns for tables -T # output in starbase/rdb format -z # output regions with zero area)ES()RP( )0 P()BD(funcnts)ES( counts photons in the specified source regions and reports the results for each region. Regions are specified using the )0 54 1 A(Spatial Region Filtering)54 0 TN TL()Ec /AF f D( mechanism. Photons are also counted in the specified bkgd regions applied to the same data file or a different data file. \201Alternatively, a constant background value in counts/pixel**2 can be specified.\202 The bkgd regions are either paired one-to-one with source regions or pooled and normalized by area, and then subtracted from the source counts in each region. Displayed results include the bkgd-subtracted counts in each region, as well as the error on the counts, the area in each region, and the surface brightness \201cnts/area**2\202 calculated for each region. )0 P(The first argument to the program specifies the FITS input image, array, or raw event file to process. If "stdin" is specified, data are read from the standard input. Use )0 42 1 A(Funtools Bracket Notation)42 0 TN TL()Ec /AF f D( to specify FITS extensions, image sections, and filters. )0 P(The optional second argument is the source region descriptor. If no region is specified, the entire field is used. )0 P(The background arguments can take one of two forms, depending on whether a separate background file is specified. If the source file is to be used for background as well, the third argument can be either the background region, or a constant value denoting background cnts/pixel. Alternatively, the third argument can be a background data file, in which case the fourth argument is the background region. If no third argument is specified, a constant value of 0 is used \201i.e., no background\202. )0 P(In summary, the following command arguments are valid: ) 5 77 PR( [sh] funcnts sfile # counts in source file [sh] funcnts sfile sregion # counts in source region [sh] funcnts sfile sregion bregion # bkgd reg. is from source file [sh] funcnts sfile sregion bvalue # bkgd reg. is constant [sh] funcnts sfile sregion bfile bregion # bkgd reg. is from separate file)RP( )0 P(NB: unlike other Funtools programs, source and background regions are specified as separate arguments on the command line, rather than being placed inside brackets as part of the source and background filenames. This is because regions in funcnts are not simply used as data filters, but also are used to calculate areas, exposure, etc. If you put the source region inside the brackets \201i.e. use it simply as a filter\202 rather than specifying it as argument two, the program still will only count photons that pass the region filter. However, the area calculation will be performed on the whole field, since field\201\202 is the default source region. This rarely is the desired behavior. On the other hand, with FITS binary tables, it often is useful to put a column filter in the filename brackets, so that only events matching the column filter are counted inside the region. )0 P(For example, to extract the counts within a radius of 22 pixels from the center of the FITS binary table snr.ev and subtract the background determined from the same image within an annulus of radii 50-100 pixels: ) 33 82 PR( [sh] funcnts snr.ev "circle\201502,512,22\202" "annulus\201502,512,50,100\202" # source # data file: snr.ev # degrees/pix: 0.00222222 # background # data file: snr.ev # column units # area: arcsec**2 # surf_bri: cnts/arcsec**2 # surf_err: cnts/arcsec**2 # background-subtracted results reg net_counts error background berror area surf_bri surf_err ---- ------------ --------- ------------ --------- --------- --------- --------- 1 3826.403 66.465 555.597 5.972 96831.98 0.040 0.001 # the following source and background components were used: source region\201s\202 ---------------- circle\201502,512,22\202 reg counts pixels ---- ------------ --------- 1 4382.000 1513 background region\201s\202 -------------------- annulus\201502,512,50,100\202 reg counts pixels)WR( ---- ------------ --------- all 8656.000 23572)RP( The area units for the output columns labeled "area", "surf_bri" \201surface brightness\202 and "surf_err" will be given either in arc-seconds \201if appropriate WCS information is in the data file header\201s\202\202 or in pixels. If the data file has WCS info, but you do not want arc-second units, use the )BD(-p)ES( switch to force output in pixels. Also, regions having zero area are not normally included in the primary \201background-subtracted\202 table, but are included in the secondary source and bkgd tables. If you want these regions to be included in the primary table, use the )BD(-z)ES( switch. )0 P(Note that a simple sed command will extract the background-subtracted results for further analysis: ) 6 79 PR( [sh] cat funcnts.sed 1,/---- .*/d /^$/,$d [sh] sed -f funcnts.sed funcnts.out 1 3826.403 66.465 555.597 5.972 96831.98 0.040 0.001)RP( )0 P(If separate source and background files are specified, )BD(funcnts)ES( will attempt to normalize the the background area so that the background pixel size is the same as the source pixel size. This normalization can only take place if the appropriate WCS information is contained in both files \201e.g. degrees/pixel values in CDELT\202. If either file does not contain the requisite size information, the normalization is not performed. In this case, it is the user's responsibility to ensure that the pixel sizes are the same for the two files. )0 P(Normally, if more than one background region is specified, )BD(funcnts)ES( will combine them all into a single region and use this background region to produce the background-subtracted results for each source region. The )BD(-m)ES( \201match multiple backgrounds\202 switch tells )BD(funcnts)ES( to make a one to one correspondence between background and source regions, instead of using a single combined background region. For example, the default case is to combine 2 background regions into a single region and then apply that region to each of the source regions: ) 35 82 PR( [sh] funcnts snr.ev "annulus\201502,512,0,22,n=2\202" "annulus\201502,512,50,100,n=2\202" # source # data file: snr.ev # degrees/pix: 0.00222222 # background # data file: snr.ev # column units # area: arcsec**2 # surf_bri: cnts/arcsec**2 # surf_err: cnts/arcsec**2 # background-subtracted results reg net_counts error background berror area surf_bri surf_err ---- ------------ --------- ------------ --------- --------- --------- --------- 1 3101.029 56.922 136.971 1.472 23872.00 0.130 0.002 2 725.375 34.121 418.625 4.500 72959.99 0.010 0.000 # the following source and background components were used: source region\201s\202 ---------------- annulus\201502,512,0,22,n=2\202 reg counts pixels ---- ------------ --------- 1 3238.000 373 2 1144.000 1140 background region\201s\202 -------------------- annulus\201502,512,50,100,n=2\202)WR( reg counts pixels ---- ------------ --------- all 8656.000 23572)RP( Note that the basic region filter rule "each photon is counted once and no photon is counted more than once" still applies when using The )BD(-m)ES( to match background regions. That is, if two background regions overlap, the overlapping pixels will be counted in only one of them. In a worst-case scenario, if two background regions are the same region, the first will get all the counts and area and the second will get none. )0 P(Using the )BD(-m)ES( switch causes )BD(funcnts)ES( to use each of the two background regions independently with each of the two source regions: ) 36 82 PR( [sh] funcnts -m snr.ev "annulus\201502,512,0,22,n=2\202" "ann\201502,512,50,100,n=2\202" # source # data file: snr.ev # degrees/pix: 0.00222222 # background # data file: snr.ev # column units # area: arcsec**2 # surf_bri: cnts/arcsec**2 # surf_err: cnts/arcsec**2 # background-subtracted results reg net_counts error background berror area surf_bri surf_err ---- ------------ --------- ------------ --------- --------- --------- --------- 1 3087.015 56.954 150.985 2.395 23872.00 0.129 0.002 2 755.959 34.295 388.041 5.672 72959.99 0.010 0.000 # the following source and background components were used: source region\201s\202 ---------------- annulus\201502,512,0,22,n=2\202 reg counts pixels ---- ------------ --------- 1 3238.000 373 2 1144.000 1140 background region\201s\202 -------------------- ann\201502,512,50,100,n=2\202)WR( reg counts pixels ---- ------------ --------- 1 3975.000 9820 2 4681.000 13752)RP( )0 P(Note that most floating point quantities are displayed using "f" format. You can change this to "g" format using the )BD(-g)ES( switch. This can be useful when the counts in each pixel is very small or very large. If you want maximum precision and don't care about the columns lining up nicely, use )BD(-G)ES(, which outputs all floating values as %.14g. )0 P(When counting photons using the annulus and panda \201pie and annuli\202 shapes, it often is useful to have access to the radii \201and panda angles\202 for each separate region. The )BD(-r)ES( switch will add radii and angle columns to the output table: ) 37 122 PR( [sh] funcnts -r snr.ev "annulus\201502,512,0,22,n=2\202" "ann\201502,512,50,100,n=2\202" # source # data file: snr.ev # degrees/pix: 0.00222222 # background # data file: snr.ev # column units # area: arcsec**2 # surf_bri: cnts/arcsec**2 # surf_err: cnts/arcsec**2 # radii: arcsecs # angles: degrees # background-subtracted results reg net_counts error background berror area surf_bri surf_err radius1 radius2 angle1 angle2 ---- ------------ --------- ------------ --------- --------- --------- --------- --------- --------- --------- --------- 1 3101.029 56.922 136.971 1.472 23872.00 0.130 0.002 0.00 88.00 NA NA 2 725.375 34.121 418.625 4.500 72959.99 0.010 0.000 88.00 176.00 NA NA # the following source and background components were used: source region\201s\202 ---------------- annulus\201502,512,0,22,n=2\202 reg counts pixels ---- ------------ --------- 1 3238.000 373 2 1144.000 1140 background region\201s\202)WR( -------------------- ann\201502,512,50,100,n=2\202 reg counts pixels ---- ------------ --------- all 8656.000 23572)RP( )0 P(Radii are given in units of pixels or arc-seconds \201depending on the presence of WCS info\202, while the angle values \201when present\202 are in degrees. These columns can be used to plot radial profiles. For example, the script )BD(funcnts.plot)ES( in the funtools distribution\202 will plot a radial profile using gnuplot \201version 3.7 or above\202. A simplified version of this script is shown below: ) 74 79 PR( #!/bin/sh if [ x"$1" = xgnuplot ]; then if [ x`which gnuplot 2>/dev/null` = x ]; then echo "ERROR: gnuplot not available" exit 1 fi awk ' BEGIN{HEADER=1; DATA=0; FILES=""; XLABEL="unknown"; YLABEL="unknown"} HEADER==1{ if\201 $1 == "#" && $2 == "data" && $3 == "file:" \202{ if\201 FILES != "" \202 FILES = FILES "," FILES = FILES $4 } else if\201 $1 == "#" && $2 == "radii:" \202{ XLABEL = $3 } else if\201 $1 == "#" && $2 == "surf_bri:" \202{ YLABEL = $3 } else if\201 $1 == "----" \202{ printf "set nokey; set title \200"funcnts\201%s\202\200"\200n", FILES printf "set xlabel \200" radius\201%s\202\200"\200n", XLABEL printf "set ylabel \200"surf_bri\201%s\202\200"\200n", YLABEL print "plot \200"-\200" using 3:4:6:7:8 with boxerrorbars" HEADER = 0 DATA = 1 next } } DATA==1{)WR( if\201 NF == 12 \202{ print $9, $10, \201$9+$10\202/2, $7, $8, $7-$8, $7+$8, $10-$9 } else{ exit } } ' | gnuplot -persist - 1>/dev/null 2>&1 elif [ x"$1" = xds9 ]; then awk ' BEGIN{HEADER=1; DATA=0; XLABEL="unknown"; YLABEL="unknown"} HEADER==1{ if\201 $1 == "#" && $2 == "data" && $3 == "file:" \202{ if\201 FILES != "" \202 FILES = FILES "," FILES = FILES $4 } else if\201 $1 == "#" && $2 == "radii:" \202{ XLABEL = $3 } else if\201 $1 == "#" && $2 == "surf_bri:" \202{ YLABEL = $3 } else if\201 $1 == "----" \202{ printf "funcnts\201%s\202 radius\201%s\202 surf_bri\201%s\202 3\200n", FILES, XLABEL, YLABEL HEADER = 0 DATA = 1 next } })WR( DATA==1{ if\201 NF == 12 \202{ print $9, $7, $8 } else{ exit } } ' else echo "funcnts -r ... | funcnts.plot [ds9|gnuplot]" exit 1 fi)RP( Thus, to run )BD(funcnts)ES( and plot the results using gnuplot \201version 3.7 or above\202, use: ) 1 75 PR( funcnts -r snr.ev "annulus\201502,512,0,50,n=5\202" ... | funcnts.plot gnuplot)RP( )0 P(The )BD(-s)ES( \201sum\202 switch causes )BD(funcnts)ES( to produce an additional table of summed \201integrated\202 background subtracted values, along with the default table of individual values: ) 51 82 PR( [sh] funcnts -s snr.ev "annulus\201502,512,0,50,n=5\202" "annulus\201502,512,50,100\202" # source # data file: snr.ev # degrees/pix: 0.00222222 # background # data file: snr.ev # column units # area: arcsec**2 # surf_bri: cnts/arcsec**2 # surf_err: cnts/arcsec**2 # summed background-subtracted results upto net_counts error background berror area surf_bri surf_err ---- ------------ --------- ------------ --------- --------- --------- --------- 1 2880.999 54.722 112.001 1.204 19520.00 0.148 0.003 2 3776.817 65.254 457.183 4.914 79679.98 0.047 0.001 3 4025.492 71.972 1031.508 11.087 179775.96 0.022 0.000 4 4185.149 80.109 1840.851 19.786 320831.94 0.013 0.000 5 4415.540 90.790 2873.460 30.885 500799.90 0.009 0.000 # background-subtracted results reg counts error background berror area surf_bri surf_err ---- ------------ --------- ------------ --------- --------- --------- --------- 1 2880.999 54.722 112.001 1.204 19520.00 0.148 0.003 2 895.818 35.423 345.182 3.710 60159.99 0.015 0.001 3 248.675 29.345 574.325 6.173 100095.98 0.002 0.000 4 159.657 32.321 809.343 8.699 141055.97 0.001 0.000 5 230.390 37.231 1032.610 11.099 179967.96 0.001 0.000 )WR( # the following source and background components were used: source region\201s\202 ---------------- annulus\201502,512,0,50,n=5\202 reg counts pixels sumcnts sumpix ---- ------------ --------- ------------ --------- 1 2993.000 305 2993.000 305 2 1241.000 940 4234.000 1245 3 823.000 1564 5057.000 2809 4 969.000 2204 6026.000 5013 5 1263.000 2812 7289.000 7825 background region\201s\202 -------------------- annulus\201502,512,50,100\202 reg counts pixels ---- ------------ --------- all 8656.000 23572)RP( )0 P(The )BD(-t)ES( and )BD(-e)ES( switches can be used to apply timing and exposure corrections, respectively, to the data. Please note that these corrections are meant to be used qualitatively, since application of more accurate correction factors is a complex and mission-dependent effort. The algorithm for applying these simple corrections is as follows: ) 9 63 PR( C = Raw Counts in Source Region Ac= Area of Source Region Tc= Exposure time for Source Data Ec= Average exposure in Source Region, from exposure map B= Raw Counts in Background Region Ab= Area of Background Region Tb= \201Exposure\202 time for Background Data Eb= Average exposure in Background Region, from exposure map)RP( Then, Net Counts in Source region is ) 1 37 PR( Net= C - B * \201Ac*Tc*Ec\202/\201Ab*Tb*Eb\202)RP( with the standard propagation of errors for the Error on Net. The net rate would then be ) 1 27 PR( Net Rate = Net/\201Ac*Tc*Ec\202)RP( The average exposure in each region is calculated by summing up the pixel values in the exposure map for the given region and then dividing by the number of pixels in that region. Exposure maps often are generated at a block factor > 1 \201e.g., block 4 means that each exposure pixel contains 4x4 pixels at full resolution\202 and )BD(funcnts)ES( will deal with the blocking automatically. Using the )BD(-e)ES( switch, you can supply both source and background exposure files \201separated by ";"\202, if you have separate source and background data files. If you do not supply a background exposure file to go with a separate background data file, )BD(funcnts)ES( assumes that exposure already has been applied to the background data file. In addition, it assumes that the error on the pixels in the background data file is zero. )0 P(NB: The )BD(-e)ES( switch assumes that the exposure map overlays the image file )BD(exactly)ES(, except for the block factor. Each pixel in the image is scaled by the block factor to access the corresponding pixel in the exposure map. If your exposure map does not line up exactly with the image, )BD(do not use)ES( the )BD(-e)ES( exposure correction. In this case, it still is possible to perform exposure correction )BD(if)ES( both the image and the exposure map have valid WCS information: use the )BD(-w)ES( switch so that the transformation from image pixel to exposure pixel uses the WCS information. That is, each pixel in the image region will be transformed first from image coordinates to sky coordinates, then from sky coordinates to exposure coordinates. Please note that using )BD(-w)ES( can increase the time required to process the exposure correction considerably. )0 P(A time correction can be applied to both source and background data using the )BD(-t)ES( switch. The value for the correction can either be a numeric constant or the name of a header parameter in the source \201or background\202 file: ) 2 74 PR( [sh] funcnts -t 23.4 ... # number for source [sh] funcnts -t "LIVETIME;23.4" ... # param for source, numeric for bkgd)RP( When a time correction is specified, it is applied to the net counts as well \201see algorithm above\202, so that the units of surface brightness become cnts/area**2/sec. )0 P(The )BD(-i)ES( \201interval\202 switch is used to run )BD(funcnts)ES( on multiple column-based intervals with only a single pass through the data. It is equivalent to running )BD(funcnts)ES( several times with a different column filter added to the source and background data each time. For each interval, the full )BD(funcnts)ES( output is generated, with a linefeed character \201^L\202 inserted between each run. In addition, the output for each interval will contain the interval specification in its header. Intervals are very useful for generating X-ray hardness ratios efficiently. Of course, they are only supported when the input data are contained in a table. )0 P(Two formats are supported for interval specification. The most general format is semi-colon-delimited list of filters to be used as intervals: ) 1 73 PR( funcnts -i "pha=1:5;pha=6:10;pha=11:15" snr.ev "circle\201502,512,22\202" ...)RP( Conceptually, this will be equivalent to running )BD(funcnts)ES( three times: ) 3 50 PR( funcnts snr.ev'[pha=1:5]' "circle\201502,512,22\202" funcnts snr.ev'[pha=6:10]' "circle\201502,512,22\202" funcnts snr.ev'[pha=11:15]' "circle\201502,512,22\202")RP( However, using the )BD(-i)ES( switch will require only one pass through the data. )0 P(Note that complex filters can be used to specify intervals: ) 1 64 PR( funcnts -i "pha=1:5&)SY(\160)ES(=4;pha=6:10&)SY(\160)ES(=5;pha=11:15&)SY(\160)ES(=6" snr.ev ...)RP( The program simply runs the data through each filter in turn and generates three )BD(funcnts)ES( outputs, separated by the line-feed character. )0 P(In fact, although the intent is to support intervals for hardness ratios, the specified filters do not have to be intervals at all. Nor does one "interval" filter have to be related to another. For example: ) 1 75 PR( funcnts -i "pha=1:5;pi=6:10;energy=11:15" snr.ev "circle\201502,512,22\202" ...)RP( is equivalent to running )BD(funcnts)ES( three times with unrelated filter specifications. )0 P(A second interval format is supported for the simple case in which a single column is used to specify multiple homogeneous intervals for that column. In this format, a column name is specified first, followed by intervals: ) 1 65 PR( funcnts -i "pha;1:5;6:10;11:15" snr.ev "circle\201502,512,22\202" ...)RP( This is equivalent to the first example, but requires less typing. The )BD(funcnts)ES( program will simply prepend "pha=" before each of the specified intervals. \201Note that this format does not contain the "=" character in the column argument.\202 )0 P(Ordinarily, when )BD(funcnts)ES( is run on a FITS binary table \201or a raw event table\202, one integral count is accumulated for each row \201event\202 contained within a given region. The )BD(-v "scol[;bcol]")ES( \201value column\202 switch will accumulate counts using the value from the specified column for the given event. If only a single column is specified, it is used for both the source and background regions. Two separate columns, separated by a semi-colon, can be specified for source and background. The special token '$none' can be used to specify that a value column is to be used for one but not the other. For example, 'pha;$none' will use the pha column for the source but use integral counts for the background, while '$none;pha' will do the converse. If the value column is of type logical, then the value used will be 1 for T and 0 for F. Value columns are used, for example, to integrate probabilities instead of integral counts. )0 P(If the )BD(-T)ES( \201rdb table\202 switch is used, the output will conform to starbase/rdb data base format: tabs will be inserted between columns rather than spaces and line-feed will be inserted between tables. )0 P(Finally, note that )BD(funcnts)ES( is an image program, even though it can be run directly on FITS binary tables. This means that image filtering is applied to the rows in order to ensure that the same results are obtained regardless of whether a table or the equivalent binned image is used. Because of this, however, the number of counts found using )BD(funcnts)ES( can differ from the number of events found using row-filter programs such as )BD(fundisp)ES( or )BD(funtable)ES( For more information about these difference, see the discussion of )0 58 1 A(Region Boundaries)58 0 TN TL()Ec /AF f D(. )0 2 9 H(funcone)WB 72 Sn()WB 6 Sn( - cone search of a binary table containing RA, Dec columns)EA()EH( )BD() 1 81 PR(funcone [columns])RP()ES( )0 P() 9 84 PR( -d deccol:[hdr] # Dec column name, units \201def: DEC:d\202 -j # join columns from list file -J # join columns from list file, output all rows -l listfile # read centers and radii from a list -L listfile # read centers and radii from a list, output list rows -n # don't use cone limits as a filter -r racol:[hdr] # RA column name, units \201def: RA:h\202 -x # append RA_CEN, DEC_CEN, RAD_CEN, CONE_KEY cols -X # append RA_CEN, DEC_CEN, RAD_CEN, CONE_KEY cols, output all rows)RP( )0 P(Funcone performs a cone search on the RA and Dec columns of a FITS binary table. The distance from the center RA, Dec position to the RA, Dec in each row in the table is calculated. Rows whose distance is less than the specified radius are output. )0 P(The first argument to the program specifies the FITS file, raw event file, or raw array file. If "stdin" is specified, data are read from the standard input. Use )0 42 1 A(Funtools Bracket Notation)42 0 TN TL()Ec /AF f D( to specify FITS extensions, and filters. The second argument is the output FITS file. If "stdout" is specified, the FITS binary table is written to the standard output. )0 P( The third and fourth required arguments are the RA and Dec center position. By default, RA is specified in hours while Dec is specified in degrees. You can change the units of either of these by appending the character "d" \201degrees\202, "h" \201hours\202 or "r" \201radians\202. Sexagesimal notation is supported, with colons or spaces separating hms and dms. \201When using spaces, please ensure that the entire string is quoted.\202 )0 P(The fifth required argument is the radius of the cone search. By default, the radius value is given in degrees. The units can be changed by appending the character "d" \201degrees\202, "r" \201radians\202, "'" \201arc minutes\202 or '"' \201arc seconds\202. )0 P(By default, all columns of the input file are copied to the output file. Selected columns can be output using an optional sixth argument in the form: ) 1 31 PR( "column1 column1 ... columnN")RP( A seventh argument allows you to output selected columns from the list file when )BD(-j)ES( switch is used. Note that the RA and Dec columns used in the cone calculation must not be de-selected. )0 P(Also by default, the RA and Dec column names are named "RA" and "Dec", and are given in units of hours and degrees respectively. You can change both the name and the units using the -r [RA] and/or -d [Dec] switches. Once again, one of "h", "d", or "r" is appended to the column name to specify units but in this case, there must be a colon ":" between the name and the unit specification. )0 P(If the )BD(-l [listfile])ES( switch is used, then one or more of the center RA, center Dec, and radius can be taken from a list file \201which can be a FITS table or an ASCII column text file\202. In this case, the third \201center RA\202, fourth \201center Dec\202, and fifth \201radius\202 command line arguments can either be a column name in the list file \201if that parameter varies\202 or else a numeric value \201if that parameter is static\202. When a column name is specified for the RA, Dec, or radius, you can append a colon followed by "h", "d", or "r" to specify units \201also ' and " for radius\202. The cone search algorithm is run once for each row in the list, taking RA, Dec, and radius values from the specified columns or from static numeric values specified on the command line. )0 P(When using a list, all valid rows from each iteration are written to a single output file. Use the )BD(-x)ES( switch to help delineate which line of the list file was used to produce the given output row\201s\202. This switch causes the values for the center RA, Dec, radius, and row number to be appended to the output file, in columns called RA_CEN, DEC_CEN, RAD_CEN and CONE_KEY, respectively. Alternatively, the )BD(-j)ES( \201join\202 switch will append all columns from the list row to the output row \201essentially a join of the list row and input row\202, along with the CONE_KEY row number. These two switches are mutually exclusive. )0 P(The )BD(-X)ES( and )BD(-J)ES( switches write out the same data as their lower case counterparts for each row satisfying a cone search. In addition, these switches also write out rows from the event file that do not satisfy any cone search. In such cases, that CONE_KEY column will be given a value of -1 and the center and list position information will be set to zero for the given row. Thus, all rows of the input event file are guaranteed to be output, with rows satisfying at least one cone search having additional search information. )0 P(The )BD(-L)ES( switch acts similarly to the )BD(-l)ES( switch in that it takes centers from a list file. However, it also implicitly sets the -j switch, so that output rows are the join of the input event row and the center position row. In addition, this switch also writes out all center position rows for which no event satisfies the cone search criteria of that row. The CONE_KEY column will be given a value of -2 for center rows that were not close to any data row and the event columns will be zeroed out for such rows. In this way, all centers rows are guaranteed to be output at least once. )0 P(If any of "all row" switches \201)BD(-X)ES(, )BD(-J)ES(, or )BD(-L)ES(\202 are specified, then a new column named JSTAT is added to the output table. The positive values in this column indicate the center position row number \201starting from 1\202 in the list file that this data row successful matched in a cone search. A value of -1 means that the data row did not match any center position. A value of -2 means that the center position was not matched by any data row. )0 P(Given a center position and radius, the cone search algorithm calculates limit parameters for a box enclosing the specified cone, and only tests rows whose positions values lie within those limits. For small files, the overhead associated with this cone limit filtering can cause the program to run more slowly than if all events were tested. You can turn off cone limit filtering using the )BD(-n)ES( switch to see if this speeds up the processing \201especially useful when processing a large list of positions\202. )0 P(For example, the default cone search uses columns "RA" and "Dec" in hours and degrees \201respectively\202 and RA position in hours, Dec and radius in degrees: ) 1 42 PR( funone in.fits out.fits 23.45 34.56 0.01)RP( To specify the RA position in degrees: ) 1 44 PR( funcone in.fits out.fits 23.45d 34.56 0.01)RP( To get RA and Dec from a list but use a static value for radius \201and also write identifying info for each row in the list\202: ) 1 57 PR( funcone -x -l list.txt in.fits out.fits MYRA MYDec 0.01)RP( User specified columns in degrees, RA position in hours \201sexagesimal notation\202, Dec position in degrees \201sexagesimal notation\202 and radius in arc minutes: ) 1 66 PR( funcone -r myRa:d -d myDec in.fits out.fits 12:30:15.5 30:12 15')RP( )0 2 10 H(fundisp)WB 73 Sn()WB 7 Sn( - display data in a Funtools data file)EA()EH( )BD() 1 62 PR(fundisp [-f format] [-l] [-n] [-T] [columns|bitpix=n])RP()ES( )0 P() 5 68 PR( -f # format string for display -l # display image as a list containing the columns X, Y, VAL -n # don't output header -F [c] # use specified character as column separator \201def: space\202 -T # output in rdb/starbase format \201tab separators\202)RP( )0 P()BD(fundisp)ES( displays the data in the specified )0 42 1 A(FITS Extension)42 0 TN TL()Ec /AF f D( and/or )0 49 1 A(Image Section)49 0 TN TL()Ec /AF f D( of a FITS file, or in a )0 49 1 A(Section)49 0 TN TL()Ec /AF f D( of a non-FITS array or raw event file. )0 P(The first argument to the program specifies the FITS input image, array, or raw event file to display. If "stdin" is specified, data are read from the standard input. Use )0 42 1 A(Funtools Bracket Notation)42 0 TN TL()Ec /AF f D( to specify FITS extensions, image sections, and filters. )0 P(If the data being displayed are columns \201either in a FITS binary table or a raw event file\202, the individual rows are listed. Filters can be added using bracket notation. Thus: ) 13 75 PR( [sh] fundisp "test.ev[time-\201int\202time>.15]" X Y PHA PI TIME DX DY ------- ------- ------- --------- ---------------- ---------- ---------- 10 8 10 8 17.1600 8.50 10.50 9 9 9 9 17.1600 9.50 9.50 10 9 10 9 18.1600 9.50 10.50 10 9 10 9 18.1700 9.50 10.50 8 10 8 10 17.1600 10.50 8.50 9 10 9 10 18.1600 10.50 9.50 9 10 9 10 18.1700 10.50 9.50 10 10 10 10 19.1600 10.50 10.50 10 10 10 10 19.1700 10.50 10.50 10 10 10 10 19.1800 10.50 10.50)RP( [NB: The FITS binary table test file test.ev, as well as the FITS image test.fits, are contained in the funtools funtest directory.] )0 P(When a table is being displayed using )BD(fundisp)ES(, a second optional argument can be used to specify the columns to display. For example: ) 12 56 PR( [sh] fundisp "test.ev[time-\201int\202time>=.99]" "x y time" X Y TIME -------- -------- --------------------- 5 -6 40.99000000 4 -5 59.99000000 -1 0 154.99000000 -2 1 168.99000000 -3 2 183.99000000 -4 3 199.99000000 -5 4 216.99000000 -6 5 234.99000000 -7 6 253.99000000)RP( )0 P(The special column )BD($REGION)ES( can be specified to display the region id of each row: ) 12 89 PR( [sh $] fundisp "test.ev[time-\201int\202time>=.99&&annulus\2010 0 0 10 n=3\202]" 'x y time $REGION' X Y TIME REGION -------- -------- --------------------- ---------- 5 -6 40.99000000 3 4 -5 59.99000000 2 -1 0 154.99000000 1 -2 1 168.99000000 1 -3 2 183.99000000 2 -4 3 199.99000000 2 -5 4 216.99000000 2 -6 5 234.99000000 3 -7 6 253.99000000 3)RP( )0 P(Here only rows with the proper fractional time and whose position also is within one of the three annuli are displayed. )0 P(Columns can be excluded from display using a minus sign before the column: ) 12 64 PR( [sh $] fundisp "test.ev[time-\201int\202time>=.99]" "-time" X Y PHA PI DX DY -------- -------- -------- ---------- ----------- ----------- 5 -6 5 -6 5.50 -6.50 4 -5 4 -5 4.50 -5.50 -1 0 -1 0 -1.50 0.50 -2 1 -2 1 -2.50 1.50 -3 2 -3 2 -3.50 2.50 -4 3 -4 3 -4.50 3.50 -5 4 -5 4 -5.50 4.50 -6 5 -6 5 -6.50 5.50 -7 6 -7 6 -7.50 6.50)RP( All columns except the time column are displayed. )0 P(The special column )BD($N)ES( can be specified to display the ordinal value of each row. Thus, continuing the previous example: ) 12 74 PR( fundisp "test.ev[time-\201int\202time>=.99]" '-time $n' X Y PHA PI DX DY N ------- -------- -------- ---------- ----------- ----------- ---------- 5 -6 5 -6 5.50 -6.50 337 4 -5 4 -5 4.50 -5.50 356 -1 0 -1 0 -1.50 0.50 451 -2 1 -2 1 -2.50 1.50 465 -3 2 -3 2 -3.50 2.50 480 -4 3 -4 3 -4.50 3.50 496 -5 4 -5 4 -5.50 4.50 513 -6 5 -6 5 -6.50 5.50 531 -7 6 -7 6 -7.50 6.50 550)RP( Note that the column specification is enclosed in single quotes to protect '$n' from begin expanded by the shell. )0 P(In general, the rules for activating and de-activating columns are: )UL()-1 LI( If only exclude columns are specified, then all columns but the exclude columns will be activated. )-1 LI( If only include columns are specified, then only the specified columns are activated. )-1 LI( If a mixture of include and exclude columns are specified, then all but the exclude columns will be active; this last case is ambiguous and the rule is arbitrary.)LU( In addition to specifying columns names explicitly, the special symbols )BD(+)ES( and )BD(-)ES( can be used to activate and de-activate )BD(all)ES( columns. This is useful if you want to activate the $REGION column along with all other columns. According to the rules, the syntax "$REGION" only activates the region column and de-activates the rest. Use "+ $REGION" to activate all columns as well as the region column. )0 P(If the data being displayed are image data \201either in a FITS primary image, a FITS image extension, or an array file\202, an mxn pixel display is produced, where m and n are the dimensions of the image. By default, pixel values are displayed using the same data type as in the file. However, for integer data where the BSCALE and BZERO header parameters are present, the data is displayed as floats. In either case, the display data type can be overridden using an optional second argument of the form: ) 1 10 PR( bitpix=n)RP( where n is 8,16,32,-32,-64, for unsigned char, short, int, float and double, respectively. )0 P(Of course, running )BD(fundisp)ES( on anything but the smallest image usually results in a display whose size makes it unreadable. Therefore, one can uses bracket notation \201see below\202 to apply section and/or blocking to the image before generating a display. For example: ) 9 66 PR( [sh] fundisp "test.fits[2:6,2:7]" bitpix=-32 2 3 4 5 6 ---------- ---------- ---------- ---------- ---------- 2: 3.00 4.00 5.00 6.00 7.00 3: 4.00 5.00 6.00 7.00 8.00 4: 5.00 6.00 7.00 8.00 9.00 5: 6.00 7.00 8.00 9.00 10.00 6: 7.00 8.00 9.00 10.00 11.00 7: 8.00 9.00 10.00 11.00 12.00)RP( )0 P(Note that is is possible to display a FITS binary table as an image simply by passing the table through )BD(funimage)ES( first: ) 9 68 PR( [sh] ./funimage test.ev stdout | fundisp "stdin[2:6,2:7]" bitpix=8 2 3 4 5 6 ------- ------- ------- ------- ------- 2: 3 4 5 6 7 3: 4 5 6 7 8 4: 5 6 7 8 9 5: 6 7 8 9 10 6: 7 8 9 10 11 7: 8 9 10 11 12)RP( If the )BD(-l)ES( \201list\202 switch is used, then an image is displayed as a list containing the columns: X, Y, VAL. For example: ) 33 45 PR( fundisp -l "test1.fits[2:6,2:7]" bitpix=-32 X Y VAL ---------- ---------- ----------- 2 2 6.00 3 2 1.00 4 2 1.00 5 2 1.00 6 2 1.00 2 3 1.00 3 3 5.00 4 3 1.00 5 3 1.00 6 3 1.00 2 4 1.00 3 4 1.00 4 4 4.00 5 4 1.00 6 4 1.00 2 5 1.00 3 5 1.00 4 5 1.00 5 5 3.00 6 5 1.00 2 6 1.00 3 6 1.00 4 6 1.00 5 6 1.00 6 6 2.00 2 7 1.00 3 7 1.00 4 7 1.00)WR( 5 7 1.00 6 7 1.00)RP( )0 P(If the )BD(-n)ES( \201nohead\202 switch is used, then no header is output for tables. This is useful, for example, when fundisp output is being directed into gnuplot. )0 P(The )BD(fundisp)ES( program uses a default set of display formats: ) 10 33 PR( datatype TFORM format -------- ----- -------- double D "%21.8f" float E "%11.2f" int J "%10d" short I "%8d" byte B "%6d" string A "%12.12s" bits X "%8x" logical L "%1x")RP( Thus, the default display of 1 double and 2 shorts gives: ) 7 42 PR( [sh] fundisp snr.ev "time x y" TIME X Y --------------------- -------- -------- 79494546.56818075 546 201 79488769.94469175 548 201 ...)RP( You can change the display format for individual columns or for all columns of a given data types by means of the -f switch. The format string that accompanies -f is a space-delimited list of keyword=format values. The keyword values can either be column names \201in which case the associated format pertains only to that column\202 or FITS table TFORM specifiers \201in which case the format pertains to all columns having that data type\202. For example, you can change the double and short formats for all columns like this: ) 7 53 PR( [sh] fundisp -f "D=%22.11f I=%3d" snr.ev "time x y" TIME X Y ---------------------- --- --- 79494546.56818075478 546 201 79488769.94469174743 548 201 ...)RP( )0 P(Alternatively, you can change the format of the time and x columns like this: ) 7 56 PR( [sh] fundisp -f "time=%22.11f x=%3d" snr.ev "time x y" TIME X Y ---------------------- --- -------- 79494546.56818075478 546 201 79488769.94469174743 548 201 ...)RP( Note that there is a potential conflict if a column has the same name as one of the TFORM specifiers. In the examples above, the the "X" column in the table has the same name as the X \201bit\202 datatype. To resolve this conflict, the format string is processed such that TFORM datatype specifiers are checked for first, using a case-sensitive comparison. If the specified format value is not an upper case TFORM value, then a case-insensitive check is made on the column name. This means that, in the examples above, "X=%3d" will refer to the X \201bit\202 datatype, while "x=%3d" will refer to the X column: ) 15 38 PR( [sh] fundisp -f "X=%3d" snr.ev "x y" X Y -------- -------- 546 201 548 201 ... [sh] fundisp -f "x=%3d" snr.ev "x y" X Y --- -------- 546 201 548 201 ...)RP( As a rule, therefore, it is best always to specify the column name in lower case and TFORM data types in upper case. )0 P(The )BD(-f [format])ES( will change the format for a single execution of fundisp. You also can use the )BD(FUN_FORMAT)ES( envronment variable to change the format for all invocations of fundisp. The format of this environment variable's value is identical to that used with the )BD(-f)ES( switch. This global value can be overridden in individual cases by use of the )BD(-f [format])ES( switch. )0 P(Caveats: Please also note that it is the user's responsibility to match the format specifier to the column data type correctly. Also note that, in order to maintain visual alignment between names and columns, the column name will be truncated \201on the left\202 if the format width is less than the length of the name. However, truncation is not performed if the output is in RDB format \201using the -T switch\202. )0 P([An older-style format string is supported but deprecated. It consists of space-delimited C format statements for all data types, specified in the following order: ) 1 40 PR( double float int short byte string bit.)RP( This order of the list is based on the assumption that people generally will want to change the float formats. )0 P(If "-" is entered instead of a format statement for a given data type, the default format is used. Also, the format string can be terminated without specifying all formats, and defaults will be used for the rest of the list. Note that you must supply a minimum field width, i.e., "%6d" and "%-6d" are legal, "%d" is not legal. By using -f [format], you can change the double and short formats like this: ) 7 51 PR( [sh] fundisp -f "22.11f - - 3d" snr.ev "time x y" TIME X Y ---------------------- --- --- 79494546.56818075478 546 201 79488769.94469174743 548 201 ...)RP( NB: This format is deprecated and will be removed in a future release.] )0 P(The )BD(-F[c])ES( switch can be used to specify a \201single-character\202 column separator \201where the default is a space\202. Note that column formatting will almost certainly also add spaces to pad individual columns to the required width. These can be removed with a program such as sed, at the cost of generating unaligned columns. For example: ) 26 117 PR(fundisp -F',' snr.ev'[cir 512 512 .1]' X, Y, PHA, PI, TIME, DX, DY --------,--------,--------,--------,---------------------,--------,-------- 512, 512, 6, 7, 79493997.45854475, 578, 574 512, 512, 8, 9, 79494575.58943175, 579, 573 512, 512, 5, 6, 79493631.03866175, 578, 575 512, 512, 5, 5, 79493290.86521725, 578, 575 512, 512, 8, 9, 79493432.00990875, 579, 573 fundisp -F',' snr.ev'[cir 512 512 .1]' | sed 's/ *, */,/g' X,Y,PHA,PI,TIME,DX,DY --------,--------,--------,--------,---------------------,--------,-------- 512,512,6,7,79493997.45854475,578,574 512,512,8,9,79494575.58943175,579,573 512,512,5,6,79493631.03866175,578,575 512,512,5,5,79493290.86521725,578,575 512,512,8,9,79493432.00990875,579,573 fundisp -f "x=%3d y=%3d pi=%1d pha=%1d time=%20.11f dx=%3d dy=%3d" -F',' snr.ev'[cir 512 512 .1]' | sed 's/ *, */,/g' X,Y,A,I,TIME,DX,DY ---,---,-,-,--------------------,---,--- 512,512,6,7,79493997.45854474604,578,574 512,512,8,9,79494575.58943174779,579,573 512,512,5,6,79493631.03866174817,578,575 512,512,5,5,79493290.86521725357,578,575 512,512,8,9,79493432.00990875065,579,573)RP( )0 P(If the )BD(-T)ES( \201rdb table\202 switch is used, the output will conform to starbase/rdb data base format: tabs will be inserted between columns rather than spaces. This format is not available when displaying image pixels \201except in conjunction with the )BD(-l)ES( switch\202. )0 P(Finally, note that )BD(fundisp)ES( can be used to create column filters from the auxiliary tables in a FITS file. For example, the following shell code will generate a good-time interval \201GTI\202 filter for X-ray data files that contain a standard GTI extension: ) 3 68 PR( #!/bin/sh sed '1,/---- .*/d /^$/,$d' | awk 'tot>0{printf "||"};{printf "time="$1":"$2; tot++}')RP( If this script is placed in a file called "mkgti", it can be used in a command such as: ) 1 46 PR( fundisp foo.fits"[GTI]" | mkgti > gti.filter)RP( The resulting filter file can then be used in various funtools programs: ) 1 37 PR( funcnts foo.fits"[@gti.filter]" ...)RP( to process only the events in the good-time intervals. )0 2 11 H(funhead)WB 74 Sn()WB 8 Sn( - display a header in a Funtools file)EA()EH( )BD() 1 50 PR(funhead [-a] [-s] [-t] [-L] [oname ename])RP()ES( )0 P() 4 60 PR( -a # display all extension headers -s # display 79 chars instead of 80 before the new-line -t # prepend data type char to each line of output -L # output in rdb/starbase list format)RP( )0 P()BD(funhead)ES( displays the FITS header parameters in the specified )0 42 1 A(FITS Extension)42 0 TN TL()Ec /AF f D(. )0 P(The first argument to the program specifies the Funtools input file to display. If "stdin" is specified, data are read from the standard input. )0 42 1 A(Funtools Bracket Notation)42 0 TN TL()Ec /AF f D( is used to specify particular FITS extension to process. Normally, the full 80 characters of each header card is output, followed by a new-line. )0 P(If the )BD(-a)ES( switch is specified, the header from each FITS extensions in the file is displayed. Note, however, that the )BD(-a)ES( switch does not work with FITS files input via stdin. We hope to remove this restriction in a future release. )0 P(If the )BD(-s)ES( switch is specified, only 79 characters are output before the new-line. This helps the display on 80 character terminals. )0 P(If the )BD(-t)ES( switch is specified, the data type of the parameter is output as a one character prefix, followed by 77 characters of the param. The parameter data types are defined as: FUN_PAR_UNKNOWN \201'u'\202, FUN_PAR_COMMENT \201'c'\202, FUN_PAR_LOGICAL \201'l'\202, FUN_PAR_INTEGER \201'i'\202, FUN_PAR_STRING \201's'\202, FUN_PAR_REAL \201'r'\202, FUN_PAR_COMPLEX \201'x'\202. )0 P(If the )BD(-L)ES( \201rdb table\202 switch is used, the output will conform to starbase/rdb data base list format. )0 P(For example to display the EVENTS extension \201binary table\202: ) 17 65 PR( [sh] funhead "foo.fits[EVENTS]" XTENSION= 'BINTABLE' / FITS 3D BINARY TABLE BITPIX = 8 / Binary data NAXIS = 2 / Table is a matrix NAXIS1 = 20 / Width of table in bytes NAXIS2 = 30760 / Number of entries in table PCOUNT = 0 / Random parameter count GCOUNT = 1 / Group count TFIELDS = 7 / Number of fields in each row EXTNAME = 'EVENTS ' / Table name EXTVER = 1 / Version number of table TFORM1 = '1I ' / Data type for field TTYPE1 = 'X ' / Label for field TUNIT1 = ' ' / Physical units for field TFORM2 = '1I ' / Data type for field etc. ... END)RP( )0 P(To display the third header: ) 14 65 PR( [sh] funhead "foo.fits[3]" XTENSION= 'BINTABLE' / FITS 3D BINARY TABLE BITPIX = 8 / Binary data NAXIS = 2 / Table is a matrix NAXIS1 = 32 / Width of table in bytes NAXIS2 = 40 / Number of entries in table PCOUNT = 0 / Random parameter count GCOUNT = 1 / Group count TFIELDS = 7 / Number of fields in each row EXTNAME = 'TGR ' / Table name EXTVER = 1 / Version number of table TFORM1 = '1D ' / Data type for field etc. ... END)RP( )0 P(To display the primary header \201i.e., extension 0\202: ) 8 59 PR( sh> funhead "coma.fits[0]" SIMPLE = T /STANDARD FITS FORMAT BITPIX = 16 /2-BYTE TWOS-COMPL INTEGER NAXIS = 2 /NUMBER OF AXES NAXIS1 = 800 / NAXIS2 = 800 / DATATYPE= 'INTEGER*2' /SHORT INTEGER END)RP( )0 P(The funhead program also can edit \201i.e. add, delete, or modify\202 or display individual headers parameters. Edit mode is signalled by the presence of two additional command-line arguments: output file and edit command file, in that order. Edit mode acts as a filter: the output file will contain the entire input FITS file, including other extensions. The edit command file can be "stdin", in which case edit command are read from the standard input. )0 P(The edit command file contains parameter comments \201having '#' in the first column\202 and delete and assignment\201modify or add\202 operations. A delete operation is specified by preceding the parameter name with a minus sign "-". A display operation \201very useful in interactive sessions, i.e., where the edit commands are taken from stdin\202 is specified by preceding the parameter name with a question mark "?". In either case, a parameter value need not be specified. An assignment operation is specified in the same two ways that a parameter is specified in a text header \201but without the comment character that precedes header params\202, i.e.: )UL()-1 LI( FITS-style comments have an equal sign "=" between the keyword and value and an optional slash "/" to signify a comment. The strict FITS rules on column positions are not enforced. )-1 LI( Free-form comments can have an optional colon separator between the keyword and value. In the absence of quote, all tokens after the keyword are part of the value, i.e. no comment is allowed.)LU( )0 P(For example, the following interactive session checks for the existence of parameters, adds new parameters, modifies them, and modifies and deletes existing parameters: ) 20 55 PR( sh$ ./funhead snr.ev foo.fits - # look for FOO1 ? FOO1 WARNING: FOO1 not found # add new foo1 FOO1 = 100 # add foo2 FOO2 = 200 # reset foo1 to a different value FOO1 -1 # delete foo2 -FOO2 # change existing value EXTVER 2 ? XS-SORT XS-SORT = 'EOF ' / type of event sort # delete existing value -XS-SORT # exit ^D)RP( )0 P(See )0 47 1 A(Column-based Text Files)47 0 TN TL()Ec /AF f D( for more information about header parameter format. )0 P( )0 P( )0 2 12 H(funhist)WB 75 Sn()WB 9 Sn( - create a 1D histogram of a column \201from a FITS binary table or raw event file\202 or an image)EA()EH( )BD() 1 51 PR(funhist [-n|-w|-T] [column] [[lo:hi:]bins])RP()ES( )0 P() 3 61 PR( -n # normalize bin value by the width of each bin -w # specify bin width instead of number of bins in arg3 -T # output in rdb/starbase format \201tab separators\202)RP( )0 P()BD(funhist)ES( creates a one-dimensional histogram from the specified columns of a )0 42 1 A(FITS Extension)42 0 TN TL()Ec /AF f D( binary table of a FITS file \201or from a non-FITS raw event file\202, or from a FITS image or array, and writes that histogram as an ASCII table. Alternatively, the program can perform a 1D projection of one of the image axes. )0 P(The first argument to the program is required, and specifies the Funtools file: FITS table or image, raw event file, or array. If "stdin" is specified, data are read from the standard input. Use )0 42 1 A(Funtools Bracket Notation)42 0 TN TL()Ec /AF f D( to specify FITS extensions, and filters. )0 P(For a table, the second argument also is required. It specifies the column to use in generating the histogram. If the data file is of type image \201or array\202, the column is optional: if "x" \201or "X"\202, "y" \201or "Y"\202 is specified, then a projection is performed over the x \201dim1\202 or y \201dim2\202 axes, respectively. \201That is, this projection will give the same results as a histogram performed on a table containing the equivalent x,y event rows.\202 If no column name is specified or "xy" \201or "XY"\202 is specified for the image, then a histogram is performed on the values contained in the image pixels. )0 P(The argument that follows is optional and specifies the number of bins to use in creating the histogram and, if desired, the range of bin values. For image and table histograms, the range should specify the min and max data values. For image histograms on the x and y axes, the range should specify the min and max image bin values. If this argument is omitted, the number of output bins for a table is calculated either from the TLMIN/TLMAX headers values \201if these exist in the table FITS header for the specified column\202 or by going through the data to calculate the min and max value. For an image, the number of output bins is calculated either from the DATAMIN/DATAMAX header values, or by going through the data to calculate min and max value. \201Note that this latter calculation might fail if the image cannot be fit in memory.\202 If the data are floating point \201table or image\202 and the number of bins is not specified, an arbitrary default of 128 is used. )0 P(For binary table processing, the )BD(-w)ES( \201bin width\202 switch can be used to specify the width of each bin rather than the number of bins. Thus: ) 1 29 PR( funhist test.ev pha 1:100:5)RP( means that 5 bins of width 20 are used in the histogram, while: ) 1 32 PR( funhist -w test.ev pha 1:100:5)RP( means that 20 bins of width 5 are used in the histogram. )0 P(The data are divvied up into the specified number of bins and the resulting 1D histogram \201or projection\202 is output in ASCII table format. For a table, the output displays the low_edge \201inclusive\202 and hi_edge \201exclusive\202 values for the data. For example, a 15-row table containing a "pha" column whose values range from -7.5 to 7.5 can be processed thus: ) 47 62 PR( [sh] funhist test.ev pha # data file: /home/eric/data/test.ev # column: pha # min,max,bins: -7.5 7.5 15 bin value lo_edge hi_edge ------ --------- --------------------- --------------------- 1 22 -7.50000000 -6.50000000 2 21 -6.50000000 -5.50000000 3 20 -5.50000000 -4.50000000 4 19 -4.50000000 -3.50000000 5 18 -3.50000000 -2.50000000 6 17 -2.50000000 -1.50000000 7 16 -1.50000000 -0.50000000 8 30 -0.50000000 0.50000000 9 16 0.50000000 1.50000000 10 17 1.50000000 2.50000000 11 18 2.50000000 3.50000000 12 19 3.50000000 4.50000000 13 20 4.50000000 5.50000000 14 21 5.50000000 6.50000000 15 22 6.50000000 7.50000000 [sh] funhist test.ev pha 1:6 # data file: /home/eric/data/test.ev # column: pha # min,max,bins: 0.5 6.5 6 bin value lo_edge hi_edge ------ --------- --------------------- --------------------- 1 16 0.50000000 1.50000000)WR( 2 17 1.50000000 2.50000000 3 18 2.50000000 3.50000000 4 19 3.50000000 4.50000000 5 20 4.50000000 5.50000000 6 21 5.50000000 6.50000000 [sh] funhist test.ev pha 1:6:3 # data file: /home/eric/data/test.ev # column: pha # min,max,bins: 0.5 6.5 3 bin value lo_edge hi_edge ------ --------- --------------------- --------------------- 1 33 0.50000000 2.50000000 2 37 2.50000000 4.50000000 3 41 4.50000000 6.50000000)RP( )0 P(For a table histogram, the )BD(-n)ES(\201normalize\202 switch can be used to normalize the bin value by the width of the bin \201i.e., hi_edge-lo_edge\202: ) 11 74 PR( [sh] funhist -n test.ev pha 1:6:3 # data file: test.ev # column: pha # min,max,bins: 0.5 6.5 3 # width normalization \201val/\201hi_edge-lo_edge\202\202 is applied bin value lo_edge hi_edge ------ --------------------- --------------------- --------------------- 1 16.50000000 0.50000000 2.50000000 2 6.16666667 2.50000000 4.50000000 3 4.10000000 4.50000000 6.50000000)RP( This could used, for example, to produce a light curve with values having units of counts/second instead of counts. )0 P(For an image histogram, the output displays the low and high image values \201both inclusive\202 used to generate the histogram. For example, in the following example, 184 pixels had a value of 1, 31 had a value of 2, while only 2 had a value of 3,4,5,6, or 7: ) 13 74 PR( [sh] funhist test.fits # data file: /home/eric/data/test.fits # min,max,bins: 1 7 7 bin value lo_val hi_val ------ --------------------- --------------------- --------------------- 1 184.00000000 1.00000000 1.00000000 2 31.00000000 2.00000000 2.00000000 3 2.00000000 3.00000000 3.00000000 4 2.00000000 4.00000000 4.00000000 5 2.00000000 5.00000000 5.00000000 6 2.00000000 6.00000000 6.00000000 7 2.00000000 7.00000000 7.00000000)RP( )0 P(For the axis projection of an image, the output displays the low and high image bins \201both inclusive\202 used to generate the projection. For example, in the following example, 21 counts had their X bin value of 2, etc.: ) 23 74 PR( [sh] funhist test.fits x 2:7 # data file: /home/eric/data/test.fits # column: X # min,max,bins: 2 7 6 bin value lo_bin hi_bin ------ --------------------- --------------------- --------------------- 1 21.00000000 2.00000000 2.00000000 2 20.00000000 3.00000000 3.00000000 3 19.00000000 4.00000000 4.00000000 4 18.00000000 5.00000000 5.00000000 5 17.00000000 6.00000000 6.00000000 6 16.00000000 7.00000000 7.00000000 [sh] funhist test.fits x 2:7:2 # data file: /home/eric/data/test.fits # column: X # min,max,bins: 2 7 2 bin value lo_bin hi_bin ------ --------------------- --------------------- --------------------- 1 60.00000000 2.00000000 4.00000000 2 51.00000000 5.00000000 7.00000000)RP( )0 P(You can use gnuplot or other plotting programs to graph the results, using a script such as: ) 7 119 PR( #!/bin/sh sed -e '1,/---- .*/d /^$/,$d' | \200 awk '\200 BEGIN{print "set nokey; set title \200"funhist\200"; set xlabel \200"bin\200"; set ylabel \200"counts\200"; plot \200"-\200" with boxes"} \200 {print $3, $2, $4-$3}' | \200 gnuplot -persist - 1>/dev/null 2>&1)RP( Similar plot commands are supplied in the script )BD(funhist.plot)ES(: ) 1 49 PR( funhist test.ev pha ... | funhist.plot gnuplot)RP( )0 2 13 H(funimage)WB 76 Sn()WB 10 Sn( - create a FITS image from a Funtools data file)EA()EH( )BD() 3 73 PR(funimage [-a] [bitpix=n] funimage [-l] [bitpix=n] funimage [-p x|y] [bitpix=n])RP()ES( )0 P() 3 65 PR( -a # append to existing output file as an image extension -l # input is a list file containing xcol, ycol, value -p [x|y] # project along x or y axis to create a 1D image)RP( )0 P()BD(funimage)ES( creates a primary FITS image from the specified )0 42 1 A(FITS Extension)42 0 TN TL()Ec /AF f D( and/or )0 49 1 A(Image Section)49 0 TN TL()Ec /AF f D( of a FITS file, or from an )0 49 1 A(Image Section)49 0 TN TL()Ec /AF f D( of a non-FITS array, or from a raw event file. )0 P(The first argument to the program specifies the FITS input image, array, or raw event file to process. If "stdin" is specified, data are read from the standard input. Use )0 42 1 A(Funtools Bracket Notation)42 0 TN TL()Ec /AF f D( to specify FITS extensions, image sections, and filters. The second argument is the output FITS file. If "stdout" is specified, the FITS image is written to the standard output. By default, the output pixel values are of the same data type as those of the input file \201or type "int" when binning a table\202, but this can be overridden using an optional third argument of the form: ) 1 10 PR( bitpix=n)RP( where n is 8,16,32,-32,-64, for unsigned char, short, int, float and double, respectively. )0 P(If the input data are of type image, the appropriate section is extracted and blocked \201based on how the )0 49 1 A(Image Section)49 0 TN TL()Ec /AF f D( is specified\202, and the result is written to the FITS primary image. When an integer image containing the BSCALE and BZERO keywords is converted to float, the pixel values are scaled and the scaling keywords are deleted from the output header. When converting integer scaled data to integer \201possibly of a different size\202, the pixels are not scaled and the scaling keywords are retained. )0 P(If the input data is a binary table or raw event file, these are binned into an image, from which a section is extracted and blocked, and written to a primary FITS image. In this case, it is necessary to specify the two columns that will be used in the 2D binning. This can be done on the command line using the )BD(bincols=\201x,y\202)ES( keyword: ) 1 46 PR( funcnts "foo.ev[EVENTS,bincols=\201detx,dety\202]")RP( The full form of the )BD(bincols=)ES( specifier is: ) 1 77 PR( bincols=\201[xname[:tlmin[:tlmax:[binsiz]]]],[yname[:tlmin[:tlmax[:binsiz]]]]\202)RP( where the tlmin, tlmax, and binsiz specifiers determine the image binning dimensions: ) 2 56 PR( dim = \201tlmax - tlmin\202/binsiz \201floating point data\202 dim = \201tlmax - tlmin\202/binsiz + 1 \201integer data\202)RP( Using this syntax, it is possible to bin any two columns of a binary table at any bin size. Note that the tlmin, tlmax, and binsiz specifiers can be omitted if TLMIN, TLMAX, and TDBIN header parameters \201respectively\202 are present in the FITS binary table header for the column in question. Note also that if only one parameter is specified, it is assumed to be tlmax, and tlmin defaults to 1. If two parameters are specified, they are assumed to be tlmin and tlmax. See )0 50 1 A(Binning FITS Binary Tables and Non-FITS Event Files)50 0 TN TL()Ec /AF f D( for more information about binning parameters. )0 P(By default, a new 2D FITS image file is created and the image is written to the primary HDU. If the )BD(-a)ES( \201append\202 switch is specified, the image is appended to an existing FITS file as an IMAGE extension. \201If the output file does not exist, the switch is effectively ignored and the image is written to the primary HDU.\202 This can be useful in a shell programming environment when processing multiple FITS images that you want to combine into a single final FITS file. )0 P()BD(funimage)ES( also can take input from a table containing columns of x, y, and value \201e.g., the output from )BD(fundisp -l)ES( which displays each image x and y and the number of counts at that position.\202 When the )BD(-l)ES( \201list\202 switch is used, the input file is taken to be a FITS or ASCII table containing \201at least\202 three columns that specify the x and y image coordinates and the value of that image pixel. In this case, )BD(funimage)ES( requires four extra arguments: xcolumn:xdims, ycolumn:ydims, vcolumn and bitpix=n. The x and y col:dim information takes the form: ) 3 55 PR( name:dim # values range from 1 to dim name:min:max # values range from min to max name:min:max:binsiz # dimensions scaled by binsize)RP( In particular, the min value should be used whenever the minimum coordinate value is something other than one. For example: ) 2 69 PR( funimage -l foo.lst foo.fits xcol:0:512 ycol:0:512 value bitpix=-32)RP( )0 P(The list feature also can be used to read unnamed columns from standard input: simply replace the column name with a null string. Note that the dimension information is still required: ) 5 60 PR( funimage -l stdin foo.fits "":0:512 "":0:512 "" bitpix=-32 240 250 1 255 256 2 ... ^D)RP( )0 P(The list feature provides a simple way to generate a blank image. If you pass a )0 47 1 A(Column-based Text File)47 0 TN TL()Ec /AF f D( to funimage in which the text header contains the required image information, then funimage will correctly make a blank image. For example, consider the following text file \201called foo.txt\202: ) 3 20 PR( x:I:1:10 y:I:1:10 ------ ------ 0 0)RP( This text file defines two columns, x and y, each of data type 32-bit int and image dimension 10. The command: ) 1 36 PR( funimage foo.txt foo.fits bitpix=8)RP( will create an empty FITS image called foo.fits containing a 10x10 image of unsigned char: ) 13 75 PR( fundisp foo.fits 1 2 3 4 5 6 7 8 9 10 ------ ------ ------ ------ ------ ------ ------ ------ ------ ------ 10: 0 0 0 0 0 0 0 0 0 0 9: 0 0 0 0 0 0 0 0 0 0 8: 0 0 0 0 0 0 0 0 0 0 7: 0 0 0 0 0 0 0 0 0 0 6: 0 0 0 0 0 0 0 0 0 0 5: 0 0 0 0 0 0 0 0 0 0 4: 0 0 0 0 0 0 0 0 0 0 3: 0 0 0 0 0 0 0 0 0 0 2: 0 0 0 0 0 0 0 0 0 0 1: 1 0 0 0 0 0 0 0 0 0)RP( Note that the text file must contain at least one row of data. However, in the present example, event position 0,0 is outside the limits of the image and will be ignored. \201You can, of course, use real x,y values to seed the image with data.\202 )0 P(Furthermore, you can use the TEXT filter specification to obviate the need for an input text file altogether. The following command will create the same 10x10 char image without an actual input file: ) 3 69 PR( funimage stdin'[TEXT\201x:I:10,y:I:10\202]' foo.fits bitpix=8 < /dev/null or funimage /dev/null'[TEXT\201x:I:10,y:I:10\202]' foo.fits bitpix=8)RP( )0 P(You also can use either of these methods to generate a region mask simply by appending a region inside the filter brackets and specfying )BD(mask=all)ES( along with the bitpix. For example, the following command will generate a 10x10 char mask using 3 regions: ) 2 76 PR( funimage stdin'[TEXT\201x:I:10,y:I:10\202,cir\2015,5,4\202,point\20110,1\202,-cir\2015,5,2\202]' \200 foo.fits bitpix=8,mask=all < /dev/null)RP( The resulting mask looks like this: ) 13 75 PR( fundisp foo.fits 1 2 3 4 5 6 7 8 9 10 ------ ------ ------ ------ ------ ------ ------ ------ ------ ------ 10: 0 0 0 0 0 0 0 0 0 0 9: 0 0 0 0 0 0 0 0 0 0 8: 0 0 1 1 1 1 1 0 0 0 7: 0 1 1 1 1 1 1 1 0 0 6: 0 1 1 0 0 0 1 1 0 0 5: 0 1 1 0 0 0 1 1 0 0 4: 0 1 1 0 0 0 1 1 0 0 3: 0 1 1 1 1 1 1 1 0 0 2: 0 0 1 1 1 1 1 0 0 0 1: 0 0 0 0 0 0 0 0 0 2)RP( )0 P(You can use )BD(funimage)ES( to create 1D image projections along the x or y axis using the )BD(-p [x|y])ES( switch. This capability works for both images and tables. For example consider a FITS table named ev.fits containing the following rows: ) 17 19 PR( X Y -------- -------- 1 1 1 2 1 3 1 4 1 5 2 2 2 3 2 4 2 5 3 3 3 4 3 5 4 4 4 5 5 5)RP( A corresponding 5x5 image, called dim2.fits, would therefore contain: ) 7 59 PR( 1 2 3 4 5 ---------- ---------- ---------- ---------- ---------- 5: 1 1 1 1 1 4: 1 1 1 1 0 3: 1 1 1 0 0 2: 1 1 0 0 0 1: 1 0 0 0 0)RP( A projection along the y axis can be performed on either the table or the image: ) 9 59 PR( funimage -p y ev.fits stdout | fundisp stdin 1 2 3 4 5 ---------- ---------- ---------- ---------- ---------- 1: 1 2 3 4 5 funimage -p y dim2.fits stdout | fundisp stdin 1 2 3 4 5 ---------- ---------- ---------- ---------- ---------- 1: 1 2 3 4 5)RP( )0 P(Furthermore, you can create a 1D image projection along any column of a table by using the )BD(bincols=[column])ES( filter specification and specifying a single column. For example, the following command projects the same 1D image along the y axis of a table as use of the )BD(-p y)ES( switch: ) 4 59 PR( funimage ev.fits'[bincols=y]' stdout | fundisp stdin 1 2 3 4 5 ---------- ---------- ---------- ---------- ---------- 1: 1 2 3 4 5)RP( )0 P(Examples: )0 P(Create a FITS image from a FITS binary table: ) 1 33 PR( [sh] funimage test.ev test.fits)RP( )0 P(Display the FITS image generated from a blocked section of FITS binary table: ) 5 60 PR( [sh] funimage "test.ev[2:8,3:7,2]" stdout | fundisp stdin 1 2 3 --------- --------- --------- 1: 20 28 36 2: 28 36 44)RP( )0 2 14 H(funindex)WB 77 Sn()WB 11 Sn( - create an index for a column of a FITS binary table)EA()EH( )BD() 1 42 PR(funindex [oname])RP()ES( )0 P() 7 71 PR( NB: these options are not compatible with Funtools processing. Please use the defaults instead. -c # compress output using gzip" -a # ASCII output, ignore -c \201default: FITS table\202" -f # FITS table output \201default: FITS table\202" -l # long output, i.e. with key value\201s\202 \201default: long\202" -s # short output, i.e. no key value\201s\202 \201default: long\202")RP( )0 P(The funindex script creates an index for the specified column \201key\202 by running funtable -s \201sort\202 and then saving the column value and the record number for each sorted row. This index will be used automatically by funtools filtering of that column, provided the index file's modification date is later than that of the data file. )0 P( The first required argument is the name of the FITS binary table to index. Please note that text files cannot be indexed at this time. The second required argument is the column \201key\202 name to index. While multiple keys can be specified in principle, the funtools index processing assume a single key and will not recognize files containing multiple keys. )0 P(By default, the output index file name is [root]_[key].idx, where [root] is the root of the input file. Funtools looks for this specific file name when deciding whether to use an index for faster filtering. Therefore, the optional third argument \201output file name\202 should not be used for funtools processing. )0 P(For example, to create an index on column Y for a given FITS file, use: ) 1 21 PR( funindex foo.fits Y)RP( This will generate an index named foo_y.idx, which will be used by funtools for filters involving the Y column. )0 2 15 H(funjoin)WB 78 Sn()WB 12 Sn( - join two or more FITS binary tables on specified columns)EA()EH( )BD() 1 57 PR(funjoin [switches] ... )RP()ES( )0 P() 11 74 PR( -a cols # columns to activate in all files -a1 cols ... an cols # columns to activate in each file -b 'c1:bvl,c2:bv2' # blank values for common columns in all files -bn 'c1:bv1,c2:bv2' # blank values for columns in specific files -j col # column to join in all files -j1 col ... jn col # column to join in each file -m min # min matches to output a row -M max # max matches to output a row -s # add 'jfiles' status column -S col # add col as status column -t tol # tolerance for joining numeric cols [2 files only])RP( )BD(funjoin)ES( joins rows from two or more \201up to 32\202 )0 42 1 A(FITS Binary Table files)42 0 TN TL()Ec /AF f D(, based on the values of specified join columns in each file. NB: the join columns must have an index file associated with it. These files are generated using the )BD(funindex)ES( program. )0 P(The first argument to the program specifies the first input FITS table or raw event file. If "stdin" is specified, data are read from the standard input. Subsequent arguments specify additional event files and tables to join. The last argument is the output FITS file. )0 P(NB: Do )BD(not)ES( use )0 42 1 A(Funtools Bracket Notation)42 0 TN TL()Ec /AF f D( to specify FITS extensions and row filters when running funjoin or you will get wrong results. Rows are accessed and joined using the index files directly, and this bypasses all filtering. )0 P(The join columns are specified using the )BD(-j col)ES( switch \201which specifies a column name to use for all files\202 or with )BD(-j1 col1)ES(, )BD(-j2 col2)ES(, ... )BD(-jn coln)ES( switches \201which specify a column name to use for each file\202. A join column must be specified for each file. If both )BD(-j col)ES( and )BD(-jn coln)ES( are specified for a given file, then the latter is used. Join columns must either be of type string or type numeric; it is illegal to mix numeric and string columns in a given join. For example, to join three files using the same key column for each file, use: ) 1 52 PR( funjoin -j key in1.fits in2.fits in3.fits out.fits)RP( A different key can be specified for the third file in this way: ) 1 65 PR( funjoin -j key -j3 otherkey in1.fits in2.fits in3.fits out.fits)RP( )0 P(The )BD(-a "cols")ES( switch \201and )BD(-a1 "col1")ES(, )BD(-a2 "cols2")ES( counterparts\202 can be used to specify columns to activate \201i.e. write to the output file\202 for each input file. By default, all columns are output. )0 P(If two or more columns from separate files have the same name, the second \201and subsequent\202 columns are renamed to have an underscore and a numeric value appended. )0 P(The )BD(-m min)ES( and )BD(-M max)ES( switches specify the minimum and maximum number of joins required to write out a row. The default minimum is 0 joins \201i.e. all rows are written out\202 and the default maximum is 63 \201the maximum number of possible joins with a limit of 32 input files\202. For example, to write out only those rows in which exactly two files have columns that match \201i.e. one join\202: ) 1 66 PR( funjoin -j key -m 1 -M 1 in1.fits in2.fits in3.fits ... out.fits)RP( )0 P(A given row can have the requisite number of joins without all of the files being joined \201e.g. three files are being joined but only two have a given join key value\202. In this case, all of the columns of the non-joined file are written out, by default, using blanks \201zeros or NULLs\202. The )BD(-b c1:bv1,c2:bv2)ES( and )BD(-b1 'c1:bv1,c2:bv2' -b2 'c1:bv1,c2:bv2' ...)ES( switches can be used to set the blank value for columns common to all files and/or columns in a specified file, respectively. Each blank value string contains a comma-separated list of column:blank_val specifiers. For floating point values \201single or double\202, a case-insensitive string value of "nan" means that the IEEE NaN \201not-a-number\202 should be used. Thus, for example: ) 1 62 PR( funjoin -b "AKEY:???" -b1 "A:-1" -b3 "G:NaN,E:-1,F:-100" ...)RP( means that a non-joined AKEY column in any file will contain the string "???", the non-joined A column of file 1 will contain a value of -1, the non-joined G column of file 3 will contain IEEE NaNs, while the non-joined E and F columns of the same file will contain values -1 and -100, respectively. Of course, where common and specific blank values are specified for the same column, the specific blank value is used. )0 P(To distinguish which files are non-blank components of a given row, the )BD(-s)ES( \201status\202 switch can be used to add a bitmask column named "JFILES" to the output file. In this column, a bit is set for each non-blank file composing the given row, with bit 0 corresponds to the first file, bit 1 to the second file, and so on. The file names themselves are stored in the FITS header as parameters named JFILE1, JFILE2, etc. The )BD(-S col)ES( switch allows you to change the name of the status column from the default "JFILES". )0 P(A join between rows is the Cartesian product of all rows in one file having a given join column value with all rows in a second file having the same value for its join column and so on. Thus, if file1 has 2 rows with join column value 100, file2 has 3 rows with the same value, and file3 has 4 rows, then the join results in 2*3*4=24 rows being output. )0 P(The join algorithm directly processes the index file associated with the join column of each file. The smallest value of all the current columns is selected as a base, and this value is used to join equal-valued columns in the other files. In this way, the index files are traversed exactly once. )0 P(The )BD(-t tol)ES( switch specifies a tolerance value for numeric columns. At present, a tolerance value can join only two files at a time. \201A completely different algorithm is required to join more than two files using a tolerance, somethng we might consider implementing in the future.\202 )0 P(The following example shows many of the features of funjoin. The input files t1.fits, t2.fits, and t3.fits contain the following columns: ) 28 49 PR( [sh] fundisp t1.fits AKEY KEY A B ----------- ------ ------ ------ aaa 0 0 1 bbb 1 3 4 ccc 2 6 7 ddd 3 9 10 eee 4 12 13 fff 5 15 16 ggg 6 18 19 hhh 7 21 22 fundisp t2.fits AKEY KEY C D ----------- ------ ------ ------ iii 8 24 25 ggg 6 18 19 eee 4 12 13 ccc 2 6 7 aaa 0 0 1 fundisp t3.fits AKEY KEY E F G ------------ ------ -------- -------- ----------- ggg 6 18 19 100.10 jjj 9 27 28 200.20 aaa 0 0 1 300.30 ddd 3 9 10 400.40)RP( )0 P(Given these input files, the following funjoin command: ) 3 59 PR( funjoin -s -a1 "-B" -a2 "-D" -a3 "-E" -b \200 "AKEY:???" -b1 "AKEY:XXX,A:255" -b3 "G:NaN,E:-1,F:-100" \200 -j key t1.fits t2.fits t3.fits foo.fits)RP( will join the files on the KEY column, outputting all columns except B \201in t1.fits\202, D \201in t2.fits\202 and E \201in t3.fits\202, and setting blank values for AKEY \201globally, but overridden for t1.fits\202 and A \201in file 1\202 and G, E, and F \201in file 3\202. A JFILES column will be output to flag which files were used in each row: ) 12 105 PR( AKEY KEY A AKEY_2 KEY_2 C AKEY_3 KEY_3 F G JFILES ------------ ------ ------ ------------ ------ ------ ------------ ------ -------- ----------- -------- aaa 0 0 aaa 0 0 aaa 0 1 300.30 7 bbb 1 3 ??? 0 0 ??? 0 -100 nan 1 ccc 2 6 ccc 2 6 ??? 0 -100 nan 3 ddd 3 9 ??? 0 0 ddd 3 10 400.40 5 eee 4 12 eee 4 12 ??? 0 -100 nan 3 fff 5 15 ??? 0 0 ??? 0 -100 nan 1 ggg 6 18 ggg 6 18 ggg 6 19 100.10 7 hhh 7 21 ??? 0 0 ??? 0 -100 nan 1 XXX 0 255 iii 8 24 ??? 0 -100 nan 2 XXX 0 255 ??? 0 0 jjj 9 28 200.20 4)RP( )0 2 16 H(funmerge)WB 79 Sn()WB 13 Sn( - merge one or more Funtools table files)EA()EH( )BD() 1 61 PR(funmerge [-w|-x] -f [colname] ... )RP()ES( )0 P() 3 68 PR( -f # output a column specifying file from which this event came -w # adjust position values using WCS info -x # adjust position values using WCS info and save old values)RP( )0 P()BD(funmerge)ES( merges FITS data from one or more )0 42 1 A(FITS Binary Table files)42 0 TN TL()Ec /AF f D( or raw event files. )0 P(The first argument to the program specifies the first input FITS table or raw event file. If "stdin" is specified, data are read from the standard input. Use )0 42 1 A(Funtools Bracket Notation)42 0 TN TL()Ec /AF f D( to specify FITS extensions and row filters. Subsequent arguments specify additional event files and tables to merge. \201NB: Stdin cannot not be used for any of these additional input file arguments.\202 The last argument is the output FITS file. The columns in each input table must be identical. )0 P(If an input file begins with the '@' character, it is processed as an include file, i.e., as a text file containing event file names \201as well as blank lines and/or comment lines starting with the '#' sign\202. If standard input is specified as an include file \201'@stdin'\202, then file names are read from the standard input until EOF \201^D\202. Event files and include files can be mixed on a command line. )0 P(Rows from each table are written sequentially to the output file. If the switch )BD(-f [colname])ES( is specified on the command line, an additional column is added to each row containing the number of the file from which that row was taken \201starting from one\202. In this case, the corresponding file names are stored in the header parameters having the prefix )BD(FUNFIL)ES(, i.e., FUNFIL01, FUNFIL02, etc. )0 P(Using the )BD(-w)ES( switch \201or )BD(-x)ES( switch as described below\202, )BD(funmerge)ES( also can adjust the position column values using the WCS information in each file. \201By position columns, we mean the columns that the table is binned on, i.e., those columns defined by the )BD(bincols=)ES( switch, or \201X,Y\202 by default.\202 To perform WCS alignment, the WCS of the first file is taken as the base WCS. Each position in subsequent files is adjusted by first converting it to the sky coordinate in its own WCS coordinate system, then by converting this sky position to the sky position of the base WCS, and finally converting back to a pixel position in the base system. Note that in order to perform WCS alignment, the appropriate WCS and TLMIN/TLMAX keywords must already exist in each FITS file. )0 P(When performing WCS alignment, you can save the original positions in the output file by using the )BD(-x)ES( \201for "xtra"\202 switch instead of the )BD(-w)ES( switch \201i.e., using this switch also implies using )BD(-w)ES(\202 The old positions are saved in columns having the same name as the original positional columns, with the added prefix "OLD_". )0 P(Examples: )0 P(Merge two tables, and preserve the originating file number for each row in the column called "FILE" \201along with the corresponding file name in the header\202: ) 1 51 PR( [sh] funmerge -f "FILE" test.ev test2.ev merge.ev)RP( )0 P(Merge two tables with WCS alignment, saving the old position values in 2 additional columns: ) 1 44 PR( [sh] funmerge -x test.ev test2.ev merge.ev)RP( )0 P(This program only works on raw event files and binary tables. We have not yet implemented image and array merging. )0 2 17 H(funsky)WB 80 Sn()WB 14 Sn( - convert between image and sky coordinates)EA()EH( )BD() 4 72 PR( funsky iname[ext] # RA,Dec \201deg\202 or image pix from stdin funsky iname[ext] [lname] # RA, Dec \201deg\202 or image pix from list funsky iname[ext] [col1] [col2] # named cols:units from stdin funsky iname[ext] [lname] [col1] [col2] # named cols:units from list)RP()ES( )0 P() 5 73 PR( -d # always use integer tlmin conversion \201as ds9 does\202 -r # convert x,y to RA,Dec \201default: convert RA,Dec to x,y\202 -o # include offset from the nominal target position \201in arcsec\202 -v # display input values also \201default: display output only\202 -T # output display in rdb format \201w/header,tab delimiters\202)RP( )0 P(Funsky converts input sky coordinates \201RA, Dec\202 to image coordinates \201or vice versa\202 using the WCS information contained in the specified FITS file. Several calling sequences are supported in order to make it easy to specify coordinate positions in different ways. )0 P(The first required argument is always the input FITS file \201or extension\202 containing the WCS information in an extension header. Note that the data from this file is not used. By default, the program converts input RA and Dec values to X and Y using this WCS information. If the WCS is associated with a FITS image, then the X,Y values are image values. If the WCS is associated with a binary table, then the X, Y values are physical values. To convert X,Y to RA and Dec, use the )BD(-r)ES( \201reverse\202 switch. )0 P(If no other command arguments are supplied, then the input positions are read from the standard input. Each line is assumed to contain a single coordinate position consisting of an RA in degrees \201or X in pixels\202 followed by a Dec in degrees \201or Y in pixels\202. The usual delimiters are supported \201spaces, commas, tabs\202. For example: ) 9 52 PR( # read from stdin, default column names and units [sh] funsky snr.ev 22.982695 58.606523 # input RA \201hrs\202, Dec\201deg\202 510.00 510.00 22.982127 58.607634 # input 512.00 510.50 22.981700 58.614301 # input 513.50 513.50 ^D # end of input)RP( )0 P(If a second argument is supplied, this argument is assumed to be a file containing RA \201X\202 and Dec \201Y\202 positions. The file can either be an ASCII table or a FITS binary table. The order of columns is unimportant, if the table has a column header. In this case, the names of the columns must be one of "RA", "DEC", or "X", "Y" for sky to image and image to sky conversions, respectively. If the table has no header, then once again, RA \201X\202 is assumed to first, followed by DEC \201Y\202. For example: ) 12 50 PR( # read from file, default column names and units [sh] cat hd.in RA DEC --------- --------- 22.982695 58.606523 22.982127 58.607634 22.981700 58.614301 [sh] funsky snr.ev hd.in 510.00 510.00 512.00 510.50 513.50 513.50)RP( )0 P(If three arguments are supplied, then the input positions again are read from the standard input. Each line is assumed to contain a single coordinate position consisting of an RA \201or X in pixels\202 followed by a Dec \201or Y in pixels\202, with the usual delimiters supported. However, the second and third arguments now specify the column names and/or sky units using a colon-delimited syntax: ) 1 19 PR( [colname]:[h|d|r])RP( If the colname is omitted, the names default to "RA", "DEC", "X", "Y", "COL1", or "COL2" as above. If the units are omitted, the default is degrees for both RA and Dec. When the -r switch is used \201convert from image to sky\202 the units are applied to the output instead of the input. The following examples will serve to illustrate the options: ) 36 66 PR( # read from stdin, specifying column names \201def. units: degrees\202 [sh] cat hd.in MYRA MYDEC --------- --------- 22.982695 58.606523 22.982127 58.607634 22.981700 58.614301 [sh] funsky snr.ev MYRA MYDEC < hd.in 510.00 510.00 512.00 510.50 513.50 513.50 # read from stdin, specifying column names and units [sh] cat dd.in MYRA MYDEC --------- --------- 344.740432 58.606523 344.731900 58.607634 344.725500 58.614301 [sh] funsky snr.ev MYRA:d MYDEC:d < dd.in 510.00 510.00 512.00 510.50 513.50 513.50 # read stdin, convert image to sky, specifying output sky units [sh] cat im.in 510.00 510.00 512.00 510.50 513.50 513.50)WR( [sh] cat im.in | funsky -r snr.ev :d :d 344.740432 58.606523 344.731900 58.607634 344.725500 58.614301)RP( )0 P(Finally, four command arguments specify both and input file and column names and/or units: ) 22 64 PR( [sh] cat dd.in MYRA MYDEC --------- --------- 344.740432 58.606523 344.731900 58.607634 344.725500 58.614301 [sh] funsky snr.ev dd.in MYRA:d MYDEC:d 510.00 510.00 512.00 510.50 513.50 513.50 # read file, convert image to sky, specifying output sky units [sh] cat im.in 510.00 510.00 512.00 510.50 513.50 513.50 [sh] funsky -r snr.ev im.in :d :d 344.740432 58.606523 344.731900 58.607634 344.725500 58.614301)RP( )0 P(By default, the output of funsky consists only of the converted coordinate position\201s\202, one per output line. This makes parsing in shell scripts easy. Use the )BD(-v)ES( \201verbose\202 switch to specify that the input coordinates should be pre-pended to each line. For example: ) 16 53 PR( [sh] cat dd.in MYRA MYDEC --------- --------- 344.740432 58.606523 344.731900 58.607634 344.725500 58.614301 [sh] funsky snr.ev dd.in MYRA:d MYDEC:d 510.00 510.00 512.00 510.50 513.50 513.50 [sh] funsky -v snr.ev dd.in MYRA:d MYDEC:d 344.740432 58.606523 510.00 510.00 344.731900 58.607634 512.00 510.50 344.725500 58.614301 513.50 513.50)RP( )0 P(In addition, a full starbase table can be output using the )BD(-T)ES( \201table\202 switch. This switch can be used with or without the -v switch. If the -T and -v are both specified, then a descriptive header parameters are output before the table \201mainly to remind you of the sky units\202: ) 23 62 PR( # output table in non-verbose mode [sh] funsky -T snr.ev dd.in MYRA:d MYDEC:d X Y ------------ ------------ 510.00 510.00 512.00 510.50 513.50 513.50 # output table in verbose mode [sh] funsky -T -v snr.ev dd.in MYRA:d MYDEC:d # IFILE = /Users/eric/data/snr.ev # ICOL1 = MYRA # ICOL2 = MYDEC # IUNITS1 = d # IUNITS2 = d # OCOL1 = X # OCOL2 = Y MYRA MYDEC X Y ------------ ------------ ------------ ------------ 344.740432 58.606523 510.00 510.00 344.731900 58.607634 512.00 510.50 344.725500 58.614301 513.50 513.50)RP( )0 P(Finally, the )BD(-d)ES( \201ds9\202 switch mimicks ds9's use of integer TLMIN and TLMAX values for all coordinate transformations. FITS conventions seem to call for use of floating point TLMIN and TLMAX when the data are floats. This convention is followed by funsky but results in a small discrepancy with ds9's converted values for floating point data. We will remedy this conflict in the future, maybe. )0 2 18 H(funtable)WB 81 Sn()WB 15 Sn( - copy selected rows from a Funtools file to a FITS binary table)EA()EH( )BD() 1 62 PR(funtable [-a] [-i|-z] [-m] [-s cols] [columns])RP()ES( )0 P() 5 61 PR( -a # append to existing output file as a table extension -i # for image data, only generate X and Y columns -m # for tables, write a separate file for each region -s "col1 ..." # columns on which to sort -z # for image data, output zero-valued pixels)RP( )0 P()BD(funtable)ES( selects rows from the specified )0 42 1 A(FITS Extension)42 0 TN TL()Ec /AF f D( \201binary table only\202 of a FITS file, or from a non-FITS raw event file, and writes those rows to a FITS binary table file. It also will create a FITS binary table from an image or a raw array file. )0 P(The first argument to the program specifies the FITS file, raw event file, or raw array file. If "stdin" is specified, data are read from the standard input. Use )0 42 1 A(Funtools Bracket Notation)42 0 TN TL()Ec /AF f D( to specify FITS extensions, and filters. The second argument is the output FITS file. If "stdout" is specified, the FITS binary table is written to the standard output. By default, all columns of the input file are copied to the output file. Selected columns can be output using an optional third argument in the form: ) 1 31 PR( "column1 column1 ... columnN")RP( )0 P(The )BD(funtable)ES( program generally is used to select rows from a FITS binary table using )0 52 1 A(Table Filters)52 0 TN TL()Ec /AF f D( and/or )0 54 1 A(Spatial Region Filters)54 0 TN TL()Ec /AF f D(. For example, you can copy only selected rows \201and output only selected columns\202 by executing in a command such as: ) 13 75 PR( [sh] funtable "test.ev[pha==1&)SY(\160)ES(==10]" stdout "x y pi pha" | fundisp stdin X Y PHA PI ------- ------- ------- --------- 1 10 1 10 1 10 1 10 1 10 1 10 1 10 1 10 1 10 1 10 1 10 1 10 1 10 1 10 1 10 1 10 1 10 1 10 1 10 1 10)RP( )0 P(The special column )BD($REGION)ES( can be specified to write the region id of each row: ) 12 113 PR( [sh $] funtable "test.ev[time-\201int\202time>=.99&&annulus\2010 0 0 10 n=3\202]" stdout 'x y time $REGION' | fundisp stdin X Y TIME REGION -------- -------- --------------------- ---------- 5 -6 40.99000000 3 4 -5 59.99000000 2 -1 0 154.99000000 1 -2 1 168.99000000 1 -3 2 183.99000000 2 -4 3 199.99000000 2 -5 4 216.99000000 2 -6 5 234.99000000 3 -7 6 253.99000000 3)RP( )0 P(Here only rows with the proper fractional time and whose position also is within one of the three annuli are written. )0 P(Columns can be excluded from display using a minus sign before the column: ) 12 79 PR( [sh $] funtable "test.ev[time-\201int\202time>=.99]" stdout "-time" | fundisp stdin X Y PHA PI DX DY -------- -------- -------- ---------- ----------- ----------- 5 -6 5 -6 5.50 -6.50 4 -5 4 -5 4.50 -5.50 -1 0 -1 0 -1.50 0.50 -2 1 -2 1 -2.50 1.50 -3 2 -3 2 -3.50 2.50 -4 3 -4 3 -4.50 3.50 -5 4 -5 4 -5.50 4.50 -6 5 -6 5 -6.50 5.50 -7 6 -7 6 -7.50 6.50)RP( All columns except the time column are written. )0 P(In general, the rules for activating and de-activating columns are: )UL()-1 LI( If only exclude columns are specified, then all columns but the exclude columns will be activated. )-1 LI( If only include columns are specified, then only the specified columns are activated. )-1 LI( If a mixture of include and exclude columns are specified, then all but the exclude columns will be active; this last case is ambiguous and the rule is arbitrary.)LU( In addition to specifying columns names explicitly, the special symbols )EM(+)ES( and )EM(-)ES( can be used to activate and de-activate )EM(all)ES( columns. This is useful if you want to activate the $REGION column along with all other columns. According to the rules, the syntax "$REGION" only activates the region column and de-activates the rest. Use "+ $REGION" to activate all columns as well as the region column. )0 P(Ordinarily, only the selected table is copied to the output file. In a FITS binary table, it sometimes is desirable to copy all of the other FITS extensions to the output file as well. This can be done by appending a '+' sign to the name of the extension in the input file name. For example, the first command below copies only the EVENT table, while the second command copies other extensions as well: ) 2 64 PR( [sh] funtable "/proj/rd/data/snr.ev[EVENTS]" events.ev [sh] funtable "/proj/rd/data/snr.ev[EVENTS+]" eventsandmore.ev)RP( )0 P(If the input file is an image or a raw array file, then )BD(funtable)ES( will generate a FITS binary table from the pixel values in the image. Note that it is not possible to specify the columns to output \201using command-line argument 3\202. Instead, there are two ways to create such a binary table from an image. By default, a 3-column table is generated, where the columns are "X", "Y", and "VALUE". For each pixel in the image, a single row \201event\202 is generated with the "X" and "Y" columns assigned the dim1 and dim2 values of the image pixel, respectively and the "VALUE" column assigned the value of the pixel. With sort of table, running )BD(funhist)ES( on the "VALUE" column will give the same results as running )BD(funhist)ES( on the original image. )0 P(If the )BD(-i)ES( \201"individual" rows\202 switch is specified, then only the "X" and "Y" columns are generated. In this case, each positive pixel value in the image generates n rows \201events\202, where n is equal to the integerized value of that pixel \201plus 0.5, for floating point data\202. In effect, )BD(-i)ES( approximately recreates the rows of a table that would have been binned into the input image. \201Of course, this is only approximately correct, since the resulting x,y positions are integerized.\202 )0 P(If the )BD(-s [col1 col2 ... coln])ES( \201"sort"\202 switch is specified, the output rows of a binary table will be sorted using the specified columns as sort keys. The sort keys must be scalar columns and also must be part of the output file \201i.e. you cannot sort on a column but not include it in the output\202. This facility uses the )BD(_sort)ES( program \201included with funtools\202, which must be accessible via your path. )0 P(For binary tables, the )BD(-m)ES( \201"multiple files"\202 switch will generate a separate file for each region in the filter specification i.e. each file contains only the rows from that region. Rows which pass the filter but are not in any region also are put in a separate file. )0 P(The separate output file names generated by the )BD(-m)ES( switch are produced automatically from the root output file to contain the region id of the associated region. \201Note that region ids start at 1, so that the file name associated with id 0 contains rows that pass the filter but are not in any given region.\202 Output file names are generated as follows: )UL()-1 LI( A $n specification can be used anywhere in the root file name \201suitably quoted to protect it from the shell\202 and will be expanded to be the id number of the associated region. For example: ) 1 78 PR( funtable -m input.fits'[cir\201512,512,1\202;cir\201520,520,1\202...]' 'foo.goo_$n.fits')RP( will generate files named foo.goo_0.fits \201for rows not in any region but still passing the filter\202, foo.goo_1.fits \201rows in region id #1, the first region\202, foo.goo_2.fits \201rows in region id #2\202, etc. Note that single quotes in the output root are required to protect the '$' from the shell. )-1 LI( If $n is not specified, then the region id will be placed before the first dot \201.\202 in the filename. Thus: ) 1 73 PR( funtable -m input.fits'[cir\201512,512,1\202;cir\201520,520,1\202...]' foo.evt.fits)RP( will generate files named foo0.evt.fits \201for rows not in any region but still passing the filter\202, foo1.evt.fits \201rows in region id #1\202, foo2.evt.fits \201rows in region id #2\202, etc. )-1 LI( If no dot is specified in the root output file name, then the region id will be appended to the filename. Thus: ) 1 70 PR( funtable -m input.fits'[cir\201512,512,1\202;cir\201520,520,1\202...]' 'foo_evt')RP( will generate files named foo_evt0 \201for rows not in any region but still passing the filter\202, foo_evt1 \201rows in region id #1\202, foo_evt2 \201rows in region id #2\202, etc.)LU( The multiple file mechanism provide a simple way to generate individual source data files with a single pass through the data. )0 P(By default, a new FITS file is created and the binary table is written to the first extension. If the )BD(-a)ES( \201append\202 switch is specified, the table is appended to an existing FITS file as a BINTABLE extension. Note that the output FITS file must already exist. )0 P(If the )BD(-z)ES( \201"zero" pixel values\202 switch is specified and )BD(-i)ES( is not specified, then pixels having a zero value will be output with their "VALUE" column set to zero. Obviously, this switch does not make sense when individual events are output. )0 2 19 H(funtbl)WB 82 Sn()WB 16 Sn( - extract a table from Funtools ASCII output)EA()EH( )BD() 1 61 PR(funtable [-c cols] [-h] [-n table] [-p prog] [-s sep] )RP()ES( )0 P([NB: This program has been deprecated in favor of the ASCII text processing support in funtools. You can now perform fundisp on funtools ASCII output files \201specifying the table using bracket notation\202 to extract tables and columns.] The )BD(funtbl)ES( script extracts a specified table \201without the header and comments\202 from a funtools ASCII output file and writes the result to the standard output. The first non-switch argument is the ASCII input file name \201i.e. the saved output from funcnts, fundisp, funhist, etc.\202. If no filename is specified, stdin is read. The -n switch specifies which table \201starting from 1\202 to extract. The default is to extract the first table. The -c switch is a space-delimited list of column numbers to output, e.g. -c "1 3 5" will extract the first three odd-numbered columns. The default is to extract all columns. The -s switch specifies the separator string to put between columns. The default is a single space. The -h switch specifies that column names should be added in a header line before the data is output. Without the switch, no header is prepended. The -p program switch allows you to specify an awk-like program to run instead of the default \201which is host-specific and is determined at build time\202. The -T switch will output the data in rdb format \201i.e., with a 2-row header of column names and dashes, and with data columns separated by tabs\202. The -help switch will print out a message describing program usage. )0 P(For example, consider the output from the following funcnts command: ) 37 82 PR( [sh] funcnts -sr snr.ev "ann 512 512 0 9 n=3" # source # data file: /proj/rd/data/snr.ev # arcsec/pixel: 8 # background # constant value: 0.000000 # column units # area: arcsec**2 # surf_bri: cnts/arcsec**2 # surf_err: cnts/arcsec**2 # summed background-subtracted results upto net_counts error background berror area surf_bri surf_err ---- ------------ --------- ------------ --------- --------- --------- --------- 1 147.000 12.124 0.000 0.000 1600.00 0.092 0.008 2 625.000 25.000 0.000 0.000 6976.00 0.090 0.004 3 1442.000 37.974 0.000 0.000 15936.00 0.090 0.002 # background-subtracted results reg net_counts error background berror area surf_bri surf_err ---- ------------ --------- ------------ --------- --------- --------- --------- 1 147.000 12.124 0.000 0.000 1600.00 0.092 0.008 2 478.000 21.863 0.000 0.000 5376.00 0.089 0.004 3 817.000 28.583 0.000 0.000 8960.00 0.091 0.003 # the following source and background components were used: source_region\201s\202 ---------------- ann 512 512 0 9 n=3)WR( reg counts pixels sumcnts sumpix ---- ------------ --------- ------------ --------- 1 147.000 25 147.000 25 2 478.000 84 625.000 109 3 817.000 140 1442.000 249)RP( )0 P(There are four tables in this output. To extract the last one, you can execute: ) 4 60 PR( [sh] funcnts -s snr.ev "ann 512 512 0 9 n=3" | funtbl -n 4 1 147.000 25 147.000 25 2 478.000 84 625.000 109 3 817.000 140 1442.000 249)RP( Note that the output has been re-formatted so that only a single space separates each column, with no extraneous header or comment information. )0 P(To extract only columns 1,2, and 4 from the last example \201but with a header prepended and tabs between columns\202, you can execute: ) 5 82 PR( [sh] funcnts -s snr.ev "ann 512 512 0 9 n=3" | funtbl -c "1 2 4" -h -n 4 -s "\200t" #reg counts sumcnts 1 147.000 147.000 2 478.000 625.000 3 817.000 1442.000)RP( )0 P(Of course, if the output has previously been saved in a file named foo.out, the same result can be obtained by executing: ) 5 48 PR( [sh] funtbl -c "1 2 4" -h -n 4 -s "\200t" foo.out #reg counts sumcnts 1 147.000 147.000 2 478.000 625.000 3 817.000 1442.000)RP( )0 P()0 0 1 A(Go to Funtools Help Index)0 0 TN TL()Ec /AF f D( )0 5 20 H(Last)WB 83 Sn( updated: April 1, 2007)EH( )WB NL /Cb Db D /Ct [16#00 16#00 16#00] D /Cl [16#00 16#00 16#00] D /CL -1 D Ct Sc DS /Ba f D /BO 0 D Bs /UR (ds9.html) D /Ti (Funtools and DS9 Image Display) D /Au () D /Df f D /ME [()] D 0 BO R ()1 Sl()WB 17 Sn( )0 2 21 H(FunDS9:)WB 85 Sn()WB 84 Sn( Funtools and DS9 Image Display)EA()EH( )0 2 22 H(Summary)WB 86 Sn()EH( Describes how funtools can be integrated into the ds9 Analysis menu. )0 2 23 H(Description)WB 87 Sn()EH( )0 P()R1 2 A(SAOImage/DS9)EA( is an astronomical imaging and data visualization application used by astronomers around the world. DS9 can display standard astronomical FITS images and binary tables, but also has support for displaying raw array files, shared memory files, and data files automatically retrieved via FTP and HTTP. Standard functional capabilities include multiple frame buffers, colormap and region manipulation, and many data scaling algorithms. DS9's advanced features include TrueColor visuals, deep frame buffers, true PostScript printing, and display of image mosaics. The program's support of image tiling, "blinking", arbitrary zoom, rotation, and pan is unparalleled in astronomy. It also has innovative support for automatic retrieval and display of standard image data such as the Digital Sky Survey \201using servers at SAO, StScI, or ESO\202. )0 P(DS9 can communicate with external programs such as Funtools using the )R2 2 A(XPA)EA( messaging system. In addition, programs can be integrated directly into the DS9 GUI by means of a configurable Analysis menu. By default, the DS9 Analysis menu contains algorithms deemed essential to the core functions of DS9, e.g., display cross-cuts of data, iso-intensity contours, and WCS grids. However, new programs can be added to DS9 by creating a set-up file which can be loaded into DS9 to reconfigure the Analysis menu. ) 7 48 PR(The basic format of the analysis set-up file is: )0 P( # # Analysis command descriptions: # menu label/description # file templates for this command # "menu" \201add to menu\202 |"bind" \201bind to key\202 # analysis command line)RP( For example, the funcnts program can be specified in this way: ) 4 69 PR( Funcnts \201counts in source/bkgd regions; options: none\202 * menu funcnts $filename $regions\201source,,\202 $regions\201background,,\202 | $text)RP( As shown above, DS9 supports a macro facility to provide information as well as task support to command lines. For example, the $regions macro is expanded by DS9 to provide the current source and/or background region to the analysis command. The $text macro is expanded to generate a text window display. It also is possible to query for parameters using a $param macro, plot data using a $plot macro, etc. See the DS9 documentation for further details. )0 P(A set-up file called )0 2 A(funtools.ds9)EA( will load some useful Funtools applications \201counts in regions, radial profile, X-ray light curve and energy spectrum, 1D histogram\202 into the DS9 Analysis menu \201version 2.1 and above\202. The file resides in the bin directory where Funtools programs are installed. It can be manually loaded into DS9 from the )BD(Load Analysis Commands ...)ES( option of the )BD(Analysis)ES( menu. Alternatively, you can tell DS9 to load this file automatically at start-up time by adding the pathname to the )BD(Edit)ES(->)BD(Preferences)ES(->)BD(Analysis Menu)ES(->)BD(Analysis File)ES( menu option. \201NB: make sure you select )BD(Edit)ES(->)BD(Preferences)ES(->)BD(Save Preferences)ES( after setting the pathname.\202 )0 P(The tasks in this setup file generally process the original disk-based FITS file. Funcnts-based results \201radial profile, counts in regions\202 are presented in WCS units, if present in the FITS header. For situations where a disk file is not available \201e.g., image data generated and sent to DS9's 'fits' XPA access point\202, versions of the radial profile and counts in regions tasks also are also offered utilizing DS9's internal image data. Results are presented in pixels. Aside from the units, the results should be identical to the file-based results. )0 P()0 0 1 A(Go to Funtools Help Index)0 0 TN TL()Ec /AF f D( )0 5 24 H(Last)WB 88 Sn( updated: November 16, 2005)EH( )WB NL /Cb Db D /Ct [16#00 16#00 16#00] D /Cl [16#00 16#00 16#00] D /CL -1 D Ct Sc DS /Ba f D /BO 0 D Bs /UR (library.html) D /Ti (Funtools Programming) D /Au () D /Df f D /ME [()] D 0 BO R ()1 Sl()WB 18 Sn( )0 2 25 H(FunLib:)WB 91 Sn()WB 89 Sn( the Funtools Programming Interface)EA()EH( )0 2 26 H(Summary)WB 92 Sn()EH( A description of the Funtools library. )0 2 27 H(Introduction)WB 93 Sn()WB 90 Sn( to the Funtools Programming Interface)EH()EA( )0 P(To create a Funtools application, you need to include the funtools.h definitions file in your code: ) 1 23 PR( #include )RP( You then call Funtools subroutines and functions to access Funtools data. The most important routines are: )UL( )0 P()-1 LI( )0 25 1 A(FunOpen)25 0 TN TL()Ec /AF f D(: open a Funtools file )-1 LI()0 35 1 A(FunInfoGet)35 0 TN TL()Ec /AF f D(: get info about an image or table )-1 LI()0 26 1 A(FunImageGet)26 0 TN TL()Ec /AF f D(: retrieve image data )-1 LI()0 28 1 A(FunImageRowGet)28 0 TN TL()Ec /AF f D(: retrieve image data by row )-1 LI()0 27 1 A(FunImagePut)27 0 TN TL()Ec /AF f D(: output image data )-1 LI()0 29 1 A(FunImageRowPut)29 0 TN TL()Ec /AF f D(: output image data by row )-1 LI()0 32 1 A(FunColumnSelect)32 0 TN TL()Ec /AF f D(: select columns in a table for access )-1 LI()0 30 1 A(FunTableRowGet)30 0 TN TL()Ec /AF f D(: retrieve rows from a table )-1 LI()0 31 1 A(FunTableRowPut)31 0 TN TL()Ec /AF f D(: output rows to a table )-1 LI( )0 40 1 A(FunClose)40 0 TN TL()Ec /AF f D(: close a Funtools file)LU( Your program must be linked against the libfuntools.a library, along with the math library. The following libraries also might be required on your system: )UL()-1 LI( -lsocket -lnsl for socket support )-1 LI( -ldl for dynamic loading)LU( )0 P(For example, on a Solaris system using gcc, use the following link line: ) 1 53 PR( gcc -o foo foo.c -lfuntools -lsocket -lnsl -ldl -lm)RP( On a Solaris system using Solaris cc, use the following link line: ) 1 48 PR( gcc -o foo foo.c -lfuntools -lsocket -lnsl -lm)RP( On a Linux system using gcc, use the following link line: ) 1 38 PR( gcc -o foo foo.c -lfuntools -ldl -lm)RP( Once configure has built a Makefile on your platform, the required "extra" libraries \201aside from -lm, which always is required\202 are specified in that file's EXTRA_LIBS variable. For example, under Linux you will find: ) 3 26 PR( grep EXTRA_LIBS Makefile EXTRA_LIBS = -ldl ...)RP( )0 P(The Funtools library contains both the zlib library \201http://www.gzip.org/zlib/\202 and Doug Mink's WCS library \201http://tdc-www.harvard.edu/software/wcstools/\202. It is not necessary to put these libraries on a Funtools link line. Include files necessary for using these libraries are installed in the Funtools include directory. )0 2 28 H(Funtools)WB 94 Sn()WB 20 Sn( Programming Tutorial)EA()EH( The )0 25 1 A(FunOpen\201\202)25 0 TN TL()Ec /AF f D( function is used to open a FITS file, an array, or a raw event file: ) 4 79 PR( /* open the input FITS file for reading */ ifun = FunOpen\201iname, "r", NULL\202; /* open the output FITS file for writing, and connect it to the input file */ ofun = FunOpen\201iname, "w", ifun\202;)RP( A new output file can inherit header parameters automatically from existing input file by passing the input Funtools handle as the last argument to the new file's )0 25 1 A(FunOpen\201\202)25 0 TN TL()Ec /AF f D( call as shown above. )0 P(For image data, you then can call )0 26 1 A(FunImageGet\201\202)26 0 TN TL()Ec /AF f D( to read an image into memory. ) 3 61 PR( float buf=NULL; /* extract and bin the data section into an image buffer */ buf = FunImageGet\201fun, NULL, "bitpix=-32"\202;)RP( If the \201second\202 buf argument to this call is NULL, buffer space is allocated automatically. The \201third\202 plist argument can be used to specify the return data type of the array. If NULL is specified, the data type of the input file is used. )0 P(To process an image buffer, you would generally make a call to )0 35 1 A(FunInfoGet\201\202)35 0 TN TL()Ec /AF f D( to determine the dimensions of the image \201which may have been changed from the original file dimensions due to )0 49 1 A(Funtools image sectioning)49 0 TN TL()Ec /AF f D( on the command line\202. In a FITS image, the index along the dim1 axis varies most rapidly, followed by the dim2 axis, etc. Thus, to access each pixel in an 2D image, use a double loop such as:)RP( buf = FunImageGet\201fun, NULL, "bitpix=-32"\202; FunInfoGet\201fun, FUN_SECT_DIM1, &dim1, FUN_SECT_DIM2, &dim2, 0\202; for\201i=1; i<=dim2; i++\202{ for\201j=1; j<=dim1; j++\202{ ... process buf[\201\201i-1\202*dim1\202+\201j-1\202] ... } })RP( or: ) 5 65 PR( buf = FunImageGet\201fun, NULL, "bitpix=-32"\202; FunInfoGet\201fun, FUN_SECT_DIM1, &dim1, FUN_SECT_DIM2, &dim2, 0\202; for\201i=0; i<\201dim1*dim2\202; i++\202{ ... process buf[i] ... })RP( Finally, you can write the resulting image to disk using )0 27 1 A(FunImagePut\201\202)27 0 TN TL()Ec /AF f D(: ) 1 48 PR( FunImagePut\201fun2, buf, dim1, dim2, -32, NULL\202;)RP( Note that Funtools automatically takes care of book-keeping tasks such as reading and writing FITS headers \201although you can, of course, write your own header or add your own parameters to a header\202. )0 P(For binary tables and raw event files, a call to )0 25 1 A(FunOpen\201\202)25 0 TN TL()Ec /AF f D( will be followed by a call to the )0 32 1 A(FunColumnSelect\201\202)32 0 TN TL()Ec /AF f D( routine to select columns to be read from the input file and/or written to the output file: ) 8 69 PR( typedef struct evstruct{ double time; int time2; } *Ev, EvRec; FunColumnSelect\201fun, sizeof\201EvRec\202, NULL, "time", "D", "rw", FUN_OFFSET\201Ev, time\202, "time2", "J", "w", FUN_OFFSET\201Ev, time2\202, NULL\202;)RP( Columns whose \201third\202 mode argument contains an "r" are "readable", i.e., columns will be read from the input file and converted into the data type specified in the call's second argument. These columns values then are stored in the specified offset of the user record structure. Columns whose mode argument contains a "w" are "writable", i.e., these values will be written to the output file. The )0 32 1 A(FunColumnSelect\201\202)32 0 TN TL()Ec /AF f D( routine also offers the option of automatically merging user columns with the original input columns when writing the output rows. )0 P(Once a set of columns has been specified, you can retrieve rows using )0 30 1 A(FunTableRowGet\201\202)30 0 TN TL()Ec /AF f D(, and write the rows using )0 31 1 A(FunTableRowPut\201\202)31 0 TN TL()Ec /AF f D(: ) 17 70 PR( Ev ebuf, ev; /* get rows -- let routine allocate the array */ while\201 \201ebuf = \201Ev\202FunTableRowGet\201fun, NULL, MAXROW, NULL, &got\202\202 \202{ /* process all rows */ for\201i=0; itime2 = \201int\202\201ev->time+.5\202; /* change the input time as well */ ev->time = -\201ev->time/10.0\202; } /* write out this batch of rows with the new column */ FunTableRowPut\201fun2, \201char *\202ebuf, got, 0, NULL\202; /* free row data */ if\201 ebuf \202 free\201ebuf\202; })RP( The input rows are retrieved into an array of user structs, which can be accessed serially as shown above. Once again, Funtools automatically takes care of book-keeping tasks such as reading and writing FITS headers \201although you can, of course, write your own header or add your own parameters to a header\202. )0 P(When all processing is done, you can call )0 40 1 A(FunClose\201\202)40 0 TN TL()Ec /AF f D( to close the file\201s\202: ) 2 17 PR( FunClose\201fun2\202; FunClose\201fun\202;)RP( )0 P(These are the basics of processing FITS files \201and arrays or raw event data\202 using Funtools. The routines in these examples are described in more detail below, along with a few other routines that support parameter access, data flushing, etc. )0 2 29 H(Compiling)WB 95 Sn()WB 22 Sn( and Linking)EA()EH( )0 P(To create a Funtools application, a software developer will include the funtools.h definitions file in Funtools code: ) 1 23 PR( #include )RP( The program is linked against the libfuntools.a library, along with the math library \201and the dynamic load library, if the latter is available on your system\202: ) 1 38 PR( gcc -o foo foo.c -lfuntools -ldl -lm)RP( )0 P(If gcc is used, Funtools filtering can be performed using dynamically loaded shared objects that are built at run-time. Otherwise, filtering is performed using a slave process. )0 P(Funtools has been built on the following systems: )UL()-1 LI( Sun/Solaris 5.X )-1 LI( Linux/RedHat Linux 5.X,6.X,7.X )-1 LI( Dec Alpha/OSF1 V4.X )-1 LI( WindowsNT/Cygwin 1.0 )-1 LI( SGI/IRIX64 6.5)LU( )0 2 30 H(A)WB 96 Sn()WB 21 Sn( Short Digression on Subroutine Order)EA()EH( )0 P(There is a natural order for all I/O access libraries. You would not think of reading a file without first opening it, or writing a file after closing it. A large part of the experiment in funtools is to use the idea of "natural order" as a means of making programming easier. We do this by maintaining the state of processing for a given funtools file, so that we can do things like write headers and flush extension padding at the right time, without you having to do it. )0 P(For example, if you open a new funtools file for writing using )0 25 1 A(FunOpen\201\202)25 0 TN TL()Ec /AF f D(, then generate an array of image data and call )0 27 1 A(FunImagePut\201\202)27 0 TN TL()Ec /AF f D(, funtools knows to write the image header automatically. There is no need to think about writing a standard header. Of course, you can add parameters to the file first by calling one of the )0 38 1 A(FunParamPut\201\202)38 0 TN TL()Ec /AF f D( routines, and these parameters will automatically be added to the header when it is written out. There still is no need to write the header explicitly. )0 P(Maintaining state in this way means that there are certain rules of order which should be maintained in any funtools program. In particular, we strongly recommend the following ordering rules be adhered to: )UL()-1 LI( When specifying that input extensions be copied to an output file via a reference handle, open the output file )BD(before)ES( reading the input file. \201Otherwise the initial copy will not occur\202. )-1 LI( Always write parameters to an output file using one of the )0 38 1 A(FunParamPut\201\202)38 0 TN TL()Ec /AF f D( calls )BD(before)ES( writing any data. \201This is a good idea for all FITS libraries, to avoid having to recopy data is the FITS header needs to be extended by adding a single parameter.\202 )-1 LI( If you retrieve an image, and need to know the data type, use the FUN_SECT_BITPIX option of )0 35 1 A(FunInfoGet\201\202)35 0 TN TL()Ec /AF f D(, )BD(after)ES( calling )0 26 1 A(FunImageGet\201\202)26 0 TN TL()Ec /AF f D(, since it is possible to change the value of BITPIX from the latter. )-1 LI( When specifying that input extensions be copied to an output file via a reference handle, close the output file )BD(before)ES( closing input file, or else use )0 39 1 A(FunFlush\201\202)39 0 TN TL()Ec /AF f D( explicitly on the output file )BD(before)ES( closing the input file. \201Otherwise the final copy will not occur\202.)LU( )0 P(We believe that these are the natural rules that are implied in most FITS programming tasks. However, we recognize that making explicit use of "natural order" to decide what automatic action to take on behalf of the programmer is experimental. Therefore, if you find that your needs are not compatible with our preferred order, please let us know -- it will be most illuminating for us as we evaluate this experiment. )0 2 31 H(Funtools)WB 97 Sn()WB 41 Sn( Programming Examples)EA()EH( )0 P(The following complete coding examples are provided to illustrate the simplicity of Funtools applications. They can be found in the funtest subdirectory of the Funtools distribution. In many cases, you should be able to modify one of these programs to generate your own Funtools program: )UL()-1 LI()0 2 A(evread.c)EA(: read and write binary tables )-1 LI()0 2 A(evcols.c)EA(: add column and rows to binary tables )-1 LI()0 2 A(evmerge.c)EA(: merge new columns with existing columns )-1 LI()0 2 A(evnext.c)EA(: manipulate raw data pointers )-1 LI()0 2 A(imblank.c)EA(: blank out image values below a threshold )-1 LI()0 2 A(asc2fits.c)EA(: convert a specific ASCII table to FITS binary table)LU( )0 2 32 H(The)WB 98 Sn()WB 24 Sn( Funtools Programming Reference Manual)EA()EH( )0 P() 45 116 PR(#include Fun )0 25 1 A(FunOpen\201char *name, char *mode, Fun ref\202)25 0 TN TL()Ec /AF f D( void *)0 26 1 A(FunImageGet\201Fun fun, void *buf, char *plist\202)26 0 TN TL()Ec /AF f D( int )0 27 1 A(FunImagePut\201Fun fun, void *buf, int dim1, int dim2, int bitpix, char *plist\202)27 0 TN TL()Ec /AF f D( void * )0 28 1 A(FunImageRowGet\201Fun fun, void *buf, int rstart, int rstop, char *plist\202)28 0 TN TL()Ec /AF f D( void * )0 29 1 A(FunImageRowPut\201Fun fun, void *buf, int rstart, int rstop, int dim1, int dim2, int bitpix, char *plist\202)29 0 TN TL()Ec /AF f D( int )0 32 1 A(FunColumnSelect\201Fun fun, int size, char *plist, ...\202)32 0 TN TL()Ec /AF f D( void )0 33 1 A(FunColumnActivate\201Fun fun, char *s, char *plist\202)33 0 TN TL()Ec /AF f D( int )0 34 1 A(FunColumnLookup\201Fun fun, char *s, int which, char **name, int *type, int *mode, int *offset, int *n, int *width\202)34 0 TN TL()Ec /AF f D( void *)0 30 1 A(FunTableRowGet\201Fun fun, void *rows, int maxrow, char *plist, int *nrow\202)30 0 TN TL()Ec /AF f D( int )0 31 1 A(FunTableRowPut\201Fun fun, void *rows, int nev, int idx, char *plist\202)31 0 TN TL()Ec /AF f D( int )0 37 1 A(FunParamGetb\201Fun fun, char *name, int n, int defval, int *got\202)37 0 TN TL()Ec /AF f D( int )0 37 1 A(FunParamGeti\201Fun fun, char *name, int n, int defval, int *got\202)37 0 TN TL()Ec /AF f D( double )0 37 1 A(FunParamGetd\201Fun fun, char *name, int n, double defval, int *got\202)37 0 TN TL()Ec /AF f D( char *)0 37 1 A(FunParamGets\201Fun fun, char *name, int n, char *defval, int *got\202)37 0 TN TL()Ec /AF f D( int )0 38 1 A(FunParamPutb\201Fun fun, char *name, int n, int value, char *comm, int append\202)38 0 TN TL()Ec /AF f D()WR( int )0 38 1 A(FunParamPuti\201Fun fun, char *name, int n, int value, char *comm, int append\202)38 0 TN TL()Ec /AF f D( int )0 38 1 A(FunParamPutd\201Fun fun, char *name, int n, double value, int prec, char *comm, int append\202)38 0 TN TL()Ec /AF f D( int )0 38 1 A(FunParamPuts\201Fun fun, char *name, int n, char *value, char *comm, int append\202)38 0 TN TL()Ec /AF f D( int )0 35 1 A(FunInfoGet\201Fun fun, int type, ...\202)35 0 TN TL()Ec /AF f D( int )0 36 1 A(FunInfoPut\201Fun fun, int type, ...\202)36 0 TN TL()Ec /AF f D( void )0 39 1 A(FunFlush\201Fun fun, char *plist\202)39 0 TN TL()Ec /AF f D( void )0 40 1 A(FunClose\201Fun fun\202)40 0 TN TL()Ec /AF f D()RP( )0 2 33 H(FunOpen)WB 99 Sn()WB 25 Sn( - open a Funtools data file)EA()EH( )BD() 3 47 PR( #include Fun FunOpen\201char *name, char *mode, Fun ref\202;)RP()ES( )0 P(The )BD(FunOpen\201\202)ES( routine opens a Funtools data file for reading or appending, or creates a new FITS file for writing. The )BD(name)ES( argument specifies the name of the Funtools data file to open. You can use IRAF-style bracket notation to specify )0 42 1 A(Funtools Files, Extensions, and Filters)42 0 TN TL()Ec /AF f D(. A separate call should be made each time a different FITS extension is accessed: ) 7 65 PR( Fun fun; char *iname; ... if\201 !\201fun = FunOpen\201iname, "r", NULL\202\202 \202{ fprintf\201stderr, "could not FunOpen input file: %s\200n", iname\202; exit\2011\202; })RP( )0 P(If )BD(mode)ES( is "r", the file is opened for reading, and processing is set up to begin at the specified extension. For reading, )BD(name)ES( can be )BD(stdin)ES(, in which case the standard input is read. )0 P(If )BD(mode)ES( is "w", the file is created if it does not exist, or opened and truncated for writing if it does exist. Processing starts at the beginning of the file. The )BD(name)ES( can be )BD(stdout)ES(, in which case the standard output is readied for processing. )0 P(If )BD(mode)ES( is "a", the file is created if it does not exist, or opened if it does exist. Processing starts at the end of the file. The )BD(name)ES( can be )BD(stdout)ES(, in which case the standard output is readied for processing. )0 P(When a Funtools file is opened for writing or appending, a previously opened )0 23 1 A(Funtools reference handle)23 0 TN TL()Ec /AF f D( can be specified as the third argument. This handle typically is associated with the input Funtools file that will be used to generate the data for the output data. When a reference file is specified in this way, the output file will inherit the \201extension\202 header parameters from the input file: ) 8 67 PR( Fun fun, fun2; ... /* open input file */ if\201 !\201fun = FunOpen\201argv[1], "r", NULL\202\202 \202 gerror\201stderr, "could not FunOpen input file: %s\200n", argv[1]\202; /* open the output FITS image, inheriting params from input */ if\201 !\201fun2 = FunOpen\201argv[2], "w", fun\202\202 \202 gerror\201stderr, "could not FunOpen output file: %s\200n", argv[2]\202;)RP( Thus, in the above example, the output FITS binary table file will inherit all of the parameters associated with the input binary table extension. )0 P(A file opened for writing with a )0 23 1 A(Funtools reference handle)23 0 TN TL()Ec /AF f D( also inherits the selected columns \201i.e. those columns chosen for processing using the )0 32 1 A(FunColumnSelect\201\202)32 0 TN TL()Ec /AF f D( routine\202 from the reference file as its default columns. This makes it easy to open an output file in such a way that the columns written to the output file are the same as the columns read in the input file. Of course, column selection can easily be tailored using the )0 32 1 A(FunColumnSelect\201\202)32 0 TN TL()Ec /AF f D( routine. In particular, it is easy to merge user-defined columns with the input columns to generate a new file. See the )0 2 A(evmerge)EA( for a complete example. )0 P(In addition, when a )0 23 1 A(Funtools reference handle)23 0 TN TL()Ec /AF f D( is supplied in a )0 25 1 A(FunOpen\201\202)25 0 TN TL()Ec /AF f D( call, it is possible also to specify that all other extensions from the reference file \201other than the input extension being processed\202 should be copied from the reference file to the output file. This is useful, for example, in a case where you are processing a FITS binary table or image and you want to copy all of the other extensions to the output file as well. Copy of other extensions is controlled by adding a "C" or "c" to the mode string of the )0 25 1 A(FunOpen\201\202)25 0 TN TL()Ec /AF f D( call )BD(of the input reference file)ES(. If "C" is specified, then other extensions are )BD(always)ES( copied \201i.e., copy is forced by the application\202. If "c" is used, then other extensions are copied if the user requests copying by adding a plus sign "+" to the extension name in the bracket specification. For example, the )BD(funtable)ES( program utilizes "c" mode, giving users the option of copying all other extensions: ) 6 67 PR( /* open input file -- allow user copy of other extensions */ if\201 !\201fun = FunOpen\201argv[1], "rc", NULL\202\202 \202 gerror\201stderr, "could not FunOpen input file: %s\200n", argv[1]\202; /* open the output FITS image, inheriting params from input */ if\201 !\201fun2 = FunOpen\201argv[2], "w", fun\202\202 \202 gerror\201stderr, "could not FunOpen output file: %s\200n", argv[2]\202;)RP( Thus, )BD(funtable)ES( supports either of these command lines: ) 4 60 PR( # copy only the EVENTS extension csh> funtable "test.ev[EVENTS,circle\201512,512,10\202]" foo.ev # copy ALL extensions csh> funtable "test.ev[EVENTS+,circle\201512,512,10\202]" foo.ev)RP( )0 P(Use of a )0 23 1 A(Funtools reference handle)23 0 TN TL()Ec /AF f D( implies that the input file is opened before the output file. However, it is important to note that if copy mode \201"c" or "C"\202 is specified for the input file, the actual input file open is delayed until just after the output file is opened, since the copy of prior extensions to the output file takes place while Funtools is seeking to the specified input extension. This implies that the output file should be opened before any I/O is done on the input file or else the copy will fail. Note also that the copy of subsequent extension will be handled automatically by )0 40 1 A(FunClose\201\202)40 0 TN TL()Ec /AF f D( if the output file is closed before the input file. Alternatively, it can be done explicitly by )0 39 1 A(FunFlush\201\202)39 0 TN TL()Ec /AF f D(, but again, this assumes that the input file still is open. )0 P(Upon success )0 25 1 A(FunOpen\201\202)25 0 TN TL()Ec /AF f D( returns a Fun handle that is used in subsequent Funtools calls. On error, NULL is returned. )0 2 34 H(FunImageGet)WB 100 Sn()WB 26 Sn( - get an image or image section)EA()EH( )BD() 3 52 PR( #include void *FunImageGet\201Fun fun, void *buf, char *plist\202)RP()ES( )0 P(The )BD(FunImageGet\201\202)ES( routine returns an binned image array of the specified section of a Funtools data file. If the input data are already of type image, the array is generated by extracting the specified image section and then binning it according to the specified bin factor. If the input data are contained in a binary table or raw event file, the rows are binned on the columns specified by the )BD(bincols=)ES( keyword \201using appropriate default columns as necessary\202, after which the image section and bin factors are applied. In both cases, the data is automatically converted from FITS to native format, if necessary. )0 P(The first argument is the Funtools handle returned by )0 25 1 A(FunOpen\201\202)25 0 TN TL()Ec /AF f D(. The second )BD(buf)ES( argument is a pointer to a data buffer to fill. If NULL is specified, FunImageGet will allocate a buffer of the appropriate size. Generally speaking, you always want Funtools to allocate the buffer because the image dimensions will be determined by )0 49 1 A(Funtools image sectioning)49 0 TN TL()Ec /AF f D( on the command line. )0 P(The third )BD(plist)ES( \201i.e., parameter list\202 argument is a string containing one or more comma-delimited )BD(keyword=value)ES( parameters. It can be used to specify the return data type using the )BD(bitpix=)ES( keyword. If no such keyword is specified in the plist string, the data type of the returned image is the same as the data type of the original input file, or is of type int for FITS binary tables. )0 P(If the )BD(bitpix=)ES( keyword is supplied in the plist string, the data type of the returned image will be one of the supported FITS image data types: )UL()-1 LI( 8 unsigned char )-1 LI( 16 short )-1 LI( 32 int )-1 LI( -32 float )-1 LI( -64 double)LU( For example: ) 4 57 PR( void *buf; /* extract data section into an image buffer */ if\201 !\201buf = FunImageGet\201fun, NULL, NULL\202\202 \202 gerror\201stderr, "could not FunImageGet: %s\200n", iname\202;)RP( will allocate buf and retrieve the image in the file data format. In this case, you will have to determine the data type \201using the FUN_SECT_BITPIX value in the )0 35 1 A(FunInfoGet\201\202)35 0 TN TL()Ec /AF f D( routine\202 and then use a switch statement to process each data type: ) 17 65 PR( int bitpix; void *buf; unsigned char *cbuf; short *sbuf; int *ibuf; ... buf = FunImageGet\201fun, NULL, NULL\202; FunInfoGet\201fun, FUN_SECT_BITPIX, &bitpix, 0\202; /* set appropriate data type buffer to point to image buffer */ switch\201bitpix\202{ case 8: cbuf = \201unsigned char *\202buf; break; case 16: sbuf = \201short *\202buf; break; case 32: ibuf = \201int *\202buf; break; ...)RP( See the )0 2 A(imblank example code)EA( for more details on how to process an image when the data type is not specified beforehand. )0 P(It often is easier to specify the data type directly: ) 4 57 PR( double *buf; /* extract data section into a double image buffer */ if\201 !\201buf = FunImageGet\201fun, NULL, "bitpix=-64"\202\202 \202 gerror\201stderr, "could not FunImageGet: %s\200n", iname\202;)RP( will extract the image while converting to type double. )0 P(On success, a pointer to the image buffer is returned. \201This will be the same as the second argument, if NULL is not passed to the latter.\202 On error, NULL is returned. )0 P(In summary, to retrieve image or row data into a binned image, you simply call FunOpen\201\202 followed by )0 26 1 A(FunImageGet\201\202)26 0 TN TL()Ec /AF f D(. Generally, you then will want to call )0 35 1 A(FunInfoGet\201\202)35 0 TN TL()Ec /AF f D( to retrieve the axis dimensions \201and data type\202 of the section you are processing \201so as to take account of sectioning and blocking of the original data\202: ) 20 73 PR( double *buf; int i, j; int dim1, dim2; ... other declarations, etc. /* open the input FITS file */ if\201 !\201fun = FunOpen\201argv[1], "rc", NULL\202\202 \202 gerror\201stderr, "could not FunOpen input file: %s\200n", argv[1]\202; /* extract and bin the data section into a double float image buffer */ if\201 !\201buf = FunImageGet\201fun, NULL, "bitpix=-64"\202\202 \202 gerror\201stderr, "could not FunImageGet: %s\200n", argv[1]\202; /* get dimension information from funtools structure */ FunInfoGet\201fun, FUN_SECT_DIM1, &dim1, FUN_SECT_DIM2, &dim2, 0\202; /* loop through pixels and reset values below limit to value */ for\201i=0; i int FunImagePut\201Fun fun, void *buf, int dim1, int dim2, int bitpix, char *plist\202)RP()ES( The )BD(FunImagePut\201\202)ES( routine outputs an image array to a FITS file. The image is written either as a primary header/data unit or as an image extension, depending on whether other data have already been written to the file. That is, if the current file position is at the beginning of the file, a primary HDU is written. Otherwise, an image extension is written. )0 P(The first argument is the Funtools handle returned by )0 25 1 A(FunOpen\201\202)25 0 TN TL()Ec /AF f D(. The second )BD(buf)ES( argument is a pointer to a data buffer to write. The )BD(dim1)ES(and )BD(dim2)ES( arguments that follow specify the dimensions of the image, where dim1 corresponds to naxis1 and dim2 corresponds to naxis2. The )BD(bitpix)ES( argument specifies the data type of the image and can have the following FITS-standard values: )UL()-1 LI( 8 unsigned char )-1 LI( 16 short )-1 LI( 32 int )-1 LI( -32 float )-1 LI( -64 double)LU( )0 P(When )0 31 1 A(FunTableRowPut\201\202)31 0 TN TL()Ec /AF f D( is first called for a given image, Funtools checks to see if the primary header has already been written \201by having previously written an image or a binary table.\202 If not, this image is written to the primary HDU. Otherwise, it is written to an image extension. )0 P(Thus, a simple program to generate a FITS image might look like this: ) 16 67 PR( int i; int dim1=512, dim2=512; double *dbuf; Fun fun; dbuf = malloc\201dim1*dim2*sizeof\201double\202\202; /* open the output FITS image, preparing to copy input params */ if\201 !\201fun = FunOpen\201argv[1], "w", NULL\202\202 \202 gerror\201stderr, "could not FunOpen output file: %s\200n", argv[1]\202; for\201i=0; i<\201dim1*dim2\202; i++\202{ ... fill dbuf ... } /* put the image \201header will be generated automatically */ if\201 !FunImagePut\201fun, buf, dim1, dim2, -64, NULL\202 \202 gerror\201stderr, "could not FunImagePut: %s\200n", argv[1]\202; FunClose\201fun\202; free\201dbuf\202;)RP( )0 P(In addition, if a )0 23 1 A(Funtools reference handle)23 0 TN TL()Ec /AF f D( was specified when this table was opened, the parameters from this )0 23 1 A(Funtools reference handle)23 0 TN TL()Ec /AF f D( are merged into the new image header. Furthermore, if a reference image was specified during )0 25 1 A(FunOpen\201\202)25 0 TN TL()Ec /AF f D(, the values of )BD(dim1)ES(, )BD(dim2)ES(, and )BD(bitpix)ES( in the calling sequence can all be set to 0. In this case, default values are taken from the reference image section. This is useful if you are reading an image section in its native data format, processing it, and then writing that section to a new FITS file. See the )0 2 A(imblank example code)EA(. )0 P(The data are assumed to be in the native machine format and will automatically be swapped to FITS big-endian format if necessary. This behavior can be over-ridden with the )BD(convert=[true|false])ES( keyword in the )BD(plist)ES( param list string. )0 P(When you are finished writing the image, you should call )0 39 1 A(FunFlush\201\202)39 0 TN TL()Ec /AF f D( to write out the FITS image padding. However, this is not necessary if you subsequently call FunClose\201\202 without doing any other I/O to the FITS file. )0 2 36 H(FunImageRowGet)WB 102 Sn()WB 28 Sn( - get row\201s\202 of an image)EA()EH( )BD() 4 65 PR( #include void *FunImageRowGet\201Fun fun, void *buf, int rstart, int rstop, char *plist\202)RP()ES( )0 P(The )BD(FunImageRowGet\201\202)ES( routine returns one or more image rows from the specified section of a Funtools data file. If the input data are of type image, the array is generated by extracting the specified image rows and then binning them according to the specified bin factor. If the input data are contained in a binary table or raw event file, the rows are binned on the columns specified by the )BD(bincols=)ES( keyword \201using appropriate default columns as needed\202, after which the image section and bin factors are applied. )0 P(The first argument is the Funtools handle returned by )0 25 1 A(FunOpen\201\202)25 0 TN TL()Ec /AF f D(. The second )BD(buf)ES( argument is a pointer to a data buffer to fill. If NULL is specified, FunImageGet\201\202 will allocate a buffer of the appropriate size. )0 P(The third and fourth arguments specify the first and last row to retrieve. Rows are counted starting from 1, up to the value of FUN_YMAX\201fun\202. The final )BD(plist)ES( \201i.e., parameter list\202 argument is a string containing one or more comma-delimited )BD(keyword=value)ES( parameters. It can be used to specify the return data type using the )BD(bitpix=)ES( keyword. If no such keyword is specified in the plist string, the data type of the image is the same as the data type of the original input file, or is of type int for FITS binary tables. )0 P(If the )BD(bitpix=)ES(value is supplied in the plist string, the data type of the returned image will be one of the supported FITS image data types: )UL()-1 LI( 8 unsigned char )-1 LI( 16 short )-1 LI( 32 int )-1 LI( -32 float )-1 LI( -64 double)LU( )0 P(For example: ) 17 65 PR( double *drow; Fun fun; ... open files ... /* get section dimensions */ FunInfoGet\201fun, FUN_SECT_DIM1, &dim1, FUN_SECT_DIM2, &dim2, 0\202; /* allocate one line's worth */ drow = malloc\201dim1*sizeof\201double\202\202; /* retrieve and process each input row \201starting at 1\202 */ for\201i=1; i <= dim2; i++\202{ if\201 !FunImageRowGet\201fun, drow, i, i, "bitpix=-64"\202 \202 gerror\201stderr, "can't FunImageRowGet: %d %s\200n", i, iname\202; /* reverse the line */ for\201j=1; j<=dim1; j++\202{ ... process drow[j-1] ... } } ...)RP( )0 P(On success, a pointer to the image buffer is returned. \201This will be the same as the second argument, if NULL is not passed to the latter.\202 On error, NULL is returned. Note that the considerations described above for specifying binning columns in )0 26 1 A(FunImageGet\201\202)26 0 TN TL()Ec /AF f D( also apply to )BD(FunImageRowGet\201\202)ES(. )0 2 37 H(FunImageRowPut)WB 103 Sn()WB 29 Sn( - put row\201s\202 of an image)EA()EH( )BD() 4 67 PR( #include void *FunImageRowPut\201Fun fun, void *buf, int rstart, int rstop, int dim1, int dim2, int bitpix, char *plist\202)RP()ES( )0 P(The )BD(FunImageRowPut\201\202)ES( routine writes one or more image rows to the specified FITS image file. The first argument is the Funtools handle returned by )0 25 1 A(FunOpen\201\202)25 0 TN TL()Ec /AF f D(. The second )BD(buf)ES( argument is a pointer to the row data buffer, while the third and fourth arguments specify the starting and ending rows to write. Valid rows values range from 1 to dim2, i.e., row is one-valued. )0 P(The )BD(dim1)ES(and )BD(dim2)ES( arguments that follow specify the dimensions, where dim1 corresponds to naxis1 and dim2 corresponds to naxis2. The )BD(bitpix)ES( argument data type of the image and can have the following FITS-standard values: )UL()-1 LI( 8 unsigned char )-1 LI( 16 short )-1 LI( 32 int )-1 LI( -32 float )-1 LI( -64 double)LU( For example: ) 16 65 PR( double *drow; Fun fun, fun2; ... open files ... /* get section dimensions */ FunInfoGet\201fun, FUN_SECT_DIM1, &dim1, FUN_SECT_DIM2, &dim2, 0\202; /* allocate one line's worth */ drow = malloc\201dim1*sizeof\201double\202\202; /* retrieve and process each input row \201starting at 1\202 */ for\201i=1; i <= dim2; i++\202{ if\201 !FunImageRowGet\201fun, drow, i, i, "bitpix=-64"\202 \202 gerror\201stderr, "can't FunImageRowGet: %d %s\200n", i, iname\202; ... process drow ... if\201 !FunImageRowPut\201fun2, drow, i, i, 64, NULL\202 \202 gerror\201stderr, "can't FunImageRowPut: %d %s\200n", i, oname\202; } ...)RP( )0 P(The data are assumed to be in the native machine format and will automatically be swapped to big-endian FITS format if necessary. This behavior can be over-ridden with the )BD(convert=[true|false])ES( keyword in the )BD(plist)ES( param list string. )0 P(When you are finished writing the image, you should call )0 39 1 A(FunFlush\201\202)39 0 TN TL()Ec /AF f D( to write out the FITS image padding. However, this is not necessary if you subsequently call FunClose\201\202 without doing any other I/O to the FITS file. )0 2 38 H(FunColumnSelect)WB 104 Sn()WB 32 Sn( - select Funtools columns)EA()EH( )BD() 11 73 PR( #include int FunColumnSelect\201Fun fun, int size, char *plist, char *name1, char *type1, char *mode1, int offset1, char *name2, char *type2, char *mode2, int offset2, ..., NULL\202 int FunColumnSelectArr\201Fun fun, int size, char *plist, char **names, char **types, char **modes, int *offsets, int nargs\202;)RP()ES( The )BD(FunColumnSelect\201\202)ES( routine is used to select the columns from a Funtools binary table extension or raw event file for processing. This routine allows you to specify how columns in a file are to be read into a user record structure or written from a user record structure to an output FITS file. )0 P(The first argument is the Fun handle associated with this set of columns. The second argument specifies the size of the user record structure into which columns will be read. Typically, the sizeof\201\202 macro is used to specify the size of a record structure. The third argument allows you to specify keyword directives for the selection and is described in more detail below. )0 P(Following the first three required arguments is a variable length list of column specifications. Each column specification will consist of four arguments: )UL()-1 LI( )BD(name)ES(: the name of the column )-1 LI( )BD(type)ES(: the data type of the column as it will be stored in the user record struct \201not the data type of the input file\202. The following basic data types are recognized: )UL()-1 LI(A: ASCII characters )-1 LI(B: unsigned 8-bit char )-1 LI(I: signed 16-bit int )-1 LI(U: unsigned 16-bit int \201not standard FITS\202 )-1 LI(J: signed 32-bit int )-1 LI(V: unsigned 32-bit int \201not standard FITS\202 )-1 LI(E: 32-bit float )-1 LI(D: 64-bit float)LU( The syntax used is similar to that which defines the TFORM parameter in FITS binary tables. That is, a numeric repeat value can precede the type character, so that "10I" means a vector of 10 short ints, "E" means a single precision float, etc. Note that the column value from the input file will be converted to the specified data type as the data is read by )0 30 1 A(FunTableRowGet\201\202)30 0 TN TL()Ec /AF f D(. )0 P([ A short digression regarding bit-fields: Special attention is required when reading or writing the FITS bit-field type \201"X"\202. Bit-fields almost always have a numeric repeat character preceding the 'X' specification. Usually this value is a multiple of 8 so that bit-fields fit into an integral number of bytes. For all cases, the byte size of the bit-field B is \201N+7\202/8, where N is the numeric repeat character. )0 P(A bit-field is most easily declared in the user struct as an array of type char of size B as defined above. In this case, bytes are simply moved from the file to the user space. If, instead, a short or int scalar or array is used, then the algorithm for reading the bit-field into the user space depends on the size of the data type used along with the value of the repeat character. That is, if the user data size is equal to the byte size of the bit-field, then the data is simply moved \201possibly with endian-based byte-swapping\202 from one to the other. If, on the other hand, the data storage is larger than the bit-field size, then a data type cast conversion is performed to move parts of the bit-field into elements of the array. Examples will help make this clear: )UL()-1 LI( If the file contains a 16X bit-field and user space specifies a 2B char array[2], then the bit-field is moved directly into the char array. )-1 LI( If the file contains a 16X bit-field and user space specifies a 1I scalar short int, then the bit-field is moved directly into the short int. )-1 LI( If the file contains a 16X bit-field and user space specifies a 1J scalar int, then the bit-field is type-cast to unsigned int before being moved \201use of unsigned avoids possible sign extension\202. )-1 LI( If the file contains a 16X bit-field and user space specifies a 2J int array[2], then the bit-field is handled as 2 chars, each of which are type-cast to unsigned int before being moved \201use of unsigned avoids possible sign extension\202. )-1 LI( If the file contains a 16X bit-field and user space specifies a 1B char, then the bit-field is treated as a char, i.e., truncation will occur. )-1 LI( If the file contains a 16X bit-field and user space specifies a 4J int array[4], then the results are undetermined. )LU( For all user data types larger than char, the bit-field is byte-swapped as necessary to convert to native format, so that bits in the resulting data in user space can be tested, masked, etc. in the same way regardless of platform.] )0 P(In addition to setting data type and size, the )BD(type)ES( specification allows a few ancillary parameters to be set, using the full syntax for )BD(type)ES(: ) 1 53 PR( [@][n][[['B']poff]][:[tlmin[:tlmax[:binsiz]]]])RP( )0 P(The special character "@" can be prepended to this specification to indicated that the data element is a pointer in the user record, rather than an array stored within the record. )0 P(The [n] value is an integer that specifies the number of elements that are in this column \201default is 1\202. TLMIN, TLMAX, and BINSIZ values also can be specified for this column after the type, separated by colons. If only one such number is specified, it is assumed to be TLMAX, and TLMIN and BINSIZ are set to 1. )0 P(The [poff] value can be used to specify the offset into an array. By default, this offset value is set to zero and the data specified starts at the beginning of the array. The offset usually is specified in terms of the data type of the column. Thus an offset specification of [5] means a 20-byte offset if the data type is a 32-bit integer, and a 40-byte offset for a double. If you want to specify a byte offset instead of an offset tied to the column data type, precede the offset value with 'B', e.g. [B6] means a 6-bye offset, regardless of the column data type. The [poff] is especially useful in conjunction with the pointer @ specification, since it allows the data element to anywhere stored anywhere in the allocated array. For example, a specification such as "@I[2]" specifies the third \201i.e., starting from 0\202 element in the array pointed to by the pointer value. A value of "@2I[4]" specifies the fifth and sixth values in the array. For example, consider the following specification: ) 12 67 PR( typedef struct EvStruct{ short x[4], *atp; } *Event, EventRec; /* set up the \201hardwired\202 columns */ FunColumnSelect\201 fun, sizeof\201EventRec\202, NULL, "2i", "2I ", "w", FUN_OFFSET\201Event, x\202, "2i2", "2I[2]", "w", FUN_OFFSET\201Event, x\202, "at2p", "@2I", "w", FUN_OFFSET\201Event, atp\202, "at2p4", "@2I[4]", "w", FUN_OFFSET\201Event, atp\202, "atp9", "@I[9]", "w", FUN_OFFSET\201Event, atp\202, "atb20", "@I[B20]", "w", FUN_OFFSET\201Event, atb\202, NULL\202;)RP( Here we have specified the following columns: )UL()-1 LI( 2i: two short ints in an array which is stored as part the record )-1 LI( 2i2: the 3rd and 4th elements of an array which is stored as part of the record )-1 LI( an array of at least 10 elements, not stored in the record but allocated elsewhere, and used by three different columns: )UL()-1 LI( at2p: 2 short ints which are the first 2 elements of the allocated array )-1 LI( at2p4: 2 short ints which are the 5th and 6th elements of the allocated array )-1 LI( atp9: a short int which is the 10th element of the allocated array)LU( )-1 LI( atb20: a short int which is at byte offset 20 of another allocated array)LU( In this way, several columns can be specified, all of which are in a single array. )BD(NB)ES(: it is the programmer's responsibility to ensure that specification of a positive value for poff does not point past the end of valid data. )-1 LI( )BD(read/write mode)ES(: "r" means that the column is read from an input file into user space by )0 30 1 A(FunTableRowGet\201\202)30 0 TN TL()Ec /AF f D(, "w" means that the column is written to an output file. Both can specified at the same time. )-1 LI( )BD(offset)ES(: the offset into the user data to store this column. Typically, the macro FUN_OFFSET\201recname, colname\202 is used to define the offset into a record structure.)LU( )0 P(When all column arguments have been specified, a final NULL argument must added to signal the column selection list. )0 P(As an alternative to the varargs )0 32 1 A(FunColumnSelect\201\202)32 0 TN TL()Ec /AF f D( routine, a non-varargs routine called )0 32 1 A(FunColumnSelectArr\201\202)32 0 TN TL()Ec /AF f D( also is available. The first three arguments \201fun, size, plist\202 of this routine are the same as in )0 32 1 A(FunColumnSelect\201\202)32 0 TN TL()Ec /AF f D(. Instead of a variable argument list, however, )0 32 1 A(FunColumnSelectArr\201\202)32 0 TN TL()Ec /AF f D( takes 5 additional arguments. The first 4 arrays arguments contain the names, types, modes, and offsets, respectively, of the columns being selected. The final argument is the number of columns that are contained in these arrays. It is the user's responsibility to free string space allocated in these arrays. )0 P(Consider the following example: ) 12 54 PR( typedef struct evstruct{ int status; float pi, pha, *phas; double energy; } *Ev, EvRec; FunColumnSelect\201fun, sizeof\201EvRec\202, NULL, "status", "J", "r", FUN_OFFSET\201Ev, status\202, "pi", "E", "r", FUN_OFFSET\201Ev, pi\202, "pha", "E", "r", FUN_OFFSET\201Ev, pha\202, "phas", "@9E", "r", FUN_OFFSET\201Ev, phas\202, NULL\202;)RP( )0 P(Each time a row is read into the Ev struct, the "status" column is converted to an int data type \201regardless of its data type in the file\202 and stored in the status value of the struct. Similarly, "pi" and "pha", and the phas vector are all stored as floats. Note that the "@" sign indicates that the "phas" vector is a pointer to a 9 element array, rather than an array allocated in the struct itself. The row record can then be processed as required: ) 9 70 PR( /* get rows -- let routine allocate the row array */ while\201 \201ebuf = \201Ev\202FunTableRowGet\201fun, NULL, MAXROW, NULL, &got\202\202 \202{ /* process all rows */ for\201i=0; ipi = \201ev->pi+.5\202; ev->pha = \201ev->pi-.5\202; })RP( )0 P()0 32 1 A(FunColumnSelect\201\202)32 0 TN TL()Ec /AF f D( can also be called to define "writable" columns in order to generate a FITS Binary Table, without reference to any input columns. For example, the following will generate a 4-column FITS binary table when )0 31 1 A(FunTableRowPut\201\202)31 0 TN TL()Ec /AF f D( is used to write Ev records: ) 12 56 PR( typedef struct evstruct{ int status; float pi, pha double energy; } *Ev, EvRec; FunColumnSelect\201fun, sizeof\201EvRec\202, NULL, "status", "J", "w", FUN_OFFSET\201Ev, status\202, "pi", "E", "w", FUN_OFFSET\201Ev, pi\202, "pha", "E", "w", FUN_OFFSET\201Ev, pha\202, "energy", "D", "w", FUN_OFFSET\201Ev, energy\202, NULL\202;)RP( All columns are declared to be write-only, so presumably the column data is being generated or read from some other source. )0 P(In addition, )0 32 1 A(FunColumnSelect\201\202)32 0 TN TL()Ec /AF f D( can be called to define )BD(both)ES( "readable" and "writable" columns. In this case, the "read" columns are associated with an input file, while the "write" columns are associated with the output file. Of course, columns can be specified as both "readable" and "writable", in which case they are read from input and \201possibly modified data values are\202 written to the output. The )0 32 1 A(FunColumnSelect\201\202)32 0 TN TL()Ec /AF f D( call itself is made by passing the input Funtools handle, and it is assumed that the output file has been opened using this input handle as its )0 23 1 A(Funtools reference handle)23 0 TN TL()Ec /AF f D(. )0 P(Consider the following example: ) 13 54 PR( typedef struct evstruct{ int status; float pi, pha, *phas; double energy; } *Ev, EvRec; FunColumnSelect\201fun, sizeof\201EvRec\202, NULL, "status", "J", "r", FUN_OFFSET\201Ev, status\202, "pi", "E", "rw", FUN_OFFSET\201Ev, pi\202, "pha", "E", "rw", FUN_OFFSET\201Ev, pha\202, "phas", "@9E", "rw", FUN_OFFSET\201Ev, phas\202, "energy", "D", "w", FUN_OFFSET\201Ev, energy\202, NULL\202;)RP( As in the "read" example above, each time an row is read into the Ev struct, the "status" column is converted to an int data type \201regardless of its data type in the file\202 and stored in the status value of the struct. Similarly, "pi" and "pha", and the phas vector are all stored as floats. Since the "pi", "pha", and "phas" variables are declared as "writable" as well as "readable", they also will be written to the output file. Note, however, that the "status" variable is declared as "readable" only, and hence it will not be written to an output file. Finally, the "energy" column is declared as "writable" only, meaning it will not be read from the input file. In this case, it can be assumed that "energy" will be calculated in the program before being output along with the other values. )0 P(In these simple cases, only the columns specified as "writable" will be output using )0 31 1 A(FunTableRowPut\201\202)31 0 TN TL()Ec /AF f D(. However, it often is the case that you want to merge the user columns back in with the input columns, even in cases where not all of the input column names are explicitly read or even known. For this important case, the )BD(merge=[type])ES( keyword is provided in the plist string. )0 P(The )BD(merge=[type])ES( keyword tells Funtools to merge the columns from the input file with user columns on output. It is normally used when an input and output file are opened and the input file provides the )0 23 1 A(Funtools reference handle)23 0 TN TL()Ec /AF f D( for the output file. In this case, each time )0 30 1 A(FunTableRowGet\201\202)30 0 TN TL()Ec /AF f D( is called, the raw input rows are saved in a special buffer. If )0 31 1 A(FunTableRowPut\201\202)31 0 TN TL()Ec /AF f D( then is called \201before another call to )0 30 1 A(FunTableRowGet\201\202)30 0 TN TL()Ec /AF f D(\202, the contents of the raw input rows are merged with the user rows according to the value of )BD(type)ES( as follows: )UL()-1 LI( )BD(update)ES(: add new user columns, and update value of existing ones \201maintaining the input data type\202 )-1 LI( )BD(replace)ES(: add new user columns, and replace the data type and value of existing ones. \201Note that if tlmin/tlmax values are not specified in the replacing column, but are specified in the original column being replaced, then the original tlmin/tlmax values are used in the replacing column.\202 )-1 LI( )BD(append)ES(: only add new columns, do not "replace" or "update" existing ones)LU( )0 P(Consider the example above. If )BD(merge=update)ES( is specified in the plist string, then "energy" will be added to the input columns, and the values of "pi", "pha", and "phas" will be taken from the user space \201i.e., the values will be updated from the original values, if they were changed by the program\202. The data type for "pi", "pha", and "phas" will be the same as in the original file. If )BD(merge=replace)ES( is specified, both the data type and value of these three input columns will be changed to the data type and value in the user structure. If )BD(merge=append)ES( is specified, none of these three columns will be updated, and only the "energy" column will be added. Note that in all cases, "status" will be written from the input data, not from the user record, since it was specified as read-only. )0 P(Standard applications will call )0 32 1 A(FunColumnSelect\201\202)32 0 TN TL()Ec /AF f D( to define user columns. However, if this routine is not called, the default behavior is to transfer all input columns into user space. For this purpose a default record structure is defined such that each data element is properly aligned on a valid data type boundary. This mechanism is used by programs such as fundisp and funtable to process columns without needing to know the specific names of those columns. It is not anticipated that users will need such capabilities \201contact us if you do!\202 )0 P(By default, )0 32 1 A(FunColumnSelect\201\202)32 0 TN TL()Ec /AF f D( reads/writes rows to/from an "array of structs", where each struct contains the column values for a single row of the table. This means that the returned values for a given column are not contiguous. You can set up the IO to return a "struct of arrays" so that each of the returned columns are contiguous by specifying )BD(org=structofarrays)ES( \201abbreviation: )BD(org=soa)ES(\202 in the plist. \201The default case is )BD(org=arrayofstructs)ES( or )BD(org=aos)ES(.\202 )0 P(For example, the default setup to retrieve rows from a table would be to define a record structure for a single event and then call )0 32 1 A(FunColumnSelect\201\202)32 0 TN TL()Ec /AF f D( as follows: ) 14 73 PR( typedef struct evstruct{ short region; double x, y; int pi, pha; double time; } *Ev, EvRec; got = FunColumnSelect\201fun, sizeof\201EvRec\202, NULL, "x", "D:10:10", mode, FUN_OFFSET\201Ev, x\202, "y", "D:10:10", mode, FUN_OFFSET\201Ev, y\202, "pi", "J", mode, FUN_OFFSET\201Ev, pi\202, "pha", "J", mode, FUN_OFFSET\201Ev, pha\202, "time", "1D", mode, FUN_OFFSET\201Ev, time\202, NULL\202;)RP( Subsequently, each call to FunTableRowGet\201\202)EA( will return an array of structs, one for each returned row. If instead you wanted to read columns into contiguous arrays, you specify )BD(org=soa)ES(: ) 14 72 PR( typedef struct aevstruct{ short region[MAXROW]; double x[MAXROW], y[MAXROW]; int pi[MAXROW], pha[MAXROW]; double time[MAXROW]; } *AEv, AEvRec; got = FunColumnSelect\201fun, sizeof\201AEvRec\202, "org=soa", "x", "D:10:10", mode, FUN_OFFSET\201AEv, x\202, "y", "D:10:10", mode, FUN_OFFSET\201AEv, y\202, "pi", "J", mode, FUN_OFFSET\201AEv, pi\202, "pha", "J", mode, FUN_OFFSET\201AEv, pha\202, "time", "1D", mode, FUN_OFFSET\201AEv, time\202, NULL\202;)RP( Note that the only modification to the call is in the plist string. )0 P(Of course, instead of using staticly allocated arrays, you also can specify dynamically allocated pointers: ) 16 75 PR( /* pointers to arrays of columns \201used in struct of arrays\202 */ typedef struct pevstruct{ short *region; double *x, *y; int *pi, *pha; double *time; } *PEv, PEvRec; got = FunColumnSelect\201fun, sizeof\201PEvRec\202, "org=structofarrays", "$region", "@I", mode, FUN_OFFSET\201PEv, region\202, "x", "@D:10:10", mode, FUN_OFFSET\201PEv, x\202, "y", "@D:10:10", mode, FUN_OFFSET\201PEv, y\202, "pi", "@J", mode, FUN_OFFSET\201PEv, pi\202, "pha", "@J", mode, FUN_OFFSET\201PEv, pha\202, "time", "@1D", mode, FUN_OFFSET\201PEv, time\202, NULL\202;)RP( Here, the actual storage space is either allocated by the user or by the )0 32 1 A(FunColumnSelect\201\202)32 0 TN TL()Ec /AF f D( call\202. )0 P(In all of the above cases, the same call is made to retrieve rows, e.g.: ) 1 64 PR( buf = \201void *\202FunTableRowGet\201fun, NULL, MAXROW, NULL, &got\202;)RP( However, the individual data elements are accessed differently. For the default case of an "array of structs", the individual row records are accessed using: ) 5 69 PR( for\201i=0; ix, ev->y, ev->pi, ev->pha, ev->dx, ev->dy, ev->time\202; })RP( For a struct of arrays or a struct of array pointers, we have a single struct through which we access individual columns and rows using: ) 6 63 PR( aev = \201AEv\202buf; for\201i=0; ix[i], aev->y[i], aev->pi[i], aev->pha[i], aev->dx[i], aev->dy[i], aev->time[i]\202; })RP( Support for struct of arrays in the )0 31 1 A(FunTableRowPut\201\202)31 0 TN TL()Ec /AF f D( call is handled analogously. )0 P(See the )0 2 A(evread example code)EA( and )0 2 A(evmerge example code)EA( for working examples of how )0 32 1 A(FunColumnSelect\201\202)32 0 TN TL()Ec /AF f D( is used. )0 2 39 H(FunColumnActivate)WB 105 Sn()WB 33 Sn( - activate Funtools columns)EA()EH( )BD() 3 55 PR( #include void FunColumnActivate\201Fun fun, char *s, char *plist\202)RP()ES( )0 P(The )BD(FunColumnActivate\201\202)ES( routine determines which columns \201set up by )0 32 1 A(FunColumnSelect\201\202)32 0 TN TL()Ec /AF f D(\202 ultimately will be read and/or written. By default, all columns that are selected using )0 32 1 A(FunColumnSelect\201\202)32 0 TN TL()Ec /AF f D( are activated. The )0 33 1 A(FunColumnActivate\201\202)33 0 TN TL()Ec /AF f D( routine can be used to turn off/off activation of specific columns. )0 P(The first argument is the Fun handle associated with this set of columns. The second argument is a space-delimited list of columns to activate or de-activate. Columns preceded by "+" are activated and columns preceded by a "-" are de-activated. If a column is named without "+" or "-", it is activated. The reserved strings "$region" and '$n' are used to activate a special columns containing the filter region value and row value, respectively, associated with this row. For example, if a filter containing two circular regions is specified as part of the Funtools file name, this column will contain a value of 1 or 2, depending on which region that row was in. The reserved strings "$x" and "$y" are used to activate the current binning columns. Thus, if the columns DX and DY are specified as binning columns: ) 1 42 PR( [sh $] fundisp foo.fits[bincols=\201DX,DY\202])RP( then "$x" and "$y" will refer to these columns in a call to )0 33 1 A(FunColumnActivate\201\202)33 0 TN TL()Ec /AF f D(. )0 P(In addition, if the activation string contains only columns to be activated, then the routine will de-activate all other columns. Similarly, if the activation string contains only columns to de-activate, then the routine will activate all other columns before activating the list. This makes it simple to change the activation state of all columns without having to know all of the column names. For example: )UL()-1 LI( )BD("pi pha time")ES( # only these three columns will be active )-1 LI( )BD("-pi -pha -time")ES( # all but these columns will be active )-1 LI( )BD("pi -pha")ES( # only pi is active, pha is not, others are not )-1 LI( )BD("+pi -pha")ES( # same as above )-1 LI( )BD("pi -pha -time")ES( # only pi is active, all others are not )-1 LI( )BD("pi pha")ES( # pha and pi are active, all others are not )-1 LI( )BD("pi pha -x -y")ES( # pha and pi are active, all others are not)LU( )0 P(You can use the column activation list to reorder columns, since columns are output in the order specified. For example: ) 19 77 PR( # default output order fundisp snr.ev'[cir 512 512 .1]' X Y PHA PI TIME DX DY -------- -------- -------- -------- --------------------- -------- -------- 512 512 6 7 79493997.45854475 578 574 512 512 8 9 79494575.58943175 579 573 512 512 5 6 79493631.03866175 578 575 512 512 5 5 79493290.86521725 578 575 512 512 8 9 79493432.00990875 579 573 # re-order the output by specifying explicit order fundisp snr.ev'[cir 512 512 .1]' "time x y dy dx pi pha" TIME X Y DY DX PI PHA --------------------- -------- -------- -------- -------- -------- -------- 79493997.45854475 512 512 574 578 7 6 79494575.58943175 512 512 573 579 9 8 79493631.03866175 512 512 575 578 6 5 79493290.86521725 512 512 575 578 5 5 79493432.00990875 512 512 573 579 9 8)RP( )0 P(A "+" sign by itself means to activate all columns, so that you can reorder just a few columns without specifying all of them: ) 9 77 PR( # reorder 3 columns and then output the rest fundisp snr.ev'[cir 512 512 .1]' "time pi pha +" TIME PI PHA Y X DX DY --------------------- -------- -------- -------- -------- -------- -------- 79493997.45854475 7 6 512 512 578 574 79494575.58943175 9 8 512 512 579 573 79493631.03866175 6 5 512 512 578 575 79493290.86521725 5 5 512 512 578 575 79493432.00990875 9 8 512 512 579 573)RP( The column activation/deactivation is performed in the order of the specified column arguments. This means you can mix "+", "-" \201which de-activates all columns\202 and specific column names to reorder and select columns in one command. For example, consider the following: ) 9 59 PR( # reorder and de-activate fundisp snr.ev'[cir 512 512 .1]' "time pi pha + -x -y" TIME PI PHA DX DY --------------------- -------- -------- -------- -------- 79493997.45854475 7 6 578 574 79494575.58943175 9 8 579 573 79493631.03866175 6 5 578 575 79493290.86521725 5 5 578 575 79493432.00990875 9 8 579 573)RP( We first activate "time", "pi", and "pha" so that they are output first. We then activate all of the other columns, and then de-activate "x" and "y". Note that this is different from: ) 9 77 PR( # probably not what you want ... fundisp snr.ev'[cir 512 512 .1]' "time pi pha -x -y +" TIME PI PHA Y X DX DY --------------------- -------- -------- -------- -------- -------- -------- 79493997.45854475 7 6 512 512 578 574 79494575.58943175 9 8 512 512 579 573 79493631.03866175 6 5 512 512 578 575 79493290.86521725 5 5 512 512 578 575 79493432.00990875 9 8 512 512 579 573)RP( Here, "x" and "y" are de-activated, but then all columns including "x" and "y" are again re-activated. )0 P(Typically, )0 33 1 A(FunColumnActivate\201\202)33 0 TN TL()Ec /AF f D( uses a list of columns that are passed into the program from the command line. For example, the code for funtable contains the following: ) 9 66 PR( char *cols=NULL; /* open the input FITS file */ if\201 !\201fun = FunOpen\201argv[1], "rc", NULL\202\202 \202 gerror\201stderr, "could not FunOpen input file: %s\200n", argv[1]\202; /* set active flag for specified columns */ if\201 argc >= 4 \202 cols = argv[3]; FunColumnActivate\201fun, cols, NULL\202;)RP( The )0 25 1 A(FunOpen\201\202)25 0 TN TL()Ec /AF f D( call sets the default columns to be all columns in the input file. The )0 33 1 A(FunColumnActivate\201\202)33 0 TN TL()Ec /AF f D( call then allows the user to control which columns ultimately will be activated \201i.e., in this case, written to the new file\202. For example: ) 1 39 PR( funtable test.ev foo.ev "pi pha time")RP( will process only the three columns mentioned, while: ) 1 33 PR( funtable test.ev foo.ev "-time")RP( will process all columns except "time". )0 P(If )0 33 1 A(FunColumnActivate\201\202)33 0 TN TL()Ec /AF f D( is called with a null string, then the environment variable )BD(FUN_COLUMNS)ES( will be used to provide a global value, if present. This is the reason why we call the routine even if no columns are specified on the command line \201see example above\202, instead of calling it this way: ) 4 45 PR( /* set active flag for specified columns */ if\201 argc >= 4 \202{ FunColumnActivate\201fun, argv[3], NULL\202; })RP( )0 2 40 H(FunColumnLookup)WB 106 Sn()WB 34 Sn( - lookup a Funtools column)EA()EH( )BD() 5 56 PR( #include int FunColumnLookup\201Fun fun, char *s, int which, char **name, int *type, int *mode, int *offset, int *n, int *width\202)RP()ES( )0 P(The )BD(FunColumnLookup\201\202)ES( routine returns information about a named \201or indexed\202 column. The first argument is the Fun handle associated with this set of columns. The second argument is the name of the column to look up. If the name argument is NULL, the argument that follows is the zero-based index into the column array of the column for which information should be returned. The next argument is a pointer to a char *, which will contain the name of the column. The arguments that follow are the addresses of int values into which the following information will be returned: )UL()-1 LI( )BD(type)ES(: data type of column: )UL()-1 LI(A: ASCII characters )-1 LI(B: unsigned 8-bit char )-1 LI(I: signed 16-bit int )-1 LI(U: unsigned 16-bit int \201not standard FITS\202 )-1 LI(J: signed 32-bit int )-1 LI(V: unsigned 32-bit int \201not standard FITS\202 )-1 LI(E: 32-bit float )-1 LI(D: 64-bit float)LU( )-1 LI( )BD(mode)ES(: bit flag status of column, including: )UL()-1 LI( COL_ACTIVE 1 is column activated? )-1 LI( COL_IBUF 2 is column in the raw input data? )-1 LI( COL_PTR 4 is column a pointer to an array? )-1 LI( COL_READ 010 is read mode selected? )-1 LI( COL_WRITE 020 is write mode selected? )-1 LI( COL_REPLACEME 040 is this column being replaced by user data?)LU( )-1 LI( )BD(offset)ES(: byte offset in struct )-1 LI( )BD(n)ES(: number of elements \201i.e. size of vector\202 in this column )-1 LI( )BD(width)ES(: size in bytes of this column)LU( If the named column exists, the routine returns a positive integer, otherwise zero is returned. \201The positive integer is the index+1 into the column array where this column was located.\202 If NULL is passed as the return address of one \201or more\202 of these values, no data is passed back for that information. For example: ) 2 76 PR( if\201 !FunColumnLookup\201fun, "phas", 0, NULL NULL, NULL, NULL, &npha, NULL\202 \202 gerror\201stderr, "can't find phas column\200n"\202;)RP( only returns information about the size of the phas vector. )0 2 41 H(FunTableRowGet)WB 107 Sn()WB 30 Sn( - get Funtools rows)EA()EH( )BD() 4 68 PR( #include void *FunTableRowGet\201Fun fun, void *rows, int maxrow, char *plist, int *nrow\202)RP()ES( )0 P(The )BD(FunTableRowGet\201\202)ES( routine retrieves rows from a Funtools binary table or raw event file, and places the values of columns selected by )0 32 1 A(FunColumnSelect\201\202)32 0 TN TL()Ec /AF f D( into an array of user structs. Selected column values are automatically converted to the specified user data type \201and to native data format\202 as necessary. )0 P(The first argument is the Fun handle associated with this row data. The second )BD(rows)ES( argument is the array of user structs into which the selected columns will be stored. If NULL is passed, the routine will automatically allocate space for this array. \201This includes proper allocation of pointers within each struct, if the "@" pointer type is used in the selection of columns. Note that if you pass NULL in the second argument, you should free this space using the standard free\201\202 system call when you are finished with the array of rows.\202 The third )BD(maxrow)ES( argument specifies the maximum number of rows to be returned. Thus, if )BD(rows)ES( is allocated by the user, it should be at least of size maxrow*sizeof\201evstruct\202. )0 P(The fourth )BD(plist)ES( argument is a param list string. Currently, the keyword/value pair "mask=transparent" is supported in the plist argument. If this string is passed in the call's plist argument, then all rows are passed back to the user \201instead of just rows passing the filter\202. This is only useful when )0 32 1 A(FunColumnSelect\201\202)32 0 TN TL()Ec /AF f D( also is used to specify "$region" as a column to return for each row. In such a case, rows found within a region have a returned region value greater than 0 \201corresponding to the region id of the region in which they are located\202, rows passing the filter but not in a region have region value of -1, and rows not passing any filter have region value of 0. Thus, using "mask=transparent" and the returned region value, a program can process all rows and decide on an action based on whether a given row passed the filter or not. )0 P(The final argument is a pointer to an int variable that will return the actual number of rows returned. The routine returns a pointer to the array of stored rows, or NULL if there was an error. \201This pointer will be the same as the second argument, if the latter is non-NULL\202. ) 16 69 PR( /* get rows -- let routine allocate the row array */ while\201 \201buf = \201Ev\202FunTableRowGet\201fun, NULL, MAXROW, NULL, &got\202\202 \202{ /* process all rows */ for\201i=0; ienergy = \201ev->pi+ev->pha\202/2.0; ev->pha = -ev->pha; ev->pi = -ev->pi; } /* write out this batch of rows */ FunTableRowPut\201fun2, buf, got, 0, NULL\202; /* free row data */ if\201 buf \202 free\201buf\202; })RP( As shown above, successive calls to )0 30 1 A(FunTableRowGet\201\202)30 0 TN TL()Ec /AF f D( will return the next set of rows from the input file until all rows have been read, i.e., the routine behaves like sequential Unix I/O calls such as fread\201\202. See )0 2 A(evmerge example code)EA( for a more complete example. )0 P(Note that FunTableRowGet\201\202 also can be called as FunEventsGet\201\202, for backward compatibility. )0 2 42 H(FunTableRowPut)WB 108 Sn()WB 31 Sn( - put Funtools rows)EA()EH( ) 1 70 PR()BD(int FunTableRowPut\201Fun fun, void *rows, int nev, int idx, char *plist\202)ES()RP( The )BD(FunTableRowPut\201\202)ES( routine writes rows to a FITS binary table, taking its input from an array of user structs that contain column values selected by a previous call to )0 32 1 A(FunColumnSelect\201\202)32 0 TN TL()Ec /AF f D(. Selected column values are automatically converted from native data format to FITS data format as necessary. )0 P(The first argument is the Fun handle associated with this row data. The second )BD(rows)ES( argument is the array of user structs to output. The third )BD(nrow)ES( argument specifies the number number of rows to write. The routine will write )BD(nrow)ES( records, starting from the location specified by )BD(rows)ES(. )0 P(The fourth )BD(idx)ES( argument is the index of the first raw input row to write, in the case where rows from the user buffer are being merged with their raw input row counterparts \201see below\202. Note that this )BD(idx)ES( value is has nothing to do with the row buffer specified in argument 1. It merely matches the row being written with its corresponding \201hidden\202 raw row. Thus, if you read a number of rows, process them, and then write them out all at once starting from the first user row, the value of )BD(idx)ES( should be 0: ) 14 70 PR( Ev ebuf, ev; /* get rows -- let routine allocate the row array */ while\201 \201ebuf = \201Ev\202FunTableRowGet\201fun, NULL, MAXROW, NULL, &got\202\202 \202{ /* process all rows */ for\201i=0; i int FunParamGetb\201Fun fun, char *name, int n, int defval, int *got\202 int FunParamGeti\201Fun fun, char *name, int n, int defval, int *got\202 double FunParamGetd\201Fun fun, char *name, int n, double defval, int *got\202 char *FunParamGets\201Fun fun, char *name, int n, char *defval, int *got\202)RP()ES( )0 P(The four routines )BD(FunParamGetb\201\202)ES(, )BD(FunParamGeti\201\202)ES(, )BD(FunParamGetd\201\202)ES(, and )BD(FunParamGets\201\202)ES(, return the value of a FITS header parameter as a boolean, int, double, and string, respectively. The string returned by )BD(FunParamGets\201\202)ES( is a malloc'ed copy of the header value and should be freed when no longer needed. )0 P(The first argument is the Fun handle associated with the FITS header being accessed. Normally, the header is associated with the FITS extension that you opened with )BD(FunOpen\201\202)ES(. However, you can use FunInfoPut\201\202 to specify access of the primary header. In particular, if you set the FUN_PRIMARYHEADER parameter to 1, then the primary header is used for all parameter access until the value is reset to 0. For example: ) 9 75 PR( int val; FunParamGeti\201fun, "NAXIS", 1, 0, &got\202; # current header val=1; FunInfoPut\201fun, FUN_PRIMARYHEADER, &val, 0\202; # switch to ... FunParamGeti\201fun, "NAXIS", 1, 0, &got\202; # ... primary header FunParamGeti\201fun, "NAXIS", 2, 0, &got\202; # ... primary header val=0; FunInfoPut\201fun, FUN_PRIMARYHEADER, &val, 0\202; # switch back to ... FunParamGeti\201fun, "NAXIS", 2, 0, &got\202; # current header)RP( )0 P(Alternatively, you can use the FUN_PRIMARY macro to access parameters from the primary header on a per-parameter basis: ) 2 72 PR( FunParamGeti\201fun, "NAXIS1", 0, 0, &got\202; # current header FunParamGeti\201FUN_PRIMARY\201fun\202, "NAXIS1", 0, 0, &got\202; # primary header)RP( )BD(NB: FUN_PRIMARY is deprecated.)ES( It makes use of a global parameter and therefore will not not appropriate for threaded applications, when we make funtools thread-safe. We recommend use of FunInfoPut\201\202 to switch between the extension header and the primary header. )0 P(For output data, access to the primary header is only possible until the header is written out, which usually takes place when the first data are written. )0 P(The second argument is the name of the parameter to access. The third )BD(n)ES( argument, if non-zero, is an integer that will be added as a suffix to the parameter name. This makes it easy to use a simple loop to process parameters having the same root name. For example, to gather up all values of TLMIN and TLMAX for each column in a binary table, you can use: ) 4 74 PR( for\201i=0, got=1; got; i++\202{ fun->cols[i]->tlmin = \201int\202FunParamGeti\201fun, "TLMIN", i+1, 0.0, &got\202; fun->cols[i]->tlmax = \201int\202FunParamGeti\201fun, "TLMAX", i+1, 0.0, &got\202; })RP( )0 P(The fourth )BD(defval)ES( argument is the default value to return if the parameter does not exist. Note that the data type of this parameter is different for each specific FunParamGet\201\202 call. The final )BD(got)ES( argument will be 0 if no param was found. Otherwise the data type of the parameter is returned as follows: FUN_PAR_UNKNOWN \201'u'\202, FUN_PAR_COMMENT \201'c'\202, FUN_PAR_LOGICAL \201'l'\202, FUN_PAR_INTEGER \201'i'\202, FUN_PAR_STRING \201's'\202, FUN_PAR_REAL \201'r'\202, FUN_PAR_COMPLEX \201'x'\202. )0 P(These routines return the value of the header parameter, or the specified default value if the header parameter does not exist. The returned value is a malloc'ed string and should be freed when no longer needed. )0 P(By default, )BD(FunParamGets\201\202)ES( returns the string value of the named parameter. However, you can use FunInfoPut\201\202 to retrieve the raw 80-character FITS card instead. In particular, if you set the FUN_RAWPARAM parameter to 1, then card images will be returned by FunParamGets\201\202 until the value is reset to 0. )0 P(Alternatively, if the FUN_RAW macro is applied to the name, then the 80-character raw FITS card is returned instead. )BD(NB: FUN_RAW is deprecated.)ES( It makes use of a global parameter and therefore will not not appropriate for threaded applications, when we make funtools thread-safe. We recommend use of FunInfoPut\201\202 to switch between the extension header and the primary header. )0 P(Note that in addition to the behaviors described above, the routine )BD(FunParamGets\201\202)ES( will return the 80 raw characters of the )BD(nth)ES( FITS card \201including the comment\202 if )BD(name)ES( is specified as NULL and )BD(n)ES( is positive. For example, to loop through all FITS header cards in a given extension and print out the raw card, use: ) 9 55 PR( for\201i=1; ;i++\202{ if\201 \201s = FunParamGets\201fun, NULL, i, NULL, &got\202\202 \202{ fprintf\201stdout, "%.80s\200n", s\202; free\201s\202; } else{ break; } })RP( )0 2 43 H(FunParamPut)WB 109 Sn()WB 38 Sn( - put a Funtools param value)EA()EH( )BD() 13 71 PR( #include int FunParamPutb\201Fun fun, char *name, int n, int value, char *comm, int append\202 int FunParamPuti\201Fun fun, char *name, int n, int value, char *comm, int append\202 int FunParamPutd\201Fun fun, char *name, int n, double value, int prec, char *comm, int append\202 int FunParamPuts\201Fun fun, char *name, int n, char *value, char *comm, int append\202)RP()ES( )0 P(The four routines )BD(FunParamPutb\201\202)ES(, )BD(FunParamPuti\201\202)ES(, )BD(FunParamPutd\201\202)ES(, and )BD(FunParamPuts\201\202)ES(, will set the value of a FITS header parameter as a boolean, int, double, and string, respectively. )0 P(The first argument is the Fun handle associated with the FITS header being accessed. Normally, the header is associated with the FITS extension that you opened with )BD(FunOpen\201\202)ES(. However, you can use FunInfoPut\201\202 to specify that use of the primary header. In particular, if you set the FUN_PRIMARYHEADER parameter to 1, then the primary header is used for all parameter access until the value is reset to 0. For example: ) 5 69 PR( int val; FunParamPuti\201fun, "NAXIS1", 0, 10, NULL, 1\202; # current header val=1; FunInfoPut\201fun, FUN_PRIMARYHEADER, &val, 0\202; # switch to ... FunParamPuti\201fun, "NAXIS1", 0, 10, NULL, 1\202; # primary header)RP( \201You also can use the deprecated FUN_PRIMARY macro, to access parameters from the primary header.\202 )0 P(The second argument is the )BD(name)ES( of the parameter. \201 In accordance with FITS standards, the special names )BD(COMMENT)ES( and )BD(HISTORY)ES(, as well as blank names, are output without the "= " value indicator in columns 9 and 10. )0 P(The third )BD(n)ES( argument, if non-zero, is an integer that will be added as a suffix to the parameter name. This makes it easy to use a simple loop to process parameters having the same root name. For example, to set the values of TLMIN and TLMAX for each column in a binary table, you can use: ) 4 70 PR( for\201i=0; i int FunInfoGet\201Fun fun, int type, char *addr, ...\202)RP()ES( )0 P(The )BD(FunInfoGet\201\202)ES( routine returns information culled from the Funtools structure. The first argument is the Fun handle from which information is to be retrieved. This first required argument is followed by a variable length list of pairs of arguments. Each pair consists of an integer representing the type of information to retrieve and the address where the information is to be stored. The list is terminated by a 0. The routine returns the number of get actions performed. )0 P(The full list of available information is described below. Please note that only a few of these will be useful to most application developers. For imaging applications, the most important types are: ) 3 47 PR( FUN_SECT_DIM1 int /* dim1 for section */ FUN_SECT_DIM2 int /* dim2 for section */ FUN_SECT_BITPIX int /* bitpix for section */)RP( These would be used to determine the dimensions and data type of image data retrieved using the )0 26 1 A(FunImageGet\201\202)26 0 TN TL()Ec /AF f D( routine. For example: ) 17 68 PR( /* extract and bin the data section into an image buffer */ buf = FunImageGet\201fun, NULL, NULL\202; /* get required information from funtools structure. this should come after the FunImageGet\201\202 call, in case the call changed sect_bitpix */ FunInfoGet\201fun, FUN_SECT_BITPIX, &bitpix, FUN_SECT_DIM1, &dim1, FUN_SECT_DIM2, &dim2, 0\202; /* loop through pixels and reset values below limit to value */ for\201i=0; i void pix2wcs \201wcs,xpix,ypix,xpos,ypos\202 struct WorldCoor *wcs; /* World coordinate system structure */ double xpix,ypix; /* x and y coordinates in pixels */ double *xpos,*ypos; /* RA and Dec in degrees \201returned\202 */)RP( which converts pixel coordinates to sky coordinates, and: ) 5 67 PR( void wcs2pix \201wcs, xpos, ypos, xpix, ypix, offscl\202 struct WorldCoor *wcs; /* World coordinate system structure */ double xpos,ypos; /* World coordinates in degrees */ double *xpix,*ypix; /* coordinates in pixels */ int *offscl; /* 0 if within bounds, else off scale */)RP( which converts sky coordinates to pixel coordinates. Again, please note that the wcs structure returned by FUN_WCS assumes that image coordinates are passed to the pix2wcs routine, while FUN_WCS0 assumes that physical coordinates are passed. )0 P(Note that funtools.h file automatically includes wcs.h. An example program that utilizes these WCS structure to call WCS Library routines is )0 2 A(twcs.c)EA(. )0 P(The following is the complete list of information that can be returned: ) 52 79 PR( name type comment --------- -------- --------------------------------------------- FUN_FNAME char * /* file name */ FUN_GIO GIO /* gio handle */ FUN_HEADER FITSHead /* fitsy header struct */ FUN_TYPE int /* TY_TABLE,TY_IMAGE,TY_EVENTS,TY_ARRAY */ FUN_BITPIX int /* bits/pixel in file */ FUN_MIN1 int /* tlmin of axis1 -- tables */ FUN_MAX1 int /* tlmax of axis1 -- tables */ FUN_MIN2 int /* tlmin of axis2 -- tables */ FUN_MAX2 int /* tlmax of axis2 -- tables */ FUN_DIM1 int /* dimension of axis1 */ FUN_DIM2 int /* dimension of axis2 */ FUN_ENDIAN int /* 0=little, 1=big endian */ FUN_FILTER char * /* supplied filter */ FUN_IFUN FITSHead /* pointer to reference header */ FUN_IFUN0 FITSHead /* same as above, but no reset performed */ /* image information */ FUN_DTYPE int /* data type for images */ FUN_DLEN int /* length of image in bytes */ FUN_DPAD int /* padding to end of extension */ FUN_DOBLANK int /* was blank keyword defined? */ FUN_BLANK int /* value for blank */ FUN_SCALED int /* was bscale/bzero defined? */ FUN_BSCALE double /* bscale value */ FUN_BZERO double /* bzero value */ /* table information */ FUN_NROWS int /* number of rows in file \201naxis2\202 */ FUN_ROWSIZE int /* size of user row struct */ FUN_BINCOLS char * /* specified binning columns */ FUN_OVERFLOW int /* overflow detected during binning? */)WR( /* array information */ FUN_SKIP int /* bytes to skip in array header */ /* section information */ FUN_SECT_X0 int /* low dim1 value of section */ FUN_SECT_X1 int /* hi dim1 value of section */ FUN_SECT_Y0 int /* low dim2 value of section */ FUN_SECT_Y1 int /* hi dim2 value of section */ FUN_SECT_BLOCK int /* section block factor */ FUN_SECT_BTYPE int /* 's' \201sum\202, 'a' \201average\202 for binning */ FUN_SECT_DIM1 int /* dim1 for section */ FUN_SECT_DIM2 int /* dim2 for section */ FUN_SECT_BITPIX int /* bitpix for section */ FUN_SECT_DTYPE int /* data type for section */ FUN_RAWBUF char * /* pointer to raw row buffer */ FUN_RAWSIZE int /* byte size of raw row records */ /* column information */ FUN_NCOL int /* number of row columns defined */ FUN_COLS FunCol /* array of row columns */ /* WCS information */ FUN_WCS struct WorldCoor * /* wcs structure, converted for images*/ FUN_WCS0 struct WorldCoor * /* wcs structure, not converted */)RP( )0 P(Row applications would not normally need any of this information. An example of how these values can be used in more complex programs is the )0 2 A(evnext example code)EA(. In this program, the time value for each row is changed to be the value of the succeeding row. The program thus reads the time values for a batch of rows, changes the time values to be the value for the succeeding row, and then merges these changed time values back with the other columns to the output file. It then reads the next batch, etc. )0 P(This does not work for the last row read in each batch, since there is no succeeding row until the next batch is read. Therefore, the program saves that last row until it has read the next batch, then processes the former before starting on the new batch. In order to merge the last row successfully, the code uses FUN_RAWBUF to save and restore the raw input data associated with each batch of rows. Clearly, this requires some information about how funtools works internally. We are happy to help you write such programs as the need arises. )0 2 45 H(FunInfoPut)WB 111 Sn()WB 36 Sn( - put information into a Funtools struct)EA()EH( )BD() 3 52 PR( #include int FunInfoPut\201Fun fun, int type, char *addr, ...\202)RP()ES( )0 P(The )BD(FunInfoPut\201\202)ES( routine puts information into a Funtools structure. The first argument is the Fun handle from which information is to be retrieved. After this first required argument comes a variable length list of pairs of arguments. Each pair consists of an integer representing the type of information to store and the address of the new information to store in the struct. The variable list is terminated by a 0. The routine returns the number of put actions performed. )0 P(The full list of available information is described above with the )0 36 1 A(FunInfoPut\201\202)36 0 TN TL()Ec /AF f D( routine. Although use of this routine is expected to be uncommon, there is one important situation in which it plays an essential part: writing multiple extensions to a single output file. )0 P(For input, multiple extensions are handled by calling )0 25 1 A(FunOpen\201\202)25 0 TN TL()Ec /AF f D( for each extension to be processed. When opening multiple inputs, it sometimes is the case that you will want to process them and then write them \201including their header parameters\202 to a single output file. To accomplish this, you open successive input extensions using )0 25 1 A(FunOpen\201\202)25 0 TN TL()Ec /AF f D( and then call )BD(FunInfoPut\201\202)ES( to set the )0 23 1 A(Funtools reference handle)23 0 TN TL()Ec /AF f D( of the output file to that of the newly opened input extension: ) 4 71 PR( /* open a new input extension */ ifun=FunOpen\201tbuf, "r", NULL\202\202 \202 /* make the new extension the reference handle for the output file */ FunInfoPut\201ofun, FUN_IFUN, &ifun, 0\202;)RP( Resetting FUN_IFUN has same effect as when a funtools handle is passed as the final argument to )0 25 1 A(FunOpen\201\202)25 0 TN TL()Ec /AF f D(. The state of the output file is reset so that a new extension is ready to be written. Thus, the next I/O call on the output extension will output the header, as expected. )0 P(For example, in a binary table, after resetting FUN_IFUN you can then call )0 32 1 A(FunColumnSelect\201\202)32 0 TN TL()Ec /AF f D( to select the columns for output. When you then call )0 27 1 A(FunImagePut\201\202)27 0 TN TL()Ec /AF f D( or )0 31 1 A(FunTableRowPut\201\202)31 0 TN TL()Ec /AF f D(, a new extension will be written that contains the header parameters from the reference extension. Remember to call )0 39 1 A(FunFlush\201\202)39 0 TN TL()Ec /AF f D( to complete output of a given extension. )0 P(A complete example of this capability is given in the )0 2 A(evcol example code)EA(. The central algorithm is: )UL()-1 LI( open the output file without a reference handle )-1 LI( loop: open each input extension in turn )UL()-1 LI( set the reference handle for output to the newly opened input extension )-1 LI( read the input rows or image and perform processing )-1 LI( write new rows or image to the output file )-1 LI( flush the output )-1 LI( close input extension)LU( )-1 LI( close output file)LU( Note that )0 39 1 A(FunFlush\201\202)39 0 TN TL()Ec /AF f D( is called after processing each input extension in order to ensure that the proper padding is written to the output file. A call to )0 39 1 A(FunFlush\201\202)39 0 TN TL()Ec /AF f D( also ensures that the extension header is written to the output file in the case where there are no rows to output. )0 P(If you wish to output a new extension without using a )0 23 1 A(Funtools reference handle)23 0 TN TL()Ec /AF f D(, you can call FunInfoPut\201\202 to reset the FUN_OPS value directly. For a binary table, you would then call FunColumnSelect\201\202 to set up the columns for this new extension. ) 6 59 PR( /* reset the operations performed on this handle */ int ops=0; FunInfoPut\201ofun, FUN_OPS, &ops, 0\202; FunColumnSelect\201fun, sizeof\201EvRec\202, NULL, "MYCOL", "J", "w", FUN_OFFSET\201Ev, mycol\202, NULL\202;)RP( Once the FUN_OPS variable has been reset, the next I/O call on the output extension will output the header, as expected. )0 2 46 H(FunFlush)WB 112 Sn()WB 39 Sn( - flush data to output file)EA()EH( )BD() 3 37 PR( #include void FunFlush\201Fun fun, char *plist\202)RP()ES( )0 P(The )BD(FunFlush)ES( routine will flush data to a FITS output file. In particular, it can be called after all rows have been written \201using the )0 31 1 A(FunTableRowPut\201\202)31 0 TN TL()Ec /AF f D( routine\202 in order to add the null padding that is required to complete a FITS block. It also should be called after completely writing an image using )0 27 1 A(FunImagePut\201\202)27 0 TN TL()Ec /AF f D( or after writing the final row of an image using )0 31 1 A(FunTableRowPut\201\202)31 0 TN TL()Ec /AF f D(. )0 P(The )BD(plist)ES( \201i.e., parameter list\202 argument is a string containing one or more comma-delimited )BD(keyword=value)ES( parameters. If the plist string contains the parameter "copy=remainder" and the file was opened with a reference file, which, in turn, was opened for extension copying \201i.e. the input )0 25 1 A(FunOpen\201\202)25 0 TN TL()Ec /AF f D( mode also was "c" or "C"\202, then FunFlush also will copy the remainder of the FITS extensions from the input reference file to the output file. This normally would be done only at the end of processing. )0 P(Note that )0 39 1 A(FunFlush\201\202)39 0 TN TL()Ec /AF f D( is called with "copy=remainder" in the mode string by FunClose\201\202. This means that if you close the output file before the reference input file, it is not necessary to call )0 39 1 A(FunFlush\201\202)39 0 TN TL()Ec /AF f D( explicitly, unless you are writing more than one extension. See the )0 2 A(evmerge example code)EA(. However, it is safe to call )0 39 1 A(FunFlush\201\202)39 0 TN TL()Ec /AF f D( more than once without fear of re-writing either the padding or the copied extensions. )0 P(In addition, if )0 39 1 A(FunFlush\201\202)39 0 TN TL()Ec /AF f D( is called on an output file with the plist set to "copy=reference" and if the file was opened with a reference file, the reference extension is written to the output file. This mechanism provides a simple way to copy input extensions to an output file without processing the former. For example, in the code fragment below, an input extension is set to be the reference file for a newly opened output extension. If that reference extension is not a binary table, it is written to the output file: ) 22 73 PR( /* process each input extension in turn */ for\201ext=0; ;ext++\202{ /* get new extension name */ sprintf\201tbuf, "%s[%d]", argv[1], ext\202; /* open input extension -- if we cannot open it, we are done */ if\201 !\201ifun=FunOpen\201tbuf, "r", NULL\202\202 \202 break; /* make the new extension the reference handle for the output file */ FunInfoPut\201ofun, FUN_IFUN, &ifun, 0\202; /* if its not a binary table, just write it out */ if\201 !\201s=FunParamGets\201ifun, "XTENSION", 0, NULL, &got\202\202 || strcmp\201s, "BINTABLE"\202\202{ if\201 s \202 free\201s\202; FunFlush\201ofun, "copy=reference"\202; FunClose\201ifun\202; continue; } else{ /* process binary table */ .... } })RP( )0 2 47 H(FunClose)WB 113 Sn()WB 40 Sn( - close a Funtools data file)EA()EH( )BD() 3 24 PR( #include void FunClose\201Fun fun\202)RP()ES( )0 P(The )BD(FunClose\201\202)ES( routine closes a previously-opened Funtools data file, freeing control structures. If a )0 23 1 A(Funtools reference handle)23 0 TN TL()Ec /AF f D( was passed to the )0 25 1 A(FunOpen\201\202)25 0 TN TL()Ec /AF f D( call for this file, and if copy mode also was specified for that file, then )0 40 1 A(FunClose\201\202)40 0 TN TL()Ec /AF f D( also will copy the remaining extensions from the input file to the output file \201if the input file still is open\202. Thus, we recommend always closing the output Funtools file )BD(before)ES( the input file. \201Alternatively, you can call )0 39 1 A(FunFlush\201\202)39 0 TN TL()Ec /AF f D( explicitly\202. )0 2 48 H(FunRef:)WB 114 Sn()WB 23 Sn( the Funtools Reference Handle)EA()EH( )0 2 49 H(Summary)WB 115 Sn()EH( A description of how to use a Funtools reference handle to connect a Funtools input file to an output file. )0 2 50 H(Description)WB 116 Sn()EH( )0 P(The Funtools reference handle connects a Funtools input file to a Funtools output file so that parameters \201or even whole extensions\202 can be copied from the one to the other. To make the connection, the Funtools handle of the input file is passed to the final argument of the )0 25 1 A(FunOpen\201\202)25 0 TN TL()Ec /AF f D( call for the output file: ) 4 67 PR( if\201 !\201ifun = FunOpen\201argv[1], "r", NULL\202\202 \202 gerror\201stderr, "could not FunOpen input file: %s\200n", argv[1]\202; if\201 !\201ofun = FunOpen\201argv[2], "w", ifun\202\202 \202 gerror\201stderr, "could not FunOpen output file: %s\200n", argv[2]\202;)RP( It does not matter what type of input or output file \201or extension\202 is opened, or whether they are the same type. When the output image or binary table is written using )0 27 1 A(FunImagePut\201\202)27 0 TN TL()Ec /AF f D( or )0 31 1 A(FunTableRowPut\201\202)31 0 TN TL()Ec /AF f D( an appropriate header will be written first, with parameters copied from the input extension. Of course, invalid parameters will be removed first, e.g., if the input is a binary table and the output is an image, then binary table parameters such as TFORM, TUNIT, etc. parameters will not be copied to the output. )0 P(Use of a reference handle also allows default values to be passed to )0 27 1 A(FunImagePut\201\202)27 0 TN TL()Ec /AF f D( in order to write out an output image with the same dimensions and data type as the input image. To use the defaults from the input, a value of 0 is entered for dim1, dim2, and bitpix. For example: ) 5 40 PR( fun = FunOpen\201argv[1], "r", NULL\202; fun2 = FunOpen\201argv[2], "w", fun\202; buf = FunImageGet\201fun, NULL, NULL\202; ... process image data ... FunImagePut\201fun2, buf, 0, 0, 0, NULL\202;)RP( Of course, you often want to get information about the data type and dimensions of the image for processing. The above code is equivalent to the following: ) 7 61 PR( fun = FunOpen\201argv[1], "r", NULL\202; fun2 = FunOpen\201argv[2], "w", fun\202; buf = FunImageGet\201fun, NULL, NULL\202; FunInfoGet\201fun, FUN_SECT_DIM1, &dim1, FUN_SECT_DIM2, &dim2, FUN_SECT_BITPIX, &bitpix, 0\202; ... process image data ... FunImagePut\201fun2, buf, dim1, dim2, bitpix, NULL\202;)RP( )0 P(It is possible to change the reference handle for a given output Funtools handle using the )0 36 1 A(FunInfoPut\201\202)36 0 TN TL()Ec /AF f D( routine: ) 2 71 PR( /* make the new extension the reference handle for the output file */ FunInfoPut\201fun2, FUN_IFUN, &fun, 0\202;)RP( When this is done, Funtools specially resets the output file to start a new output extension, which is connected to the new input reference handle. You can use this mechanism to process multiple input extensions into a single output file, by successively opening the former and setting the reference handle for the latter. For example: ) 18 73 PR( /* open a new output FITS file */ if\201 !\201fun2 = FunOpen\201argv[2], "w", NULL\202\202 \202 gerror\201stderr, "could not FunOpen output file: %s\200n", argv[2]\202; /* process each input extension in turn */ for\201ext=0; ;ext++\202{ /* get new extension name */ sprintf\201tbuf, "%s[%d]", argv[1], ext\202; /* open it -- if we cannot open it, we are done */ if\201 !\201fun=FunOpen\201tbuf, "r", NULL\202\202 \202 break; /* make the new extension the reference handle for the output file */ FunInfoPut\201fun2, FUN_IFUN, &fun, 0\202; ... process ... /* flush output extension \201write padding, etc.\202 */ FunFlush\201fun2, NULL\202; /* close the input extension */ FunClose\201fun\202; })RP( In this example, the output file is opened first. Then each successive input extension is opened, and the output reference handle is set to the newly opened input handle. After data processing is performed, the output extension is flushed and the input extension is closed, in preparation for the next input extension. )0 P(Finally, a reference handle can be used to copy other extensions from the input file to the output file. Copy of other extensions is controlled by adding a "C" or "c" to the mode string of the )0 25 1 A(FunOpen\201\202)25 0 TN TL()Ec /AF f D( call )BD(of the input reference file)ES(. If "C" is specified, then other extensions are )BD(always)ES( copied \201i.e., copy is forced by the application\202. If "c" is used, then other extensions are copied if the user requests copying by adding a plus sign "+" to the extension name in the bracket specification. For example, the )BD(funtable)ES( program utilizes user-specified "c" mode so that the second example below will copy all extensions: ) 4 60 PR( # copy only the EVENTS extension csh> funtable "test.ev[EVENTS,circle\201512,512,10\202]" foo.ev # copy ALL extensions csh> funtable "test.ev[EVENTS+,circle\201512,512,10\202]" foo.ev)RP( When extension copy is specified in the input file, the call to )0 25 1 A(FunOpen\201\202)25 0 TN TL()Ec /AF f D( on the input file delays the actual file open until the output file also is opened \201or until I/O is performed on the input file, which ever happens first\202. Then, when the output file is opened, the input file is also opened and input extensions are copied to the output file, up to the specific extension being opened. Processing of input and output extensions then proceed. )0 P(When extension processing is complete, the remaining extensions need to be copied from input to output. This can be done explicitly, using the )0 39 1 A(FunFlush\201\202)39 0 TN TL()Ec /AF f D( call with the "copy=remaining" plist: ) 1 34 PR( FunFlush\201fun, "copy=remaining"\202;)RP( Alternatively, this will happen automatically, if the output file is closed )BD(before)ES( the input file: ) 5 77 PR( /* we could explicitly flush remaining extensions that need copying */ /* FunFlush\201fun2, "copy=remaining"\202; */ /* but if we close output before input, end flush is done automatically */ FunClose\201fun2\202; FunClose\201fun\202;)RP( )0 P()0 0 1 A(Go to Funtools Help Index)0 0 TN TL()Ec /AF f D( )0 5 51 H(Last)WB 117 Sn( updated: December 1, 2005)EH( )WB NL /Cb Db D /Ct [16#00 16#00 16#00] D /Cl [16#00 16#00 16#00] D /CL -1 D Ct Sc DS /Ba f D /BO 0 D Bs /UR (files.html) D /Ti (Funtools Data Files) D /Au () D /Df f D /ME [()] D 0 BO R ()1 Sl()WB 42 Sn( )0 2 52 H(FunFiles:)WB 120 Sn()WB 118 Sn( Funtools Data Files)EA()EH( )0 2 53 H(Summary)WB 121 Sn()EH( This document describes the data file formats \201FITS, array, raw events\202 as well as the file types \201gzip, socket, etc.\202 supported by Funtools. )0 2 54 H(Description)WB 122 Sn()EH( )0 P(Funtools supports FITS images and binary tables, and binary files containing array \201homogeneous\202 data or event \201heterogeneous\202 data. IRAF-style brackets are appended to the filename to specify various kinds of information needed to characterize these data: ) 3 49 PR( file[ext|ind|ARRAY\201\202|EVENTS\201\202,section][filters] or file[ext|ind|ARRAY\201\202|EVENTS\201\202,section,filters])RP( where: )UL()-1 LI( )BD(file)ES( is the Funtools file name )-1 LI( )BD(ext)ES( is the FITS extension name )-1 LI( )BD(ind)ES( is the FITS extension number )-1 LI( )BD(ARRAY\201\202)ES( is an array specification )-1 LI( )BD(EVENTS\201\202)ES( is an event specification )-1 LI( )BD(section)ES( is the image section specification )-1 LI( )BD(filters)ES( are spatial region and table \201row\202 filters)LU( )0 2 55 H(Supported)WB 123 Sn()WB 43 Sn( Data Formats)EA()EH( )0 P(Funtools programs \201and the underlying libraries\202 support the following data file formats: )UL()-1 LI( FITS images \201and image extensions\202 )-1 LI( FITS binary tables )-1 LI( binary files containing an array of homogeneous data )-1 LI( binary files containing events, i.e. records of heterogeneous data )-1 LI( column-based text files, which are documented )0 47 1 A(here)47 0 TN TL()Ec /AF f D( )-1 LI( non-disk files and lists of files)LU( Information needed to identify and characterize the event or image data can be specified on the command line using IRAF-style bracket notation appended to the filename: ) 5 69 PR( foo.fits # open FITS default extension image.fits[3] # open FITS extension #3 events.fits[EVENTS] # open EVENTS extension array.file[ARRAY\201s1024\202] # open 1024x1024 short array events.file[EVENTS\201x:1024,y:1024...\202] # open non-FITS event list)RP( Note that in many Unix shells \201e.g., csh and tcsh\202, filenames must be enclosed in quotes to protect the brackets from shell processing. )0 2 56 H(FITS)WB 124 Sn()WB 44 Sn( Images and Binary Tables)EA()EH( )0 P(When )0 25 1 A(FunOpen\201\202)25 0 TN TL()Ec /AF f D( opens a FITS file without a bracket specifier, the default behavior is to look for a valid image in the primary HDU. In the absence of a primary image, Funtools will try to open an extension named either )BD(EVENTS)ES( or )BD(STDEVT)ES(, if one of these exists. This default behavior supports both FITS image processing and standard X-ray event list processing \201which, after all, is what we at SAO/HEAD do\202. )0 P(In order to open a FITS binary table or image extension explicitly, it is necessary to specify either the extension name or the extension number in brackets: ) 3 71 PR( foo.fits[1] # open extension #1: the primary HDU foo.fits[3] # open extension #3 of a FITS file foo.fits[GTI] # open GTI extension of a FITS file)RP( The ext argument specifies the name of the FITS extension \201i.e. the value of the EXTENSION header parameter in a FITS extension\202, while the index specifies the value of the FITS EXTVER header parameter. Following FITS conventions, extension numbers start at 1. )0 P(When a FITS data file is opened for reading using )0 25 1 A(FunOpen\201\202)25 0 TN TL()Ec /AF f D(, the specified extension is automatically located and is used to initialize the Funtools internal data structures. )0 2 57 H(Non-FITS)WB 125 Sn()WB 45 Sn( Raw Event Files)EA()EH( In addition to FITS tables, Funtools programs and libraries can operate on non-FITS files containing heterogeneous event records. To specify such an event file, use: )UL()-1 LI( file[EVENTS\201event-spec\202] )-1 LI( file[EVENTS\201\202])LU( where )BD(event-spec)ES( is a string that specified the names, data types, and optional image dimensions for each element of the event record: )UL()-1 LI( [name]:[n][type]:[\201lodim:\202hidim])LU( )0 P(Data types follow standard conventions for FITS binary tables, but include two extra unsigned types \201'U' and 'V'\202: )UL()-1 LI( )BD(B)ES( -- unsigned 8-bit char )-1 LI( )BD(I)ES( -- signed 16-bit int )-1 LI( )BD(J)ES( -- signed 32-bit int )-1 LI( )BD(K)ES( -- signed 64-bit int )-1 LI( )BD(E)ES( -- 32-bit float )-1 LI( )BD(D)ES( -- 64-bit float )-1 LI( )BD(U)ES( -- unsigned 16-bit int )-1 LI( )BD(V)ES( -- unsigned 32-bit int)LU( An optional integer value )BD(n)ES( can be prefixed to the type to indicate that the element is an array of n values. For example: ) 1 37 PR( foo.fits[EVENTS\201x:I,y:I,status:4J\202])RP( defines x and y as 16-bit ints and status as an array of 4 32-bit ints. )0 P(Furthermore, image dimensions can be attached to the event specification in order to tell Funtools how to bin the events into an image. They follow the conventions for the FITS TLMIN/TLMAX keywords. If the low image dimension is not specified, it defaults to 1. Thus: )UL()-1 LI( RAWX:J:1:100 )-1 LI( RAWX:J:100)LU( both specify that the dimension of this column runs from 1 to 100. )0 P(NB: it is required that all padding be specified in the record definition. Thus, when writing out whole C structs instead of individual record elements, great care must be taken to include the compiler-added padding in the event definition. )0 P(For example, suppose a FITS binary table has the following set of column definitions: ) 22 54 PR( TTYPE1 = 'X ' / Label for field TFORM1 = '1I ' / Data type for field TLMIN1 = 1 / Min. axis value TLMAX1 = 10 / Max. axis value TTYPE2 = 'Y ' / Label for field TFORM2 = '1I ' / Data type for field TLMIN2 = 2 / Min. axis value TLMAX2 = 11 / Max. axis value TTYPE3 = 'PHA ' / Label for field TFORM3 = '1I ' / Data type for field TTYPE4 = 'PI ' / Label for field TFORM4 = '1J ' / Data type for field TTYPE5 = 'TIME ' / Label for field TFORM5 = '1D ' / Data type for field TTYPE6 = 'DX ' / Label for field TFORM6 = '1E ' / Data type for field TLMIN6 = 1 / Min. axis value TLMAX6 = 10 / Max. axis value TTYPE7 = 'DY ' / Label for field TFORM7 = '1E ' / Data type for field TLMIN7 = 3 / Min. axis value TLMAX7 = 12 / Max. axis value)RP( An raw event file containing these same data would have the event specification: ) 1 61 PR( EVENTS\201X:I:10,Y:I:2:11,PHA:I,PI:J,TIME:D,DX:E:10,DY:E:3:12\202)RP( )0 P(If no event specification string is included within the EVENTS\201\202 operator, then the event specification is taken from the )BD(EVENTS)ES( environment variable: ) 1 65 PR( setenv EVENTS "X:I:10,Y:I:10,PHA:I,PI:J,TIME:D,DX:E:10,DY:E:10")RP( )0 P(In addition to knowing the data structure, it is necessary to know the )EM(endian)ES( ordering of the data, i.e., whether or not the data is in )EM(bigendian)ES( format, so that we can convert to the native format for this platform. This issue does not arise for FITS Binary Tables because all FITS files use big-endian ordering, regardless of platform. But for non-FITS data, big-endian data produced on a Sun workstation but read on a Linux PC needs to be byte-swapped, since PCs use little-endian ordering. To specify an ordering, use the )EM(bigendian=)ES( or )EM(endian=)ES( keywords on the command-line or the EVENTS_BIGENDIAN or EVENTS_ENDIAN environment variables. The value of the )EM(bigendian)ES( variables should be "true" or "false", while the value of the )EM(endian)ES( variables should be "little" or "big". )0 P(For example, a PC can access data produced by a Sun using: ) 7 35 PR( hrc.nepr[EVENTS\201\202,bigendian=true] or hrc.nepr[EVENTS\201\202,endian=big] or setenv EVENTS_BIGENDIAN true or setenv EVENTS_ENDIAN big)RP( If none of these are specified, the data are assumed to follow the format for that platform and no byte-swapping is performed. )0 2 58 H(Non-FITS)WB 126 Sn()WB 46 Sn( Array Files)EA()EH( In addition to FITS images, Funtools programs and libraries can operate on non-FITS files containing arrays of homogeneous data. To specify an array file, use: )UL()-1 LI( file[ARRAY\201array-spec\202] )-1 LI( file[ARRAY\201\202])LU( where array-spec is of the form: )UL()-1 LI( [type][dim1][.dim2][:skip][endian])LU( and where [type] is: )UL()-1 LI( b \2018-bit unsigned char\202 )-1 LI( s \20116-bit short int\202 )-1 LI( u \20116-bit unsigned short int\202 )-1 LI( i \20132-bit int\202 )-1 LI( r,f \20132-bit float\202 )-1 LI( d \20164-bit float\202)LU( )0 P(The dim1 specification is required, but dim2 is optional and defaults to dim1. The skip specification is optional and defaults to 0. The optional endian specification can be 'l' or 'b' and defaults to the endian type for the current machine. )0 P(If no array specification is included within the ARRAY\201\202 operator, then the array specification is taken from the )BD(ARRAY)ES( environment variable. For example: ) 7 76 PR( foo.arr[ARRAY\201r512\202] # bitpix=-32 dim1=512 dim2=512 foo.arr[ARRAY\201r512.400\202] # bitpix=-32 dim1=512 dim2=400 foo.arr[ARRAY\201r512.400]\202 # bitpix=-32 dim1=512 dim2=400 foo.arr[ARRAY\201r512.400:2880\202] # bitpix=-32 dim1=512 dim2=400 skip=2880 foo.arr[ARRAY\201r512l\202] # bitpix=-32 dim1=512 dim2=512 endian=little setenv ARRAY "r512.400:2880" foo.arr[ARRAY\201\202] # bitpix=-32 dim1=512 dim2=400 skip=2880)RP( )0 2 59 H(Specifying)WB 127 Sn()WB 49 Sn( Image Sections)EA()EH( Once a data file \201and possibly, a FITS extension\202 has been specified, the next \201optional\202 part of a bracket specification can be used to select image )BD(section)ES( information, i.e., to specify the x,y limits of an image section, as well as the blocking factor to apply to that section. This information can be added to any file specification but only is used by Funtools image processing routines. )0 P(The format of the image section specification is one of the following: )UL()-1 LI( file[xy0:xy1,block] )-1 LI( file[x0:x1,y0:y1,block] )-1 LI( file[x0:x1,*,block] )-1 LI( file[*,y0:y1,block] )-1 LI( file[*,block])LU( where the limit values can be ints or "*" for default. A single "*" can be used instead of val:val, as shown. Note that blocking is applied to the section after it is extracted. )0 P(In addition to image sections specified by the lo and hi x,y limits, image sections using center positions can be specified: )UL()-1 LI( file[dim1@xcen,dim2@ycen] )-1 LI( file[xdim2@xcen@ycen] )-1 LI( file[dim1@xcen,dim2@ycen,block] )-1 LI( file[dim@xcen@ycen,block])LU( Note that the \201float\202 values for dim, dim1, dim2, xcen, ycen must be specified or else the expression does not make sense! )0 P(In all cases, block is optional and defaults to 1. An 's' or 'a' can be appended to signify "sum" or "average" blocking \201default is "sum"\202. Section specifications are given in image coordinates by default. If you wish to specify physical coordinates, add a 'p' as the last character of the section specification, before the closing bracket. For example: ) 2 21 PR()UL()-1 LI( file[-8:-7,-8:-7p] )-1 LI( file[-8:-7,-8:-7,2p])LU()RP( A section can be specified in any Funtools file name. If the operation to be applied to that file is an imaging operation, then the specification will be utilized. If the operation is purely a table operation, then the section specification is ignored. )0 P(Do not be confused by: ) 2 15 PR( foo.fits[2] foo.fits[*,2])RP( The former specifies opening the second extension of the FITS file. The latter specifies application of block 2 to the image section. )0 P(Note that the section specification must come after any of FITS )BD(ext)ES( name or )BD(ind)ES( number, but all sensible defaults are supported: )UL()-1 LI( file[ext] )-1 LI( file[ext,index] )-1 LI( file[index] )-1 LI( file[ext,section] )-1 LI( file[ext,index,section] )-1 LI( file[index,section] )-1 LI( file[section])LU( )0 2 60 H(Binning)WB 128 Sn()WB 50 Sn( FITS Binary Tables and Non-FITS Event Files)EH( If a FITS binary table or a non-FITS raw event file is to be binned into a 2D image \201e.g., using the )0 10 1 A(funimage)10 0 TN TL()Ec /AF f D( program\202, it is necessary to specify the two columns to be used for the binning, as well as the dimensions of the image. Funtools first looks for a specifier of the form: ) 1 74 PR( bincols=\201[xnam[:tlmin[:tlmax:[binsiz]]]],[ynam[:tlmin[:tlmax[:binsiz]]]]\202)RP( in bracket syntax, and uses the column names thus specified. The tlmin, tlmax, and binsiz specifiers determine the image binning dimensions using: ) 2 56 PR( dim = \201tlmax - tlmin\202/binsiz \201floating point data\202 dim = \201tlmax - tlmin\202/binsiz + 1 \201integer data\202)RP( These tlmin, tlmax, and binsiz specifiers can be omitted if TLMIN, TLMAX, and TDBIN header parameters are present in the FITS binary table header, respectively. If only one parameter is specified, it is assumed to be tlmax, and tlmin defaults to 1. If two parameters are specified, they are assumed to be tlmin and tlmax. For example, to bin an HRC event list columns "VPOS" and "UPOS", use: ) 1 31 PR( hrc.nepr[bincols=\201VPOS,UPOS\202])RP( or ) 1 42 PR( hrc.nepr[bincols=\201VPOS:49152,UPOS:4096\202])RP( Note that you can optionally specify the dimensions of these columns to cover cases where neither TLMAX keywords are defined in the header. If either dimension is specified, then both must be specified. )0 P(You can set the FITS_BINCOLS or EVENTS_BINCOLS environment variable as an alternative to adding the "bincols=" specifier to each file name for FITS binary tables and raw event files, respectively. If no binning keywords or environment variables are specified, or if the specified columns are not in the binary table, the Chandra parameters CPREF \201or PREFX\202 are searched for in the FITS binary table header. Failing this, columns named "X" and "Y" are sought. If these are not found, the code looks for columns containing the characters "X" and "Y". Thus, you can bin on "DETX" and "DETX" columns without specifying them, if these are the only column names containing the "X" and "Y" characters. )0 P(Ordinarily, each event or row contributes one count to an image pixel during the 2D binning process. Thus, if five events all have the same \201x,y\202 position, the image pixel value for that position will have a value of five. It is possible to specify a variable contribution for each event by using the vcol=[colname] filter spec: ) 1 15 PR( vcol=[colname])RP( The vcol colname is a column containing a numeric value in each event row that will be used as the contribution of the given event to its image pixel. For example, consider an event file that has the following content: ) 10 24 PR( x:e:4 y:e:4 v:e ------ ------ ---- 1 1 1.0 2 2 2.0 3 3 3.0 4 4 0.0 1 1 1.0 2 2 2.0 3 3 3.0 4 4 4.0)RP( There are two events with x,y value of \2011,1\202 so ordinarily a 2D image will have a value of 2 in the \2011,1\202 pixel. If the v column is specified as the value column: ) 1 20 PR( foo.fits'[vcol=v]')RP( then each pixel will contain the additive sum of the associated \201x,y\202 column values from the v column. For example, image pixel \2011,1\202 will contain 1. + 1. = 2, image pixel \2012,2\202 will contain \2012 + 2\202 = 4, etc. )0 P(An important variation on the use of a value column to specify the contribution an event makes to an image pixel is when the value column contains the reciprocal of the event contribution. For this case, the column name should be prefixed with a / \201divide sign\202 thus: ) 1 21 PR( foo.fits'[vcol=/v]')RP( Each image pixel value will then be the sum of the reciprocals of the value column. A zero in the value column results in NaN \201not a number\202. Thus, in the above example, image pixel \2011.1\202 will contain 1/1 + 1/1 = 2, image pixel \2012,2\202 will contain \2011/2 + 1/2\202 = 1, etc. Image pixel \2014,4\202 will contain \2011/0 + 1/4\202 = NaN. )0 P(You can set the FITS_VCOL or EVENTS_VCOL environment variable as an alternative to adding the "vcol=" specifier to each file name for FITS binary tables and raw event files, respectively. )0 P(Finally, when binning events, the data type of the resulting 2D image must be specified. This can be done with the "bitpix=[n]" keyword in the bracket specification. For example: ) 1 45 PR( events.fits[bincols=\201VPOS,UPOS\202,bitpix=-32])RP( will create a floating point image binned on columns VPOS and UPOS. If no bitpix keyword is specified, bitpix=32 is assumed. As with bincols values, you also can use the FITS_BITPIX and EVENTS_BITPIX environment variables to set this value for FITS binary tables and raw event files, respectively. )0 P(The )BD(funimage)ES( program also allows you to create a 1D image projection along any column of a table by using the )BD(bincols=[column])ES( filter specification and specifying a single column. For example, the following command projects a 1D image along the chipx column of a table: ) 1 43 PR( funimage ev.fits'[bincols=chipx]' im.fits)RP( See )0 10 1 A(funimage)10 0 TN TL()Ec /AF f D( for more information about creating 1D and 2D images. )0 P(Finally, please note that Funtools supports most FITS standards. We will add missing support as required by the community. In general, however, we do not support non-standard extensions. For example, we sense the presence of the binary table 'variable length array' proposed extension and we pass it along when copying and filtering files, but we do not process it. We will add support for new standards as they become official. )0 2 61 H(Table)WB 129 Sn()WB 119 Sn( and Spatial Region Filters)EH( )0 P(Note that, in addition extensions and image sections, Funtools bracket notation can be used to specify table and spatial region filters. These filters are always placed after the image section information. They can be specified in the same bracket or in a separate bracket immediately following: )UL()-1 LI( file[ext|ind|ARRAY\201\202|EVENTS\201\202,section][filters] )-1 LI( file[ext|ind|ARRAY\201\202|EVENTS\201\202,section,filters])LU( where: )UL()-1 LI( )BD(file)ES( is the Funtools file name )-1 LI( )BD(ARRAY\201\202)ES( is an array specification )-1 LI( )BD(EVENTS\201\202)ES( is an event list specification )-1 LI( )BD(ext)ES( is the FITS extension name )-1 LI( )BD(ind)ES( is the FITS extension number )-1 LI( )BD(section)ES( is the image section to extract )-1 LI( )BD(filters)ES( are spatial region and table \201row\202 filters to apply)LU( The topics of table and region filtering are covered in detail in: )UL()-1 LI()0 52 1 A(Table Filtering)52 0 TN TL()Ec /AF f D( )-1 LI()0 54 1 A(Spatial Region Filtering)54 0 TN TL()Ec /AF f D()LU( )0 2 62 H(Disk)WB 130 Sn()WB 51 Sn( Files and Other Supported File Types)EA()EH( )0 P(The specified )BD(file)ES( usually is an ordinary disk file. In addition, gzip'ed files are supported in Funtools: gzip'ed input files are automatically uncompressed as they are read, and gzip'ed output files are compressed as they are written. NB: if a FITS binary table is written in gzip format, the number of rows in the table will be set to -1. Such a file will work with Funtools programs but will not work with other FITS programs such as ds9. )0 P(The special keywords "stdin" and "stdout" designate Unix standard input and standard output, respectively. The string "-" \201hyphen\202 will be taken to mean "stdin" if the file is opened for reading and "stdout" if the file is opened for writing. )0 P(A file also can be an INET socket on the same or another machine using the syntax: ) 1 14 PR( machine:port)RP( Thus, for example: ) 1 14 PR( karapet:1428)RP( specifies that I/O should be performed to/from port 1428 on the machine karapet. If no machine name is specified, the default is to use the current machine: ) 1 7 PR( :1428)RP( This means to open port 1428 on the current machine. Socket support allows you to generate a distributed pipe: ) 2 48 PR( on karapet: funtask1 in.fits bynars:1428 on bynars: funtask2 :1428 out.fits)RP( The socket mechanism thus supports simple parallel processing using )BD(process decomposition)ES(. Note that parallel processing using )BD(data decomposition)ES( is supported via the )BD(section)ES( specifier \201see below\202, and the )BD(row#)ES( specifier, which is part of )0 52 1 A(Table Filtering)52 0 TN TL()Ec /AF f D(. )0 P(A file also can be a pointer to shared memory using the syntax: ) 1 22 PR( shm:[id|@key][:size])RP( A shared memory segment is specified with a )BD(shm:)ES( prefix, followed by either the shared memory id or the shared memory key \201where the latter is prefixed by the '@' character\202. The size \201in bytes\202 of the shared memory segment can then be appended \201preceded by the ':' character\202. If the size specification is absent, the code will attempt to determine the length automatically. If the open mode contains the string "w+", then the memory segment will be created if it does not exist. \201It also will be released and deleted when the file is closed.\202 In the case where a memory segment is being created, the length of the segment is required. )0 P(A file also can be Unix piped command \201i.e. a program to run\202 using the syntax: ) 1 31 PR( "pipe: command arg1 ... argn")RP( The output from the command must be a valid FITS file. It is important to use quotes to protect spaces so that command arguments are passed correctly. A silly example is: ) 1 60 PR( fundisp "pipe: funtable 'foo.fits[cir 512 512 .1]' stdout")RP( This seemed like a good idea at the time ... )0 2 63 H(Lists)WB 131 Sn()WB 51 Sn( of Files)EA()EH( )0 P(Funtools also will process a list of files as a single file using the syntax: ) 1 31 PR( "list: file1 file2 ... filen")RP( The files in the list are separated by whitespace. Any of the above file types can be used. For example, if two files, foo1.fits and foo2.fits, are part of the same observation, they can be processed as a single file \201using their own filters\202: ) 17 77 PR( fundisp "list: foo1.fits[cir\201512,512,10\202] foo2.fits[cir\201511,511,10\202]" X Y PHA PI TIME DX DY -------- -------- -------- -------- --------------------- -------- -------- 512 512 6 7 79493997.45854475 578 574 512 512 8 9 79494575.58943175 579 573 512 512 5 6 79493631.03866175 578 575 512 512 5 5 79493290.86521725 578 575 512 512 8 9 79493432.00990875 579 573 511 511 5 5 79488631.09462625 580 575 511 511 10 11 79488780.60006675 580 573 511 511 4 4 79494562.35474326 580 575 511 511 6 6 79488203.01561825 580 575 511 511 6 6 79488017.99730176 580 575 511 511 4 4 79494332.45355175 580 575 511 511 9 10 79492685.94014275 581 574 511 511 5 5 79487708.71298325 580 575 511 511 8 9 79493719.00160225 581 573)RP( Again, note that it is important to avoid spaces in the filters because the list separator also is whitespace. To protect whitespace in a filter, enclose the file specification in quotes: ) 1 72 PR( fundisp "list: 'foo1.fits[cir 512 512 .1]' foo2.fits[cir\201511,511,.1\202]")RP( )0 P()0 0 1 A(Go to Funtools Help Index)0 0 TN TL()Ec /AF f D( )0 5 64 H(Last)WB 132 Sn( updated: February 15, 2006)EH( )WB NL /Cb Db D /Ct [16#00 16#00 16#00] D /Cl [16#00 16#00 16#00] D /CL -1 D Ct Sc DS /Ba f D /BO 0 D Bs /UR (text.html) D /Ti (Column-based Text Files) D /Au () D /Df f D /ME [()] D 0 BO R ()1 Sl()WB 47 Sn( )0 2 65 H(Funtext:)WB 134 Sn()WB 133 Sn( Support for Column-based Text Files)EA()EH( )0 2 66 H(Summary)WB 135 Sn()EH( )0 P(This document contains a summary of the options for processing column-based text files. )0 2 67 H(Description)WB 136 Sn()EH( )0 P(Funtools will automatically sense and process "standard" column-based text files as if they were FITS binary tables without any change in Funtools syntax. In particular, you can filter text files using the same syntax as FITS binary tables: ) 3 54 PR( fundisp foo.txt'[cir 512 512 .1]' fundisp -T foo.txt > foo.rdb funtable foo.txt'[pha=1:10,cir 512 512 10]' foo.fits)RP( )0 P(The first example displays a filtered selection of a text file. The second example converts a text file to an RDB file. The third example converts a filtered selection of a text file to a FITS binary table. )0 P(Text files can also be used in Funtools image programs. In this case, you must provide binning parameters \201as with raw event files\202, using the bincols keyword specifier: ) 1 75 PR( bincols=\201[xname[:tlmin[:tlmax:[binsiz]]]],[yname[:tlmin[:tlmax[:binsiz]]])RP( For example: ) 1 64 PR( funcnts foo'[bincols=\201x:1024,y:1024\202]' "ann 512 512 0 10 n=10")RP( )0 2 68 H(Standard)WB 137 Sn( Text Files)EH( )0 P(Standard text files have the following characteristics: )UL()-1 LI( Optional comment lines start with # )-1 LI( Optional blank lines are considered comments )-1 LI( An optional table header consists of the following \201in order\202: )UL( )-1 LI( a single line of alpha-numeric column names )-1 LI( an optional line of unit strings containing the same number of cols )-1 LI( an optional line of dashes containing the same number of cols)LU( )-1 LI( Data lines follow the optional header and \201for the present\202 consist of the same number of columns as the header. )-1 LI( Standard delimiters such as space, tab, comma, semi-colon, and bar.)LU( )0 P(Examples: ) 26 46 PR( # rdb file foo1 foo2 foo3 foos ---- ---- ---- ---- 1 2.2 3 xxxx 10 20.2 30 yyyy # multiple consecutive whitespace and dashes foo1 foo2 foo3 foos --- ---- ---- ---- 1 2.2 3 xxxx 10 20.2 30 yyyy # comma delims and blank lines foo1,foo2,foo3,foos 1,2.2,3,xxxx 10,20.2,30,yyyy # bar delims with null values foo1|foo2|foo3|foos 1||3|xxxx 10|20.2||yyyy # header-less data 1 2.2 3 xxxx 10 20.2 30 yyyy)RP( )0 P(The default set of token delimiters consists of spaces, tabs, commas, semi-colons, and vertical bars. Several parsers are used simultaneously to analyze a line of text in different ways. One way of analyzing a line is to allow a combination of spaces, tabs, and commas to be squashed into a single delimiter \201no null values between consecutive delimiters\202. Another way is to allow tab, semi-colon, and vertical bar delimiters to support null values, i.e. two consecutive delimiters implies a null value \201e.g. RDB file\202. A successful parser is one which returns a consistent number of columns for all rows, with each column having a consistent data type. More than one parser can be successful. For now, it is assumed that successful parsers all return the same tokens for a given line. \201Theoretically, there are pathological cases, which will be taken care of as needed\202. Bad parsers are discarded on the fly. )0 P(If the header does not exist, then names "col1", "col2", etc. are assigned to the columns to allow filtering. Furthermore, data types for each column are determined by the data types found in the columns of the first data line, and can be one of the following: string, int, and double. Thus, all of the above examples return the following display: ) 4 58 PR( fundisp foo'[foo1>5]' FOO1 FOO2 FOO3 FOOS ---------- --------------------- ---------- ------------ 10 20.20000000 30 yyyy)RP( )0 2 69 H(Comments)WB 138 Sn( Convert to Header Params)EH( )0 P(Comments which precede data rows are converted into header parameters and will be written out as such using funimage or funhead. Two styles of comments are recognized: )0 P(1. FITS-style comments have an equal sign "=" between the keyword and value and an optional slash "/" to signify a comment. The strict FITS rules on column positions are not enforced. In addition, strings only need to be quoted if they contain whitespace. For example, the following are valid FITS-style comments: ) 5 55 PR( # fits0 = 100 # fits1 = /usr/local/bin # fits2 = "/usr/local/bin /opt/local/bin" # fits3c = /usr/local/bin /opt/local/bin /usr/bin # fits4c = "/usr/local/bin /opt/local/bin" / path dir)RP( Note that the fits3c comment is not quoted and therefore its value is the single token "/usr/local/bin" and the comment is "opt/local/bin /usr/bin". This is different from the quoted comment in fits4c. )0 P(2. Free-form comments can have an optional colon separator between the keyword and value. In the absence of quote, all tokens after the keyword are part of the value, i.e. no comment is allowed. If a string is quoted, then slash "/" after the string will signify a comment. For example: ) 9 54 PR( # com1 /usr/local/bin # com2 "/usr/local/bin /opt/local/bin" # com3 /usr/local/bin /opt/local/bin /usr/bin # com4c "/usr/local/bin /opt/local/bin" / path dir # com11: /usr/local/bin # com12: "/usr/local/bin /opt/local/bin" # com13: /usr/local/bin /opt/local/bin /usr/bin # com14c: "/usr/local/bin /opt/local/bin" / path dir)RP( )0 P(Note that com3 and com13 are not quoted, so the whole string is part of the value, while comz4c and com14c are quoted and have comments following the values. )0 P(Some text files have column name and data type information in the header. You can specify the format of column information contained in the header using the "hcolfmt=" specification. See below for a detailed description. )0 2 70 H(Multiple)WB 139 Sn( Tables in a Single File)EH( )0 P( Multiple tables are supported in a single file. If an RDB-style file is sensed, then a ^L \201vertical tab\202 will signify end of table. Otherwise, an end of table is sensed when a new header \201i.e., all alphanumeric columns\202 is found. \201Note that this heuristic does not work for single column tables where the column type is ASCII and the table that follows also has only one column.\202 You also can specify characters that signal an end of table condition using the )BD(eot=)ES( keyword. See below for details. )0 P(You can access the nth table \201starting from 1\202 in a multi-table file by enclosing the table number in brackets, as with a FITS extension: ) 1 18 PR( fundisp foo'[2]')RP( The above example will display the second table in the file. \201Index values start at 1 in oder to maintain logical compatibility with FITS files, where extension numbers also start at 1\202. )0 2 71 H(TEXT\201\202)WB 140 Sn( Specifier)EH( )0 P(As with ARRAY\201\202 and EVENTS\201\202 specifiers for raw image arrays and raw event lists respectively, you can use TEXT\201\202 on text files to pass key=value options to the parsers. An empty set of keywords is equivalent to not having TEXT\201\202 at all, that is: ) 2 23 PR( fundisp foo fundisp foo'[TEXT\201\202]')RP( are equivalent. A multi-table index number is placed before the TEXT\201\202 specifier as the first token, when indexing into a multi-table: fundisp foo'[2,TEXT\201...\202]' )0 P(The filter specification is placed after the TEXT\201\202 specifier, separated by a comma, or in an entirely separate bracket: ) 2 47 PR( fundisp foo'[TEXT\201...\202,circle 512 512 .1]' fundisp foo'[2,TEXT\201...\202][circle 512 512 .1]')RP( )0 2 72 H(Text\201\202)WB 141 Sn( Keyword Options)EH( )0 P( The following is a list of keywords that can be used within the TEXT\201\202 specifier \201the first three are the most important\202: )0 DL( )0 P()0 DT( delims="[delims]" )DD(Specify token delimiters for this file. Only a single parser having these delimiters will be used to process the file. ) 2 40 PR( fundisp foo.fits'[TEXT\201delims="!"\202]' fundisp foo.fits'[TEXT\201delims="\200t%"\202]')RP( )0 P()0 DT( comchars="[comchars]" )DD( Specify comment characters. You must include "\200n" to allow blank lines. These comment characters will be used for all standard parsers \201unless delims are also specified\202. ) 1 42 PR( fundisp foo.fits'[TEXT\201comchars="!\200n"\202]')RP( )0 P()0 DT( cols="[name1:type1 ...]" )DD( Specify names and data type of columns. This overrides header names and/or data types in the first data row or default names and data types for header-less tables. ) 1 70 PR( fundisp foo.fits'[TEXT\201cols="x:I,y:I,pha:I,pi:I,time:D,dx:E,dy:e"\202]')RP( )0 P(If the column specifier is the only keyword, then the cols= is not required \201in analogy with EVENTS\201\202\202: ) 1 63 PR( fundisp foo.fits'[TEXT\201x:I,y:I,pha:I,pi:I,time:D,dx:E,dy:e\202]')RP( Of course, an index is allowed in this case: ) 1 65 PR( fundisp foo.fits'[2,TEXT\201x:I,y:I,pha:I,pi:I,time:D,dx:E,dy:e\202]')RP( )0 P()0 DT( eot="[eot delim]" )DD( Specify end of table string specifier for multi-table files. RDB files support ^L. The end of table specifier is a string and the whole string must be found alone on a line to signify EOT. For example: ) 1 37 PR( fundisp foo.fits'[TEXT\201eot="END"\202]')RP( will end the table when a line contains "END" is found. Multiple lines are supported, so that: ) 1 43 PR( fundisp foo.fits'[TEXT\201eot="END\200nGAME"\202]')RP( will end the table when a line contains "END" followed by a line containing "GAME". )0 P(In the absence of an EOT delimiter, a new table will be sensed when a new header \201all alphanumeric columns\202 is found. )0 P()0 DT( null1="[datatype]" )DD( Specify data type of a single null value in row 1. Since column data types are determined by the first row, a null value in that row will result in an error and a request to specify names and data types using cols=. If you only have a one null in row 1, you don't need to specify all names and columns. Instead, use null1="type" to specify its data type. )0 P()0 DT( alen=[n] )DD(Specify size in bytes for ASCII type columns. FITS binary tables only support fixed length ASCII columns, so a size value must be specified. The default is 16 bytes. )0 P()0 DT( nullvalues=["true"|"false"] )DD(Specify whether to expect null values. Give the parsers a hint as to whether null values should be allowed. The default is to try to determine this from the data. )0 P()0 DT( whitespace=["true"|"false"] )DD( Specify whether surrounding white space should be kept as part of string tokens. By default surrounding white space is removed from tokens. )0 P()0 DT( header=["true"|"false"] )DD(Specify whether to require a header. This is needed by tables containing all string columns \201and with no row containing dashes\202, in order to be able to tell whether the first row is a header or part of the data. The default is false, meaning that the first row will be data. If a row dashes are present, the previous row is considered the column name row. )0 P()0 DT( units=["true"|"false"] )DD(Specify whether to require a units line. Give the parsers a hint as to whether a row specifying units should be allowed. The default is to try to determine this from the data. )0 P()0 DT( i2f=["true"|"false"] )DD(Specify whether to allow int to float conversions. If a column in row 1 contains an integer value, the data type for that column will be set to int. If a subsequent row contains a float in that same column, an error will be signaled. This flag specifies that, instead of an error, the float should be silently truncated to int. Usually, you will want an error to be signaled, so that you can specify the data type using cols= \201or by changing the value of the column in row 1\202. )0 P()0 DT( comeot=["true"|"false"|0|1|2] )DD(Specify whether comment signifies end of table. If comeot is 0 or false, then comments do not signify end of table and can be interspersed with data rows. If the value is true or 1 \201the default for standard parsers\202, then non-blank lines \201e.g. lines beginning with '#'\202 signify end of table but blanks are allowed between rows. If the value is 2, then all comments, including blank lines, signify end of table. )0 P()0 DT( lazyeot=["true"|"false"] )DD(Specify whether "lazy" end of table should be permitted \201default is true for standard formats, except rdb format where explicit ^L is required between tables\202. A lazy EOT can occur when a new table starts directly after an old one, with no special EOT delimiter. A check for this EOT condition is begun when a given row contains all string tokens. If, in addition, there is a mismatch between the number of tokens in the previous row and this row, or a mismatch between the number of string tokens in the prev row and this row, a new table is assumed to have been started. For example: ) 9 20 PR( ival1 sval3 ----- ----- 1 two 3 four jval1 jval2 tval3 ----- ----- ------ 10 20 thirty 40 50 sixty)RP( Here the line "jval1 ..." contains all string tokens. In addition, the number of tokens in this line \2013\202 differs from the number of tokens in the previous line \2012\202. Therefore a new table is assumed to have started. Similarly: ) 9 20 PR( ival1 ival2 sval3 ----- ----- ----- 1 2 three 4 5 six jval1 jval2 tval3 ----- ----- ------ 10 20 thirty 40 50 sixty)RP( Again, the line "jval1 ..." contains all string tokens. The number of string tokens in the previous row \2011\202 differs from the number of tokens in the current row\2013\202. We therefore assume a new table as been started. This lazy EOT test is not performed if lazyeot is explicitly set to false. )0 P()0 DT( hcolfmt=[header column format] )DD( Some text files have column name and data type information in the header. For example, VizieR catalogs have headers containing both column names and data types: ) 3 95 PR( #Column e_Kmag \201F6.3\202 ?\201k_msigcom\202 K total magnitude uncertainty \2014\202 [ucd=ERROR] #Column Rflg \201A3\202 \201rd_flg\202 Source of JHK default mag \2016\202 [ucd=REFER_CODE] #Column Xflg \201I1\202 [0,2] \201gal_contam\202 Extended source contamination \20110\202 [ucd=CODE_MISC])RP( while Sextractor files have headers containing column names alone: ) 4 79 PR( # 1 X_IMAGE Object position along x [pixel] # 2 Y_IMAGE Object position along y [pixel] # 3 ALPHA_J2000 Right ascension of barycenter \201J2000\202 [deg] # 4 DELTA_J2000 Declination of barycenter \201J2000\202 [deg])RP( The hcolfmt specification allows you to describe which header lines contain column name and data type information. It consists of a string defining the format of the column line, using "$col" \201or "$name"\202 to specify placement of the column name, "$fmt" to specify placement of the data format, and "$skip" to specify tokens to ignore. You also can specify tokens explicitly \201or, for those users familiar with how sscanf works, you can specify scanf skip specifiers using "%*"\202. For example, the VizieR hcolfmt above might be specified in several ways: ) 3 67 PR( Column $col \201$fmt\202 # explicit specification of "Column" string $skip $col \201$fmt\202 # skip one token %*s $col \201$fmt\202 # skip one string \201using scanf format\202)RP( while the Sextractor format might be specified using: ) 2 59 PR( $skip $col # skip one token %*d $col # skip one int \201using scanf format\202)RP( You must ensure that the hcolfmt statement only senses actual column definitions, with no false positives or negatives. For example, the first Sextractor specification, "$skip $col", will consider any header line containing two tokens to be a column name specifier, while the second one, "%*d $col", requires an integer to be the first token. In general, it is preferable to specify formats as explicitly as possible. )0 P(Note that the VizieR-style header info is sensed automatically by the funtools standard VizieR-like parser, using the hcolfmt "Column $col \201$fmt\202". There is no need for explicit use of hcolfmt in this case. )0 P()0 DT( debug=["true"|"false"] )DD(Display debugging information during parsing. )LD( )0 2 73 H(Environment)WB 142 Sn( Variables)EH( )0 P( Environment variables are defined to allow many of these TEXT\201\202 values to be set without having to include them in TEXT\201\202 every time a file is processed: ) 10 36 PR( keyword environment variable ------- -------------------- delims TEXT_DELIMS comchars TEXT_COMCHARS cols TEXT_COLUMNS eot TEXT_EOT null1 TEXT_NULL1 alen TEXT_ALEN bincols TEXT_BINCOLS hcolfmt TEXT_HCOLFMT)RP( )0 2 74 H(Restrictions)WB 143 Sn( and Problems)EH( )0 P( As with raw event files, the '+' \201copy extensions\202 specifier is not supported for programs such as funtable. )0 P(String to int and int to string data conversions are allowed by the text parsers. This is done more by force of circumstance than by conviction: these transitions often happens with VizieR catalogs, which we want to support fully. One consequence of allowing these transitions is that the text parsers can get confused by columns which contain a valid integer in the first row and then switch to a string. Consider the following table: ) 4 20 PR( xxx yyy zzz ---- ---- ---- 111 aaa bbb ccc 222 ddd)RP( The xxx column has an integer value in row one a string in row two, while the yyy column has the reverse. The parser will erroneously treat the first column as having data type int: ) 5 38 PR( fundisp foo.tab XXX YYY ZZZ ---------- ------------ ------------ 111 'aaa' 'bbb' 1667457792 '222' 'ddd')RP( while the second column is processed correctly. This situation can be avoided in any number of ways, all of which force the data type of the first column to be a string. For example, you can edit the file and explicitly quote the first row of the column: ) 10 40 PR( xxx yyy zzz ---- ---- ---- "111" aaa bbb ccc 222 ddd [sh] fundisp foo.tab XXX YYY ZZZ ------------ ------------ ------------ '111' 'aaa' 'bbb' 'ccc' '222' 'ddd')RP( You can edit the file and explicitly set the data type of the first column: ) 10 40 PR( xxx:3A yyy zzz ------ ---- ---- 111 aaa bbb ccc 222 ddd [sh] fundisp foo.tab XXX YYY ZZZ ------------ ------------ ------------ '111' 'aaa' 'bbb' 'ccc' '222' 'ddd')RP( You also can explicitly set the column names and data types of all columns, without editing the file: ) 5 52 PR( [sh] fundisp foo.tab'[TEXT\201xxx:3A,yyy:3A,zzz:3a\202]' XXX YYY ZZZ ------------ ------------ ------------ '111' 'aaa' 'bbb' 'ccc' '222' 'ddd')RP( The issue of data type transitions \201which to allow and which to disallow\202 is still under discussion. )0 P()0 0 1 A(Go to Funtools Help Index)0 0 TN TL()Ec /AF f D( )0 5 75 H(Last)WB 144 Sn( updated: August 3, 2007)EH( )WB NL /Cb Db D /Ct [16#00 16#00 16#00] D /Cl [16#00 16#00 16#00] D /CL -1 D Ct Sc DS /Ba f D /BO 0 D Bs /UR (view.html) D /Ti (Database View Support for Tables) D /Au () D /Df f D /ME [()] D 0 BO R ()1 Sl()WB 48 Sn( )0 2 76 H(Funview:)WB 146 Sn()WB 145 Sn( Database View Support for Tables)EA()EH( )0 2 77 H(Summary)WB 147 Sn()EH( )0 P(This document contains a summary of the options for utilizing database-inspired Views of tables. )0 2 78 H(Description)WB 148 Sn()EH( )0 2 79 H(Database)WB 149 Sn( Views)EH( )0 P(In database parlance, a )BD(View)ES( defines a "virtual table", i.e., a description of row and/or column selection filters \201but with no permanent storage space allocated\202. When used in place of a table, a View selects the specified rows and/or columns from one or more real tables. Views enable you to see complicated data tables in a more convenient format. They also can be used as a security mechanism, by restricting user access to specific columns and/or rows. [See: ) 1 72 PR(http://www.cs.unibo.it/~ciaccia/COURSES/RESOURCES/SQLTutorial/sqlch5.htm)RP( for a good discussion of SQL Views.] )0 P(Funtools supports an expanded notion of Views for all tabular data \201FITS tables, raw binary tables, and ASCII column files\202. Funtools Views allow you to pre-set values for the filter specification, the columns to activate, and display format \201though the latter is for fundisp only\202. Setting the filter and column activation values provides functionality equivalent to that of a classical database View, while the ability to set the format is similar to classical report writing capabilities. )0 2 80 H(Funtools)WB 150 Sn( View Attributes)EH( )0 P(A Funtools View is a text file containing one or more of the following columns: ) 7 46 PR( column description ------ ----------------------------- view name of view file data file name or template filter filter specification columns columns to activate format fundisp format specification)RP( All of the attribute columns are optional, including the )BD(view)ES( name itself. This means that a View can be named or unnamed. Unnamed Views can refer to a specific file or a template of files \201obviously if neither the view or the file column is specified, the input View specification will never be used\202. You can specify any combination of filter, column, and format parameters. \201It also is possible to apply file-specific View to other files; see the discussion on )BD(View Lists)ES( below\202. Each column has a size limit of 1024 characters. )0 P(For example, consider the following View file: ) 13 70 PR( view file format columns filter ---- ---------------------- ------ ------------ ------- x3 ${HOME}/data/snr.ev I=%4d x y pi pha cir 512 512 .1 x2 ${HOME}/data/snr.ev x y pi pha cir 512 512 .1 x1 ${HOME}/data/snr.ev cir 512 512 .1 x1a ${HOME}/data/snr.ev x y pi pha x0 ${HOME}/data/snr.ev xf I=%4d xc x y pi pha xr cir 512 512 .1 *.ev x y pi pha *.fit x y dx dy cir 400 400 3 *.fits I=%3d x y dx dy cir 400 400 3)RP( This database example is in rdb format, i.e. using tab delimiters and permitting null values. Any valid ASCII table format is acceptable, but if you use a format that does not permit null values, it will be necessary to quote the null strings. )0 P(The first five entries \201x3, x2, x1, x1a, x0\202 are named entries defining default values specifically for the snr.ev data file. Typically, you would use these Views by specifying View name, and the corresponding file, filter, column, and format values would be used. Note that the x0 View is essentially an alias for the pathname of this file. )0 P(The next three entries define defaults that can be applied to any file. You typically would use these View names in conjunction with a specific file name \201see )BD(View Lists)ES( below\202 so that the associated parameter\201s\202 were applied to that file. )0 P(The last three entry in the database define unnamed Views that pertains to all files ending with the specified templates. In these cases, any View that specifies a file name matching the file template would be processed with the associated parameter attributes. )0 2 81 H(Invoking)WB 151 Sn( a Funtools View \201in Place of an Input File\202)EH( )0 P(To use a Funtools View, you simply pre-pend the "v:" prefix to a View name or a file name where an input file name usually is specified. For example: ) 1 14 PR( fundisp v:x3)RP( specifies that the View named x3 \201with its file name and associated parameters\202 is processed as the input file to fundisp. Using the example database, above, this is equivalent to: ) 1 73 PR( fundisp -f "I=%4d" ${HOME}/data/snr.ev'[cir 512 512 .1]' "x y pi pha")RP( That is, the format is used with fundisp's -f \201format\202 switch, while the filename and extension are composed of the x3 View's filename and region filter. )0 P(Similarly, executing a command such as: ) 1 19 PR( fundisp v:foo.fit)RP( will match the unnamed View associated with the template "*.fit". This is equivalent to executing: ) 1 46 PR( fundisp foo.fit'[cir 400 400 3]' "x y dx dy")RP( Of course, if you omit the "v:" prefix, then no View processing takes place: ) 2 66 PR( fundisp foo.fit # process foo.fit without any View parameters fundisp x3 # error \201assuming there is no file named x3\202)RP( )0 2 82 H(Basic)WB 152 Sn( View Matching Rules)EH( )0 P(When a "v:" prefix is recognized, Funtools searches for a View database file in the following order: ) 5 59 PR( location description ------------ ------------------------------------ FUN_VIEWFILE environment variable \201any file name\202 ./.funtools.vu hidden file, default name $HOME/.funtools.vu hidden file, default name)RP( The first View database file located is used to construct a new filename, as well as an activation column specification and a format specification. The following rules are used: )0 P(1. An attempt is made to match the input name \201i.e., the part of the input View after the "v:" prefix\202 against the )BD(view)ES( column value \201if present\202 of each row in the database. If a match is found, the values of all non-blank columns are saved for later use. Also note that the first match terminates the search: i.e., )BD(the order of the database rows matters)ES(. )0 P(2. If no )BD(view)ES( match is made, an attempt is made to match the input name against the )BD(file)ES( column value \201if present\202. Matching is performed on the full pathname of both the input name and the database file name, and on the non-directory \201root\202 part of these files. This means that the root specification: ) 1 18 PR( fundisp v:snr.ev)RP( will match a row in the database that has a full pathname in the file, allowing you to use a )BD(file)ES(-matched View without having to specify the full pathname. In this example, the "v:snr.ev" View specification will match the first row \201v:x3\202 in the database: ) 1 67 PR( x3 ${HOME}/data/snr.ev I=%4d x y pi pha cir 512 512 .1)RP( even though the row contains a fully qualified pathname as the file value. Once again, values of all non-blank columns are saved, and the first match terminates the search. )0 P(3. If neither a )BD(view)ES( or a )BD(view)ES( match has been found, then a simple template match is attempted against the )BD(view)ES( values. Template matching supports a simplified version of file globbing \201not a regular expression\202, with support for a single "*" \201all characters\202, "?" \201single character\202, or "[...]" \201range\202 specification. )0 P(4. If no template match was found on the )BD(view)ES( column, then a simple template match is attempted against the )BD(file)ES( columns. )0 P(5. If no match is found, then the filename \201minus the "v:" prefix\202 is returned. )0 2 83 H(More)WB 153 Sn( on View Matching Rules: Single vs. Multiple Matches )EH( The matching rules described above stop after the first match, regardless of whether that match provides values for all three parameters \201filter, columns, and format\202. In cases where a )BD(view)ES( or )BD(file)ES( match does not provide all three values, it is possible that a template match might do so. With regard to the example View database above, the x1 View provides only a filter, while omitting both the format and columns values. But note that the final rows in the database could provide the values via a template match on the filename. This sort of multiple matching is especially valuable in order to provide "global" values to several Views. )0 P(Obviously, multiple matching might not be wanted in every case. Therefore, we support both multiple matching and single matching according to the value of the FUN_VIEWMATCH environment variable. If the FUN_VIEWMATCH environment variable exists and if its value begins with "s", then a single match is used and missing parameters are not filled in with subsequent template matches on the file name. That is, matching rules above are followed exactly as explained above. If the value of this environment variable begins with "m" \201or does not exist\202, then multiple matches are used to try to fill in missing parameters. In this case, template matching always takes place and missing values are taken from these template matches. )0 P(Thus, in the example above, the View specification: ) 1 14 PR( fundisp v:x1)RP( will take the file name and filter value from the x1 View: ) 1 70 PR( x1 ${HOME}/data/snr.ev cir 512 512 .1)RP( The column value then will be taken from the "*.ev" file template match against the x1 file name: ) 1 52 PR( *.ev x y pi pha)RP( Note once again that order is important: missing values are taken in the order in which the template matches are processed. )0 2 84 H(View)WB 154 Sn( Lists: Applying a View to Any File)EH( )0 P(It is possible to apply a named View, or even several Views, to any data file by appending a )BD(viewlist)ES( immediately after the standard "v:" prefix. A viewlist takes the form: ) 1 15 PR( :v1,v2,...vn:)RP( where v1, v2, etc. are named Views. The two ":" colon characters surrounding the list are required. Thus, the syntax for applying a viewlist to a file is: ) 1 34 PR( v::view1,view2,...viewn:filename)RP( Note that the name after the last ":" is assumed to be a file; it is not permissible \201or sensible\202 to use a View name. )0 P(For example, the View specification: ) 1 19 PR( fundisp v::x2:foo)RP( applies the x2 View to the file foo \201even if there is a View named foo\202 and \201in using our example database\202 is equivalent to: ) 1 45 PR( ./fundisp foo'[cir 512 512 .1] "x y pi pha")RP( The same command can be effected using a list of Views: ) 1 23 PR( fundisp v::x1,x1a:foo)RP( )0 P(What happens if a viewlist is used and the file also matches a template? Consider, for example, this View specification: ) 1 23 PR( fundisp v::x2:foo.fit)RP( Here, the x2 View will supply filter and column values, while the template *.fit can also supply \201different\202 filter and column values. In this case, the explicitly specified Views of the viewlist trump the matched view values. )0 P(On the other hand, if a file template match can supply a View value that is not supplied by the viewlist, then that value will be taken from the file template match. For example: ) 1 24 PR( fundisp v::x2:foo.fits)RP( does not explicitly supply a format value, but the file match on *.fits can and does. You can avoid supplying missing values using file template matching by replacing the first ":" with a "-" in a viewlist specification: ) 1 24 PR( fundisp v:-x2:foo.fits)RP( The use of ":+" to explicitly allow file template matching is also supported, but is the same as the default case. Note that the nuances of viewlist support are subject to change as our experience and understanding grow. )0 2 85 H(Overriding)WB 155 Sn( Values Associated with a View)EH( )0 P(To override values associated with a View, simply supply the override values in the correct place on the command line. Thus, given the example database described above, the command: ) 1 14 PR( fundisp v:x3)RP( specifies that the View named x3, along with its file name and associated parameters, be processed as the input file to fundisp in this way: ) 1 73 PR( fundisp -f "I=%4d" ${HOME}/data/snr.ev'[cir 512 512 .1]' "x y pi pha")RP( To override one or more of these values, simply specify a new value for the format, filter, or columns. For example, if your input View file contains a filter, then the View will use that filter as an override of the View filter: ) 1 31 PR( fundisp v:x3'[cir 400 400 3]')RP( will use the columns and format of the x3 View but not the x3 filter. Further examples are: ) 2 67 PR( fundisp v:x3 "x y dx dy" # activate a different set of columns fundisp -f "I=%3d" v:x3 # use a different format statement)RP( )0 P(Note that extension names, extension index values, and other non-filter specifications )BD(do not)ES( override the View filter. Thus: ) 1 22 PR( fundisp v:foo.fit[3])RP( will still use the filter associated with the .fit template \201see above\202, since the "3" is an extension index, not a filter. )0 2 86 H(Environment)WB 156 Sn( Variables)EH( The following environment variables are used by Funtools Views: )0 DL()0 DT()BD(FUN_VIEWNAME)ES( )DD( The )BD(FUN_VIEWNAME)ES( environment variable specifies the name and location of the View database file. If not present, the files ./.funtools.vu and $HOME/.funtools.vu are searched for, in that order. )0 DT()BD(FUN_VIEWMATCH)ES( )DD( The )BD(FUN_VIEWMATCH)ES( environment variable specifies whether a single match or multiple match algorithm is used to locate parameter values. If the value of this environment variable begins with "s", then a single match is used and missing parameters are not filled in with subsequent template matches on the file name. If the value begins with "m", then multiple matches are used to try to fill in missing parameters. The default is to use multiple matches.)LD( )0 2 87 H(Restrictions)WB 157 Sn( and Problems)EH( Support for overriding a filter \201while not overriding extension names, extension indexes, etc.\202 requires that we can sense the presence of a filter in a bracket specification. It is unclear yet whether our algorithm is perfect. )0 P()0 0 1 A(Go to Funtools Help Index)0 0 TN TL()Ec /AF f D( )0 5 88 H(Last)WB 158 Sn( updated: August 3, 2007)EH( )WB NL /Cb Db D /Ct [16#00 16#00 16#00] D /Cl [16#00 16#00 16#00] D /CL -1 D Ct Sc DS /Ba f D /BO 0 D Bs /UR (filters.html) D /Ti (Table Filtering) D /Au () D /Df f D /ME [()] D 0 BO R ()1 Sl()WB 52 Sn( )0 2 89 H(Funfilters:)WB 165 Sn()WB 159 Sn( Filtering Rows in a Table)EA()EH( )0 2 90 H(Summary)WB 166 Sn()EH( )0 P(This document contains a summary of the user interface for filtering rows in binary tables. )0 2 91 H(Description)WB 167 Sn()EH( )0 P(Table filtering allows a program to select rows from an table \201e.g., X-ray event list\202 by checking each row against one or more expressions involving the columns in the table. When a table is filtered, only valid rows satisfying these expressions are passed through for processing. )0 P(A filter expression is specified using bracket notation appended to the filename of the data being processed: ) 1 23 PR( foo.fits[pha==1&)SY(\160)ES(==2])RP( It is also possible to put region specification inside a file and then pass the filename in bracket notation: ) 1 19 PR( foo.fits[@my.reg])RP( Filters must be placed after the extension and image section information, when such information is present. The correct order is: )UL()-1 LI( file[fileinfo,sectioninfo][filters] )-1 LI( file[fileinfo,sectioninfo,filters])LU( where: )UL()-1 LI( )BD(file)ES( is the Funtools file name )-1 LI( )BD(fileinfo)ES( is an ARRAY, EVENT, FITS extension, or FITS index )-1 LI( )BD(sectioninfo)ES( is the image section to extract )-1 LI( )BD(filters)ES( are spatial region and table \201row\202 filters to apply)LU( See )0 42 1 A(Funtools Files)42 0 TN TL()Ec /AF f D( for more information on file and image section specifications. )0 2 92 H(Filter)WB 168 Sn( Expressions)EH( )0 P(Table filtering can be performed on columns of data in a FITS binary table or a raw event file. Table filtering is accomplished by means of )BD(table filter specifications)ES(. An table filter specification consists of one or more )BD(filter expressions)ES( Filter specifications also can contain comments and local/global processing directives. )0 P(More specifically, a filter specification consist of one or more lines containing: ) 13 75 PR( # comment until end of line # include the following file in the table descriptor @file # each row expression can contain filters separated by operators [filter_expression] BOOLOP [filter_expression2], ... # each row expression can contain filters separated by the comma operator [filter_expression1], [filter_expression2], ... # the special row# keyword allows a range of rows to be processed row#=m:n # or a single row row#=m # regions are supported -- but are described elsewhere [spatial_region_expression])RP( )0 P(A single filter expression consists of an arithmetic, logical, or other operations involving one or more column values from a table. Columns can be compared to other columns, to header values, or to numeric constants. Standard math functions can be applied to columns. Separate filter expressions can be combined using boolean operators. Standard C semantics can be used when constructing expressions, with the usual precedence and associativity rules holding sway: ) 15 55 PR( Operator Associativity -------- ------------- \201\202 left to right !! \201logical not\202 right to left ! \201bitwise not\202 - \201unary minus\202 right to left * / left to right + - left to right < <= > >= left to right == != left to right & \201bitwise and\202 left to right ^ \201bitwise exclusive or\202 left to right | \201bitwise inclusive or\202 left to right && \201logical and\202 left to right || \201logical or\202 left to right = right to left)RP( For example, if energy and pha are columns in a table, then the following are valid expressions: ) 4 24 PR( pha>1 energy == pha \201pha>1\202 && \201energy<=2\202 max\201pha,energy\202>=2.5)RP( )0 P(Comparison values can be integers or floats. Integer comparison values can be specified in decimal, octal \201using '0' as prefix\202, hex \201using '0x' as prefix\202 or binary \201using '0b' as prefix\202. Thus, the following all specify the same comparison test of a status mask: ) 4 40 PR( \201status & 15\202 == 8 # decimal \201status & 017\202 == 010 # octal \201status & 0xf\202 == 0x8 # hex \201status & 0b1111\202 == 0b1000 # binary)RP( )0 P(The special keyword row# allows you to process a range of rows. When row# is specified, the filter code skips to the designated row and only processes the specified number of rows. The "*" character can be utilized as the high limit value to denote processing of the remaining rows. Thus: ) 1 14 PR( row#=100:109)RP( processes 10 rows, starting with row 100 \201counting from 1\202, while: ) 1 12 PR( row#=100:*)RP( specifies that all but the first 99 rows are to be processed. )0 P(Spatial region filtering allows a program to select regions of an image or rows of a table \201e.g., X-ray events\202 using simple geometric shapes and boolean combinations of shapes. For a complete description of regions, see )0 54 1 A(Spatial Region Filtering)54 0 TN TL()Ec /AF f D(. )0 2 93 H(Separators)WB 169 Sn()WB 160 Sn( Also Are Operators)EA()EH( )0 P(As mentioned previously, multiple filter expressions can be specified in a filter descriptor, separated by commas or new-lines. When such a comma or new-line separator is used, the boolean AND operator is automatically generated in its place. Thus and expression such as: ) 1 15 PR( pha==1,pi=2:4)RP( is equivalent to: ) 1 26 PR( \201pha==1\202 && \201pi>=2&)SY(\160)ES(<=4\202)RP( )0 P([Note that the behavior of separators is different for filter expressions and spatial region expressions. The former uses AND as the operator, while the latter user OR. See )0 60 1 A(Combining Region and Table Filters)60 0 TN TL()Ec /AF f D( for more information about these conventions and how they are treated when combined.] )0 2 94 H(Range)WB 170 Sn()WB 161 Sn( Lists)EA()EH()0 P( )0 P(Aside from the standard C syntax, filter expressions can make use of IRAF-style )BD(range lists)ES( which specify a range of values. The syntax requires that the column name be followed by an '=' sign, which is followed by one or more comma-delimited range expressions of the form: ) 4 52 PR( col = vv # col == vv in range col = :vv # col <= vv in range col = vv: # col >= vv in range col = vv1:vv2 # vv1 <= col <= vv2 in range)RP( The vv's above must be numeric constants; the right hand side of a range list cannot contain a column name or header value. )0 P(Note that, unlike an ordinary comma separator, the comma separator used between two or more range expressions denotes OR. Thus, when two or more range expressions are combined with a comma separator, the resulting expression is a shortcut for more complicated boolean logic. For example: ) 1 18 PR( col = :3,6:8,10:)RP( is equivalent to: ) 1 47 PR( \201col<=3\202 || \201col>=6 && col <=8\202 || \201col >=10\202)RP( Note also that the single-valued rangelist: ) 1 11 PR( col = val)RP( is equivalent to the C-based filter expression: ) 1 12 PR( col == val)RP( assuming, of course, that val is a numeric constant. )0 2 95 H(Math)WB 171 Sn()WB 162 Sn( Operations and Functions)EA()EH()0 P( )0 P(It is permissible to specify C math functions as part of the filter syntax. When the filter parser recognizes a function call, it automatically includes the math.h and links in the C math library. Thus, it is possible to filter rows by expressions such as these: )UL()-1 LI(\201pi+pha\202>\2012+log\201pi\202-pha\202 )-1 LI( min\201pi,pha\202*14>x )-1 LI( max\201pi,pha\202==\201pi+1\202 )-1 LI( feq\201pi,pha\202 )-1 LI( div\201pi,pha\202>0)LU( The function feq\201a,b\202 returns true \2011\202 if the difference between a and b \201taken as double precision values\202 is less than approximately 10E-15. The function div\201a,b\202 divides a by b, but returns NaN \201not a number\202 if b is 0. It is a safe way to avoid floating point errors when dividing one column by another. )0 2 96 H(Include)WB 172 Sn()WB 163 Sn( Files)EA()EH()0 P( )0 P(The special )BD(@filename)ES( directive specifies an include file containing filter expressions. This file is processed as part of the overall filter descriptor: ) 1 23 PR( foo.fits[pha==1,@foo])RP( )0 2 97 H(Header)WB 173 Sn()WB 164 Sn( Parameters)EA()EH()0 P( )0 P(The filter syntax supports comparison between a column value and a header parameter value of a FITS binary tables \201raw event files have no such header\202. The header parameters can be taken from the binary table header or the primary header. For example, assuming there is a header value MEAN_PHA in one of these headers, you can select photons having exactly this value using: )UL()-1 LI( pha==MEAN_PHA)LU( )0 2 98 H(Examples)WB 174 Sn()EH( )0 P(Table filtering is more easily described by means of examples. Consider data containing the following table structure: )UL()-1 LI( double TIME )-1 LI( int X )-1 LI( int Y )-1 LI( short PI )-1 LI( short PHA )-1 LI( int DX )-1 LI( int DY)LU( )0 P(Tables can be filtered on these columns using IRAF/QPOE range syntax or any valid C syntax. The following examples illustrate the possibilities: )0 DL( )0 P()0 DT( pha=10 )0 DT( pha==10 )DD( select rows whose pha value is exactly 10 )0 P()0 DT( pha=10:50 )DD( select rows whose pha value is in the range of 10 to 50 )0 P()0 DT( pha=10:50,100 )DD( select rows whose pha value is in the range of 10 to 50 or is equal to 100 )0 P()0 DT( pha>=10 && pha<=50 )DD( select rows whose pha value is in the range of 10 to 50 )0 P()0 DT( pi=1,2&&pha>3 )DD( select rows whose pha value is 1 or 2 and whose pi value is 3 )0 P()0 DT( pi=1,2 || pha>3 )DD( select rows whose pha value is 1 or 2 or whose pi value is 3 )0 P()0 DT( pha==pi+1 )DD( select rows whose pha value is 1 less than the pi value )0 P()0 DT( \201pha==pi+1\202 && \201time>50000.0\202 )DD( select rows whose pha value is 1 less than the pi value and whose time value is greater than 50000 )0 P()0 DT(\201pi+pha\202>20 )DD( select rows in which the sum of the pi and pha values is greater than 20 )0 P()0 DT( pi%2==1 )DD( select rows in which the pi value is odd)LD( )0 P(Currently, integer range list limits cannot be specified in binary notation \201use decimal, hex, or octal instead\202. Please contact us if this is a problem. )0 P()0 0 1 A(Go to Funtools Help Index)0 0 TN TL()Ec /AF f D( )0 5 99 H(Last)WB 175 Sn( updated: November 17, 2005)EH( )WB NL /Cb Db D /Ct [16#00 16#00 16#00] D /Cl [16#00 16#00 16#00] D /CL -1 D Ct Sc DS /Ba f D /BO 0 D Bs /UR (idx.html) D /Ti (Table Filtering with Indexes) D /Au () D /Df f D /ME [()] D 0 BO R ()1 Sl()WB 53 Sn( )0 2 100 H(Funidx:)WB 177 Sn()WB 176 Sn( Using Indexes to Filter Rows in a Table)EA()EH( )0 2 101 H(Summary)WB 178 Sn()EH( )0 P(This document contains a summary of the user interface for filtering rows in binary tables with indexes. )0 2 102 H(Description)WB 179 Sn()EH( )0 P(Funtools )0 52 1 A(Table Filtering)52 0 TN TL()Ec /AF f D( allows rows in a table to be selected based on the values of one or more columns in the row. Because the actual filter code is compiled on the fly, it is very efficient. However, for very large files \201hundreds of Mb or larger\202, evaluating the filter expression on each row can take a long time. Therefore, funtools supports index files for columns, which are used automatically during filtering to reduce dramatically the number of row evaluations performed. The speed increase for indexed filtering can be an order of magnitude or more, depending on the size of the file. )0 P(The )0 11 1 A(funindex)11 0 TN TL()Ec /AF f D( program creates an index on one or more columns in a binary table. For example, to create an index for the column pi in the file huge.fits, use: ) 1 23 PR( funindex huge.fits pi)RP( This will create an index named huge_pi.idx. )0 P(When a filter expression is initialized for row evaluation, funtools looks for an index file for each column in the filter expression. If found, and if the file modification date of the index file is later than that of the data file, then the index will be used to reduce the number of rows that are evaluated in the filter. When )0 54 1 A(Spatial Region Filtering)54 0 TN TL()Ec /AF f D( is part of the expression, the columns associated with the region are checked for index files. )0 P(If an index file is not available for a given column, then in general, all rows must be checked when that column is part of a filter expression. This is not true, however, when a non-indexed column is part of an AND expression. In this case, only the rows that pass the other part of the AND expression need to be checked. Thus, in some cases, filtering speed can increase significantly even if all columns are not indexed. )0 P(Also note that certain types of filter expression syntax cannot make use of indices. For example, calling functions with column names as arguments implies that all rows must be checked against the function value. Once again, however, if this function is part of an AND expression, then a significant improvement in speed still is possible if the other part of the AND expression is indexed. )0 P(For example, note below the dramatic speedup in searching a 1 Gb file using an AND filter, even when one of the columns \201pha\202 has no index: ) 49 69 PR( time fundisp \200 huge.fits'[idx_activate=0,idx_debug=1,pha=2348&&cir 4000 4000 1]' \200 "x y pha" x y pha ---------- ----------- ---------- 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 42.36u 13.07s 6:42.89 13.7% time fundisp \200 huge.fits'[idx_activate=1,idx_debug=1,pha=2348&&cir 4000 4000 1]' \200 "x y pha" x y pha ---------- ----------- ---------- idxeq: [INDEF] idxand sort: x[ROW 8037025:8070128] y[ROW 5757665:5792352] idxand\2011\202: INDEF [IDX_OR_SORT] )WR( idxall\2011\202: [IDX_OR_SORT] 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 1.55u 0.37s 1:19.80 2.4%)RP( When all columns are indexed, the increase in speed can be even more dramatic: ) 50 67 PR( time fundisp \200 huge.fits'[idx_activate=0,idx_debug=1,pi=770&&cir 4000 4000 1]' \200 "x y pi" x y pi ---------- ----------- ---------- 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 42.60u 12.63s 7:28.63 12.3% time fundisp \200 huge.fits'[idx_activate=1,idx_debug=1,pi=770&&cir 4000 4000 1]' \200 "x y pi" x y pi ---------- ----------- ---------- idxeq: pi start=9473025,stop=9492240 => pi[ROW 9473025:9492240] idxand sort: x[ROW 8037025:8070128] y[ROW 5757665:5792352] idxor sort/merge: pi[ROW 9473025:9492240] [IDX_OR_SORT] )WR( idxmerge\2015\202: [IDX_OR_SORT] pi[ROW] idxall\2011\202: [IDX_OR_SORT] 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 1.67u 0.30s 0:24.76 7.9%)RP( )0 P(The miracle of indexed filtering \201and indeed, of any indexing\202 is the speed of the binary search on the index, which is of order log2\201n\202 instead of n. \201The funtools binary search method is taken from http://www.tbray.org/ongoing/When/200x/2003/03/22/Binary, to whom grateful acknowledgement is made.\202 This means that the larger the file, the better the performance. Conversely, it also means that for small files, using an index \201and the overhead involved\202 can slow filtering down somewhat. Our tests indicate that on a file containing a few tens of thousands of rows, indexed filtering can be 10 to 20 percent slower than non-indexed filtering. Of course, your mileage will vary with conditions \201disk access speed, amount of available memory, process load, etc.\202 )0 P(Any problem encountered during index processing will result in indexing being turned off, and replaced by filtering all rows. You can turn filtering off manually by setting the idx_activate variable to 0 \201in a filter expression\202 or the FILTER_IDX_ACTIVATE environment variable to 0 \201in the global environment\202. Debugging output showing how the indexes are being processed can be displayed to stderr by setting the idx_debug variable to 1 \201in a filter expression\202 or the FILTER_IDX_DEBUG environment variable to 1 \201in the global environment\202. )0 P(Currently, indexed filtering only works with FITS binary tables and raw event files. It does not work with text files. This restriction might be removed in a future release. )0 P()0 0 1 A(Go to Funtools Help Index)0 0 TN TL()Ec /AF f D( )0 5 103 H(Last)WB 180 Sn( updated: August 3, 2007)EH( )WB NL /Cb Db D /Ct [16#00 16#00 16#00] D /Cl [16#00 16#00 16#00] D /CL -1 D Ct Sc DS /Ba f D /BO 0 D Bs /UR (regions.html) D /Ti (Spatial Region Filtering) D /Au () D /Df f D /ME [()] D 0 BO R ()1 Sl()WB 54 Sn( )0 2 104 H(Regions:)WB 182 Sn()WB 181 Sn( Spatial Region Filtering)EA()EH( )0 2 105 H(Summary)WB 183 Sn()EH( )0 P(This document contains a summary of the user interface for spatial region filtering images and tables. )0 2 106 H(Description)WB 184 Sn()EH( )0 P(Spatial region filtering allows a program to select regions of an image or rows of a table \201e.g., X-ray events\202 to process using simple geometric shapes and boolean combinations of shapes. When an image is filtered, only pixels found within these shapes are processed. When a table is filtered, only rows found within these shapes are processed. )0 P(Spatial region filtering for images and tables is accomplished by means of )BD(region specifications)ES(. A region specification consists of one or more )BD(region expressions)ES(, which are geometric shapes,combined according to the rules of boolean algebra. Region specifications also can contain comments and local/global processing directives. )0 P(Typically, region specifications are specified using bracket notation appended to the filename of the data being processed: ) 1 31 PR( foo.fits[circle\201512,512,100\202])RP( It is also possible to put region specification inside a file and then pass the filename in bracket notation: ) 1 19 PR( foo.fits[@my.reg])RP( )0 P(When region filters are passed in bracket notation in this manner, the filtering is set up automatically when the file is opened and all processing occurs through the filter. Programs also can use the filter library API to open filters explicitly. )0 2 107 H(Region)WB 185 Sn( Expressions)EH( More specifically, region specifications consist of one or more lines containing: ) 9 68 PR( # comment until end of line global keyword=value keyword=value ... # set global value\201s\202 # include the following file in the region descriptor @file # use the FITS image as a mask \201cannot be used with other regions\202 @fitsimage # each region expression contains shapes separated by operators [region_expression1], [region_expression2], ... [region_expression], [region_expression], ...)RP( )0 P(A single region expression consists of: ) 8 72 PR( # parens and commas are optional, as is the + sign [+-]shape\201num , num , ...\202 OP1 shape num num num OP2 shape ... e.g.: \201[+-]shape\201num , num , ...\202 && shape num num || shape\201num, num\202 # a comment can come after a region -- reserved for local properties [+-]shape\201num , num , ...\202 # local properties go here, e.g. color=red)RP( )0 P(Thus, a region descriptor consists of one or more )BD(region expressions)ES( or )BD(regions)ES(, separated by comas, new-lines, or semi-colons. Each )BD(region)ES( consists of one or more )BD(geometric shapes)ES( combined using standard boolean operation. Several types of shapes are supported, including: ) 11 57 PR( shape: arguments: ----- ---------------------------------------- ANNULUS xcenter ycenter inner_radius outer_radius BOX xcenter ycenter xwidth yheight \201angle\202 CIRCLE xcenter ycenter radius ELLIPSE xcenter ycenter xwidth yheight \201angle\202 FIELD none LINE x1 y1 x2 y2 PIE xcenter ycenter angle1 angle2 POINT x1 y1 POLYGON x1 y1 x2 y2 ... xn yn)RP( )0 P(In addition, the following regions accept )BD(accelerator)ES( syntax: ) 13 73 PR( shape arguments ----- ------------------------------------------ ANNULUS xcenter ycenter radius1 radius2 ... radiusn ANNULUS xcenter ycenter inner_radius outer_radius n=[number] BOX xcenter ycenter xw1 yh1 xw2 yh2 ... xwn yhn \201angle\202 BOX xcenter ycenter xwlo yhlo xwhi yhhi n=[number] \201angle\202 CIRCLE xcenter ycenter r1 r2 ... rn # same as annulus CIRCLE xcenter ycenter rinner router n=[number] # same as annulus ELLIPSE xcenter ycenter xw1 yh1 xw2 yh2 ... xwn yhn \201angle\202 ELLIPSE xcenter ycenter xwlo yhlo xwhi yhhi n=[number] \201angle\202 PIE xcenter ycenter angle1 angle2 \201angle3\202 \201angle4\202 \201angle5\202 ... PIE xcenter ycenter angle1 angle2 \201n=[number]\202 POINT x1 y1 x2 y2 ... xn yn)RP( Note that the circle accelerators are simply aliases for the annulus accelerators. See )0 55 1 A(region geometry)55 0 TN TL()Ec /AF f D( for more information about accelerators. )0 P(Finally, the following are combinations of pie with different shapes \201called "panda" for "Pie AND Annulus"\202 allow for easy specification of radial sections: ) 6 75 PR( shape: arguments: ----- --------- PANDA xcen ycen ang1 ang2 nang irad orad nrad # circular CPANDA xcen ycen ang1 ang2 nang irad orad nrad # circular BPANDA xcen ycen ang1 ang2 nang xwlo yhlo xwhi yhhi nrad \201ang\202 # box EPANDA xcen ycen ang1 ang2 nang xwlo yhlo xwhi yhhi nrad \201ang\202 # ellipse)RP( The panda and cpanda specify combinations of annulus and circle with pie, respectively and give identical results. The bpanda combines box and pie, while epanda combines ellipse and pie. See )0 55 1 A(region geometry)55 0 TN TL()Ec /AF f D( for more information about pandas. )0 P(The following "shapes" are ignored by funtools \201generated by ds9\202: ) 8 62 PR( shape: arguments: ----- --------- PROJECTION x1 y1 x2 y2 width # NB: ignored by funtools RULER x1 y1 x2 y2 # NB: ignored by funtools TEXT x y # NB: ignored by funtools GRID # NB: ignored by funtools TILE # NB: ignored by funtools COMPASS # NB: ignored by funtools)RP( )0 P(All arguments to regions are real values; integer values are automatically converted to real where necessary. All angles are in degrees and run from the positive image x-axis to the positive image y-axis. If a rotation angle is part of the associated WCS header, that angle is added implicitly as well. )0 P(Note that 3-letter abbreviations are supported for all shapes, so that you can specify "circle" or "cir". )0 P()0 2 108 H(Columns)WB 186 Sn( Used in Region Filtering)EH( )0 P(By default, the x,y values in a region expression refer to the two "image binning" columns, i.e. the columns that would be used to bin the data into an image. For images, these are just the 2 dimensions of the image. For tables, these usually default to x and y but can be changed as required. For example, in Funtools, new binning columns are specified using a bincols=\201col1,col2\202 statement within the bracket string on the command line. )0 P(Alternate columns for region filtering can be specified by the syntax: ) 1 25 PR( \201col1,col2\202=region\201...\202)RP( e.g.: ) 3 34 PR( \201X,Y\202=annulus\201x,y,ri,ro\202 \201PHA,PI\202=circle\201x,y,r\202 \201DX,DY\202=ellipse\201x,y,a,b[,angle]\202)RP( )0 P()0 2 109 H(Region)WB 187 Sn( Algebra)EH( \201See also )0 56 1 A(Region Algebra)56 0 TN TL()Ec /AF f D( for more complete information.\202 )0 P(Region shapes can be combined together using Boolean operators: ) 6 72 PR( Symbol Operation Use -------- --------- ----------------------------------- ! not Exclude this shape from this region & or && and Include only the overlap of these shapes | or || inclusive or Include all of both shapes ^ exclusive or Include both shapes except their overlap)RP( Note that the !region syntax must be combined with another region in order that we be able to assign a region id properly. That is, ) 1 21 PR( !circle\201512,512,10\202)RP( is not a legal region because there is no valid region id to work with. To get the full field without a circle, combine the above with field\201\202, as in: ) 1 32 PR( field\201\202 && !circle\201512,512,10\202)RP( )0 2 110 H()WB 188 Sn( Region Separators Also Are Operators)EH( )0 P(As mentioned previously, multiple region expressions can be specified in a region descriptor, separated by commas, new-lines, or semi-colons. When such a separator is used, the boolean OR operator is automatically generated in its place but, unlike explicit use of the OR operator, the region ID is incremented \201starting from 1\202. )0 P(For example, the two shapes specified in this example are given the same region value: ) 1 50 PR( foo.fits[circle\201512,512,10\202||circle\201400,400,20\202])RP( On the other hand, the two shapes defined in the following example are given different region values: ) 1 49 PR( foo.fits[circle\201512,512,10\202,circle\201400,400,20\202])RP( )0 P(Of course these two examples will both mask the same table rows or pixels. However, in programs that distinguish region id's \201such as )0 5 1 A(funcnts)5 0 TN TL()Ec /AF f D( \202, they will act differently. The explicit OR operator will result in one region expression consisting of two shapes having the same region id and funcnts will report a single region. The comma operator will cause funcnts to report two region expressions, each with one shape, in its output. )0 P(In general, commas are used to separate region expressions entered in bracket notation on the command line: ) 2 57 PR( # regions are added to the filename in bracket notation foo.fits[circle\201512,512,100\202,circle\201400,400,20\202])RP( New-lines are used to separate region expressions in a file: ) 4 58 PR( # regions usually are separated by new-lines in a file # use @filename to include this file on the command line circle\201512,512,100\202 circle\201400,400,20\202)RP( Semi-colons are provided for backward compatibility with the original IRAF/PROS implementation and can be used in either case. )0 P(If a pixel is covered by two different regions expressions, it is given the mask value of the )BD(first)ES( region that contains that pixel. That is, successive regions )BD(do not)ES( overwrite previous regions in the mask, as was the case with the original PROS regions. In this way, an individual pixel is covered by one and only one region. This means that one must sometimes be careful about the order in which regions are defined. If region N is fully contained within region M, then N should be defined )BD(before)ES( M, or else it will be "covered up" by the latter. )0 2 111 H(Region)WB 189 Sn( Exclusion)EH( )0 P(Shapes also can be globally excluded from all the region specifiers in a region descriptor by using a minus sign before a region: ) 4 73 PR( operator arguments: -------- ----------- - Globally exclude the region expression following '-' sign from ALL regions specified in this file)RP( The global exclude region can be used by itself; in such a case, field\201\202 is implied. )0 P(A global exclude differs from the local exclude \201i.e. a shape prefixed by the logical not "!" symbol\202 in that global excludes are logically performed last, so that no region will contain pixels from a globally excluded shape. A local exclude is used in a boolean expression with an include shape, and only excludes pixels from that include shape. Global excludes cannot be used in boolean expressions. )0 2 112 H(Include)WB 190 Sn( Files)EH( )0 P(The )BD(@filename)ES( directive specifies an include file containing region expressions. This file is processed as part of the overall region descriptor: ) 1 35 PR( foo.fits[circle\201512,512,10\202,@foo])RP( A filter include file simply includes text without changing the state of the filter. It therefore can be used in expression. That is, if the file foo1 contains "pi==1" and foo2 contains "pha==2" then the following expressions are equivalent: ) 3 57 PR( "[@foo1&&@foo2]" is equivalent to "[pi==1&&pha==2]" "[pha==1||@foo2]" is equivalent to "[pi==1||pha==2]" "[@foo1,@foo2]" is equivalent to "[pi==1,pha==2]")RP( Be careful that you specify evaluation order properly using parenthesis, especially if the include file contains multiple filter statements. For example, consider a file containing two regions such as: ) 2 19 PR( circle 512 512 10 circle 520 520 10)RP( If you want to include only events \201or pixels\202 that are in these regions and have a pi value of 4, then the correct syntax is: ) 1 17 PR( pi==4&&\201@foo\202)RP( since this is equivalent to: ) 1 53 PR( pi==4 && \201circle 512 512 10 || circle 520 520 10\202)RP( If you leave out the parenthesis, you are filtering this statement: ) 1 52 PR( pi==4 && circle 512 512 10 || circle 520 520 10\202)RP( which is equivalent to: ) 1 54 PR( \201pi==4 && circle 512 512 10\202 || circle 520 520 10\202)RP( The latter syntax only applies the pi test to the first region. )0 P(For image-style filtering, the )BD(@filename)ES( can specify an 8-bit or 16-bit FITS image. In this case, the pixel values in the mask image are used as the region mask. The valid pixels in the mask must have positive values. Zero values are excluded from the mask and negative values are not allowed. Moreover, the region id value is taken as the image pixel value and the total number of regions is taken to be the highest pixel value. The dimensions of the image mask must be less than or equal to the image dimensions of the data. The mask will be replicated as needed to match the size of the image. \201Thus, best results are obtained when the data dimensions are an even multiple of the mask dimensions.\202 )0 P(An image mask can be used in any image filtering operation, regardless of whether the data is of type image or table. For example, the )0 5 1 A(funcnts)5 0 TN TL()Ec /AF f D( \202 program performs image filtering on images or tables, and so FITS image masks are valid input for either type of data in this program.. An image mask cannot be used in a program such as )0 7 1 A(fundisp)7 0 TN TL()Ec /AF f D( \202 when the input data is a table, because fundisp displays rows of a table and processes these rows using event-style filtering. )0 2 113 H(Global)WB 191 Sn( and Local Properties of Regions)EH( )0 P(The ds9 image display program describes a host of properties such as color, font, fix/free state, etc. Such properties can be specified globally \201for all regions\202 or locally \201for an individual region\202. The )BD(global)ES( keyword specifies properties and qualifiers for all regions, while local properties are specified in comments on the same line as the region: ) 4 30 PR( global color=red circle\20110,10,2\202 circle\20120,20,3\202 # color=blue circle\20130,30,4\202)RP( The first and third circles will be red, which the second circle will be blue. Note that funtools currently ignores region properties, as they are used in display only. )0 2 114 H()WB 192 Sn( Coordinate Systems)EH( For each region, it is important to specify the coordinate system used to interpret the region, i.e., to set the context in which position and size values are interpreted. For this purpose, the following keywords are recognized: ) 12 68 PR( name description ---- ------------------------------------------ PHYSICAL pixel coords of original file using LTM/LTV IMAGE pixel coords of current file FK4, B1950 sky coordinate systems FK5, J2000 sky coordinate systems GALACTIC sky coordinate systems ECLIPTIC sky coordinate systems ICRS currently same as J2000 LINEAR linear wcs as defined in file AMPLIFIER mosaic coords of original file using ATM/ATV DETECTOR mosaic coords of original file using DTM/DTV)RP( )0 P()0 2 115 H(Specifying)WB 193 Sn( Positions, Sizes, and Angles)EH( The arguments to region shapes can be floats or integers describing positions and sizes. They can be specified as pure numbers or using explicit formatting directives: ) 21 57 PR( position arguments description ------------------ ------------------------------ [num] context-dependent \201see below\202 [num]d degrees [num]r radians [num]p physical pixels [num]i image pixels [num]:[num]:[num] hms for 'odd' position arguments [num]:[num]:[num] dms for 'even' position arguments [num]h[num]m[num]s explicit hms [num]d[num]m[num]s explicit dms size arguments description -------------- ----------- [num] context-dependent \201see below\202 [num]" arc seconds [num]' arc minutes [num]d degrees [num]r radians [num]p physical pixels [num]i image pixels)RP( When a "pure number" \201i.e. one without a format directive such as 'd' for 'degrees'\202 is specified, its interpretation depends on the context defined by the 'coordsys' keyword. In general, the rule is: )0 P()BD(All pure numbers have implied units corresponding to the current coordinate system.)ES( )0 P(If no such system is explicitly specified, the default system is implicitly assumed to be PHYSICAL. )0 P(In practice this means that for IMAGE and PHYSICAL systems, pure numbers are pixels. Otherwise, for all systems other than linear, pure numbers are degrees. For LINEAR systems, pure numbers are in the units of the linear system. This rule covers both positions and sizes. )0 P(The input values to each shape can be specified in several coordinate systems including: ) 12 68 PR( name description ---- ---------------------------- IMAGE pixel coords of current file LINEAR linear wcs as defined in file FK4, B1950 various sky coordinate systems FK5, J2000 GALACTIC ECLIPTIC ICRS PHYSICAL pixel coords of original file using LTM/LTV AMPLIFIER mosaic coords of original file using ATM/ATV DETECTOR mosaic coords of original file using DTM/DTV)RP( )0 P(If no coordinate system is specified, PHYSICAL is assumed. PHYSICAL or a World Coordinate System such as J2000 is preferred and most general. The coordinate system specifier should appear at the beginning of the region description, on a separate line \201in a file\202, or followed by a new-line or semicolon; e.g., ) 2 26 PR( global coordsys physical circle 6500 9320 200)RP( The use of celestial input units automatically implies WORLD coordinates of the reference image. Thus, if the world coordinate system of the reference image is J2000, then ) 1 27 PR( circle 10:10:0 20:22:0 3')RP( is equivalent to: ) 1 35 PR( circle 10:10:0 20:22:0 3' # j2000)RP()RP( Note that by using units as described above, you may mix coordinate systems within a region specifier; e.g., ) 1 32 PR( circle 6500 9320 3' # physical)RP( )0 P(Note that, for regions which accept a rotation angle: ) 2 29 PR(ellipse \201x, y, r1, r2, angle\202 box\201x, y, w, h, angle\202)RP( the angle is relative to the specified coordinate system. In particular, if the region is specified in WCS coordinates, the angle is related to the WCS system, not x/y image coordinate axis. For WCS systems with no rotation, this obviously is not an issue. However, some images do define an implicit rotation \201e.g., by using a non-zero CROTA value in the WCS parameters\202 and for these images, the angle will be relative to the WCS axes. In such case, a region specification such as: ) 1 54 PR(fk4;ellipse\20122:59:43.985, +58:45:26.92,320", 160", 30\202)RP( will not, in general, be the same region specified as: ) 1 38 PR(physical;ellipse\201465, 578, 40, 20, 30\202)RP( even when positions and sizes match. The angle is relative to WCS axes in the first case, and relative to physical x,y axes in the second. )0 P(More detailed descriptions are available for: )0 55 1 A(Region Geometry)55 0 TN TL()Ec /AF f D(, )0 56 1 A(Region Algebra)56 0 TN TL()Ec /AF f D(, )0 57 1 A(Region Coordinates)57 0 TN TL()Ec /AF f D(, and )0 58 1 A(Region Boundaries)58 0 TN TL()Ec /AF f D(. )0 P()0 0 1 A(Go to Funtools Help Index)0 0 TN TL()Ec /AF f D( )0 5 116 H(Last)WB 194 Sn( updated: November 17, 2005)EH( )WB NL /Cb Db D /Ct [16#00 16#00 16#00] D /Cl [16#00 16#00 16#00] D /CL -1 D Ct Sc DS /Ba f D /BO 0 D Bs /UR (reggeometry.html) D /Ti (Region Geometry) D /Au () D /Df f D /ME [()] D 0 BO R ()1 Sl()WB 55 Sn( )0 2 117 H(RegGeometry:)WB 196 Sn()WB 195 Sn( Geometric Shapes in Spatial Region Filtering)EA()EH( )0 2 118 H(Summary)WB 197 Sn()EH( )0 P(This document describes the geometry of regions available for spatial filtering in IRAF/PROS analysis. )0 2 119 H(Geometric)WB 198 Sn( shapes)EH( )0 P(Several geometric shapes are used to describe regions. The valid shapes are: ) 11 57 PR( shape: arguments: ----- ---------------------------------------- ANNULUS xcenter ycenter inner_radius outer_radius BOX xcenter ycenter xwidth yheight \201angle\202 CIRCLE xcenter ycenter radius ELLIPSE xcenter ycenter xwidth yheight \201angle\202 FIELD none LINE x1 y1 x2 y2 PIE xcenter ycenter angle1 angle2 POINT x1 y1 POLYGON x1 y1 x2 y2 ... xn yn)RP( All arguments are real values; integer values are automatically converted to real where necessary. All angles are in degrees and specify angles that run counter-clockwise from the positive y-axis. )0 P(Shapes can be specified using "command" syntax: ) 1 23 PR( [shape] arg1 arg2 ...)RP( or using "routine" syntax: ) 1 26 PR( [shape]\201arg1, arg2, ...\202)RP( or by any combination of the these. \201Of course, the parentheses must balance and there cannot be more commas than necessary.\202 The shape keywords are case-insensitive. Furthermore, any shape can be specified by a three-character unique abbreviation. For example, one can specify three circular regions as: ) 1 64 PR( "foo.fits[CIRCLE 512 512 50;CIR\201128 128, 10\202;cir\201650,650,20\202]")RP( \201Quotes generally are required to protect the region descriptor from being processed by the Unix shell.\202 )2 1 1 HR( )0 P(The )BD(annulus)ES( shape specifies annuli, centered at xcenter, ycenter, with inner and outer radii \201r1, r2\202. For example, ) 1 20 PR( ANNULUS 25 25 5 10)RP( specifies an annulus centered at 25.0 25.0 with an inner radius of 5.0 and an outer radius of 10. Assuming \201as will be done for all examples in this document, unless otherwise noted\202 this shape is used in a mask of size 40x40, it will look like this: ) 42 51 PR( 1234567890123456789012345678901234567890 ---------------------------------------- 40:........................................ 39:........................................ 38:........................................ 37:........................................ 36:........................................ 35:........................................ 34:....................111111111........... 33:...................11111111111.......... 32:.................111111111111111........ 31:.................111111111111111........ 30:................11111111111111111....... 29:...............1111111.....1111111...... 28:...............111111.......111111...... 27:...............11111.........11111...... 26:...............11111.........11111...... 25:...............11111.........11111...... 24:...............11111.........11111...... 23:...............11111.........11111...... 22:...............111111.......111111...... 21:...............1111111.....1111111...... 20:................11111111111111111....... 19:.................111111111111111........ 18:.................111111111111111........ 17:...................11111111111.......... 16:....................111111111........... 15:........................................ 14:........................................ 13:........................................ 12:........................................)WR( 11:........................................ 10:........................................ 9:........................................ 8:........................................ 7:........................................ 6:........................................ 5:........................................ 4:........................................ 3:........................................ 2:........................................ 1:........................................)RP( )2 1 1 HR( )0 P(The )BD(box)ES( shape specifies an orthogonally oriented box, centered at xcenter, ycenter, of size xwidth, yheight. It requires four arguments and accepts an optional fifth argument to specify a rotation angle. When the rotation angle is specified \201in degrees\202, the box is rotated by an angle that runs counter-clockwise from the positive y-axis. )0 P(The )BD(box)ES( shape specifies a rotated box, centered at xcenter, ycenter, of size xwidth, yheight. The box is rotated by an angle specified in degrees that runs counter-clockwise from the positive y-axis. If the angle argument is omitted, it defaults to 0. )2 1 1 HR( )0 P(The )BD(circle)ES( shape specifies a circle, centered at xcenter, ycenter, of radius r. It requires three arguments. )2 1 1 HR( )0 P(The )BD(ellipse)ES( shape specifies an ellipse, centered at xcenter, ycenter, with y-axis width a and the y-axis length b defined such that: ) 1 27 PR( x**2/a**2 + y**2/b**2 = 1)RP( Note that a can be less than, equal to, or greater than b. The ellipse is rotated the specified number of degrees. The rotation is done according to astronomical convention, counter-clockwise from the positive y-axis. An ellipse defined by: ) 1 23 PR( ELLIPSE 20 20 5 10 45)RP( will look like this: ) 42 49 PR( 1234567890123456789012345678901234567890 ---------------------------------------- 40:........................................ 39:........................................ 38:........................................ 37:........................................ 36:........................................ 35:........................................ 34:........................................ 33:........................................ 32:........................................ 31:........................................ 30:........................................ 29:........................................ 28:........................................ 27:............111111...................... 26:............11111111.................... 25:............111111111................... 24:............11111111111................. 23:............111111111111................ 22:............111111111111................ 21:.............111111111111............... 20:.............1111111111111.............. 19:..............111111111111.............. 18:...............111111111111............. 17:...............111111111111............. 16:................11111111111............. 15:..................111111111............. 14:...................11111111............. 13:.....................111111............. 12:........................................)WR( 11:........................................ 10:........................................ 9:........................................ 8:........................................ 7:........................................ 6:........................................ 5:........................................ 4:........................................ 3:........................................ 2:........................................ 1:........................................)RP( )2 1 1 HR( )0 P(The )BD(field)ES( shape specifies the entire field as a region. It is not usually specified explicitly, but is used implicitly in the case where no regions are specified, that is, in cases where either a null string or some abbreviation of the string "none" is input. )BD(Field)ES( takes no arguments. )2 1 1 HR( )0 P(The )BD(pie)ES( shape specifies an angular wedge of the entire field, centered at xcenter, ycenter. The wedge runs between the two specified angles. The angles are given in degrees, running counter-clockwise from the positive x-axis. For example, ) 1 18 PR( PIE 20 20 90 180)RP( defines a region from 90 degrees to 180 degrees, i.e., quadrant 2 of the Cartesian plane. The display of such a region looks like this: ) 42 51 PR( 1234567890123456789012345678901234567890 ---------------------------------------- 40:11111111111111111111.................... 39:11111111111111111111.................... 38:11111111111111111111.................... 37:11111111111111111111.................... 36:11111111111111111111.................... 35:11111111111111111111.................... 34:11111111111111111111.................... 33:11111111111111111111.................... 32:11111111111111111111.................... 31:11111111111111111111.................... 30:11111111111111111111.................... 29:11111111111111111111.................... 28:11111111111111111111.................... 27:11111111111111111111.................... 26:11111111111111111111.................... 25:11111111111111111111.................... 24:11111111111111111111.................... 23:11111111111111111111.................... 22:11111111111111111111.................... 21:11111111111111111111.................... 20:........................................ 19:........................................ 18:........................................ 17:........................................ 16:........................................ 15:........................................ 14:........................................ 13:........................................ 12:........................................)WR( 11:........................................ 10:........................................ 9:........................................ 8:........................................ 7:........................................ 6:........................................ 5:........................................ 4:........................................ 3:........................................ 2:........................................ 1:........................................)RP( The pie slice specified is always a counter-clockwise sweep between the angles, starting at the first angle and ending at the second. Thus: ) 1 17 PR( PIE 10 15 30 60)RP( describes a 30 degree sweep from 2 o'clock to 1 o'clock, while: ) 1 17 PR( PIE 10 15 60 30)RP( describes a 330 degree counter-clockwise sweep from 1 o'clock to 2 o'clock passing through 12 o'clock \2010 degrees\202. Note in both of these examples that the center of the slice can be anywhere on the plane. The second mask looks like this: ) 42 51 PR( 1234567890123456789012345678901234567890 ---------------------------------------- 40:111111111111111111111111................ 39:11111111111111111111111................. 38:11111111111111111111111................. 37:1111111111111111111111.................. 36:1111111111111111111111.................. 35:111111111111111111111................... 34:11111111111111111111.................... 33:11111111111111111111.................... 32:1111111111111111111....................1 31:1111111111111111111..................111 30:111111111111111111.................11111 29:111111111111111111................111111 28:11111111111111111...............11111111 27:1111111111111111..............1111111111 26:1111111111111111.............11111111111 25:111111111111111............1111111111111 24:111111111111111..........111111111111111 23:11111111111111.........11111111111111111 22:11111111111111........111111111111111111 21:1111111111111.......11111111111111111111 20:111111111111......1111111111111111111111 19:111111111111....111111111111111111111111 18:11111111111....1111111111111111111111111 17:11111111111..111111111111111111111111111 16:1111111111.11111111111111111111111111111 15:1111111111111111111111111111111111111111 14:1111111111111111111111111111111111111111 13:1111111111111111111111111111111111111111 12:1111111111111111111111111111111111111111)WR( 11:1111111111111111111111111111111111111111 10:1111111111111111111111111111111111111111 9:1111111111111111111111111111111111111111 8:1111111111111111111111111111111111111111 7:1111111111111111111111111111111111111111 6:1111111111111111111111111111111111111111 5:1111111111111111111111111111111111111111 4:1111111111111111111111111111111111111111 3:1111111111111111111111111111111111111111 2:1111111111111111111111111111111111111111 1:1111111111111111111111111111111111111111)RP( The pie slice goes to the edge of the field. To limit its scope, pie usually is is combined with other shapes, such as circles and annuli, using boolean operations. \201See below and in "help regalgebra"\202. )0 P(Pie Performance Notes: )0 P(Pie region processing time is proportional to the size of the image, and not the size of the region. This is because the pie shape is the only infinite length shape, and we essentially must check all y rows for inclusion \201unlike other regions, where the y limits can be calculated beforehand\202. Thus, pie can run very slowly on large images. In particular, it will run MUCH more slowly than the panda shape in image-based region operations \201such as funcnts\202. We recommend use of panda over pie where ever possible. )0 P(If you must use pie, always try to put it last in a boolean && expression. The reason for this is that the filter code is optimized to exit as soon as the result is know. Since pie is the slowest region, it is better to avoid executing it if another region can decide the result. Consider, for example, the difference in time required to process a Chandra ACIS file when a pie and circle are combined in two different orders: ) 5 74 PR( time ./funcnts nacis.fits "circle 4096 4096 100 && pie 4096 4096 10 78" 2.87u 0.38s 0:35.08 9.2% time ./funcnts nacis.fits "pie 4096 4096 10 78 && circle 4096 4096 100 " 89.73u 0.36s 1:03.50 141.8%)RP( )0 P(Black-magic performance note: )0 P(Panda region processing uses a )BD(quick test)ES( pie region instead of the normal pie region when combining its annulus and pie shapes. This )BD(qtpie)ES( shape differs from the normal pie in that it utilizes the y limits from the previous region with which it is combined. In a panda shape, which is a series of annuli combined with pies, the processing time is thus reduced to that of the annuli. )0 P(You can use the qtpie shape instead of pie in cases where you are combining pie with another shape using the && operator. This will cause the pie limits to be set using limits from the other shape, and will speed up the processing considerably. For example, the above execution of funcnts can be improved considerably using this technique: ) 2 75 PR( time ./funcnts nacis.fits "circle 4096 4096 100 && qtpie 4096 4096 10 78" 4.66u 0.33s 0:05.87 85.0%)RP( )0 P(We emphasize that this is a quasi-documented feature and might change in the future. The qtpie shape is not recognized by ds9 or other programs. )2 1 1 HR( )0 P(The )BD(line)ES( shape allows single pixels in a line between \201x1,y1\202 and \201x2,y2\202 to be included or excluded. For example: ) 44 49 PR( LINE \2015,6, 24,25\202 ) 43 49 PR(displays as: ) 42 49 PR( 1234567890123456789012345678901234567890 ---------------------------------------- 40:........................................ 39:........................................ 38:........................................ 37:........................................ 36:........................................ 35:........................................ 34:........................................ 33:........................................ 32:........................................ 31:........................................ 30:........................................ 29:........................................ 28:........................................ 27:........................................ 26:........................................ 25:.......................1................ 24:......................1................. 23:.....................1.................. 22:....................1................... 21:...................1.................... 20:..................1..................... 19:.................1...................... 18:................1....................... 17:...............1........................ 16:..............1......................... 15:.............1.......................... 14:............1...........................)WR( 13:...........1............................)WR( 12:..........1.............................)WR( 11:.........1.............................. 10:........1............................... 9:.......1................................ 8:......1................................. 7:.....1.................................. 6:....1................................... 5:........................................ 4:........................................ 3:........................................ 2:........................................ 1:........................................)RP( )2 1 1 HR( )0 P(The )BD(point)ES( shape allows single pixels to be included or excluded. Although the \201x,y\202 values are real numbers, they are truncated to integer and the corresponding pixel is included or excluded, as specified. )0 P(Several points can be put in one region declaration; unlike the original IRAF implementation, each now is given a different region mask value. This makes it easier, for example, for funcnts to determine the number of photons in the individual pixels. For example, ) 1 37 PR( POINT \2015,6, 10,11, 20,20, 35,30\202)RP( will give the different region mask values to all four points, as shown below: ) 42 49 PR( 1234567890123456789012345678901234567890 ---------------------------------------- 40:........................................ 39:........................................ 38:........................................ 37:........................................ 36:........................................ 35:........................................ 34:........................................ 33:........................................ 32:........................................ 31:........................................ 30:..................................4..... 29:........................................ 28:........................................ 27:........................................ 26:........................................ 25:........................................ 24:........................................ 23:........................................ 22:........................................ 21:........................................ 20:...................3.................... 19:........................................ 18:........................................ 17:........................................ 16:........................................ 15:........................................ 14:........................................ 13:........................................ 12:........................................)WR( 11:.........2.............................. 10:........................................ 9:........................................ 8:........................................ 7:........................................ 6:....1................................... 5:........................................ 4:........................................ 3:........................................ 2:........................................ 1:........................................)RP( )2 1 1 HR( )0 P(The )BD(polygon)ES( shape specifies a polygon with vertices \201x1, y1\202 ... \201xn, yn\202. The polygon is closed automatically: one should not specify the last vertex to be the same as the first. Any number of vertices are allowed. For example, the following polygon defines a right triangle as shown below: ) 1 33 PR( POLYGON \20110,10, 10,30, 30,30\202)RP( looks like this: ) 42 49 PR( 1234567890123456789012345678901234567890 ---------------------------------------- 40:........................................ 39:........................................ 38:........................................ 37:........................................ 36:........................................ 35:........................................ 34:........................................ 33:........................................ 32:........................................ 31:........................................ 30:..........11111111111111111111.......... 29:..........1111111111111111111........... 28:..........111111111111111111............ 27:..........11111111111111111............. 26:..........1111111111111111.............. 25:..........111111111111111............... 24:..........11111111111111................ 23:..........1111111111111................. 22:..........111111111111.................. 21:..........11111111111................... 20:..........1111111111.................... 19:..........111111111..................... 18:..........11111111...................... 17:..........1111111....................... 16:..........111111........................ 15:..........11111......................... 14:..........1111.......................... 13:..........111........................... 12:..........11............................)WR( 11:..........1............................. 10:........................................ 9:........................................ 8:........................................ 7:........................................ 6:........................................ 5:........................................ 4:........................................ 3:........................................ 2:........................................ 1:........................................)RP( Note that polygons can get twisted upon themselves if edge lines cross. Thus: ) 1 37 PR( POL \20110,10, 20,20, 20,10, 10,20\202)RP( will produce an area which is two triangles, like butterfly wings, as shown below: ) 42 49 PR( 1234567890123456789012345678901234567890 ---------------------------------------- 40:........................................ 39:........................................ 38:........................................ 37:........................................ 36:........................................ 35:........................................ 34:........................................ 33:........................................ 32:........................................ 31:........................................ 30:........................................ 29:........................................ 28:........................................ 27:........................................ 26:........................................ 25:........................................ 24:........................................ 23:........................................ 22:........................................ 21:........................................ 20:........................................ 19:..........1........1.................... 18:..........11......11.................... 17:..........111....111.................... 16:..........1111..1111.................... 15:..........1111111111.................... 14:..........1111..1111.................... 13:..........111....111.................... 12:..........11......11....................)WR( 11:..........1........1.................... 10:........................................ 9:........................................ 8:........................................ 7:........................................ 6:........................................ 5:........................................ 4:........................................ 3:........................................ 2:........................................ 1:........................................)RP( )2 1 1 HR( )0 P(The following are combinations of pie with different shapes \201called "panda" for "Pie AND Annulus"\202 allow for easy specification of radial sections: ) 6 76 PR( shape: arguments: ----- --------- PANDA xcen ycen ang1 ang2 nang irad orad nrad # circular CPANDA xcen ycen ang1 ang2 nang irad orad nrad # circular BPANDA xcen ycen ang1 ang2 nang xwlo yhlo xwhi yhhi nrad \201ang\202 # box EPANDA xcen ycen ang1 ang2 nang xwlo yhlo xwhi yhhi nrad \201ang\202 # ellipse)RP( The )BD(panda)ES( \201)BD(P)ES(ies )BD(AND)ES( )BD(A)ES(nnuli\202 shape can be used to create combinations of pie and annuli markers. It is analogous to a Cartesian product on those shapes, i.e., the result is several shapes generated by performing a boolean AND between pies and annuli. Thus, the panda and cpanda specify combinations of annulus and circle with pie, respectively and give identical results. The bpanda combines box and pie, while epanda combines ellipse and pie. )0 P(Consider the example shown below: ) 1 31 PR( PANDA\20120,20, 0,360,3, 0,15,4\202)RP( Here, 3 pie slices centered at 20, 20 are combined with 4 annuli, also centered at 20, 20. The result is a mask with 12 regions \201displayed in base 16 to save characters\202: ) 42 51 PR( 1234567890123456789012345678901234567890 ---------------------------------------- 40:........................................ 39:........................................ 38:........................................ 37:........................................ 36:........................................ 35:........................................ 34:..............44444444444............... 33:............444444444444444............. 32:...........88444444444444444............ 31:.........888844443333344444444.......... 30:........88888833333333333444444......... 29:........88888733333333333344444......... 28:.......8888877733333333333344444........ 27:......888887777332222233333344444....... 26:......888877777622222222333334444....... 25:.....88887777766622222222333334444...... 24:.....88887777666622222222233334444...... 23:.....88887777666651111222233334444...... 22:.....88877776666551111122223333444...... 21:.....88877776666555111122223333444...... 20:.....888777766665559999aaaabbbbccc...... 19:.....888777766665559999aaaabbbbccc...... 18:.....888777766665599999aaaabbbbccc...... 17:.....88887777666659999aaaabbbbcccc...... 16:.....888877776666aaaaaaaaabbbbcccc...... 15:.....888877777666aaaaaaaabbbbbcccc...... 14:......8888777776aaaaaaaabbbbbcccc....... 13:......888887777bbaaaaabbbbbbccccc....... 12:.......88888777bbbbbbbbbbbbccccc........)WR( 11:........888887bbbbbbbbbbbbccccc......... 10:........888888bbbbbbbbbbbcccccc......... 9:.........8888ccccbbbbbcccccccc.......... 8:...........88ccccccccccccccc............ 7:............ccccccccccccccc............. 6:..............ccccccccccc............... 5:........................................ 4:........................................ 3:........................................ 2:........................................ 1:........................................)RP( )2 1 1 HR( )0 P(Several regions with different mask values can be combined in the same mask. This supports comparing data from the different regions. \201For information on how to combine different shapes into a single region, see "help regalgebra".\202 For example, consider the following set of regions: ) 3 24 PR( ANNULUS 25 25 5 10 ELLIPSE 20 20 5 10 315 BOX 15 15 5 10)RP( The resulting mask will look as follows: ) 42 49 PR( 1234567890123456789012345678901234567890 ---------------------------------------- 40:........................................ 39:........................................ 38:........................................ 37:........................................ 36:........................................ 35:........................................ 34:....................111111111........... 33:...................11111111111.......... 32:.................111111111111111........ 31:.................111111111111111........ 30:................11111111111111111....... 29:...............1111111.....1111111...... 28:...............111111.......111111...... 27:...............11111.222222..11111...... 26:...............111112222222..11111...... 25:...............111112222222..11111...... 24:...............111112222222..11111...... 23:...............111112222222..11111...... 22:...............111111222222.111111...... 21:..............211111112222.1111111...... 20:............322211111111111111111....... 19:............32222111111111111111........ 18:............22222111111111111111........ 17:............222222211111111111.......... 16:............22222222111111111........... 15:............222222222................... 14:............22222222.................... 13:............222222...................... 12:............33333.......................)WR( 11:............33333....................... 10:........................................ 9:........................................ 8:........................................ 7:........................................ 6:........................................ 5:........................................ 4:........................................ 3:........................................ 2:........................................ 1:........................................)RP( Note that when a pixel is in 2 or more regions, it is arbitrarily assigned to a one of the regions in question \201often based on how a give C compiler optimizes boolean expressions\202. )0 P()0 2 120 H(Region)WB 199 Sn( accelerators)EH( )0 P(Two types of \200fBaccelerators)ES(, to simplify region specification, are provided as natural extensions to the ways shapes are described. These are: extended lists of parameters, specifying multiple regions, valid for annulus, box, circle, ellipse, pie, and points; and )BD(n=)ES(, valid for annulus, box, circle, ellipse, and pie \201not point\202. In both cases, one specification is used to define several different regions, that is, to define shapes with different mask values in the region mask. )0 P(The following regions accept )BD(accelerator)ES( syntax: ) 13 73 PR( shape arguments ----- ------------------------------------------ ANNULUS xcenter ycenter radius1 radius2 ... radiusn ANNULUS xcenter ycenter inner_radius outer_radius n=[number] BOX xcenter ycenter xw1 yh1 xw2 yh2 ... xwn yhn \201angle\202 BOX xcenter ycenter xwlo yhlo xwhi yhhi n=[number] \201angle\202 CIRCLE xcenter ycenter r1 r2 ... rn # same as annulus CIRCLE xcenter ycenter rinner router n=[number] # same as annulus ELLIPSE xcenter ycenter xw1 yh1 xw2 yh2 ... xwn yhn \201angle\202 ELLIPSE xcenter ycenter xwlo yhlo xwhi yhhi n=[number] \201angle\202 PIE xcenter ycenter angle1 angle2 \201angle3\202 \201angle4\202 \201angle5\202 ... PIE xcenter ycenter angle1 angle2 \201n=[number]\202 POINT x1 y1 x2 y2 ... xn yn)RP( Note that the circle accelerators are simply aliases for the annulus accelerators. )0 P(For example, several annuli at the same center can be specified in one region expression by specifying more than two radii. If )BD(N)ES( radii are specified, then )BD(N)ES(-1 annuli result, with the outer radius of each preceding annulus being the inner radius of the succeeding annulus. Each annulus is considered a separate region, and is given a separate mask value. For example, ) 1 30 PR( ANNULUS 20 20 0 2 5 10 15 20)RP( specifies five different annuli centered at 20 20, and is equivalent to: ) 5 25 PR( ANNULUS 20.0 20.0 0 2 ANNULUS 20.0 20.0 2 5 ANNULUS 20.0 20.0 5 10 ANNULUS 20.0 20.0 10 15 ANNULUS 20.0 20.0 15 20)RP( The mask is shown below: ) 42 49 PR( 1234567890123456789012345678901234567890 ---------------------------------------- 40:........................................ 39:.............5555555555555.............. 38:...........55555555555555555............ 37:.........555555555555555555555.......... 36:........55555555555555555555555......... 35:......555555555555555555555555555....... 34:.....55555555544444444444555555555...... 33:....5555555544444444444444455555555..... 32:....5555555444444444444444445555555..... 31:...555555444444444444444444444555555.... 30:..55555544444444444444444444444555555... 29:..55555544444443333333334444444555555... 28:.5555554444444333333333334444444555555.. 27:.5555544444433333333333333344444455555.. 26:555555444444333333333333333444444555555. 25:555554444443333333333333333344444455555. 24:555554444433333332222233333334444455555. 23:555554444433333322222223333334444455555. 22:555554444433333222222222333334444455555. 21:555554444433333222111222333334444455555. 20:555554444433333222111222333334444455555. 19:555554444433333222111222333334444455555. 18:555554444433333222222222333334444455555. 17:555554444433333322222223333334444455555. 16:555554444433333332222233333334444455555. 15:555554444443333333333333333344444455555. 14:555555444444333333333333333444444555555. 13:.5555544444433333333333333344444455555.. 12:.5555554444444333333333334444444555555..)WR( 11:..55555544444443333333334444444555555... 10:..55555544444444444444444444444555555... 9:...555555444444444444444444444555555.... 8:....5555555444444444444444445555555..... 7:....5555555544444444444444455555555..... 6:.....55555555544444444444555555555...... 5:......555555555555555555555555555....... 4:........55555555555555555555555......... 3:.........555555555555555555555.......... 2:...........55555555555555555............ 1:.............5555555555555..............)RP( )0 P(For boxes and ellipses, if an odd number of arguments is specified, then the last argument is assumed to be an angle. Otherwise, the angle is assumed to be zero. For example: ) 1 38 PR( ellipse 20 20 3 5 6 10 9 15 12 20 45)RP( specifies an 3 ellipses at a 45 degree angle: ) 42 51 PR( 1234567890123456789012345678901234567890 ---------------------------------------- 40:........................................ 39:........................................ 38:........................................ 37:........................................ 36:........33333333........................ 35:......333333333333...................... 34:.....3333333333333333................... 33:....333333333333333333.................. 32:....33333332222233333333................ 31:...3333332222222222333333............... 30:...33333222222222222233333.............. 29:...333332222222222222223333............. 28:...3333222222211112222223333............ 27:...33332222211111111222223333........... 26:...333322222111111111122223333.......... 25:...3333222211111111111122223333......... 24:....3332222111111..1111122223333........ 23:....333322211111.....11112222333........ 22:....33332222111.......11112223333....... 21:.....33322221111.......11122223333...... 20:.....33332221111.......11112223333...... 19:.....33332222111.......11112222333...... 18:......33332221111.......11122223333..... 17:.......33322221111.....111112223333..... 16:.......3333222211111..1111112222333..... 15:........3333222211111111111122223333.... 14:.........333322221111111111222223333.... 13:..........33332222211111111222223333.... 12:...........3333222222111122222223333....)WR( 11:............333322222222222222233333.... 10:.............33333222222222222233333.... 9:..............3333332222222222333333.... 8:...............33333333222223333333..... 7:.................333333333333333333..... 6:..................3333333333333333...... 5:.....................333333333333....... 4:.......................33333333......... 3:........................................ 2:........................................ 1:........................................)RP( Note in the above example that the lower limit is not part of the region for boxes, circles, and ellipses. This makes circles and annuli equivalent, i.e.: ) 2 26 PR( circle 20 20 5 10 15 20 annulus 20 20 5 10 15 20)RP( both give the following region mask: ) 42 51 PR( 1234567890123456789012345678901234567890 ---------------------------------------- 40:........................................ 39:.............3333333333333.............. 38:...........33333333333333333............ 37:.........333333333333333333333.......... 36:........33333333333333333333333......... 35:......333333333333333333333333333....... 34:.....33333333322222222222333333333...... 33:....3333333322222222222222233333333..... 32:....3333333222222222222222223333333..... 31:...333333222222222222222222222333333.... 30:..33333322222222222222222222222333333... 29:..33333322222221111111112222222333333... 28:.3333332222222111111111112222222333333.. 27:.3333322222211111111111111122222233333.. 26:333333222222111111111111111222222333333. 25:333332222221111111111111111122222233333. 24:33333222221111111.....11111112222233333. 23:3333322222111111.......1111112222233333. 22:333332222211111.........111112222233333. 21:333332222211111.........111112222233333. 20:333332222211111.........111112222233333. 19:333332222211111.........111112222233333. 18:333332222211111.........111112222233333. 17:3333322222111111.......1111112222233333. 16:33333222221111111.....11111112222233333. 15:333332222221111111111111111122222233333. 14:333333222222111111111111111222222333333. 13:.3333322222211111111111111122222233333.. 12:.3333332222222111111111112222222333333..)WR( 11:..33333322222221111111112222222333333... 10:..33333322222222222222222222222333333... 9:...333333222222222222222222222333333.... 8:....3333333222222222222222223333333..... 7:....3333333322222222222222233333333..... 6:.....33333333322222222222333333333...... 5:......333333333333333333333333333....... 4:........33333333333333333333333......... 3:.........333333333333333333333.......... 2:...........33333333333333333............ 1:.............3333333333333..............)RP( )0 P(As a final example, specifying several angles in one pie slice expression is equivalent to specifying several separate slices with the same center. As with the annulus, if )BD(N)ES( angles are specified, then )BD(N)ES(-1 slices result, with the ending angle of each preceding slice being the starting angle of the succeeding slice. Each slice is considered a separate region, and is given a separate mask value. For example, ) 1 26 PR( PIE 12 12 315 45 115 270)RP( specifies three regions as shown below: ) 42 51 PR( 1234567890123456789012345678901234567890 ---------------------------------------- 40:2222222222222222222222222222222222222222 39:2222222222222222222222222222222222222221 38:2222222222222222222222222222222222222211 37:2222222222222222222222222222222222222111 36:2222222222222222222222222222222222221111 35:3222222222222222222222222222222222211111 34:3222222222222222222222222222222222111111 33:3322222222222222222222222222222221111111 32:3322222222222222222222222222222211111111 31:3332222222222222222222222222222111111111 30:3332222222222222222222222222221111111111 29:3333222222222222222222222222211111111111 28:3333222222222222222222222222111111111111 27:3333322222222222222222222221111111111111 26:3333322222222222222222222211111111111111 25:3333322222222222222222222111111111111111 24:3333332222222222222222221111111111111111 23:3333332222222222222222211111111111111111 22:3333333222222222222222111111111111111111 21:3333333222222222222221111111111111111111 20:3333333322222222222211111111111111111111 19:3333333322222222222111111111111111111111 18:3333333332222222221111111111111111111111 17:3333333332222222211111111111111111111111 16:3333333333222222111111111111111111111111 15:3333333333222221111111111111111111111111 14:3333333333322211111111111111111111111111 13:3333333333322111111111111111111111111111 12:33333333333.1111111111111111111111111111)WR( 11:3333333333331111111111111111111111111111 10:333333333333.111111111111111111111111111 9:333333333333..11111111111111111111111111 8:333333333333...1111111111111111111111111 7:333333333333....111111111111111111111111 6:333333333333.....11111111111111111111111 5:333333333333......1111111111111111111111 4:333333333333.......111111111111111111111 3:333333333333........11111111111111111111 2:333333333333.........1111111111111111111 1:333333333333..........111111111111111111)RP( )0 P(The annulus, box, circle, ellipse, and pie shapes also accept an )BD(n=[int])ES( syntax for specifying multiple regions. The )BD(n=[int])ES(syntax interprets the previous \201shape-dependent\202 arguments as lower and upper limits for the region and creates n shapes with evenly spaced boundaries. For example, if )BD(n=[int])ES( is specified in an annulus, the two immediately preceding radii \201)BD(rn)ES( and )BD(rm)ES(\202 are divided into )BD(int)ES( annuli, such that the inner radius of the first is )BD(rn)ES( and the outer radius of the last is )BD(rm)ES(. For example, ) 1 24 PR( ANNULUS 20 20 5 20 n=3)RP( is equivalent to: ) 1 26 PR( ANNULUS 20 20 5 10 15 20)RP( If this syntax is used with an ellipse or box, then the two preceding pairs of values are taken to be lower and upper limits for a set of ellipses or boxes. A circle uses the two preceding arguments for upper and lower radii. For pie, the two preceding angles are divided into n wedges such that the starting angle of the first is the lower bound and the ending angle of the last is the upper bound. In all cases, the )BD(n=[int])ES( syntax allows any single alphabetic character before the "=", i.e, i=3, z=3, etc. are all equivalent. )0 P(Also note that for boxes and ellipses, the optional angle argument is always specified after the )BD(n=[int])ES( syntax. For example: ) 45 57 PR( ellipse 20 20 4 6 16 24 n=3 45 ) 44 57 PR(specifies 3 elliptical regions at an angle of 45 degrees: ) 42 45 PR( 1234567890123456789012345678901234567890 ---------------------------------------- 40:........33333333........................ 39:.....33333333333333..................... 38:....33333333333333333................... 37:...33333333333333333333................. 36:..33333333333333333333333............... 35:.3333333333222223333333333.............. 34:3333333322222222222233333333............ 33:33333332222222222222223333333........... 32:333333222222222222222222333333.......... 31:3333322222222222222222222333333......... 30:33333222222222111122222222333333........ 29:333332222222111111112222222333333....... 28:3333222222211111111111222222333333...... 27:3333222222111111111111112222233333...... 26:33332222221111111111111112222233333..... 25:33332222211111111.111111112222233333.... 24:333322222111111......111111222223333.... 23:333322222111111.......111112222233333... 22:33333222221111.........11111222223333... 21:333332222211111.........11112222233333.. 20:.33332222211111.........11111222223333.. 19:.33333222221111.........111112222233333. 18:..33332222211111.........11112222233333. 17:..333332222211111.......111111222233333. 16:...333322222111111......111111222223333. 15:...333332222211111111.111111112222233333)WR( 14:....333332222211111111111111122222233333)WR( 13:.....33333222221111111111111122222233333 12:.....33333322222211111111111222222233333)WR( 11:......3333332222222111111112222222333333 10:.......333333222222221111222222222333333 9:........33333322222222222222222222333333 8:.........333333222222222222222222333333. 7:..........33333332222222222222223333333. 6:...........3333333322222222222233333333. 5:.............3333333333222223333333333.. 4:..............33333333333333333333333... 3:................33333333333333333333.... 2:..................33333333333333333..... 1:....................33333333333333......)RP( )0 P(Both the variable argument syntax and the )BD(n=[int])ES( syntax must occur alone in a region descriptor \201aside from the optional angle for boxes and ellipses\202. They cannot be combined. Thus, it is not valid to precede or follow an )BD(n=[int])ES( accelerator with more angles or radii, as in this example: ) 3 49 PR( # INVALID -- one too many angles before a=5 ... # and no angles are allowed after a=5 PIE 12 12 10 25 50 a=5 85 135)RP( Instead, use three separate specifications, such as: ) 3 21 PR( PIE 12 12 10 25 PIE 12 12 25 50 a=5 PIE 12 12 85 135)RP( The original \201IRAF\202 implementation of region filtering permitted this looser syntax, but we found it caused more confusion than it was worth and therefore removed it. )0 P(NB: Accelerators may be combined with other shapes in a boolean expression in any order. \201This is a change starting with funtools v1.1.1. Prior to this release, the accelerator shape had to be specified last\202. The actual region mask id values returned depend on the order in which the shapes are specified, although the total number of pixels or rows that pass the filter will be consistent. For this reason, use of accelerators in boolean expressions is discouraged in programs such as funcnts, where region mask id values are used to count events or image pixels. )0 P([All region masks displayed in this document were generated using the )BD(fundisp)ES( routine and the undocumented "mask=all" argument \201with spaced removed using sed \202: ) 2 72 PR( fundisp "funtools/funtest/test40.fits[ANNULUS 25 25 5 10]" mask=all |\200 sed 's/ //g')RP( Note that you must supply an image of the appropriate size -- in this case, a FITS image of dimension 40x40 is used.] )0 P()0 0 1 A(Go to Funtools Help Index)0 0 TN TL()Ec /AF f D( )0 5 121 H(Last)WB 200 Sn( updated: March 12, 2007)EH( )WB NL /Cb Db D /Ct [16#00 16#00 16#00] D /Cl [16#00 16#00 16#00] D /CL -1 D Ct Sc DS /Ba f D /BO 0 D Bs /UR (regalgebra.html) D /Ti (Region Algebra) D /Au () D /Df f D /ME [()] D 0 BO R ()1 Sl()WB 56 Sn( )0 2 122 H(RegAlgebra:)WB 202 Sn()WB 201 Sn( Boolean Algebra on Spatial Regions)EA()EH( )0 2 123 H(Summary)WB 203 Sn()EH( )0 P(This document describes the boolean arithmetic defined for region expressions. )0 2 124 H(Description)WB 204 Sn()EH( )0 P(When defining a region, several shapes can be combined using boolean operations. The boolean operators are \201in order of precedence\202: ) 6 53 PR( Symbol Operator Associativity ------ -------- ------------- ! not right to left & and left to right ^ exclusive or left to right | inclusive or left to right)RP( For example, to create a mask consisting of a large circle with a smaller box removed, one can use the )BD(and)ES( and )BD(not)ES( operators: ) 1 36 PR( CIRCLE\20111,11,15\202 & !BOX\20111,11,3,6\202)RP( and the resulting mask is: ) 42 49 PR( 1234567890123456789012345678901234567890 ---------------------------------------- 1:1111111111111111111111.................. 2:1111111111111111111111.................. 3:11111111111111111111111................. 4:111111111111111111111111................ 5:111111111111111111111111................ 6:1111111111111111111111111............... 7:1111111111111111111111111............... 8:1111111111111111111111111............... 9:111111111...1111111111111............... 10:111111111...1111111111111............... 11:111111111...1111111111111............... 12:111111111...1111111111111............... 13:111111111...1111111111111............... 14:111111111...1111111111111............... 15:1111111111111111111111111............... 16:1111111111111111111111111............... 17:111111111111111111111111................ 18:111111111111111111111111................ 19:11111111111111111111111................. 20:1111111111111111111111.................. 21:1111111111111111111111.................. 22:111111111111111111111................... 23:..11111111111111111..................... 24:...111111111111111...................... 25:.....11111111111........................ 26:........................................ 27:........................................ 28:........................................ 29:........................................)WR( 30:........................................ 31:........................................ 32:........................................ 33:........................................ 34:........................................ 35:........................................ 36:........................................ 37:........................................ 38:........................................ 39:........................................ 40:........................................)RP( A three-quarter circle can be defined as: ) 1 40 PR( CIRCLE\20120,20,10\202 & !PIE\20120,20,270,360\202)RP( and looks as follows: ) 42 49 PR( 1234567890123456789012345678901234567890 ---------------------------------------- 1:........................................ 2:........................................ 3:........................................ 4:........................................ 5:........................................ 6:........................................ 7:........................................ 8:........................................ 9:........................................ 10:........................................ 11:...............111111111................ 12:..............11111111111............... 13:............111111111111111............. 14:............111111111111111............. 15:...........11111111111111111............ 16:..........1111111111111111111........... 17:..........1111111111111111111........... 18:..........1111111111111111111........... 19:..........1111111111111111111........... 20:..........1111111111111111111........... 21:..........1111111111.................... 22:..........1111111111.................... 23:..........1111111111.................... 24:..........1111111111.................... 25:...........111111111.................... 26:............11111111.................... 27:............11111111.................... 28:..............111111.................... 29:...............11111....................)WR( 30:........................................ 31:........................................ 32:........................................ 33:........................................ 34:........................................ 35:........................................ 36:........................................ 37:........................................ 38:........................................ 39:........................................ 40:........................................)RP( Two non-intersecting ellipses can be made into the same region: ) 1 40 PR( ELL\20120,20,10,20,90\202 | ELL\2011,1,20,10,0\202)RP( and looks as follows: ) 42 49 PR( 1234567890123456789012345678901234567890 ---------------------------------------- 1:11111111111111111111.................... 2:11111111111111111111.................... 3:11111111111111111111.................... 4:11111111111111111111.................... 5:1111111111111111111..................... 6:111111111111111111...................... 7:1111111111111111........................ 8:111111111111111......................... 9:111111111111............................ 10:111111111............................... 11:...........11111111111111111............ 12:........111111111111111111111111........ 13:.....11111111111111111111111111111...... 14:....11111111111111111111111111111111.... 15:..11111111111111111111111111111111111... 16:.1111111111111111111111111111111111111.. 17:111111111111111111111111111111111111111. 18:111111111111111111111111111111111111111. 19:111111111111111111111111111111111111111. 20:111111111111111111111111111111111111111. 21:111111111111111111111111111111111111111. 22:111111111111111111111111111111111111111. 23:111111111111111111111111111111111111111. 24:.1111111111111111111111111111111111111.. 25:..11111111111111111111111111111111111... 26:...11111111111111111111111111111111..... 27:.....11111111111111111111111111111...... 28:.......111111111111111111111111......... 29:...........11111111111111111............)WR( 30:........................................ 31:........................................ 32:........................................ 33:........................................ 34:........................................ 35:........................................ 36:........................................ 37:........................................ 38:........................................ 39:........................................ 40:........................................)RP( You can use several boolean operations in a single region expression, to create arbitrarily complex regions. With the important exception below, you can apply the operators in any order, using parentheses if necessary to override the natural precedences of the operators. )0 P(NB: Using a panda shape is always much more efficient than explicitly specifying "pie & annulus", due to the ability of panda to place a limit on the number of pixels checked in the pie shape. If you are going to specify the intersection of pie and annulus, use panda instead. )0 P(As described in "help regreometry", the )BD(PIE)ES( slice goes to the edge of the field. To limit its scope, )BD(PIE)ES( usually is is combined with other shapes, such as circles and annuli, using boolean operations. In this context, it is worth noting that that there is a difference between )BD(-PIE)ES( and )BD(&!PIE)ES(. The former is a global exclude of all pixels in the )BD(PIE)ES( slice, while the latter is a local excludes of pixels affecting only the region\201s\202 with which the )BD(PIE)ES( is combined. For example, the following region uses )BD(&!PIE)ES( as a local exclude of a single circle. Two other circles are also defined and are unaffected by the local exclude: ) 21 56 PR( CIRCLE\2011,8,1\202 CIRCLE\2018,8,7\202&!PIE\2018,8,60,120\202&!PIE\2018,8,240,300\202 CIRCLE\20115,8,2\202 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 - - - - - - - - - - - - - - - 15: . . . . . . . . . . . . . . . 14: . . . . 2 2 2 2 2 2 2 . . . . 13: . . . 2 2 2 2 2 2 2 2 2 . . . 12: . . 2 2 2 2 2 2 2 2 2 2 2 . . 11: . . 2 2 2 2 2 2 2 2 2 2 2 . . 10: . . . . 2 2 2 2 2 2 2 . . . . 9: . . . . . . 2 2 2 . . . . 3 3 8: 1 . . . . . . . . . . . . 3 3 7: . . . . . . 2 2 2 . . . . 3 3 6: . . . . 2 2 2 2 2 2 2 . . . . 5: . . 2 2 2 2 2 2 2 2 2 2 2 . . 4: . . 2 2 2 2 2 2 2 2 2 2 2 . . 3: . . . 2 2 2 2 2 2 2 2 2 . . . 2: . . . . 2 2 2 2 2 2 2 . . . . 1: . . . . . . . . . . . . . . .)RP( Note that the two other regions are not affected by the )BD(&!PIE)ES(, which only affects the circle with which it is combined. )0 P(On the other hand, a )BD(-PIE)ES( is an global exclude that does affect other regions with which it overlaps: ) 23 39 PR( CIRCLE\2011,8,1\202 CIRCLE\2018,8,7\202 -PIE\2018,8,60,120\202 -PIE\2018,8,240,300\202 CIRCLE\20115,8,2\202 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 - - - - - - - - - - - - - - - 15: . . . . . . . . . . . . . . . 14: . . . . 2 2 2 2 2 2 2 . . . . 13: . . . 2 2 2 2 2 2 2 2 2 . . . 12: . . 2 2 2 2 2 2 2 2 2 2 2 . . 11: . . 2 2 2 2 2 2 2 2 2 2 2 . . 10: . . . . 2 2 2 2 2 2 2 . . . . 9: . . . . . . 2 2 2 . . . . . . 8: . . . . . . . . . . . . . . . 7: . . . . . . 2 2 2 . . . . . . 6: . . . . 2 2 2 2 2 2 2 . . . . 5: . . 2 2 2 2 2 2 2 2 2 2 2 . . 4: . . 2 2 2 2 2 2 2 2 2 2 2 . . 3: . . . 2 2 2 2 2 2 2 2 2 . . . 2: . . . . 2 2 2 2 2 2 2 . . . . 1: . . . . . . . . . . . . . . .)RP( The two smaller circles are entirely contained within the two exclude )BD(PIE)ES( slices and therefore are excluded from the region. )0 P()0 0 1 A(Go to Funtools Help Index)0 0 TN TL()Ec /AF f D( )0 5 125 H(Last)WB 205 Sn( updated: November 17, 2005)EH( )WB NL /Cb Db D /Ct [16#00 16#00 16#00] D /Cl [16#00 16#00 16#00] D /CL -1 D Ct Sc DS /Ba f D /BO 0 D Bs /UR (regcoords.html) D /Ti (Spatial Region Coordinates) D /Au () D /Df f D /ME [()] D 0 BO R ()1 Sl()WB 57 Sn( )0 2 126 H(RegCoords:)WB 207 Sn()WB 206 Sn( Spatial Region Coordinates)EA()EH( )0 2 127 H(Summary)WB 208 Sn()EH( )0 P(This document describes the specification of coordinate systems, and the interpretation of coordinate values, for spatial region filtering. )0 2 128 H(Pixel)WB 209 Sn( coordinate systems)EH( )0 P(The default coordinate system for regions is PHYSICAL, which means that region position and size values are taken from the original data. \201Note that this is a change from the original IRAF/PROS implementation, in which the IMAGE coordinate system was the default.\202 PHYSICAL coordinates always refer to pixel positions on the original image \201using IRAF LTM and LTV keywords\202. With PHYSICAL coordinates, if a set of coordinates specifies the position of an object in an original FITS file, the same coordinates will specify the same object in any FITS derived from the original. Physical coordinates are invariant with blocking of FITS files or taking sections of images, even when a blocked section is written to a new file. )0 P(Thus, although a value in pixels refers, by default, to the PHYSICAL coordinate system, you may specify that position values refer to the image coordinate system using the )BD(global)ES( or )BD(local)ES( properties commands: ) 2 23 PR( global coordsys image circle 512 512 100)RP( The )BD(global)ES( command changes the coordinate system for all regions that follow, while the )BD(local)ES( command changes the coordinate system only for the region immediately following: ) 3 22 PR( local coordsys image circle 512 512 100 circle 1024 1024 200)RP( This changes the coordinate system only for the region that follows. In the above example, the second region uses the global coordinate system \201PHYSICAL by default\202. )0 P()0 2 129 H(World)WB 210 Sn( Coordinate Systems)EH( If World Coordinate System information is contained in the data file being filtered, it also is possible to define regions using a sky coordinate system. Supported systems include: ) 10 67 PR( name description ---- ----------- PHYSICAL pixel coords of original file using LTM/LTV IMAGE pixel coords of current file FK4, B1950 sky coordinate systems FK5, J2000 sky coordinate systems GALACTIC sky coordinate systems ECLIPTIC sky coordinate systems ICRS currently same as J2000 LINEAR linear wcs as defined in file)RP( In addition, two mosaic coordinate systems have been defined that utilize the \201evolving\202 IRAF mosaic keywords: ) 4 68 PR( name description ---- ----------- AMPLIFIER mosaic coords of original file using ATM/ATV DETECTOR mosaic coords of original file using DTM/DTV)RP( Again, to use one of these coordinate systems, the )BD(global)ES( or )BD(local)ES( properties commands are used: ) 1 26 PR( global coordsys galactic)RP( )0 2 130 H(WCS)WB 211 Sn( Positions and Sizes)EH( In addition to pixels, positional values in a WCS-enabled region can be specified using sexagesimal or degrees format: ) 11 57 PR( position arguments description ------------------ ----------- [num] context-dependent \201see below\202 [num]d degrees [num]r radians [num]p physical pixels [num]i image pixels [num]:[num]:[num] hms for 'odd' position arguments [num]:[num]:[num] dms for 'even' position arguments [num]h[num]m[num]s explicit hms [num]d[num]m[num]s explicit dms)RP( If ':' is used as sexagesimal separator, the value is considered to be specifying hours/minutes/seconds if it is the first argument of a positional pair, and degrees/minutes/seconds for the second argument of a pair \201except for galactic coordinates, which always use degrees\202: ) 7 78 PR( argument description ----------- ----------- 10:20:30.0 10 hours, 20 minutes, 30 seconds for 1st positional argument 10 degrees, 20 minutes, 30 seconds for 2nd positional argument 10h20m30.0 10 hours, 20 minutes, 30 seconds 10d20m30.0 10 degrees, 20 minutes, 30 seconds 10.20d 10.2 degrees)RP( Similarly, the units of size values are defined by the formating character\201s\202 attached to a number: ) 9 53 PR( size arguments description -------------- ----------- [num] context-dependent \201see below\202 [num]" arc seconds [num]' arc minutes [num]d degrees [num]r radians [num]p physical pixels [num]i image pixels)RP( For example: ) 8 34 PR( argument description ----------- ----------- 10 ten pixels 10' ten minutes of arc 10" ten seconds of arc 10d ten degrees 10p ten pixels 0.5r half of a radian)RP( )0 P(An example of using sky coordinate systems follows: ) 4 65 PR( global coordsys B1950 -box 175.54d 20.01156d 10' 10' local coordsys J2000 pie 179.57d 22.4d 0 360 n=4 && annulus 179.57d 22.4d 3' 24' n=5)RP( At the FK4 1950 coordinates 175.54d RA, 20.01156d DEC exclude a 10 minute by 10 minute box. Then at the FK5 2000 coordinates 179.57d RA 22.4d DEC draw a radial profile regions pattern with 4 quadrants and 5 annuli ranging from 3 minutes to 24 minutes in diameter. In this example, the default coordinate system is overridden by the commands in the regions spec. )0 2 131 H(NB:)WB 212 Sn( The Meaning of Pure Numbers Are Context Sensitive)EH( )0 P(When a "pure number" \201i.e. one without a format directive such as 'd' for 'degrees'\202 is specified as a position or size, its interpretation depends on the context defined by the 'coordsys' keyword. In general, the rule is: )0 P()BD(All pure numbers have implied units corresponding to the current coordinate system.)ES( )0 P(If no coordinate system is explicitly specified, the default system is implicitly assumed to be PHYSICAL. In practice this means that for IMAGE and PHYSICAL systems, pure numbers are pixels. Otherwise, for all systems other than LINEAR, pure numbers are degrees. For LINEAR systems, pure numbers are in the units of the linear system. This rule covers both positions and sizes. )0 P(As a corollary, when a sky-formatted number is used with the IMAGE or PHYSICAL coordinate system \201which includes the default case of no coordsys being specified\202, the formatted number is assumed to be in the units of the WCS contained in the current file. If no sky WCS is specified, an error results. )0 P(Examples: ) 2 43 PR( circle\201512,512,10\202 ellipse 202.44382d 47.181656d 0.01d 0.02d)RP( )0 P(In the absence of a specified coordinate system, the circle uses the default PHYSICAL units of pixels, while the ellipse explicitly uses degrees, presumably to go with the WCS in the current file. ) 5 43 PR( global coordsys=fk5 global color=green font="system 10 normal" circle 202.44382 47.181656 0.01 circle 202.44382 47.181656 10p ellipse\201512p,512p,10p,15p,20\202)RP( )0 P(Here, the circles use the FK5 units of degrees \201except for the explicit use of pixels in the second radius\202, while the ellipse explicitly specifies pixels. The ellipse angle is in degrees. )0 P(Note that Chandra data format appears to use "coordsys=physical" implicitly. Therefore, for most Chandra applications, valid regions can be generated safely by asking ds9 to save/display regions in pixels using the PHYSICAL coordsys. )0 P()0 0 1 A(Go to Funtools Help Index)0 0 TN TL()Ec /AF f D( )0 5 132 H(Last)WB 213 Sn( updated: November 17, 2005)EH( )WB NL /Cb Db D /Ct [16#00 16#00 16#00] D /Cl [16#00 16#00 16#00] D /CL -1 D Ct Sc DS /Ba f D /BO 0 D Bs /UR (regbounds.html) D /Ti (Spatial Region Boundaries) D /Au () D /Df f D /ME [()] D 0 BO R ()1 Sl()WB 58 Sn( )0 2 133 H(RegBounds:)WB 215 Sn()WB 214 Sn( Region Boundaries)EA()EH( )0 2 134 H(Summary)WB 216 Sn()EH( Describes how spatial region boundaries are handled. )0 2 135 H(Description)WB 217 Sn()EH( )0 P(The golden rule for spatial region filtering was first enunciated by Leon VanSpeybroeck in 1986: )0 P()BD(Each photon will be counted once, and no photon will be counted more than once)ES(. )0 P(This means that we must be careful about boundary conditions. For example, if a circle is contained in an annulus such that the inner radius of the annulus is the same as the radius of the circle, then photons on that boundary must always be assigned to one or the other region. That is, the number of photons in both regions must equal the sum of the number of photons in each region taken separately. With this in mind, the rules for determining whether a boundary image pixel or table row are assigned to a region are defined below. )0 2 136 H(Image)WB 218 Sn( boundaries : radially-symmetric shapes \201circle, annuli, ellipse\202)EH( For image filtering, pixels whose center is inside the boundary are included. This also applies non-radially-symmetric shapes. When a pixel center is exactly on the boundary, the pixel assignment rule is: )UL()-1 LI( the outer boundary of a symmetric shape does not include such pixels )-1 LI( the inner boundary of a symmetric shape \201annulus\202 includes such pixels)LU( In this way, an annulus with radius from 0 to 1, centered exactly on a pixel, includes the pixel on which it is centered, but none of its neighbors. These rules ensure that when defining concentric shapes, no pixels are omitted between concentric regions and no pixels are claimed by two regions. When applied to small symmetric shapes, the shape is less likely to be skewed, as would happen with non-radially-symmetric rules. These rules differ from the rules for box-like shapes, which are more likely to be positioned adjacent to one another. )0 2 137 H(Image)WB 219 Sn( Boundaries: non-radially symmetric shapes \201polygons, boxes\202)EH( For image filtering, pixels whose center is inside the boundary are included. This also applies radially-symmetric shapes. When a pixel center is exactly on the boundary of a non-radially symmetric region, the pixel is included in the right or upper region, but not the left or lower region. This ensures that geometrically adjoining regions touch but don't overlap. )0 2 138 H(Row)WB 220 Sn( Boundaries are Analytic)EH( When filtering table rows, the boundary rules are the same as for images, except that the calculation is not done on the center of a pixel, \201since table rows, especially X-ray events rows, often have discrete, floating point positions\202 but are calculated exactly. That is, an row is inside the boundary without regard to its integerized pixel value. For rows that are exactly on a region boundary, the above rules are applied to ensure that all rows are counted once and no row is counted more than once. )0 P(Because row boundaries are calculated differently from image boundaries, certain programs will give different results when filtering the same region file. In particular, fundisp/funtable \201which utilize analytic row filtering\202 perform differently from funcnts \201which performs image filtering, even on tables\202. )0 2 139 H(Image)WB 221 Sn( Boundaries vs. Row Boundaries: Practical Considerations)EH( )0 P(You will sometimes notice a discrepancy between running funcnts on an binary table file and running fundisp on the same file with the same filter. For example, consider the following: ) 2 49 PR( fundisp test1.fits"[box\2014219,3887,6,6,0\202]" | wc 8893 320148 3752846)RP( Since fundisp has a 2-line header, there are actually 8891 photons that pass the filter. But then run funtable and select only the rows that pass this filter, placing them in a new file: ) 1 58 PR( ./funtable test1.fits"[box\2014219,3887,6,6,0\202]" test2.fits)RP( Now run funcnts using the original filter on the derived file: ) 12 61 PR( ./funcnts test2.fits "physical; box\2014219,3887,6,6,0\202" [... lot of processed output ...] # the following source and background components were used: source region\201s\202 ---------------- physical; box\2014219,3887,6,6,0\202 reg counts pixels ---- ------------ --------- 1 7847.000 36)RP( There are 1044 rows \201events\202 that pass the row filter in fundisp \201or funtable\202 but fail to make it through funcnts. Why? )0 P(The reason can be traced to how analytic row filtering \201fundisp, funtable\202 differs from integerized pixel filtering\201funcnts, funimage\202. Consider the region: ) 1 22 PR( box\2014219,3887,6,6,0\202)RP( Analytically \201i.e., using row filtering\202, positions will pass this filter successfully if: ) 2 19 PR( 4216 <= x <= 4222 3884 <= y <= 3890)RP( For example, photons with position values of x=4216.4 or y=3884.08 will pass. )0 P(Integerized image filtering is different in that the pixels that will pass this filter have centers at: ) 2 40 PR( x = 4217, 4218, 4219, 4220, 4221, 4222 y = 3885, 3886, 3887, 3888, 3889, 3890)RP( Note that there are 6 pixels in each direction, as specified by the region. That means that positions will pass the filter successfully if: ) 2 24 PR( 4217 <= \201int\202x <= 4222 3885 <= \201int\202y <= 3890)RP( Photons with position values of x=4216.4 or y=3884.08 will NOT pass. )0 P(Note that the position values are integerized, in effect, binned into image values. This means that x=4222.4 will pass this filter, but not the analytic filter above. We do this to maintain the design goal that either all counts in a pixel are included in an integerized filter, or else none are included. )0 P([It could be argued that the correct photon limits for floating point row data really should be: ) 2 23 PR( 4216.5 <= x <= 4222.5 3884.5 <= y <= 3890.5)RP( since each pixel extends for .5 on either side of the center. We chose to the maintain integerized algorithm for all image-style filtering so that funcnts would give the exact same results regardless of whether a table or a derived non-blocked binned image is used.] )0 P()0 0 1 A(Go to Funtools Help Index)0 0 TN TL()Ec /AF f D( )0 5 140 H(Last)WB 222 Sn( updated: November 16, 2005)EH( )WB NL /Cb Db D /Ct [16#00 16#00 16#00] D /Cl [16#00 16#00 16#00] D /CL -1 D Ct Sc DS /Ba f D /BO 0 D Bs /UR (regdiff.html) D /Ti (Differences Between Funtools and IRAF Regions) D /Au () D /Df f D /ME [()] D 0 BO R ()1 Sl()WB 59 Sn( )0 2 141 H(RegDiff:Differences)WB 224 Sn()WB 223 Sn( Between Funtools and IRAF Regions)EA()EH( )0 2 142 H(Summary)WB 225 Sn()EH( Describes the differences between Funtools/ds9 regions and the old IRAF/PROS regions. )0 2 143 H(Description)WB 226 Sn()EH( )0 P(We have tried to make Funtools regions compatible with their predecessor, IRAF/PROS regions. For simple regions and simple boolean algebra between regions, there should be no difference between the two implementations. The following is a list of differences and incompatibilities between the two: )UL( )0 P()-1 LI(If a pixel is covered by two different regions expressions, Funtools assigns the mask value of the )BD(first)ES( region that contains that pixel. That is, successive regions )BD(do not)ES( overwrite previous regions in the mask, as was the case with the original PROS regions. This means that one must define overlapping regions in the reverse order in which they were defined in PROS. If region N is fully contained within region M, then N should be defined )BD(before)ES( M, or else it will be "covered up" by the latter. This change is necessitated by the use of optimized filter compilation, i.e., Funtools only tests individual regions until a proper match is made. )0 P()-1 LI( The )BD(PANDA)ES( region has replaced the old PROS syntax in which a )BD(PIE)ES( accelerator was combined with an )BD(ANNULUS)ES( accelerator using )BD(AND)ES(. That is, ) 1 48 PR( ANNULUS\20120,20,0,15,n=4\202 & PIE\20120,20,0,360,n=3\202)RP( has been replaced by: ) 1 29 PR( PANDA\20120,20,0,360,3,0,15,4\202)RP( The PROS syntax was inconsistent with the meaning of the )BD(AND)ES( operator. )0 P()-1 LI( The meaning of pure numbers \201i.e., without format specifiers\202 in regions has been clarified, as has the syntax for specifying coordinate systems. See the general discussion on )0 54 1 A(Spatial Region Filtering)54 0 TN TL()Ec /AF f D( for more information. )LU( )0 P()0 0 1 A(Go to Funtools Help Index)0 0 TN TL()Ec /AF f D( )0 5 144 H(Last)WB 227 Sn( updated: November 16, 2005)EH( )WB NL /Cb Db D /Ct [16#00 16#00 16#00] D /Cl [16#00 16#00 16#00] D /CL -1 D Ct Sc DS /Ba f D /BO 0 D Bs /UR (combo.html) D /Ti (Combining Region and Table Filters) D /Au () D /Df f D /ME [()] D 0 BO R ()1 Sl()WB 60 Sn( )0 2 145 H(FunCombine:)WB 230 Sn()WB 228 Sn( Combining Region and Table Filters)EA()EH( )0 2 146 H(Summary)WB 231 Sn()EH( )0 P(This document discusses the conventions for combining region and table filters, especially with regards to the comma operator. )0 2 147 H(Comma)WB 232 Sn()WB 229 Sn( Conventions)EA()EH( )0 P(Filter specifications consist of a series of boolean expressions, separated by commas. These expressions can be table filters, spatial region filters, or combinations thereof. Unfortunately, common usage requires that the comma operator must act differently in different situations. Therefore, while its use is intuitive in most cases, commas can be a source of confusion. )0 P(According to long-standing usage in IRAF, when a comma separates two table filters, it takes on the meaning of a boolean )BD(and)ES(. Thus: ) 1 24 PR( foo.fits[pha==1,pi==2])RP( is equivalent to: ) 1 27 PR( foo.fits[pha==1 && pi==2])RP( When a comma separates two spatial region filters, however, it has traditionally taken on the meaning of a boolean )BD(or)ES(. Thus: ) 1 46 PR( foo.fits[circle\20110,10,3\202,ellipse\20120,20,8,5\202])RP( is equivalent to: ) 1 49 PR( foo.fits[circle\20110,10,3\202 || ellipse\20120,20,8,5\202])RP( \201except that in the former case, each region is given a unique id in programs such as funcnts\202. )0 P(Region and table filters can be combined: ) 1 34 PR( foo.fits[circle\20110,10,3\202,pi=1:5])RP( or even: ) 1 61 PR( foo.fits[pha==1&&circle\20110,10,3\202,pi==2&&ellipse\20120,20,8,5\202])RP( In these cases, it is not obvious whether the command should utilize an )BD(or)ES( or )BD(and)ES( operator. We therefore arbitrarily chose to implement the following rule: )UL()-1 LI( if both expressions contain a region, the operator used is )BD(or)ES(. )-1 LI( if one \201or both\202 expression\201s\202 does not contain a region, the operator used is )BD(and)ES(.)LU( This rule handles the cases of pure regions and pure column filters properly. It unambiguously assigns the boolean )BD(and)ES( to all mixed cases. Thus: ) 1 34 PR( foo.fits[circle\20110,10,3\202,pi=1:5])RP( and ) 1 34 PR( foo.fits[pi=1:5,circle\20110,10,3\202])RP( both are equivalent to: ) 1 37 PR( foo.fits[circle\20110,10,3\202 && pi=1:5])RP( )0 P([NB: This arbitrary rule )BD(replaces the previous arbitrary rule)ES( \201pre-funtools 1.2.3\202 which stated: )UL()-1 LI( if the 2nd expression contains a region, the operator used is )BD(or)ES(. )-1 LI( if the 2nd expression does not contain a region, the operator used is )BD(and)ES(.)LU( In that scenario, the )BD(or)ES( operator was implied by: ) 1 21 PR( pha==4,circle 5 5 1)RP( while the )BD(and)ES( operator was implied by ) 1 21 PR( circle 5 5 1,pha==4)RP( Experience showed that this non-commutative treatment of the comma operator was confusing and led to unexpected results.] )0 P(The comma rule must be considered provisional: comments and complaints are welcome to help clarify the matter. Better still, we recommend that the comma operator be avoided in such cases in favor of an explicit boolean operator. )0 P()0 0 1 A(Go to Funtools Help Index)0 0 TN TL()Ec /AF f D( )0 5 148 H(Last)WB 233 Sn( updated: November 16, 2005)EH( )WB NL /Cb Db D /Ct [16#00 16#00 16#00] D /Cl [16#00 16#00 16#00] D /CL -1 D Ct Sc DS /Ba f D /BO 0 D Bs /UR (env.html) D /Ti (Funtools Environment Variables) D /Au () D /Df f D /ME [()] D 0 BO R ()1 Sl()WB 61 Sn( )0 2 149 H(FunEnv:)WB 235 Sn()WB 234 Sn( Funtools Environment Variables)EA()EH( )0 2 150 H(Summary)WB 236 Sn()EH( Describes the environment variables which can be used to tailor the overall Funtools environment. )0 2 151 H(Description)WB 237 Sn()EH( )0 P(The following environment variables are supported by Funtools: )0 DL()0 P()0 DT()BD(FITS_EXTNAME)ES( )DD( The )BD(FITS_EXTNAME)ES( environment variable specifies the default FITS extension name when )0 25 1 A(FunOpen\201\202)25 0 TN TL()Ec /AF f D( is called on a file lacking a primary image. Thus, ) 1 29 PR( setenv FITS_EXTNAME "NEWEV")RP( will allow you to call )0 25 1 A(FunOpen\201\202)25 0 TN TL()Ec /AF f D( on files without specifying NEWEV in the )0 42 1 A(Funtools bracket specification)42 0 TN TL()Ec /AF f D(. If no FITS_EXTNAME variable is defined and the extension name also is not passed in the bracket specification, then the default will be to look for standard X-ray event table extension names "EVENTS" or "STDEVT" \201we are, after all, and X-ray astronomy group at heart!\202. )0 P()0 DT()BD(FITS_EXTNUM)ES( )DD( The )BD(FITS_EXTNUM)ES( environment variable specifies the default FITS extension number when )0 25 1 A(FunOpen\201\202)25 0 TN TL()Ec /AF f D( is called on a file lacking a primary image. Thus, ) 1 22 PR( setenv FITS_EXTNUM 7)RP( will allow you to call )0 25 1 A(FunOpen\201\202)25 0 TN TL()Ec /AF f D( on files to open the seventh extension without specifying the number in the )0 42 1 A(Funtools bracket specification)42 0 TN TL()Ec /AF f D(. )0 P()0 DT()BD(FITS_BINCOLS)ES( and )BD(EVENTS_BINCOLS)ES( )DD( These environment variable specifies the default binning key for FITS binary tables and raw event files, respectively. They can be over-ridden using the )BD(bincols=[naxis1,naxis2])ES( keyword in a )0 42 1 A(Funtools bracket specification)42 0 TN TL()Ec /AF f D(. The value of each environment variable is a pair of comma-delimited columns, enclosed in parentheses, to use for binning. For example, if you want to bin on detx and dety by default, then use: ) 1 35 PR( setenv FITS_BINCOLS "\201detx,dety\202")RP( in preference to adding a bincols specification to each filename: ) 1 31 PR( foo.fits[bincols=\201detx,dety\202])RP( )0 P()0 DT()BD(FITS_BITPIX)ES( and )BD(EVENTS_BITPIX)ES( )DD( These environment variable specifies the default bitpix value for binning FITS binary tables and raw event files, respectively. They can be over-ridden using the )BD(bitpix=[value])ES( keyword in a )0 42 1 A(Funtools bracket specification)42 0 TN TL()Ec /AF f D(. The value of each environment variable is one of the standard FITS bitpix values \2018,16,32,-32,-64\202. For example, if you want binning routines to create a floating array, then use: ) 1 24 PR( setenv FITS_BITPIX -32)RP( in preference to adding a bitpix specification to each filename: ) 1 22 PR( foo.fits[bitpix=-32])RP( )0 P()0 DT()BD(ARRAY)ES( )DD( The )BD(ARRAY)ES( environment variable specifies the default definition of an array file for Funtools. It is used if there is no array specification passed in the )BD(ARRAY\201\202)ES( directive in a )0 46 1 A(Non-FITS Array specification)46 0 TN TL()Ec /AF f D(. The value of the environment variable is a valid array specification such as: ) 2 25 PR( setenv ARRAY "s100.150" foo.arr[ARRAY\201\202])RP( This can be defined in preference to adding the specification to each filename: ) 1 26 PR( foo.arr[ARRAY\201s100.150\202])RP( )0 P()0 DT()BD(EVENTS)ES( )DD( The )BD(EVENTS)ES( environment variable specifies the default definition of an raw event file for Funtools. It is used if there is no EVENTS specification passed in the )BD(EVENTS\201\202)ES( directive in a )0 45 1 A(Non-FITS EVENTS specification)45 0 TN TL()Ec /AF f D(. The value of the environment variable is a valid EVENTS specification such as: ) 2 73 PR( setenv EVENTS "x:J:1024,y:J:1024,pi:I,pha:I,time:D,dx:E:1024,dx:E:1024" foo.ev[EVENTS\201\202])RP( This can be defined in preference to adding the specification to each filename: ) 1 73 PR( foo.ev[EVENTS\201x:J:1024,y:J:1024,pi:I,pha:I,time:D,dx:E:1024,dx:E:1024\202])RP()LD( The following filter-related environment variables are supported by Funtools: )0 DL( )0 P()0 DT()BD(FILTER_PTYPE)ES( )DD( The )BD(FILTER_PTYPE)ES( environment variable specifies how to build a filter. There are three possible methods: )0 DL()0 DT(process or p )DD(The filter is compiled and linked against the funtools library \201which must therefore be accessible in the original install directory\202 to produce a slave program. This program is fed events or image data and returns filter results. )0 DT(dynamic or d \201gcc only\202 )DD(The filter is compiled and linked against the funtools library \201which must therefore be accessible in the original install directory\202 to produce a dynamic shared object, which is loaded into the funtools program and executed as a subroutine. \201Extensive testing has shown that, contrary to expectations, this method is no faster than using a slave process.\202 )0 DT(contained or c )DD(The filter and all supporting region code is compiled and linked without reference to the funtools library to produce a slave program \201which is fed events or image data and returns filter results\202. This method is slower than the other two, because of the time it takes to compile the region filtering code. It is used by stand-alone programs such as ds9, which do not have access to the funtools library.)LD( By default, )BD(dynamic)ES( is generally used for gcc compilers and )BD(process)ES( for other compilers. However the filter building algorithm will check for required external files and will use )BD(contained)ES( is these are missing. )0 P()0 DT()BD(FUN_MAXROW)ES( )DD( The )BD(FUN_MAXROW)ES( environment variable is used by core row-processing Funtools programs \201funtable, fundisp, funcnts, funhist, funmerge, and funcalc\202 to set the maximum number of rows read at once \201i.e. it sets the third argument to the FunTableRowGet\201\202 call\202. The default is 8192. Note that this variable is a convention only: it will not be a part of a non-core Funtools program unless code is explicitly added, since each call to FunTableRowGet\201\202 specifies its own maximum number of rows to read. NB: if you make this value very large, you probably will need to increase )BD(FUN_MAXBUFSIZE)ES( \201see below\202 as well. )0 P()0 DT()BD(FUN_MAXBUFSIZE)ES( )DD( The )BD(FUN_MAXBUFSIZE)ES( environment variable is used to limit the max buffer size that will be allocated to hold table row data. This buffer size is calculated to be the row size of the table multiplied by the maximum number of rows read at once \201see above\202. Since the row size is unlimited \201and we have examples of it being larger than 5 Mb\202, it is possible that the total buffer size will exceed the machine capabilities. We therefore set a default value of 5Mb for the max buffer size, and adjust maxrow so that the total size calculated is less than this max buffer size. \201If the row size is greater than this max buffer size, then maxrow is set to 1.\202 This environment variable will change the max buffer size allowed. )0 P()0 DT()BD(FILTER_CC)ES( )DD( The )BD(FILTER_CC)ES( environment variable specifies the compiler to use for compiling a filter specification. You also can use the )BD(CC)ES( environment variable. If neither has been set, then gcc will be used if available. Otherwise cc is used if available. )0 P()0 DT()BD(FILTER_EXTRA)ES( )DD( The )BD(FILTER_EXTRA)ES( environment variable specifies extra options to add to a filter compile command line. In principle, you can add libraries, include files, and compiler switches. This variable should be used with care. )0 P()0 DT()BD(FILTER_TMPDIR)ES( )DD( The )BD(FILTER_TMPDIR)ES( environment variable specifies the temporary directory for filter compilation intermediate files. You also can use the )BD(TMPDIR)ES( and )BD(TMP)ES( variables. By default, /tmp is used as the temporary directory. )0 P()0 DT()BD(FILTER_KEEP)ES( )DD( The )BD(FILTER_KEEP)ES( environment variable specifies whether the intermediate filter files \201i.e. C source file and compile log file\202 should be saved after a filter is built. The default is "false", so that these intermediate files are deleted. This variable is useful for debugging, but care should be taken to reset its value to false when debugging is complete. )LD( )0 P()0 0 1 A(Go to Funtools Help Index)0 0 TN TL()Ec /AF f D( )0 5 152 H(Last)WB 238 Sn( updated: November 16, 2005)EH( )WB NL /Cb Db D /Ct [16#00 16#00 16#00] D /Cl [16#00 16#00 16#00] D /CL -1 D Ct Sc DS /Ba f D /BO 0 D Bs /UR (changelog.html) D /Ti (Funtools ChangeLog) D /Au () D /Df f D /ME [()] D 0 BO R ()1 Sl()WB 62 Sn( )0 2 153 H(Funtools)WB 239 Sn( ChangeLog)EH( )0 P(This ChangeLog covers both the Funtools library and the suite of applications. It will be updated as we continue to develop and improve Funtools. The up-to-date version can be found )R5 2 A(here)EA(. [The changelog for the initial development of Funtools, covering the beta releases, can be found )R6 2 A(here)EA(.] )0 2 154 H()WB 240 Sn( Patch Release 1.4.5 \201internal ds9 release\202)EH( )UL()0 P()-1 LI( Removed permission checking from Find\201\202 on cygwin systems. This was broken by Windows 7. )0 P()-1 LI( Removed addition of -no-cpp-precomp flag from gcc 4.2 and beyond.)LU( )0 2 155 H()WB 241 Sn( Patch Release 1.4.4 \201internal ds9 release\202)EH( )UL()0 P()-1 LI( Fixed -J funcone, which was not properly outputting all rows. )0 P()-1 LI( Filter: when an image is flipped, the rotation angle must be reversed. )0 P()-1 LI( Filter: add support for windows-based ipc communication when using tcc compiler.)LU( )0 2 156 H()WB 242 Sn( Patch Release 1.4.3 \201internal ds9 release\202)EH( )UL()0 P()-1 LI( Filter: improve checks for existence of compiler, even if CC is set. )0 P()-1 LI( Change launch.h to xlaunch.h to avoid conflict with OS X. )0 P()-1 LI( handle flipped images in filtering)LU( )0 2 157 H()WB 243 Sn( Patch Release 1.4.2 \201internal ds9 release\202)EH( )UL()0 P( )-1 LI( Port to gcc 4.2. )0 P()-1 LI( Fix 1-byte filters on intel machines \201missing SW1 no-op\202. )0 P()-1 LI( Remove ambiguity from filt.l \201and calc.l\202 using [A-z] in a case-insensitive lexer. )0 P()-1 LI( In funsky, the default unit for RA was changed from hours to degrees. )0 P()-1 LI( Fixed bug in funtable in which TCRVL header values were output as strings. )0 P()-1 LI( Added support for running funtools filters in Rosetta \201i.e. running PPC executables on an Intel Mac\202 by sensing and handling data swap requirements. Only works with FILTER_PTYPE set to 'c' \201can't link against wrong architecture libraries\202. )0 P()-1 LI( Fixed bug in FITS library to allow "-" in extension names. )0 P()-1 LI( Code and documentation now agree that the copy extension specifier \201'+'\202 comes after the extension name.)LU( )0 2 158 H()WB 244 Sn( Patch Release 1.4.1 \201internal ds9 release\202)EH( )UL()0 P()-1 LI( Modified internal Launch\201\202 routine to use posix_spawn\201\202, if necessary. This is required for OS X 10.5 \201leopard\202, which frowns upon use of fork\201\202 and exec\201\202. Also modified zprocess routines to use Launch\201\202.)LU( )0 2 159 H()WB 245 Sn( Public Release 1.4.0 \20115 August 2007\202)EH( )UL()-1 LI( Public release of production-quality code, incorporating changes and improvements from previous beta releases, including: )UL()-1 LI( Support for access to ASCII text column files. )-1 LI( Support for fast indexed access of binary tables. )-1 LI( Support for database views of tables, i.e. pre-set values for the filter specification, the columns to activate, and display format. )-1 LI( New programs include funcone \201cone search\202, funindex \201create index files\202, and funcen \201calculate centroids within regions\202.)LU( )LU( )0 2 160 H()WB 246 Sn( Release 1.3.0b[n] \201mainly internal SAO beta releases\202)EH( )UL( )0 P()-1 LI( Added -F[c] switch to change the column delimiter to the specified character. )0 P()-1 LI( Extended fundisp's format switch \201-f\202 so that it can now handle complex formats such as 'x=sometext%3d- y=othertest%3d.ext'. )0 P()-1 LI( Added support for creating and processing 1D FITS images. )0 P()-1 LI( Added vcol=colname and vcol=/colname to filter specifications to support use of a third value column when binning 2D images. )0 P()-1 LI( Added switches to funcone to write out data rows are not within any cone \201-J, -X\202 and centers which have no close data rows \201-L\202. )0 P()-1 LI( In funjoin, added ability to specify a numeric tolerance for when joining two files. )0 P()-1 LI( shared memory support in gio now can create a shared segment if w+ is specified as the open mode. )0 P()-1 LI( Changed reggeometry man page so that examples correctly show angles going counter-clockwise from the x-axis instead of from the y-axis. )0 P()-1 LI( Added checks to funmerge to ensure that all files have the same columns. )0 P()-1 LI( Fixed bug in text support that prevented header-less files from being processed properly. )0 P()-1 LI( Added support for 64-bit images \201bitpix=64\202 and table columns \201TFORM=K\202. )0 P()-1 LI( Filter code was not applying bscale/bzero to columns. )0 P( )-1 LI( Fixed funimage bug that caused a .5/block error in WCS CRPIX values generated from binary tables. )0 P()-1 LI( Added feq\201a,b\202 and div\201a,b\202 macros to funcalc. )0 P()-1 LI( Added support for single-line #define to funcalc. )0 P()-1 LI( Updated wcs library to 3.6.6 )0 P()-1 LI( Fix bug in funcen in which ra,dec was not being calculated correctly if physical and image coords did not match up. )0 P()-1 LI( The filter syntax "col1 = col2" now explicitly generates an error \201you really want to do "col1 == col2"\202. )0 P()-1 LI( Added -o switch to include offset from the nominal target position. )0 P()-1 LI( Fundisp now displays multi-dimensional vector columns properly. )0 P()-1 LI( Documented support for lists of files processed as a single file using "list: file1 ... filen" syntax. )0 P()-1 LI( Fixed bugs in support for pipe file type \201i.e. ability to pass commands as a filename using "pipe: cmd arg1 ... argn" syntax\202. )0 P()-1 LI( Fixed bug in funhist processing of image-based pixel histograms \201i.e using "xy" for columns\202 where a region was specified. All pixels outside the region were erroneously being added to the bin containing the 0 value. )0 P()-1 LI( Disabled multi-file processing in funds9, which was breaking support for pathnames containing spaces and is not used by ds9 anyway. )0 P()-1 LI( Added support for Views of tables, i.e. pre-set values for the filter specification, the columns to activate, and display format \201though the latter is for fundisp only\202. )0 P()-1 LI( Added -l switch to funimage to read x, y, val columns from a list. )0 P()-1 LI( Removed useless and meaningless section syntax foo'[*]' because it breaks pointer de-referencing on string columns \201i.e. foo'[*xxx=='a']'\202. Use foo'[*,*]' instead, as documented. )0 P()-1 LI( String variables were not always being terminated properly in the filter code because FITS 'A' data is not necessarily null-terminated. )0 P()-1 LI( Added funtools version number to all usage\201\202 displays. )0 P()-1 LI( Added explanation of switch arguments to many usage\201\202 displays. )0 P()-1 LI( The filter keyword row# now supports single row selection as well as range selection, i.e., "row#=100" along with previous "row#=100:200". )0 P()-1 LI( fundisp now outputs "0x" before hex values. )0 P()-1 LI( Fixed bug in filter parser which processed rangelists incorrectly if spaces were put into the rangelist \201i.e. "pha= 1 : 3" instead of pha=1:3\202. )0 P()-1 LI( Fixed a bug in funindex which created a wrongly named index file if more than one "." was in the input file name. )0 P()-1 LI( Added support to funcone to take ra, dec, radius from a list \201i.e. columns in a FITS file or a text file\202. )0 P()-1 LI( Fixed a bug in FunColumnActivate so that if some columns are explicitly activated while others are de-activated, only the explicitly activated columns are activated \201code was activating all columns in this case\202. )0 P()-1 LI( Fixed a bug in funindex which prevented indexing tables containing a column named N. )0 P()-1 LI( fundisp now encloses ASCII column values in single quotes \201unless -T is specified to output RDB format\202. )0 P()-1 LI( If a filter specification only involves indexed columns, then the compiled filter is not used. )0 P()-1 LI( Funmerge can now be given a list of files to merge using @list syntax. Also removed the restriction on how many files can be merged \201was limited to the max number of open files\202. )0 P()-1 LI( Added ability to edit \201add, delete, modify\202 header parameters in funhead by specifying an output file \201editing acts as a filter\202 and an edit command file \201which can be stdin\202. )0 P()-1 LI( Funtools now contains preliminary code to support \201fast\202 indexed access of binary tables. See idx.html or "man funidx" for more details. )0 P()-1 LI( Funtools now contains preliminary code supporting access to ASCII column files. See text.html or "man funtext" for more details. )0 P()-1 LI( Fixed bug in funcalc in which columns used in an expression were always being replaced by new columns, with all associated parameters \201e.g. WCS\202 were being deleted. Now this only happens if the column explicitly changes its data type. )0 P()-1 LI( Fixed bug in funcalc in which the raw data and user data became out of sync for one row after every 8192 \201FUN_MAXROW\202 rows. )0 P()-1 LI( Fixed bug in gio in which gseek returned 0 instead of the current byte offset for disk files. )0 P()-1 LI( Added funcone program to perform cone search on RA, Dec columns in a FITS binary table. )0 P()-1 LI( Fixed bug in polygon, pie and rotated box region filtering for tables \201nearby rows exactly in line between two non-vertical or non-horizontal vertices were being accepted incorrectly\202. )0 P()-1 LI( Fixed pie and panda regions so that the angles now start from positive x axis == 0 degrees and run counter-clockwise, as documented. They were going from positive y. NB: a similar change was made to ds9 release 4.0b3. You must be using ds9 4.0b3 or later in order to have the correct behavior when generating regions in ds9 and using them in funtools. )0 P()-1 LI( Added -p [prog] switch to funcalc to save the generated program. instead of executing \201and deleting\202 it. )0 P()-1 LI( Upgraded zlib to 1.2.3. )LU( )0 2 161 H()WB 247 Sn( Patch Release 1.2.4 \201internal SAO and beta release only\202)EH( )UL( )0 P()-1 LI( In funcalc, added support for user-specified arguments via the -a [argstr] switch. These arguments are accessed in the compiled program using the supplied ARGC and ARGV\201n\202 macros. )0 P()-1 LI( Added -n \201no header display\202 to fundisp to skip outputting header. )0 P()-1 LI( Added checks for various types of blank filters. )0 P( )-1 LI( Added macros NROW \201current row number\202 and WRITE_ROW \201write current row to disk\202 to funcalc. )0 P()-1 LI( funcalc no longer requires that at least one data column be specified in the compiled expression. )0 P()-1 LI( Added FUN_NROWS to FunInfoGet\201\202 to return the total number of rows in an input table \201i.e. value of NAXIS2\202. )0 P( )-1 LI( The compiled funcalc program now includes stdlib.h and unistd.h. )0 P()-1 LI( The util/NaN.h header file is now modified at configure time to contain endian status for the target architecture. References to specific platforms have been removed. )0 P()-1 LI( Added -m switch to funtable to output multiple files, one for each input region \201and a separate file for events that pass the filters but are not in any region\202. )0 P()-1 LI( Added ability to add new parameters \201FunParamPutx\202 after writing data if space is previously reserved in the form of a blank parameter whose value is the name of the param to be updated. \201Also requires the append argument of FunParamPutx be set to 2\202. )0 P( )-1 LI( Added ability to build shared libraries. With --enable-shared=yes, shared library is built but not used. With --enable-shared=link, shared library is linked against \201requires proper installation and/or use of LD_LIBRARY_PATH\202. )0 P()-1 LI( Added -v [column] support to funcnts so that counts in a table can be accumulated using values from a specified column \201instead of the default case where an integral count is accumulated for each event in a region\202. )0 P()-1 LI( Added funcen program to calculate centroids within regions \201binary tables only\202. Also added support for a funcen-based centroid tool to funtools.ds9. )0 P()-1 LI( Fixed bug which prevented successful filtering of columns containing arrays. )0 P()-1 LI( Added filter check to ensure that a column is not incorrectly used as an array. )0 P()-1 LI( Fundisp now displays column arrays indexed from 0, not 1. )0 P()-1 LI( Added -i [interval] support to funcnts so that multiple intervals can be processed in a single pass through the data. For example, specifying -i "pha=1:5;pha=6:10;pha=11:15" will generate results in each of 3 pha bands. )0 P()-1 LI( Fixed calculation of LTV quantities when binning floating point column data \201value was off by 0.5\202. )0 P()-1 LI( Added support for 'D' in floating point header values. )0 P()-1 LI( Added -a switch to funimage and funtable to append output image or table to an existing FITS file \201as an IMAGE or BINTABLE extension\202. )0 P()-1 LI( Added support for column scaling \201TSCAL and TZERO\202 on input columns. Note that the default column type is changed to accommodate scaling \201e.g. a column of type 'I' is changed to 'J', 'J' is changed to 'D'\202 so that the scaled values can be handled properly by programs such as fundisp \201which utilize default types\202. )0 P( )-1 LI( Added support to FunColumnSelect\201\202 for handling structs of arrays \201i.e. where returned columns are contiguous\202 instead of the default array of structs \201returned row are contiguous\202. This is done by specifying "org=structofarrays" in the plist and passing a single struct containing the arrays. )0 P()-1 LI( When writing an rdb/starbase file, fundisp now outputs the full column name, regardless of the width of the column \201which ordinarily is truncated to match\202. )0 P()-1 LI( Fixed support for large files by changing all file positions variables from "long" declarations to "off_t. )0 P()-1 LI( Fixed bug in funcalc incorrectly processed multiple array references \201e.g. cur->foo[0]=cur->x;cur->foo[1]=cur->y;\202 within a single line of code. )0 P()-1 LI( Added FILTER_CFLAGS environment variable for all filtering. Also added --with-filter-cc and --with-filter-cflags options on configure to allow specification of a default C compiler and associated CFLAGS for filtering. All of this is necessary in order to support 64-bit libraries under Solaris. )0 P()-1 LI( Added the funtbl script to extract a table from Funtools ASCII output. )0 P()-1 LI( Added code to funimage to update IRAF DATASEC keyword. )0 P()-1 LI( Added checks to ensure that image dimensions are positive. )0 P()-1 LI( Fixed a bug in funimage where int data was being scaled using BSCALE and BZERO but these keywords also were being retained in the output image header. Now the data are not scaled unless the output data type is float \201in which case the scaling parameters are removed\202. )0 P()-1 LI( Fixed a bug in funmerge which prevented merging of files unless one of the -f, -w, or -x switches were used. )0 P()-1 LI( Fixed a bug in funtable and fundisp which caused the special '$n' column to be output incorrectly. )0 P()-1 LI( Fixed sort option in funtable, which previously worked only if the record size was an even divisor of 8192 \201and returned garbage otherwise\202. )0 P()-1 LI( Fixed bug in filters involving FITS data type 'X' \201bitfield\202. )0 P()-1 LI( Fixed bug in funcnts in which the output angles and radii were being displayed incorrectly when multiple panda shapes were specified. )0 P()-1 LI( Fixed bug in pandas and pies using n= syntax when first angle specified was greater than second. The resulting mask was of the correct shape but contained only a single region. )0 P()-1 LI( Table row access routines will now decrease maxrows if memory cannot be allocated for maxrows*sizeof\201row\202, i.e. if the size of a row is so large that space for maxrows cannot be allocated. )0 P()-1 LI( The FUN_MAXBUFSIZE environment variable was added to limit the max buffer size that will be allocated to hold table row data. The default is 5Mb. )0 P()-1 LI( Generated PostScript and PDF versions of the help pages. )0 P()-1 LI( Moved OPTIONS section before \201often-lengthy\202 DESCRIPTION section in man pages. )0 P()-1 LI( All memory allocation now does error checking on the result \201except wcs library, which is external code\202. )0 P()-1 LI( Removed some compiler warnings that surfaced when using gcc -O2. )0 P()-1 LI( Updated wcs library to 3.5.5. )0 P()-1 LI( Upgraded zlib to 1.2.1. )LU( )0 2 162 H()WB 248 Sn( Patch Release 1.2.3 \20112 January 2004\202)EH( )UL( )0 P()-1 LI( Generated man pages from the html pages. These are installed automatically at build time. )0 P()-1 LI( Changed instances of sprintf\201\202 to snprintf\201\202 to protect against buffer overflow. )0 P()-1 LI( Fixed a number of compiler warnings in non-ANSI compilers. )0 P()-1 LI( Increased SZ_LINE parameter value from 1024 to 4096. )LU( )0 2 163 H()WB 249 Sn( Patch Release 1.2.3b1 \20119 August 2003\202)EH( )UL( )0 P()-1 LI( The rule for using comma to separate a table filter expression and a region expression has been changed. The rule now states: )UL()-1 LI( if both expressions contain a region, the operator used is )BD(or)ES(. )-1 LI( if one \201or both\202 expression\201s\202 does not contain a region, the operator used is )BD(and)ES(.)LU( This rule handles the cases of pure regions and pure column filters properly. It unambiguously assigns the boolean )BD(and)ES( to all mixed cases. Thus: ) 1 34 PR( foo.fits[circle\20110,10,3\202,pi=1:5])RP( and ) 1 34 PR( foo.fits[pi=1:5,circle\20110,10,3\202])RP( both are equivalent to: ) 1 37 PR( foo.fits[circle\20110,10,3\202 && pi=1:5])RP( )0 P()-1 LI( When include files are used in filters, they now have implied parentheses surrounding them. Thus, if a region file foo.reg contains two regions \201e.g. circle 1 2 3 and circle 4 5 6\202, the syntax: ) 1 21 PR( pha=4:5&&@foo.reg)RP( is equivalent to: ) 1 42 PR( pha=4:5 && \201circle 1 2 3 || cir 4 5 6\202)RP( instead of: ) 1 40 PR( pha=4:5 && circle 1 2 3 || cir 4 5 6)RP( and the pha filter is applied to both regions. )0 P()-1 LI( Filters and comments now can be terminated with the string literal "\200n" as well as ";" and the new-line character. This means that a region can have comments embedded in it: ) 1 72 PR( funcnts foo.fits "circle 512 512 10 # color=red\200n circle 512 512 20")RP( )0 P()-1 LI( Added capability to update the value of an existing parameter after writing the table or image \201assuming the output image is a disk file or is being redirected into a file\202. )0 P()-1 LI( Improved handling of parentheses in filter expressions. )0 P( )-1 LI( Fixed a bug in image \201not event\202 regions in which circles and annuli with radius of 1 pixel were not being processed. No counts and no area would be found in such regions. )0 P()-1 LI( Fixed a bug in funcnts in which the radii column values for out of sync if multiple annuli were specified \201instead of a single varargs or accel annulus\202. )0 P()-1 LI( By default, fundisp will display integer image data as floats if the BSCALE and BZERO header parameters are present. )0 P()-1 LI( Added -L switch to funhead to output starbase list format. )0 P()-1 LI( Changed the name of the routine _FunColumnSelect to FunColumnSelectArr, in order to emphasize that it is not a private routine. )0 P()-1 LI( Funcalc now checks to ensure that a column was specified as part of the expression. )0 P()-1 LI( Funcalc local variables in the compiled program now use a "__" prefix to avoid conflicts with user-defined variables. )0 P()-1 LI( Unofficial unsigned short \201bitpix=-16\202 image data now is scaled correctly using BSCALE and BZERO header parameters. )0 P()-1 LI( Ported to Intel icc and gcc 3.3 compilers. )0 P()-1 LI( Updated wcs library to 3.5.1. )0 P()-1 LI( Changed license from public domain to GNU GPL. )LU( )0 2 164 H()WB 250 Sn( Patch Release 1.2.2 \20118 May 2003\202)EH( )UL( )0 P( )-1 LI( Fixed funcalc so that it now actually compiles an expression and runs it, instead of getting a "filter compilation error". Oops! )0 P()-1 LI( Fixed bug in FunOpen in which the bracket specification was being removed from the filename if a disk file was opened for "w" or "a". )0 P()-1 LI( Fixed bug in FunFlush which prevented two successive calls to FunImagePut from writing the second extension header properly. )0 P()-1 LI( All filter routines now use gerror\201stderr, ...\202 call instead of fprintf\201stderr, ...\202 so that output to stderr can be turned off \201via setgerror\201level\202 or GERROR environment variable\202. )0 P()-1 LI( All standard Funtools programs check for GERROR environment variable before setting gerror flag. )0 P()-1 LI( Some error messages about invalid region arguments were not being printed. )0 P()-1 LI( FITS parameters/headers now conform more closely to FITS standard: )UL()-1 LI( Blank keywords are treated in the same way as COMMENTS and HISTORY cards )-1 LI( XTENSION keywords are now exactly 8 characters long )-1 LI( 'E' is output instead of 'e' in floating point param values )-1 LI( PCOUNT and GCOUNT are output correctly for image extensions )-1 LI( EXTEND=T is output in primary header )-1 LI( COMMENTS and HISTORY start in column 9)LU( )LU( )0 2 165 H()WB 251 Sn( Patch Release 1.2.1 \20124 April 2003\202)EH( )UL( )0 P()-1 LI( Varargs ellipse and box annular regions were being processed incorrectly when the following conditions all were met: )UL()-1 LI( the region was specified in physical or wcs coordinates )-1 LI( the data file contained LTM/LTV keywords, i.e., it was blocked with respect to the original data file )-1 LI( the program being run was an image program \201e.g. funcnts, funimage\202)LU( Varargs ellipse and boxes are regions of the form: ) 2 43 PR( ellipse x y a1 b1 a2 b2 ... an bn [angle] box x y l1 w1 l2 w2 ... ln wn [angle])RP( where at least 2 sets of axis \201length\202 values were specified to form an annulus \201i.e. simple ellipses and boxes worked properly\202. With all of the above conditions met, a region in physical coordinates saw its second length argument converted incorrectly from physical coordinates to image coordinates. In simple terms, this means that funcnts did not process elliptical or box regions in physical coords on blocked images properly. Note that blocking on the command line \201e.g. foo.fits[*,*,2]\202 did work when no LTM/LTV keywords existed in the file. )0 P()-1 LI( The fundisp -f switch now supports specification of column-specific display formats as well as a more convenient way to specify datatype-specific display formats. Both use keyword=value specifiers. For columns, use: ) 1 58 PR( fundisp -f "colname1=format1 colname2=format2 ..." ...)RP( e.g. ) 1 40 PR( fundisp -f "time=%13.2f pha=%3d" ...)RP( You also can specify display formats for individual datatypes using the FITS binary table TFORM variables as the keywords: ) 1 65 PR( fundisp -f "D=double_format E=float_format J=int_format etc.")RP( e.g. ) 1 35 PR( fundisp -f "D=%13.2f I=%3d" ...)RP( The old position-dependent syntax is deprecated. )0 P()-1 LI( Fundisp will now print out a single 16-bit \201or 32-bit\202 unsigned int for a column whose data format is 16X \201or 32X\202, instead of printing 2 \201or 4\202 unsigned chars. )0 P()-1 LI( Fixed bug in which fundisp was not able to display bitfield data for raw event lists. )0 P()-1 LI( Previously, when binning columns used implicitly in a region and explicitly in a filter could suffer from a case sensitivity problem. This has been fixed. )0 P()-1 LI( Fixed internal mask=all switch on fundisp. )0 P()-1 LI( Filter include files now simply include text without changing the state of the filter. They therefore can be used in expression. That is, if foo1 contains "pi==1" and foo2 contains "pha==2" then the following expressions are equivalent: ) 3 57 PR( "[@foo1&&@foo2]" is equivalent to "[pi==1&&pha==2]" "[pha==1||@foo2]" is equivalent to "[pi==1||pha==2]" "[@foo1,@foo2]" is equivalent to "[pi==1,pha==2]")RP( )0 P()-1 LI( Fixed bug in filter specification which caused a SEGV if a varargs-style region was enclosed in parens. )0 P()-1 LI( Updated wcs library to 3.3.2. )LU( )0 2 166 H()WB 252 Sn( Public Release 1.2.0 \20124 March 2003\202)EH( )UL( )0 P()-1 LI( BSCALE and BZERO are now always applied to int pixel data, instead of only being applied if the desired output is floating point. )LU( )0 2 167 H()WB 253 Sn( Beta Release 1.2.b3 \2014 February 2003\202)EH( )UL( )0 P()-1 LI( In FunColumnSelect, added the ability to specify an offset into an array in the type specification, using the extended syntax: ) 1 48 PR( [@][n][[poff]][:[tlmin[:tlmax[:binsiz]]]])RP( The [poff] string specifies the offset. For example, a type specification such as "@I[2]" specifies the third \201i.e., starting from 0\202 element in the array pointed to by the pointer value. A value of "@2I[4]" specifies the fifth and sixth values in the array. )0 P()-1 LI( Added a non-varargs version of FunColumnSelect called _FunColumnSelect: ) 3 76 PR(int _FunColumnSelect\201Fun fun, int size, char *plist, char **names, char **types, char **modes, int *offsets, int nargs\202;)RP( )0 P()-1 LI( Added support for sorting binary tables by column name using: funtable -s "col1 col2 ... coln" ... )0 P()-1 LI( Added the FUN_RAW macro which, when applied to the "name" parameter of FunParamGets\201\202, returns the 80-character raw FITS card instead of only the value. )0 P()-1 LI( Added support for comparing column values with binary masks of the form 0b[01]+, e.g.: ) 1 23 PR( \201status&0b111\202==0b001)RP( Previously, such masks had to be specified in decimal, octal, or hex. )0 P()-1 LI( Completed support for type 'L' \201logical\202 in fundisp and in filtering of binary tables. )0 P()-1 LI( Fixed bug in funhist that was improperly setting the number of bins when the data was of type float. )0 P()-1 LI( Fixed bug in filter/Makefile where the filter OBJPATH #define was being passed to the wrong module. )LU( )0 2 168 H()WB 254 Sn( Beta Release 1.2.b2 \2017 October 2002\202)EH( )UL( )0 P()-1 LI( Updated wcs library to 3.1.3. )0 P()-1 LI( Added support for reading gzip'ed files via stdin. )LU( )0 2 169 H()WB 255 Sn( Beta Release 1.2.b1 \20124 September 2002\202)EH( )UL( )0 P()-1 LI( Added the following accelerators to region filtering: ) 8 73 PR( shape: arguments: ----- --------- BOX xcenter ycenter xw1 yh1 xw2 yh2 ... xwn yhn \201angle\202 BOX xcenter ycenter xwlo yhin xwout yhhi n=[number] \201angle\202 CIRCLE xcenter ycenter r1 r2 ... rn # same as annulus CIRCLE xcenter ycenter rinner router n=[number] # same as annulus ELLIPSE xcenter ycenter xw1 yh1 xw2 yh2 ... xwn yhn \201angle\202 ELLIPSE xcenter ycenter xwlo yhin xwout yhhi n=[number] \201angle\202)RP( )0 P()-1 LI( Added the following new pandas \201Pie AND Annulus\202 to region filtering: ) 5 77 PR( shape: arguments: ----- --------- CPANDA xcen ycen ang1 ang2 nang irad orad nrad # same as panda BPANDA xcen ycen ang1 ang2 nang ixlo iylo ixhi iyhi nrad \201ang\202 # box EPANDA xcen ycen ang1 ang2 nang ixlo iylo ixhi iyhi nrad \201ang\202 # ellipse)RP( )0 P()-1 LI( Added support for filtering images using simple FITS image masks, i.e. 8-bit or 16-bit FITS images where the value of a pixel is the region id number for that pixel \201and therefore must be greater than 0\202. The image section being filtered must either be the same size as the mask dimensions or else be an even multiple of the mask. This works with image-style filtering, i.e., funcnts can utilize a mask on both images and binary tables. )0 P()-1 LI( Added '$n' to fundisp column specification to allow display of ordinal value of each row passing the filter. )0 P()-1 LI( Added code to support region filtering on image sections. )0 P()-1 LI( Fixed bugs which prevented filtering more than one ASCII region file. )0 P()-1 LI( Fixed bug occasionally causing filter slave processes to become zombies. )0 P()-1 LI( Fixed bugs in event filtering: annulus with inner radius of 0 \201i.e., a circle\202 was rejecting events with coordinates xcen, ycen. Also, pie with angles of 0 and 360 was rejecting some events. Image filtering \201e.g. funcnts\202 did not have these problems. )0 P()-1 LI( Filters now accept global exclude regions without an include region. In such a case, the field region is implied. That is, "-circle\201x,y,r\202" is equivalent to "field; -circle\201x,y,r\202", etc. )0 P()-1 LI( Fixed panda so that it can be used as a global exclude. )0 P()-1 LI( Allow empty ds9 region file \201comments and globals only\202 to be a valid filter. Totally ignore zero length region or include file. )0 P( )-1 LI( Fixed funcnts bug that was displaying 0 value as inner radius of a circle, instead of just one radius value. )LU( )0 2 170 H()WB 256 Sn( Public Release 1.1.0 \20122 April 2002\202)EH( )0 P(New features include: )UL()0 P()-1 LI( Funtools programs now accept gzip'ed files as valid input. )0 P()-1 LI( Improved security via replacement of system\201\202 function. )0 P()-1 LI( fundisp, funcnts, funhist can output starbase/rdb format \201tabs between columns, form-feeds between tables\202. )0 P()-1 LI( Improved support for Windows platform, as well as new support for Mac OSX.)LU( )0 2 171 H()WB 257 Sn( Pre-Release 1.1.0e \20110 April 2002\202)EH( )UL( )0 P()-1 LI( Added enough support to skip over variable length arrays in BINTABLES. We will add full support if this non-standard construct becomes more widely used. )0 P()-1 LI( Fixed bug in underlying fitsy _gread\201\202 routine that was returning an arbitrary bytes-read value if the input fd was invalid. )LU( )0 2 172 H()WB 258 Sn( Pre-Release 1.1.0e \20119 March 2002\202)EH( )UL( )0 P()-1 LI( Added additional check for Windows/PC to filter/Nan.h. )0 P()-1 LI( Upgraded zlib library to 1.1.4 \201fix double free security hole\202. )LU( )0 2 173 H()WB 259 Sn( Pre-Release 1.1.0e \20127 February 2002\202)EH( )UL( )0 P()-1 LI( Changed filter/process.[ch] to filter/zprocess.[ch] to avoid name collision with Cygwin include file. )0 P()-1 LI( Added -a switch to funhead to display all headers in a FITS file. )LU( )0 2 174 H()WB 260 Sn( Pre-Release 1.1.0e \20111 February 2002\202)EH( )UL( )0 P()-1 LI( Fixed filter parser so that it ignores ds9 "ruler" and "text" markers only up to the first \200n or ; \201was ignoring to last \200n\202. )0 P()-1 LI( The NBLOCK parameter in fitsy/headdata.c was too large for Mac OS X \201max size of a declared char buf seems to be about .5 Mb\202. )LU( )0 2 175 H()WB 261 Sn( Beta Release 1.0.1b5 \20131 January 2002\202)EH( )UL( )0 P()-1 LI( Fixed bug introduced in calculated IRAF LTM values in 1.0.1b3. )0 P()-1 LI( Fixed bug in filter parser giving wrong answers when two range lists were combined with and explicit boolean operator: ) 1 34 PR( $ fundisp $S"[x=512&&y=511,512]")RP( incorrectly acted like: ) 1 39 PR( fundisp $S"[\201x=512&&y=511\202||\201y=512\202]")RP( instead of: ) 1 37 PR( fundisp $S"[x=512&&\201y=511||y=512\202]")RP( In general, we recommend use of explicit parentheses. )0 P()-1 LI( Fixed filter/NaN.h to recognize Compaq Alpha again \201broken by their last change to cc\202. )0 P()-1 LI( Removed redundant varargs definitions that conflicted with Alpha compiler definitions. )0 P()-1 LI( Added blank line to inc.sed to work around Apple Mac OS X bug in which the "i" \201insert\202 command was treating final \200\200 as continuation \200 in the text. )0 P( )-1 LI( Added include of mkrtemp.h to mkrtemp.c to get conditional compilation for Mac OSX. )0 P()-1 LI( Added support for --with-zlib to fitsy so that ds9 could use its own copy of zlib \201and not build the copy in fitsy\202. )0 P()-1 LI( Removed config.cache and Makefile files from distribution tar file. )LU( )0 2 176 H()WB 262 Sn( Beta Release 1.0.1b4 \20126 January 2002\202)EH( )UL( )0 P()-1 LI( Make explicit that column filters are not permitted in an image expression \201such as the funcnts region arguments\202. )0 P()-1 LI( Fix bug in region parser in which a region \201without parens\202, followed immediately by an operator: ) 1 24 PR( circle 512 512 .5&)SY(\160)ES(==1)RP( was not processing the final argument of the region correctly. )0 P()-1 LI( Ignore new "tile" directive in filters \201used by ds9\202. )LU( )0 2 177 H()WB 263 Sn( Beta Release 1.0.1b3 \2014 January 2002\202)EH( )UL( )0 P()-1 LI( Made modifications to Makefile.in to make releases easier. )0 P()-1 LI( Added instructions Makefile.in so that funtools.h will always have correct #defines for FUN_VERSION, FUN_MAJOR_VERSION, FUN_MINOR_VERSION, and FUN_PATCH_LEVEL. )0 P()-1 LI( Allow #include statements in funcalc program files. )0 P()-1 LI( funimage now updates all 4 CDX_Y values by the block factor. )0 P()-1 LI( Minor changes to make funtools work under darwin \201Mac OS X\202. )LU( )0 2 178 H()WB 264 Sn( Beta Release 1.0.1b2 \20114 November 2001\202)EH( )UL( )0 P()-1 LI( Fixed FunOpen\201\202 bug \201introduced in b1\202 in which filenames without extensions SEGV'ed on open. Yikes! )0 P()-1 LI( Funmerge now extends the tlmin/tlmax values of the output binning columns so that merged events from widely separated files are valid in the output table. )0 P()-1 LI( In funhist, added -w switch to specify bin width \201lo:hi:width\202 instead of number of bins \201lo:hi:num\202. Added support for this new width option in funtools.ds9. )0 P()-1 LI( If a tdbin value was set using bincols=\201name:tlmin:tlmax:tdbin, ...\202, the WCS parameters were not being updated properly. )0 P()-1 LI( Cleaned up build support for zlib. )LU( )0 2 179 H()WB 265 Sn( Beta Release 1.0.1b1 \2016 November 2001\202)EH( )UL( )0 P()-1 LI( Added support for gzip'ed files to the underlying fitsy/gio library. This means that all funtools programs now accept gzip'ed files as valid input: ) 1 41 PR( funcnts foo.fits.gz "circle 504 512 10")RP( It is no longer necessary to run gunzip and pipe the results to stdin of a funtools program. )0 P()-1 LI( Funtools tasks are now placed in a sub-menu in the DS9 Analysis menu, instead of at the top level. )0 P()-1 LI( Fixed a bug in funcnts in which the bottom-most pixel of a small circle or annulus region could be missed when the region is only one pixel wide for that value of y. )0 P()-1 LI( Added -n switch to funhist so that table histograms could be normalized by the width of the bin \201val/\201hi_edge-lo_edge\202\202. )0 P()-1 LI( Added -T switch to fundisp, funcnts, funhist to output in starbase/rdb format \201uses tabs instead of spaces between columns, form-feeds between tables, etc.\202 )0 P()-1 LI( Fixed a bug in which the field\201\202 region was not being properly processed in combination with an image section. This could affect funcnts processing of image data where an image section was specified \201though it usually resulted in a funcnts error\202. )0 P()-1 LI( Fixed bug in display of binary table header for vector columns. )0 P()-1 LI( Filters now recognize hex constants \201starting with 0x\202 and long constants \201ending with L\202. )0 P()-1 LI(Filenames containing a ':' are now only treated as sockets if they actually are in the form of a valid ip:port. )0 P()-1 LI(Replaced funtools.ds9 with a new version that calls a new funds9 script, instead of calling funcnts or funhist directly. The new script supports gzip'ed files and bracket specifications on filenames at the same time, which the direct call could not. Also the new script has better error reporting. )0 P()-1 LI( Replaced system\201\202 call used to compile filter and funcalc expression with a special launch\201\202 call, which performs execvp\201\202 directly without going through sh. \201launch\201\202 works under DOS and has fewer security problems.\202 )0 P()-1 LI( Fixed image filter code in which the field\201\202 region was being ignored if it was combined with one or more exclude regions \201and no other include regions\202, resulting in no valid pixels. )0 P()-1 LI( Changed use of getdtable\201\202 to FD_SETSIZE in calls to select\201\202. )0 P()-1 LI( Added code to guard against FITS binary tables without proper TFORMx parameters. )0 P()-1 LI( Added support to FunParamGets so that it returns the raw FITS card if the specified input name is NULL and the input n value is positive. )0 P()-1 LI( Fixed bug in underlying fitsy code that set the comment in a header parameter. )LU( )0 2 180 H()WB 266 Sn( Public Release 1.0.0 \20131 July 2001\202)EH( )UL( )0 P()-1 LI( "a new day with no mistakes ... yet")LU( )2 1 1 HR()0 0 1 A(Index to the Funtools Help Pages)0 0 TN TL()Ec /AF f D( )0 5 181 H(Last)WB 267 Sn( updated: 22 April 2002)EH( )WB NL /TE t D NP TU PM 0 eq and{/Pn () D showpage}if end restore funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/help.html000066400000000000000000000204231256243640000230620ustar00rootroot00000000000000 The Funtools Help Facility

Funtools: FITS Users Need Tools

Summary

This document is the Table of Contents for Funtools.

Description

Funtools, is a "minimal buy-in" FITS library and utility package developed at the the High Energy Astrophysics Division of SAO. The Funtools library provides simplified access to a wide array of file types: standard astronomical FITS images and binary tables, raw arrays and binary event lists, and even tables of ASCII column data. A sophisticated region filtering library (compatible with ds9) filters images and tables using boolean operations between geometric shapes, support world coordinates, etc. Funtools also supports advanced capabilities such as optimized data searching using index files. The main goal of the Funtools project has been to develop a minimal buy-in FITS library for researchers who are occasional (but serious) coders. In this case, "minimal buy-in" means "easy to learn, easy to use, and easy to re-learn next month". We have tried to achieve this goal by emphasizing two essential capabilities. The first is the ability to develop FITS programs without knowing much about FITS, i.e., without having to deal with the arcane rules for generating a properly formatted FITS file. The second is to support the use of already-familiar C/Unix facilities, especially C structs and Unix stdio. Taken together, these two capabilities should allow researchers to leverage their existing programming expertise while minimizing the need to learn new and complex coding rules.

Choose from the following topics:

Last updated: January 6, 2006
funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/html2man000077500000000000000000000153271256243640000227230ustar00rootroot00000000000000#!/usr/bin/perl # # See COPYRIGHT # # Script to generate a pod file from an html source (the same one as for text files too) # and later this pod file it passed through pod2man # # Use: # html2man [ [] ] is the directory where the man pages will be created # (current directory by default). If a file name is given instead of # directory then the directory of that file is used. # is the directory containing the ttf2pt1 files version.h # and CHANGES.html which are used to generate the release name and date # for the man page (by default looks in current directory and then in up to # 5 ancestor directories). # If the version files can not be found then the release defaults to # "current" and the date defaults to today. # # Special formatting in the html file is: # All controls are hidden within HTML comments that must occupy a whole separate line # Such a line looks like: # # # Any sort of directive must be followed by a space. The pod directives are # automatically surrounded by empty lines in the output file. # The html2man directives are: # # # Define a man page. Multiple man pages can be defined in the same HTML # file. is a short name by which this man page will be referred in the # other directives. is the name of the man page, and
is the # section of the manual (do not confuse with sections within a man page). # # # All the text following this directive is copied (with translation) # into the specified section of the specified man page. The sections # may appear in arbitrary order, they will be rearranged to the standard # order before output. Only standard section names are permitted (see @stdsect # below). The pod directives which occur outside of man sections are ignored, # just like the common text. The translation of HTML tags is: # #
- to paragraph break # - to B<> # - to I<> # - to C<> # - to F<> #
    ,
  • ,
- to =over 2, =item *, =back #  , &, <, > - to their symbols, appropriately encoded # # The rest of HTML tags is removed # # If the same section is started more than once, the text from the # second appearance will be added to the first, etc. # # # Stop copying text to the man page. # # # Continue copying text to the man page, same section as before. # # # Insert this into the man page (works only when copying is enabled). # Characters <, >, & are converted as usual. @mons = qw(January February March April May June July August September October November December); $dir = $ARGV[0]; $maindir = $ARGV[1]; if($dir eq "") { $dir = "."; } elsif( ! -d $dir ) { if( ! ($dir =~ s|\/[^/]*$||) ) { $dir = "."; } } if($maindir eq "") { $maindir = "."; for($i=0; $i<5; $i++) { if(-f "$maindir/version.h") { last; } $maindir = "../$maindir"; } } if( open(VERFILE, "<$maindir/version.h") ) { while() { if( /^\s*\#define\s+TTF2PT1_VERSION\s+\"(.*)\"/ ) { $release = "version $1"; } } close(VERFILE); if( $release =~ /SNAP-([0-9][0-9])([0-9][0-9])([0-9][0-9])/ ) { $date = sprintf("%s %d, 20%02d", $mons[$2-1], $3, $1); } elsif( open(CFILE, "<$maindir/CHANGES.html") ) { while() { if( /\/) { last; } } $_ = ; chomp; if( $_ =~ s/^.*?-- // ) { $date = $_; } close(CFILE); } } if($release eq "") { if( open(VERFILE, "<../Makefile") ) { while() { if( /^VERSION\s+=\s+(.*)/ ) { $release = "version $1"; } } close(VERFILE); } } if($release eq "") { $release = "current"; } if($date eq "") { @lt = localtime(time); $date = sprintf("%s %d, %d", $mons[$lt[4]], $lt[3], 1900+$lt[5]); } #printf(STDERR "date=%s release=%s\n", $date, $release); $writemode = 0; while() { if( s/^\<\!\-\- \=(\S+)\s+//) { $cmd = $1; s/\s*\-\-\>\s*$//; #printf(STDERR "cmd=%s args=%s\n", $cmd, $_); if($cmd =~ /^=/) { if($writemode) { $text{$tosect} .= "\n\n$cmd $_\n\n"; } } elsif($cmd eq "defdoc") { @sl = split; push(@allids, $sl[0]); $file{$sl[0]} = $sl[1]; $mansect{$sl[0]} = $sl[2]; } elsif($cmd eq "section") { # tosect includes the file id $tosect = $_; $text{$tosect} .= "\n\n"; $writemode = 1; } elsif($cmd eq "stop") { $writemode = 0; $text{$tosect} .= "\n"; } elsif($cmd eq "cont") { $writemode = 1; } elsif($cmd eq "text") { if($writemode) { s/\<\;//gi; s/\&\;/\&/gi; $text{$tosect} .= "$_\n"; } } } elsif($writemode) { # s/^\s+//; s/\{/\&lbr;/g; s/\}/\&rbr;/g; s/\/\n\n/gi; #s/\/\n\n=over 4\n\n/gi; #s/\<\/blockquote\>/\n\n=back\n\n/gi; s/\/\n\n=over 4\n\n/gi; s/\<\/ul\>/\n\n=back\n\n/gi; s/\\s*/\n\n=item \*\n\n/gi; s/\/\n\n=over 4\n\n/gi; s/\<\/dl\>/\n\n=back\n\n/gi; s/\\s*/\n\n=item \*\n\n/gi; s/\\s*/\n\n/gi; s/\(.*?)\<\/i\>/I\{\1\}/gi; s/\(.*?)\<\/em\>/I\{\1\}/gi; s/\(.*?)\<\/b\>/B\{\1\}/gi; s/\(.*?)\<\/tt\>/C\{\1\}/gi; s/\
(.*?)\<\/a\>/F\{\1\}/gi; s/\summary\<\/h2\>//gi; s/\description\<\/h2\>//gi; s/\examples\<\/h2\>//gi; s/\options\<\/h2\>//gi; s/\(.*?)\<\/h2\>/B\{\1\}/gi; s/\<.*?\>//g; s/\{/\/g; s/\ \;/S< >/gi; s/\&\;/\&/gi; # s/\<\;/E/gi; # s/\>\;/E/gi; s/\<\;/\/gi; #s/\|/E/g; #s/\//E/g; s/\&lbr\;/\{/g; s/\&rbr\;/\}/g; #printf(STDERR "section=%s add=%s", $tosect, $_); $text{$tosect} .= $_; } } @stdsect = ( "NAME", "SYNOPSIS", "OPTIONS", "DESCRIPTION", "RETURN VALUE", "ERRORS", "EXAMPLES", "ENVIRONMENT", "FILES", "SEE ALSO", "NOTES", "CAVEATS", "DIAGNOSTICS", "BUGS", "RESTRICTIONS", "AUTHOR", "HISTORY" ); #printf(STDERR "allids= @allids\n"); for $id (@allids) { print(STDERR "creating man page $id $file{$id} $mansect{$id}\n\n"); die "Unable to create pod file $dir/$file{$id}.pod" unless open(PODF, ">./pod/$file{$id}.pod"); print(PODF "=pod\n\n"); for $sect (@stdsect) { $sid = "$id $sect"; #printf(STDERR "trying %s\n", $sid); if(defined $text{$sid}) { #printf(STDERR " section %s\n", $sid); print(PODF "=head1 $sect\n\n$text{$sid}\n\n"); } } print(PODF "=cut\n"); close(PODF); die "Unable to generate the man page $dir/$file{$id}.1" if system("pod2man --section=\"$mansect{$id}\" --release=\"$release\" " . "--center=\"SAORD Documentation\" --date=\"$date\" " . "--name=\"$file{$id}\" " . "./pod/$file{$id}.pod > $dir/man$mansect{$id}/$file{$id}.$mansect{$id}"); unlink("$dir/$file{$id}.pod"); } funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/idx.html000066400000000000000000000205711256243640000227220ustar00rootroot00000000000000 Table Filtering with Indexes

Funidx: Using Indexes to Filter Rows in a Table

Summary

This document contains a summary of the user interface for filtering rows in binary tables with indexes.

Description

Funtools Table Filtering allows rows in a table to be selected based on the values of one or more columns in the row. Because the actual filter code is compiled on the fly, it is very efficient. However, for very large files (hundreds of Mb or larger), evaluating the filter expression on each row can take a long time. Therefore, funtools supports index files for columns, which are used automatically during filtering to reduce dramatically the number of row evaluations performed. The speed increase for indexed filtering can be an order of magnitude or more, depending on the size of the file.

The funindex program creates an index on one or more columns in a binary table. For example, to create an index for the column pi in the file huge.fits, use:

  funindex huge.fits pi
This will create an index named huge_pi.idx.

When a filter expression is initialized for row evaluation, funtools looks for an index file for each column in the filter expression. If found, and if the file modification date of the index file is later than that of the data file, then the index will be used to reduce the number of rows that are evaluated in the filter. When Spatial Region Filtering is part of the expression, the columns associated with the region are checked for index files.

If an index file is not available for a given column, then in general, all rows must be checked when that column is part of a filter expression. This is not true, however, when a non-indexed column is part of an AND expression. In this case, only the rows that pass the other part of the AND expression need to be checked. Thus, in some cases, filtering speed can increase significantly even if all columns are not indexed.

Also note that certain types of filter expression syntax cannot make use of indices. For example, calling functions with column names as arguments implies that all rows must be checked against the function value. Once again, however, if this function is part of an AND expression, then a significant improvement in speed still is possible if the other part of the AND expression is indexed.

For example, note below the dramatic speedup in searching a 1 Gb file using an AND filter, even when one of the columns (pha) has no index:

  time fundisp \
  huge.fits'[idx_activate=0,idx_debug=1,pha=2348&&cir 4000 4000 1]' \
  "x y pha"
          x           y        pha                                   
 ---------- ----------- ----------                                    
    3999.48     4000.47       2348
    3999.48     4000.47       2348
    3999.48     4000.47       2348
    3999.48     4000.47       2348
    3999.48     4000.47       2348
    3999.48     4000.47       2348
    3999.48     4000.47       2348
    3999.48     4000.47       2348
    3999.48     4000.47       2348
    3999.48     4000.47       2348
    3999.48     4000.47       2348
    3999.48     4000.47       2348
    3999.48     4000.47       2348
    3999.48     4000.47       2348
    3999.48     4000.47       2348
    3999.48     4000.47       2348
    42.36u 13.07s 6:42.89 13.7%

  time fundisp \
  huge.fits'[idx_activate=1,idx_debug=1,pha=2348&&cir 4000 4000 1]' \
  "x y pha"
          x           y        pha                                    
 ---------- ----------- ----------                                    
 idxeq: [INDEF]                                   
 idxand sort: x[ROW 8037025:8070128] y[ROW 5757665:5792352]             
 idxand(1): INDEF [IDX_OR_SORT]                                   
 idxall(1): [IDX_OR_SORT]                                   
    3999.48     4000.47       2348
    3999.48     4000.47       2348
    3999.48     4000.47       2348
    3999.48     4000.47       2348
    3999.48     4000.47       2348
    3999.48     4000.47       2348
    3999.48     4000.47       2348
    3999.48     4000.47       2348
    3999.48     4000.47       2348
    3999.48     4000.47       2348
    3999.48     4000.47       2348
    3999.48     4000.47       2348
    3999.48     4000.47       2348
    3999.48     4000.47       2348
    3999.48     4000.47       2348
    3999.48     4000.47       2348
    1.55u 0.37s 1:19.80 2.4%
When all columns are indexed, the increase in speed can be even more dramatic:
  time fundisp \
  huge.fits'[idx_activate=0,idx_debug=1,pi=770&&cir 4000 4000 1]' \
  "x y pi"
          x           y         pi                                    
 ---------- ----------- ----------                                    
    3999.48     4000.47        770
    3999.48     4000.47        770
    3999.48     4000.47        770
    3999.48     4000.47        770
    3999.48     4000.47        770
    3999.48     4000.47        770
    3999.48     4000.47        770
    3999.48     4000.47        770
    3999.48     4000.47        770
    3999.48     4000.47        770
    3999.48     4000.47        770
    3999.48     4000.47        770
    3999.48     4000.47        770
    3999.48     4000.47        770
    3999.48     4000.47        770
    3999.48     4000.47        770
    42.60u 12.63s 7:28.63 12.3%

  time fundisp \
  huge.fits'[idx_activate=1,idx_debug=1,pi=770&&cir 4000 4000 1]' \
  "x y pi"
          x           y         pi                                    
 ---------- ----------- ----------                                    
 idxeq: pi start=9473025,stop=9492240 => pi[ROW 9473025:9492240]          
 idxand sort: x[ROW 8037025:8070128] y[ROW 5757665:5792352]               
 idxor sort/merge: pi[ROW 9473025:9492240] [IDX_OR_SORT]                   
 idxmerge(5): [IDX_OR_SORT] pi[ROW]                                   
 idxall(1): [IDX_OR_SORT]                                   
    3999.48     4000.47        770
    3999.48     4000.47        770
    3999.48     4000.47        770
    3999.48     4000.47        770
    3999.48     4000.47        770
    3999.48     4000.47        770
    3999.48     4000.47        770
    3999.48     4000.47        770
    3999.48     4000.47        770
    3999.48     4000.47        770
    3999.48     4000.47        770
    3999.48     4000.47        770
    3999.48     4000.47        770
    3999.48     4000.47        770
    3999.48     4000.47        770
    3999.48     4000.47        770
    1.67u 0.30s 0:24.76 7.9%

The miracle of indexed filtering (and indeed, of any indexing) is the speed of the binary search on the index, which is of order log2(n) instead of n. (The funtools binary search method is taken from http://www.tbray.org/ongoing/When/200x/2003/03/22/Binary, to whom grateful acknowledgement is made.) This means that the larger the file, the better the performance. Conversely, it also means that for small files, using an index (and the overhead involved) can slow filtering down somewhat. Our tests indicate that on a file containing a few tens of thousands of rows, indexed filtering can be 10 to 20 percent slower than non-indexed filtering. Of course, your mileage will vary with conditions (disk access speed, amount of available memory, process load, etc.)

Any problem encountered during index processing will result in indexing being turned off, and replaced by filtering all rows. You can turn filtering off manually by setting the idx_activate variable to 0 (in a filter expression) or the FILTER_IDX_ACTIVATE environment variable to 0 (in the global environment). Debugging output showing how the indexes are being processed can be displayed to stderr by setting the idx_debug variable to 1 (in a filter expression) or the FILTER_IDX_DEBUG environment variable to 1 (in the global environment).

Currently, indexed filtering only works with FITS binary tables and raw event files. It does not work with text files. This restriction might be removed in a future release.

Go to Funtools Help Index

Last updated: August 3, 2007
funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/imblank.c000066400000000000000000000050101256243640000230200ustar00rootroot00000000000000#include #include #ifdef ANSI_FUNC int main (int argc, char **argv) #else main(argc, argv) int argc; char **argv; #endif { int i; int bitpix, dim1, dim2; int total; double blimit, bvalue; char *buf; unsigned char *cbuf; short *sbuf; int *ibuf; float *fbuf; double *dbuf; Fun fun, fun2; if( argc < 4 ){ fprintf(stderr, "usage: %s iname oname blimit bvalue\n", argv[0]); exit(1); } /* get blank limit and optional blank value */ blimit = atof(argv[3]); bvalue = 0; if( argc >= 5 ) bvalue = atof(argv[4]); /* exit on gio errors */ setgerror(2); /* open the input FITS file */ if( !(fun = FunOpen(argv[1], "rc", NULL)) ) gerror(stderr, "could not FunOpen input file: %s\n", argv[1]); /* open the output FITS image, preparing to copy input params */ if( !(fun2 = FunOpen(argv[2], "w", fun)) ) gerror(stderr, "could not FunOpen output file: %s\n", argv[2]); /* extract and bin the data section into an image buffer */ if( !(buf = FunImageGet(fun, NULL, NULL)) ) gerror(stderr, "could not FunImageGet: %s\n", argv[1]); /* get required information from funtools structure. this should come after the ImageGet call, in case that call changed fun_sect_bitpix value */ FunInfoGet(fun, FUN_SECT_BITPIX, &bitpix, FUN_SECT_DIM1, &dim1, FUN_SECT_DIM2, &dim2, 0); /* set appropriate data type buffer to point to image buffer */ switch(bitpix){ case 8: cbuf = (unsigned char *)buf; break; case 16: sbuf = (short *)buf; break; case 32: ibuf = (int *)buf; break; case -32: fbuf = (float *)buf; break; case -64: dbuf = (double *)buf; break; } /* loop through pixels and reset values below limit to value */ total = dim1*dim2; for(i=0; i Funtools Programming

FunLib: the Funtools Programming Interface

Summary

A description of the Funtools library.

Introduction to the Funtools Programming Interface

To create a Funtools application, you need to include the funtools.h definitions file in your code:

  #include <funtools.h>
You then call Funtools subroutines and functions to access Funtools data. The most important routines are: Your program must be linked against the libfuntools.a library, along with the math library. The following libraries also might be required on your system:
  • -lsocket -lnsl for socket support
  • -ldl for dynamic loading

For example, on a Solaris system using gcc, use the following link line:

  gcc -o foo foo.c -lfuntools -lsocket -lnsl -ldl -lm
On a Solaris system using Solaris cc, use the following link line:
  gcc -o foo foo.c -lfuntools -lsocket -lnsl -lm
On a Linux system using gcc, use the following link line:
  gcc -o foo foo.c -lfuntools -ldl -lm
Once configure has built a Makefile on your platform, the required "extra" libraries (aside from -lm, which always is required) are specified in that file's EXTRA_LIBS variable. For example, under Linux you will find:
  grep EXTRA_LIBS Makefile
  EXTRA_LIBS      =  -ldl
  ...

The Funtools library contains both the zlib library (http://www.gzip.org/zlib/) and Doug Mink's WCS library (http://tdc-www.harvard.edu/software/wcstools/). It is not necessary to put these libraries on a Funtools link line. Include files necessary for using these libraries are installed in the Funtools include directory.

Funtools Programming Tutorial

The FunOpen() function is used to open a FITS file, an array, or a raw event file:
  /* open the input FITS file for reading */
  ifun = FunOpen(iname, "r", NULL);
  /* open the output FITS file for writing, and connect it to the input file */
  ofun = FunOpen(iname, "w", ifun);
A new output file can inherit header parameters automatically from existing input file by passing the input Funtools handle as the last argument to the new file's FunOpen() call as shown above.

For image data, you then can call FunImageGet() to read an image into memory.

  float buf=NULL;
  /* extract and bin the data section into an image buffer */
  buf = FunImageGet(fun, NULL, "bitpix=-32");
If the (second) buf argument to this call is NULL, buffer space is allocated automatically. The (third) plist argument can be used to specify the return data type of the array. If NULL is specified, the data type of the input file is used.

To process an image buffer, you would generally make a call to FunInfoGet() to determine the dimensions of the image (which may have been changed from the original file dimensions due to Funtools image sectioning on the command line). In a FITS image, the index along the dim1 axis varies most rapidly, followed by the dim2 axis, etc. Thus, to access each pixel in an 2D image, use a double loop such as: buf = FunImageGet(fun, NULL, "bitpix=-32"); FunInfoGet(fun, FUN_SECT_DIM1, &dim1, FUN_SECT_DIM2, &dim2, 0); for(i=1; i<=dim2; i++){ for(j=1; j<=dim1; j++){ ... process buf[((i-1)*dim1)+(j-1)] ... } } or:

  buf = FunImageGet(fun, NULL, "bitpix=-32");
  FunInfoGet(fun, FUN_SECT_DIM1, &dim1, FUN_SECT_DIM2, &dim2, 0);
  for(i=0; i<(dim1*dim2); i++){
    ... process buf[i] ...
  }
Finally, you can write the resulting image to disk using FunImagePut():
  FunImagePut(fun2, buf, dim1, dim2, -32, NULL);
Note that Funtools automatically takes care of book-keeping tasks such as reading and writing FITS headers (although you can, of course, write your own header or add your own parameters to a header).

For binary tables and raw event files, a call to FunOpen() will be followed by a call to the FunColumnSelect() routine to select columns to be read from the input file and/or written to the output file:

  typedef struct evstruct{
    double time;
    int time2;
  } *Ev, EvRec;
  FunColumnSelect(fun, sizeof(EvRec), NULL,
                  "time",      "D",     "rw",  FUN_OFFSET(Ev, time),
                  "time2",     "J",     "w",   FUN_OFFSET(Ev, time2),
                  NULL);
Columns whose (third) mode argument contains an "r" are "readable", i.e., columns will be read from the input file and converted into the data type specified in the call's second argument. These columns values then are stored in the specified offset of the user record structure. Columns whose mode argument contains a "w" are "writable", i.e., these values will be written to the output file. The FunColumnSelect() routine also offers the option of automatically merging user columns with the original input columns when writing the output rows.

Once a set of columns has been specified, you can retrieve rows using FunTableRowGet(), and write the rows using FunTableRowPut():

  Ev ebuf, ev;
  /* get rows -- let routine allocate the array */
  while( (ebuf = (Ev)FunTableRowGet(fun, NULL, MAXROW, NULL, &got)) ){
    /* process all rows */
    for(i=0; i<got; i++){
      /* point to the i'th row */
      ev = ebuf+i;
      /* time2 is generated here */
      ev->time2 = (int)(ev->time+.5);
      /* change the input time as well */
      ev->time = -(ev->time/10.0);
    }
    /* write out this batch of rows with the new column */
    FunTableRowPut(fun2, (char *)ebuf, got, 0, NULL);
    /* free row data */
    if( ebuf ) free(ebuf);
  }
The input rows are retrieved into an array of user structs, which can be accessed serially as shown above. Once again, Funtools automatically takes care of book-keeping tasks such as reading and writing FITS headers (although you can, of course, write your own header or add your own parameters to a header).

When all processing is done, you can call FunClose() to close the file(s):

  FunClose(fun2);
  FunClose(fun);

These are the basics of processing FITS files (and arrays or raw event data) using Funtools. The routines in these examples are described in more detail below, along with a few other routines that support parameter access, data flushing, etc.

Compiling and Linking

To create a Funtools application, a software developer will include the funtools.h definitions file in Funtools code:

  #include <funtools.h>
The program is linked against the libfuntools.a library, along with the math library (and the dynamic load library, if the latter is available on your system):
  gcc -o foo foo.c -lfuntools -ldl -lm

If gcc is used, Funtools filtering can be performed using dynamically loaded shared objects that are built at run-time. Otherwise, filtering is performed using a slave process.

Funtools has been built on the following systems:

  • Sun/Solaris 5.X
  • Linux/RedHat Linux 5.X,6.X,7.X
  • Dec Alpha/OSF1 V4.X
  • WindowsNT/Cygwin 1.0
  • SGI/IRIX64 6.5

A Short Digression on Subroutine Order

There is a natural order for all I/O access libraries. You would not think of reading a file without first opening it, or writing a file after closing it. A large part of the experiment in funtools is to use the idea of "natural order" as a means of making programming easier. We do this by maintaining the state of processing for a given funtools file, so that we can do things like write headers and flush extension padding at the right time, without you having to do it.

For example, if you open a new funtools file for writing using FunOpen(), then generate an array of image data and call FunImagePut(), funtools knows to write the image header automatically. There is no need to think about writing a standard header. Of course, you can add parameters to the file first by calling one of the FunParamPut() routines, and these parameters will automatically be added to the header when it is written out. There still is no need to write the header explicitly.

Maintaining state in this way means that there are certain rules of order which should be maintained in any funtools program. In particular, we strongly recommend the following ordering rules be adhered to:

  • When specifying that input extensions be copied to an output file via a reference handle, open the output file before reading the input file. (Otherwise the initial copy will not occur).
  • Always write parameters to an output file using one of the FunParamPut() calls before writing any data. (This is a good idea for all FITS libraries, to avoid having to recopy data is the FITS header needs to be extended by adding a single parameter.)
  • If you retrieve an image, and need to know the data type, use the FUN_SECT_BITPIX option of FunInfoGet(), after calling FunImageGet(), since it is possible to change the value of BITPIX from the latter.
  • When specifying that input extensions be copied to an output file via a reference handle, close the output file before closing input file, or else use FunFlush() explicitly on the output file before closing the input file. (Otherwise the final copy will not occur).

We believe that these are the natural rules that are implied in most FITS programming tasks. However, we recognize that making explicit use of "natural order" to decide what automatic action to take on behalf of the programmer is experimental. Therefore, if you find that your needs are not compatible with our preferred order, please let us know -- it will be most illuminating for us as we evaluate this experiment.

Funtools Programming Examples

The following complete coding examples are provided to illustrate the simplicity of Funtools applications. They can be found in the funtest subdirectory of the Funtools distribution. In many cases, you should be able to modify one of these programs to generate your own Funtools program:

  • evread.c: read and write binary tables
  • evcols.c: add column and rows to binary tables
  • evmerge.c: merge new columns with existing columns
  • evnext.c: manipulate raw data pointers
  • imblank.c: blank out image values below a threshold
  • asc2fits.c: convert a specific ASCII table to FITS binary table

The Funtools Programming Reference Manual

#include <funtools.h>

Fun FunOpen(char *name, char *mode, Fun ref)

void *FunImageGet(Fun fun, void *buf, char *plist)

int FunImagePut(Fun fun, void *buf, int dim1, int dim2, int bitpix, char *plist)

void * FunImageRowGet(Fun fun, void *buf, int rstart, int rstop, char *plist)

void * FunImageRowPut(Fun fun, void *buf, int rstart, int rstop, int dim1, int dim2, int bitpix, char *plist)

int FunColumnSelect(Fun fun, int size, char *plist, ...)

void FunColumnActivate(Fun fun, char *s, char *plist)

int FunColumnLookup(Fun fun, char *s, int which, char **name, int *type, int *mode, int *offset, int *n, int *width)

void *FunTableRowGet(Fun fun, void *rows, int maxrow, char *plist, int *nrow)

int FunTableRowPut(Fun fun, void *rows, int nev, int idx, char *plist)

int FunParamGetb(Fun fun, char *name, int n, int defval, int *got)

int FunParamGeti(Fun fun, char *name, int n, int defval, int *got)

double FunParamGetd(Fun fun, char *name, int n, double defval, int *got)

char *FunParamGets(Fun fun, char *name, int n, char *defval, int *got)

int FunParamPutb(Fun fun, char *name, int n, int value, char *comm, int append)

int FunParamPuti(Fun fun, char *name, int n, int value, char *comm, int append)

int FunParamPutd(Fun fun, char *name, int n, double value, int prec, char *comm, int append)

int FunParamPuts(Fun fun, char *name, int n, char *value, char *comm, int append)

int FunInfoGet(Fun fun, int type, ...)

int FunInfoPut(Fun fun, int type, ...)

void FunFlush(Fun fun, char *plist)

void FunClose(Fun fun)

FunOpen - open a Funtools data file

  #include <funtools.h>

  Fun FunOpen(char *name, char *mode, Fun ref);

The FunOpen() routine opens a Funtools data file for reading or appending, or creates a new FITS file for writing. The name argument specifies the name of the Funtools data file to open. You can use IRAF-style bracket notation to specify Funtools Files, Extensions, and Filters. A separate call should be made each time a different FITS extension is accessed:

  Fun fun;
  char *iname;
  ...
  if( !(fun = FunOpen(iname, "r", NULL)) ){
    fprintf(stderr, "could not FunOpen input file: %s\n", iname);
    exit(1);
  }

If mode is "r", the file is opened for reading, and processing is set up to begin at the specified extension. For reading, name can be stdin, in which case the standard input is read.

If mode is "w", the file is created if it does not exist, or opened and truncated for writing if it does exist. Processing starts at the beginning of the file. The name can be stdout, in which case the standard output is readied for processing.

If mode is "a", the file is created if it does not exist, or opened if it does exist. Processing starts at the end of the file. The name can be stdout, in which case the standard output is readied for processing.

When a Funtools file is opened for writing or appending, a previously opened Funtools reference handle can be specified as the third argument. This handle typically is associated with the input Funtools file that will be used to generate the data for the output data. When a reference file is specified in this way, the output file will inherit the (extension) header parameters from the input file:

  Fun fun, fun2;
  ...
  /* open input file */
  if( !(fun = FunOpen(argv[1], "r", NULL)) )
    gerror(stderr, "could not FunOpen input file: %s\n", argv[1]);
  /* open the output FITS image, inheriting params from input */
  if( !(fun2 = FunOpen(argv[2], "w", fun)) )
    gerror(stderr, "could not FunOpen output file: %s\n", argv[2]);
Thus, in the above example, the output FITS binary table file will inherit all of the parameters associated with the input binary table extension.

A file opened for writing with a Funtools reference handle also inherits the selected columns (i.e. those columns chosen for processing using the FunColumnSelect() routine) from the reference file as its default columns. This makes it easy to open an output file in such a way that the columns written to the output file are the same as the columns read in the input file. Of course, column selection can easily be tailored using the FunColumnSelect() routine. In particular, it is easy to merge user-defined columns with the input columns to generate a new file. See the evmerge for a complete example.

In addition, when a Funtools reference handle is supplied in a FunOpen() call, it is possible also to specify that all other extensions from the reference file (other than the input extension being processed) should be copied from the reference file to the output file. This is useful, for example, in a case where you are processing a FITS binary table or image and you want to copy all of the other extensions to the output file as well. Copy of other extensions is controlled by adding a "C" or "c" to the mode string of the FunOpen() call of the input reference file. If "C" is specified, then other extensions are always copied (i.e., copy is forced by the application). If "c" is used, then other extensions are copied if the user requests copying by adding a plus sign "+" to the extension name in the bracket specification. For example, the funtable program utilizes "c" mode, giving users the option of copying all other extensions:

  /* open input file -- allow user copy of other extensions */
  if( !(fun = FunOpen(argv[1], "rc", NULL)) )
    gerror(stderr, "could not FunOpen input file: %s\n", argv[1]);
  /* open the output FITS image, inheriting params from input */
  if( !(fun2 = FunOpen(argv[2], "w", fun)) )
    gerror(stderr, "could not FunOpen output file: %s\n", argv[2]);
Thus, funtable supports either of these command lines:
  # copy only the EVENTS extension
  csh> funtable "test.ev[EVENTS,circle(512,512,10)]" foo.ev
  # copy ALL extensions
  csh> funtable "test.ev[EVENTS+,circle(512,512,10)]" foo.ev

Use of a Funtools reference handle implies that the input file is opened before the output file. However, it is important to note that if copy mode ("c" or "C") is specified for the input file, the actual input file open is delayed until just after the output file is opened, since the copy of prior extensions to the output file takes place while Funtools is seeking to the specified input extension. This implies that the output file should be opened before any I/O is done on the input file or else the copy will fail. Note also that the copy of subsequent extension will be handled automatically by FunClose() if the output file is closed before the input file. Alternatively, it can be done explicitly by FunFlush(), but again, this assumes that the input file still is open.

Upon success FunOpen() returns a Fun handle that is used in subsequent Funtools calls. On error, NULL is returned.

FunImageGet - get an image or image section

  #include <funtools.h>

  void *FunImageGet(Fun fun, void *buf, char *plist)

The FunImageGet() routine returns an binned image array of the specified section of a Funtools data file. If the input data are already of type image, the array is generated by extracting the specified image section and then binning it according to the specified bin factor. If the input data are contained in a binary table or raw event file, the rows are binned on the columns specified by the bincols= keyword (using appropriate default columns as necessary), after which the image section and bin factors are applied. In both cases, the data is automatically converted from FITS to native format, if necessary.

The first argument is the Funtools handle returned by FunOpen(). The second buf argument is a pointer to a data buffer to fill. If NULL is specified, FunImageGet will allocate a buffer of the appropriate size. Generally speaking, you always want Funtools to allocate the buffer because the image dimensions will be determined by Funtools image sectioning on the command line.

The third plist (i.e., parameter list) argument is a string containing one or more comma-delimited keyword=value parameters. It can be used to specify the return data type using the bitpix= keyword. If no such keyword is specified in the plist string, the data type of the returned image is the same as the data type of the original input file, or is of type int for FITS binary tables.

If the bitpix= keyword is supplied in the plist string, the data type of the returned image will be one of the supported FITS image data types:

  • 8 unsigned char
  • 16 short
  • 32 int
  • -32 float
  • -64 double
For example:
  void *buf;
  /* extract data section into an image buffer */
  if( !(buf = FunImageGet(fun, NULL, NULL)) )
    gerror(stderr, "could not FunImageGet: %s\n", iname);
will allocate buf and retrieve the image in the file data format. In this case, you will have to determine the data type (using the FUN_SECT_BITPIX value in the FunInfoGet() routine) and then use a switch statement to process each data type:
  int bitpix;
  void *buf;
  unsigned char *cbuf;
  short *sbuf;
  int *ibuf;
  ...
  buf = FunImageGet(fun, NULL, NULL);
  FunInfoGet(fun, FUN_SECT_BITPIX,  &bitpix, 0);
  /* set appropriate data type buffer to point to image buffer */
  switch(bitpix){
  case 8:
    cbuf = (unsigned char *)buf; break;
  case 16:
    sbuf = (short *)buf; break;
  case 32:
    ibuf = (int *)buf; break;
 ...
See the imblank example code for more details on how to process an image when the data type is not specified beforehand.

It often is easier to specify the data type directly:

  double *buf;
  /* extract data section into a double image buffer */
  if( !(buf = FunImageGet(fun, NULL, "bitpix=-64")) )
    gerror(stderr, "could not FunImageGet: %s\n", iname);
will extract the image while converting to type double.

On success, a pointer to the image buffer is returned. (This will be the same as the second argument, if NULL is not passed to the latter.) On error, NULL is returned.

In summary, to retrieve image or row data into a binned image, you simply call FunOpen() followed by FunImageGet(). Generally, you then will want to call FunInfoGet() to retrieve the axis dimensions (and data type) of the section you are processing (so as to take account of sectioning and blocking of the original data):

  double *buf;
  int i, j;
  int dim1, dim2;
  ... other declarations, etc.

  /* open the input FITS file */
  if( !(fun = FunOpen(argv[1], "rc", NULL)) )
    gerror(stderr, "could not FunOpen input file: %s\n", argv[1]);

  /* extract and bin the data section into a double float image buffer */
  if( !(buf = FunImageGet(fun, NULL, "bitpix=-64")) )
    gerror(stderr, "could not FunImageGet: %s\n", argv[1]);

  /* get dimension information from funtools structure */
  FunInfoGet(fun, FUN_SECT_DIM1, &dim1, FUN_SECT_DIM2, &dim2, 0);

  /* loop through pixels and reset values below limit to value */
  for(i=0; i<dim1*dim2; i++){
    if( buf[i] <= blimit ) buf[i] = bvalue;
  }

Another useful plist string value is "mask=all", which returns an image populated with regions id values. Image pixels within a region will contain the associated region id (region values start at 1), and otherwise will contain a 0 value. Thus, the returned image is a region mask which can be used to process the image data (which presumably is retrieved by a separate call to FunImageGet) pixel by pixel.

If a FITS binary table or a non-FITS raw event file is being binned into an image, it is necessary to specify the two columns that will be used in the 2D binning. This usually is done on the command line using the bincols=(x,y) keyword:

  funcnts "foo.ev[EVENTS,bincols=(detx,dety)]"

The full form of the bincols= specifier is:

  bincols=([xname[:tlmin[:tlmax:[binsiz]]]],[yname[:tlmin[:tlmax[:binsiz]]]])
where the tlmin, tlmax, and binsiz specifiers determine the image binning dimensions:
  dim = (tlmax - tlmin)/binsiz     (floating point data)
  dim = (tlmax - tlmin)/binsiz + 1 (integer data)
These tlmin, tlmax, and binsiz specifiers can be omitted if TLMIN, TLMAX, and TDBIN header parameters (respectively) are present in the FITS binary table header for the column in question. Note that if only one parameter is specified, it is assumed to be tlmax, and tlmin defaults to 1. If two parameters are specified, they are assumed to be tlmin and tlmax.

If bincols is not specified on the command line, Funtools tries to use appropriate defaults: it looks for the environment variable FITS_BINCOLS (or FITS_BINKEY). Then it looks for the Chandra parameters CPREF (or PREFX) in the FITS binary table header. Failing this, it looks for columns named "X" and "Y" and if these are not found, it looks for columns containing the characters "X" and "Y".

See Binning FITS Binary Tables and Non-FITS Event Files for more information.

FunImagePut - put an image to a Funtools file

  #include <funtools.h>

  int FunImagePut(Fun fun, void *buf, int dim1, int dim2, int bitpix,
                  char *plist)
The FunImagePut() routine outputs an image array to a FITS file. The image is written either as a primary header/data unit or as an image extension, depending on whether other data have already been written to the file. That is, if the current file position is at the beginning of the file, a primary HDU is written. Otherwise, an image extension is written.

The first argument is the Funtools handle returned by FunOpen(). The second buf argument is a pointer to a data buffer to write. The dim1and dim2 arguments that follow specify the dimensions of the image, where dim1 corresponds to naxis1 and dim2 corresponds to naxis2. The bitpix argument specifies the data type of the image and can have the following FITS-standard values:

  • 8 unsigned char
  • 16 short
  • 32 int
  • -32 float
  • -64 double

When FunTableRowPut() is first called for a given image, Funtools checks to see if the primary header has already been written (by having previously written an image or a binary table.) If not, this image is written to the primary HDU. Otherwise, it is written to an image extension.

Thus, a simple program to generate a FITS image might look like this:

  int i;
  int dim1=512, dim2=512;
  double *dbuf;
  Fun fun;
  dbuf = malloc(dim1*dim2*sizeof(double));
  /* open the output FITS image, preparing to copy input params */
  if( !(fun = FunOpen(argv[1], "w", NULL)) )
    gerror(stderr, "could not FunOpen output file: %s\n", argv[1]);
  for(i=0; i<(dim1*dim2); i++){
    ... fill dbuf ...
  }
  /* put the image (header will be generated automatically */
  if( !FunImagePut(fun, buf, dim1, dim2, -64, NULL) )
    gerror(stderr, "could not FunImagePut: %s\n", argv[1]);
  FunClose(fun);
  free(dbuf);

In addition, if a Funtools reference handle was specified when this table was opened, the parameters from this Funtools reference handle are merged into the new image header. Furthermore, if a reference image was specified during FunOpen(), the values of dim1, dim2, and bitpix in the calling sequence can all be set to 0. In this case, default values are taken from the reference image section. This is useful if you are reading an image section in its native data format, processing it, and then writing that section to a new FITS file. See the imblank example code.

The data are assumed to be in the native machine format and will automatically be swapped to FITS big-endian format if necessary. This behavior can be over-ridden with the convert=[true|false] keyword in the plist param list string.

When you are finished writing the image, you should call FunFlush() to write out the FITS image padding. However, this is not necessary if you subsequently call FunClose() without doing any other I/O to the FITS file.

FunImageRowGet - get row(s) of an image

  #include <funtools.h>

  void *FunImageRowGet(Fun fun, void *buf, int rstart, int rstop,
                       char *plist)

The FunImageRowGet() routine returns one or more image rows from the specified section of a Funtools data file. If the input data are of type image, the array is generated by extracting the specified image rows and then binning them according to the specified bin factor. If the input data are contained in a binary table or raw event file, the rows are binned on the columns specified by the bincols= keyword (using appropriate default columns as needed), after which the image section and bin factors are applied.

The first argument is the Funtools handle returned by FunOpen(). The second buf argument is a pointer to a data buffer to fill. If NULL is specified, FunImageGet() will allocate a buffer of the appropriate size.

The third and fourth arguments specify the first and last row to retrieve. Rows are counted starting from 1, up to the value of FUN_YMAX(fun). The final plist (i.e., parameter list) argument is a string containing one or more comma-delimited keyword=value parameters. It can be used to specify the return data type using the bitpix= keyword. If no such keyword is specified in the plist string, the data type of the image is the same as the data type of the original input file, or is of type int for FITS binary tables.

If the bitpix=value is supplied in the plist string, the data type of the returned image will be one of the supported FITS image data types:

  • 8 unsigned char
  • 16 short
  • 32 int
  • -32 float
  • -64 double

For example:

  double *drow;
  Fun fun;
  ... open files ...
  /* get section dimensions */
  FunInfoGet(fun, FUN_SECT_DIM1, &dim1, FUN_SECT_DIM2, &dim2, 0);
  /* allocate one line's worth */
  drow = malloc(dim1*sizeof(double));
  /* retrieve and process each input row (starting at 1) */
  for(i=1; i <= dim2; i++){
    if( !FunImageRowGet(fun, drow, i, i, "bitpix=-64") )
      gerror(stderr, "can't FunImageRowGet: %d %s\n", i, iname);
      /* reverse the line */
      for(j=1; j<=dim1; j++){
        ... process drow[j-1] ...
      }
  }
  ...

On success, a pointer to the image buffer is returned. (This will be the same as the second argument, if NULL is not passed to the latter.) On error, NULL is returned. Note that the considerations described above for specifying binning columns in FunImageGet() also apply to FunImageRowGet().

FunImageRowPut - put row(s) of an image

  #include <funtools.h>

  void *FunImageRowPut(Fun fun, void *buf, int rstart, int rstop,
                       int dim1, int dim2, int bitpix, char *plist)

The FunImageRowPut() routine writes one or more image rows to the specified FITS image file. The first argument is the Funtools handle returned by FunOpen(). The second buf argument is a pointer to the row data buffer, while the third and fourth arguments specify the starting and ending rows to write. Valid rows values range from 1 to dim2, i.e., row is one-valued.

The dim1and dim2 arguments that follow specify the dimensions, where dim1 corresponds to naxis1 and dim2 corresponds to naxis2. The bitpix argument data type of the image and can have the following FITS-standard values:

  • 8 unsigned char
  • 16 short
  • 32 int
  • -32 float
  • -64 double
For example:
  double *drow;
  Fun fun, fun2;
  ... open files ...
  /* get section dimensions */
  FunInfoGet(fun, FUN_SECT_DIM1, &dim1, FUN_SECT_DIM2, &dim2, 0);
  /* allocate one line's worth */
  drow = malloc(dim1*sizeof(double));
  /* retrieve and process each input row (starting at 1) */
  for(i=1; i <= dim2; i++){
    if( !FunImageRowGet(fun, drow, i, i, "bitpix=-64") )
      gerror(stderr, "can't FunImageRowGet: %d %s\n", i, iname);
    ... process drow ...
    if( !FunImageRowPut(fun2, drow, i, i, 64, NULL) )
      gerror(stderr, "can't FunImageRowPut: %d %s\n", i, oname);
  }
  ...

The data are assumed to be in the native machine format and will automatically be swapped to big-endian FITS format if necessary. This behavior can be over-ridden with the convert=[true|false] keyword in the plist param list string.

When you are finished writing the image, you should call FunFlush() to write out the FITS image padding. However, this is not necessary if you subsequently call FunClose() without doing any other I/O to the FITS file.

FunColumnSelect - select Funtools columns

  #include <funtools.h>

  int FunColumnSelect(Fun fun, int size, char *plist, 
                      char *name1, char *type1, char *mode1, int offset1,
                      char *name2, char *type2, char *mode2, int offset2,
                      ...,
                      NULL)

  int FunColumnSelectArr(Fun fun, int size, char *plist, 
                         char **names, char **types, char **modes,
                         int *offsets, int nargs);
The FunColumnSelect() routine is used to select the columns from a Funtools binary table extension or raw event file for processing. This routine allows you to specify how columns in a file are to be read into a user record structure or written from a user record structure to an output FITS file.

The first argument is the Fun handle associated with this set of columns. The second argument specifies the size of the user record structure into which columns will be read. Typically, the sizeof() macro is used to specify the size of a record structure. The third argument allows you to specify keyword directives for the selection and is described in more detail below.

Following the first three required arguments is a variable length list of column specifications. Each column specification will consist of four arguments:

  • name: the name of the column
  • type: the data type of the column as it will be stored in the user record struct (not the data type of the input file). The following basic data types are recognized:
    • A: ASCII characters
    • B: unsigned 8-bit char
    • I: signed 16-bit int
    • U: unsigned 16-bit int (not standard FITS)
    • J: signed 32-bit int
    • V: unsigned 32-bit int (not standard FITS)
    • E: 32-bit float
    • D: 64-bit float
    The syntax used is similar to that which defines the TFORM parameter in FITS binary tables. That is, a numeric repeat value can precede the type character, so that "10I" means a vector of 10 short ints, "E" means a single precision float, etc. Note that the column value from the input file will be converted to the specified data type as the data is read by FunTableRowGet().

    [ A short digression regarding bit-fields: Special attention is required when reading or writing the FITS bit-field type ("X"). Bit-fields almost always have a numeric repeat character preceding the 'X' specification. Usually this value is a multiple of 8 so that bit-fields fit into an integral number of bytes. For all cases, the byte size of the bit-field B is (N+7)/8, where N is the numeric repeat character.

    A bit-field is most easily declared in the user struct as an array of type char of size B as defined above. In this case, bytes are simply moved from the file to the user space. If, instead, a short or int scalar or array is used, then the algorithm for reading the bit-field into the user space depends on the size of the data type used along with the value of the repeat character. That is, if the user data size is equal to the byte size of the bit-field, then the data is simply moved (possibly with endian-based byte-swapping) from one to the other. If, on the other hand, the data storage is larger than the bit-field size, then a data type cast conversion is performed to move parts of the bit-field into elements of the array. Examples will help make this clear:

    • If the file contains a 16X bit-field and user space specifies a 2B char array[2], then the bit-field is moved directly into the char array.
    • If the file contains a 16X bit-field and user space specifies a 1I scalar short int, then the bit-field is moved directly into the short int.
    • If the file contains a 16X bit-field and user space specifies a 1J scalar int, then the bit-field is type-cast to unsigned int before being moved (use of unsigned avoids possible sign extension).
    • If the file contains a 16X bit-field and user space specifies a 2J int array[2], then the bit-field is handled as 2 chars, each of which are type-cast to unsigned int before being moved (use of unsigned avoids possible sign extension).
    • If the file contains a 16X bit-field and user space specifies a 1B char, then the bit-field is treated as a char, i.e., truncation will occur.
    • If the file contains a 16X bit-field and user space specifies a 4J int array[4], then the results are undetermined.
    For all user data types larger than char, the bit-field is byte-swapped as necessary to convert to native format, so that bits in the resulting data in user space can be tested, masked, etc. in the same way regardless of platform.]

    In addition to setting data type and size, the type specification allows a few ancillary parameters to be set, using the full syntax for type:

     [@][n]<type>[[['B']poff]][:[tlmin[:tlmax[:binsiz]]]]
    

    The special character "@" can be prepended to this specification to indicated that the data element is a pointer in the user record, rather than an array stored within the record.

    The [n] value is an integer that specifies the number of elements that are in this column (default is 1). TLMIN, TLMAX, and BINSIZ values also can be specified for this column after the type, separated by colons. If only one such number is specified, it is assumed to be TLMAX, and TLMIN and BINSIZ are set to 1.

    The [poff] value can be used to specify the offset into an array. By default, this offset value is set to zero and the data specified starts at the beginning of the array. The offset usually is specified in terms of the data type of the column. Thus an offset specification of [5] means a 20-byte offset if the data type is a 32-bit integer, and a 40-byte offset for a double. If you want to specify a byte offset instead of an offset tied to the column data type, precede the offset value with 'B', e.g. [B6] means a 6-bye offset, regardless of the column data type. The [poff] is especially useful in conjunction with the pointer @ specification, since it allows the data element to anywhere stored anywhere in the allocated array. For example, a specification such as "@I[2]" specifies the third (i.e., starting from 0) element in the array pointed to by the pointer value. A value of "@2I[4]" specifies the fifth and sixth values in the array. For example, consider the following specification:

    
      typedef struct EvStruct{
        short x[4], *atp;
      } *Event, EventRec;
      /* set up the (hardwired) columns */
      FunColumnSelect( fun, sizeof(EventRec), NULL,
                       "2i",    "2I  ",    "w", FUN_OFFSET(Event, x),
                       "2i2",   "2I[2]",   "w", FUN_OFFSET(Event, x),
                       "at2p",  "@2I",     "w", FUN_OFFSET(Event, atp),
                       "at2p4", "@2I[4]",  "w", FUN_OFFSET(Event, atp),
                       "atp9",  "@I[9]",   "w", FUN_OFFSET(Event, atp),
                       "atb20", "@I[B20]", "w", FUN_OFFSET(Event, atb),
                       NULL);
    
    Here we have specified the following columns:
    • 2i: two short ints in an array which is stored as part the record
    • 2i2: the 3rd and 4th elements of an array which is stored as part of the record
    • an array of at least 10 elements, not stored in the record but allocated elsewhere, and used by three different columns:
      • at2p: 2 short ints which are the first 2 elements of the allocated array
      • at2p4: 2 short ints which are the 5th and 6th elements of the allocated array
      • atp9: a short int which is the 10th element of the allocated array
    • atb20: a short int which is at byte offset 20 of another allocated array
    In this way, several columns can be specified, all of which are in a single array. NB: it is the programmer's responsibility to ensure that specification of a positive value for poff does not point past the end of valid data.
  • read/write mode: "r" means that the column is read from an input file into user space by FunTableRowGet(), "w" means that the column is written to an output file. Both can specified at the same time.
  • offset: the offset into the user data to store this column. Typically, the macro FUN_OFFSET(recname, colname) is used to define the offset into a record structure.

When all column arguments have been specified, a final NULL argument must added to signal the column selection list.

As an alternative to the varargs FunColumnSelect() routine, a non-varargs routine called FunColumnSelectArr() also is available. The first three arguments (fun, size, plist) of this routine are the same as in FunColumnSelect(). Instead of a variable argument list, however, FunColumnSelectArr() takes 5 additional arguments. The first 4 arrays arguments contain the names, types, modes, and offsets, respectively, of the columns being selected. The final argument is the number of columns that are contained in these arrays. It is the user's responsibility to free string space allocated in these arrays.

Consider the following example:

  typedef struct evstruct{
    int status;
    float pi, pha, *phas;
    double energy;
  } *Ev, EvRec;

  FunColumnSelect(fun, sizeof(EvRec), NULL,
    "status",  "J",     "r",   FUN_OFFSET(Ev, status),
    "pi",      "E",     "r",  FUN_OFFSET(Ev, pi),
    "pha",     "E",     "r",  FUN_OFFSET(Ev, pha),
    "phas",    "@9E",   "r",  FUN_OFFSET(Ev, phas),
    NULL);

Each time a row is read into the Ev struct, the "status" column is converted to an int data type (regardless of its data type in the file) and stored in the status value of the struct. Similarly, "pi" and "pha", and the phas vector are all stored as floats. Note that the "@" sign indicates that the "phas" vector is a pointer to a 9 element array, rather than an array allocated in the struct itself. The row record can then be processed as required:

  /* get rows -- let routine allocate the row array */
  while( (ebuf = (Ev)FunTableRowGet(fun, NULL, MAXROW, NULL, &got)) ){
    /* process all rows */
    for(i=0; i<got; i++){
      /* point to the i'th row */
      ev = ebuf+i;
      ev->pi = (ev->pi+.5);
      ev->pha = (ev->pi-.5);
    }

FunColumnSelect() can also be called to define "writable" columns in order to generate a FITS Binary Table, without reference to any input columns. For example, the following will generate a 4-column FITS binary table when FunTableRowPut() is used to write Ev records:

  typedef struct evstruct{
    int status;
    float pi, pha
    double energy;
  } *Ev, EvRec;

  FunColumnSelect(fun, sizeof(EvRec), NULL,
    "status",  "J",     "w",   FUN_OFFSET(Ev, status),
    "pi",      "E",     "w",   FUN_OFFSET(Ev, pi),
    "pha",     "E",     "w",   FUN_OFFSET(Ev, pha),
    "energy",  "D",       "w",   FUN_OFFSET(Ev, energy),
    NULL);
All columns are declared to be write-only, so presumably the column data is being generated or read from some other source.

In addition, FunColumnSelect() can be called to define both "readable" and "writable" columns. In this case, the "read" columns are associated with an input file, while the "write" columns are associated with the output file. Of course, columns can be specified as both "readable" and "writable", in which case they are read from input and (possibly modified data values are) written to the output. The FunColumnSelect() call itself is made by passing the input Funtools handle, and it is assumed that the output file has been opened using this input handle as its Funtools reference handle.

Consider the following example:

  typedef struct evstruct{
    int status;
    float pi, pha, *phas;
    double energy;
  } *Ev, EvRec;

  FunColumnSelect(fun, sizeof(EvRec), NULL,
    "status",  "J",     "r",   FUN_OFFSET(Ev, status),
    "pi",      "E",     "rw",  FUN_OFFSET(Ev, pi),
    "pha",     "E",     "rw",  FUN_OFFSET(Ev, pha),
    "phas",    "@9E",   "rw",  FUN_OFFSET(Ev, phas),
    "energy",  "D",     "w",   FUN_OFFSET(Ev, energy),
    NULL);
As in the "read" example above, each time an row is read into the Ev struct, the "status" column is converted to an int data type (regardless of its data type in the file) and stored in the status value of the struct. Similarly, "pi" and "pha", and the phas vector are all stored as floats. Since the "pi", "pha", and "phas" variables are declared as "writable" as well as "readable", they also will be written to the output file. Note, however, that the "status" variable is declared as "readable" only, and hence it will not be written to an output file. Finally, the "energy" column is declared as "writable" only, meaning it will not be read from the input file. In this case, it can be assumed that "energy" will be calculated in the program before being output along with the other values.

In these simple cases, only the columns specified as "writable" will be output using FunTableRowPut(). However, it often is the case that you want to merge the user columns back in with the input columns, even in cases where not all of the input column names are explicitly read or even known. For this important case, the merge=[type] keyword is provided in the plist string.

The merge=[type] keyword tells Funtools to merge the columns from the input file with user columns on output. It is normally used when an input and output file are opened and the input file provides the Funtools reference handle for the output file. In this case, each time FunTableRowGet() is called, the raw input rows are saved in a special buffer. If FunTableRowPut() then is called (before another call to FunTableRowGet()), the contents of the raw input rows are merged with the user rows according to the value of type as follows:

  • update: add new user columns, and update value of existing ones (maintaining the input data type)
  • replace: add new user columns, and replace the data type and value of existing ones. (Note that if tlmin/tlmax values are not specified in the replacing column, but are specified in the original column being replaced, then the original tlmin/tlmax values are used in the replacing column.)
  • append: only add new columns, do not "replace" or "update" existing ones

Consider the example above. If merge=update is specified in the plist string, then "energy" will be added to the input columns, and the values of "pi", "pha", and "phas" will be taken from the user space (i.e., the values will be updated from the original values, if they were changed by the program). The data type for "pi", "pha", and "phas" will be the same as in the original file. If merge=replace is specified, both the data type and value of these three input columns will be changed to the data type and value in the user structure. If merge=append is specified, none of these three columns will be updated, and only the "energy" column will be added. Note that in all cases, "status" will be written from the input data, not from the user record, since it was specified as read-only.

Standard applications will call FunColumnSelect() to define user columns. However, if this routine is not called, the default behavior is to transfer all input columns into user space. For this purpose a default record structure is defined such that each data element is properly aligned on a valid data type boundary. This mechanism is used by programs such as fundisp and funtable to process columns without needing to know the specific names of those columns. It is not anticipated that users will need such capabilities (contact us if you do!)

By default, FunColumnSelect() reads/writes rows to/from an "array of structs", where each struct contains the column values for a single row of the table. This means that the returned values for a given column are not contiguous. You can set up the IO to return a "struct of arrays" so that each of the returned columns are contiguous by specifying org=structofarrays (abbreviation: org=soa) in the plist. (The default case is org=arrayofstructs or org=aos.)

For example, the default setup to retrieve rows from a table would be to define a record structure for a single event and then call FunColumnSelect() as follows:

  typedef struct evstruct{
    short region;
    double x, y;
    int pi, pha;
    double time;
  } *Ev, EvRec;

  got = FunColumnSelect(fun, sizeof(EvRec), NULL,
                        "x",       "D:10:10", mode, FUN_OFFSET(Ev, x),
                        "y",       "D:10:10", mode, FUN_OFFSET(Ev, y),
                        "pi",      "J",       mode, FUN_OFFSET(Ev, pi),
                        "pha",     "J",       mode, FUN_OFFSET(Ev, pha),
                        "time",    "1D",      mode, FUN_OFFSET(Ev, time),
                        NULL);
Subsequently, each call to FunTableRowGet() will return an array of structs, one for each returned row. If instead you wanted to read columns into contiguous arrays, you specify org=soa:
  typedef struct aevstruct{
    short region[MAXROW];
    double x[MAXROW], y[MAXROW];
    int pi[MAXROW], pha[MAXROW];
    double time[MAXROW];
  } *AEv, AEvRec;

  got = FunColumnSelect(fun, sizeof(AEvRec), "org=soa",
                      "x",       "D:10:10", mode, FUN_OFFSET(AEv, x),
                      "y",       "D:10:10", mode, FUN_OFFSET(AEv, y),
                      "pi",      "J",       mode, FUN_OFFSET(AEv, pi),
                      "pha",     "J",       mode, FUN_OFFSET(AEv, pha),
                      "time",    "1D",      mode, FUN_OFFSET(AEv, time),
                      NULL);
Note that the only modification to the call is in the plist string.

Of course, instead of using staticly allocated arrays, you also can specify dynamically allocated pointers:

  /* pointers to arrays of columns (used in struct of arrays) */
  typedef struct pevstruct{
    short *region;
    double *x, *y;
    int *pi, *pha;
    double *time;
  } *PEv, PEvRec;

  got = FunColumnSelect(fun, sizeof(PEvRec), "org=structofarrays",
                      "$region", "@I",       mode, FUN_OFFSET(PEv, region),
                      "x",       "@D:10:10", mode, FUN_OFFSET(PEv, x),
                      "y",       "@D:10:10", mode, FUN_OFFSET(PEv, y),
                      "pi",      "@J",       mode, FUN_OFFSET(PEv, pi),
                      "pha",     "@J",       mode, FUN_OFFSET(PEv, pha),
                      "time",    "@1D",      mode, FUN_OFFSET(PEv, time),
                      NULL);
Here, the actual storage space is either allocated by the user or by the FunColumnSelect() call).

In all of the above cases, the same call is made to retrieve rows, e.g.:

    buf = (void *)FunTableRowGet(fun, NULL, MAXROW, NULL, &got);
However, the individual data elements are accessed differently. For the default case of an "array of structs", the individual row records are accessed using:
  for(i=0; i<got; i++){
    ev = (Ev)buf+i;
    fprintf(stdout, "%.2f\t%.2f\t%d\t%d\t%.4f\t%.4f\t%21.8f\n",
            ev->x, ev->y, ev->pi, ev->pha, ev->dx, ev->dy, ev->time);
  }
For a struct of arrays or a struct of array pointers, we have a single struct through which we access individual columns and rows using:
  aev = (AEv)buf;
  for(i=0; i<got; i++){
    fprintf(stdout, "%.2f\t%.2f\t%d\t%d\t%.4f\t%.4f\t%21.8f\n",
            aev->x[i], aev->y[i], aev->pi[i], aev->pha[i], 
            aev->dx[i], aev->dy[i], aev->time[i]);
  }
Support for struct of arrays in the FunTableRowPut() call is handled analogously.

See the evread example code and evmerge example code for working examples of how FunColumnSelect() is used.

FunColumnActivate - activate Funtools columns

  #include <funtools.h>

  void FunColumnActivate(Fun fun, char *s, char *plist)

The FunColumnActivate() routine determines which columns (set up by FunColumnSelect()) ultimately will be read and/or written. By default, all columns that are selected using FunColumnSelect() are activated. The FunColumnActivate() routine can be used to turn off/off activation of specific columns.

The first argument is the Fun handle associated with this set of columns. The second argument is a space-delimited list of columns to activate or de-activate. Columns preceded by "+" are activated and columns preceded by a "-" are de-activated. If a column is named without "+" or "-", it is activated. The reserved strings "$region" and '$n' are used to activate a special columns containing the filter region value and row value, respectively, associated with this row. For example, if a filter containing two circular regions is specified as part of the Funtools file name, this column will contain a value of 1 or 2, depending on which region that row was in. The reserved strings "$x" and "$y" are used to activate the current binning columns. Thus, if the columns DX and DY are specified as binning columns:

  [sh $] fundisp foo.fits[bincols=(DX,DY)]
then "$x" and "$y" will refer to these columns in a call to FunColumnActivate().

In addition, if the activation string contains only columns to be activated, then the routine will de-activate all other columns. Similarly, if the activation string contains only columns to de-activate, then the routine will activate all other columns before activating the list. This makes it simple to change the activation state of all columns without having to know all of the column names. For example:

  • "pi pha time" # only these three columns will be active
  • "-pi -pha -time" # all but these columns will be active
  • "pi -pha" # only pi is active, pha is not, others are not
  • "+pi -pha" # same as above
  • "pi -pha -time" # only pi is active, all others are not
  • "pi pha" # pha and pi are active, all others are not
  • "pi pha -x -y" # pha and pi are active, all others are not

You can use the column activation list to reorder columns, since columns are output in the order specified. For example:

  # default output order
  fundisp snr.ev'[cir 512 512 .1]' 
         X        Y      PHA       PI                  TIME       DX       DY
  -------- -------- -------- -------- --------------------- -------- --------
       512      512        6        7     79493997.45854475      578      574
       512      512        8        9     79494575.58943175      579      573
       512      512        5        6     79493631.03866175      578      575
       512      512        5        5     79493290.86521725      578      575
       512      512        8        9     79493432.00990875      579      573

  # re-order the output by specifying explicit order
  fundisp snr.ev'[cir 512 512 .1]' "time x y dy dx pi pha"
                   TIME        X        Y       DY       DX       PI      PHA
  --------------------- -------- -------- -------- -------- -------- --------
      79493997.45854475      512      512      574      578        7        6
      79494575.58943175      512      512      573      579        9        8
      79493631.03866175      512      512      575      578        6        5
      79493290.86521725      512      512      575      578        5        5
      79493432.00990875      512      512      573      579        9        8

A "+" sign by itself means to activate all columns, so that you can reorder just a few columns without specifying all of them:

  # reorder 3 columns and then output the rest
  fundisp snr.ev'[cir 512 512 .1]' "time pi pha +"
                   TIME       PI      PHA        Y        X       DX       DY
  --------------------- -------- -------- -------- -------- -------- --------
      79493997.45854475        7        6      512      512      578      574
      79494575.58943175        9        8      512      512      579      573
      79493631.03866175        6        5      512      512      578      575
      79493290.86521725        5        5      512      512      578      575
      79493432.00990875        9        8      512      512      579      573
The column activation/deactivation is performed in the order of the specified column arguments. This means you can mix "+", "-" (which de-activates all columns) and specific column names to reorder and select columns in one command. For example, consider the following:
  # reorder and de-activate
  fundisp snr.ev'[cir 512 512 .1]' "time pi pha + -x -y"
                   TIME       PI      PHA       DX       DY
  --------------------- -------- -------- -------- --------
      79493997.45854475        7        6      578      574
      79494575.58943175        9        8      579      573
      79493631.03866175        6        5      578      575
      79493290.86521725        5        5      578      575
      79493432.00990875        9        8      579      573
We first activate "time", "pi", and "pha" so that they are output first. We then activate all of the other columns, and then de-activate "x" and "y". Note that this is different from:
  # probably not what you want ...
  fundisp snr.ev'[cir 512 512 .1]' "time pi pha -x -y +"
                   TIME       PI      PHA        Y        X       DX       DY
  --------------------- -------- -------- -------- -------- -------- --------
      79493997.45854475        7        6      512      512      578      574
      79494575.58943175        9        8      512      512      579      573
      79493631.03866175        6        5      512      512      578      575
      79493290.86521725        5        5      512      512      578      575
      79493432.00990875        9        8      512      512      579      573
Here, "x" and "y" are de-activated, but then all columns including "x" and "y" are again re-activated.

Typically, FunColumnActivate() uses a list of columns that are passed into the program from the command line. For example, the code for funtable contains the following:

  char *cols=NULL;

  /* open the input FITS file */
  if( !(fun = FunOpen(argv[1], "rc", NULL)) )
    gerror(stderr, "could not FunOpen input file: %s\n", argv[1]);

  /* set active flag for specified columns */
  if( argc >= 4 ) cols = argv[3];
  FunColumnActivate(fun, cols, NULL);
The FunOpen() call sets the default columns to be all columns in the input file. The FunColumnActivate() call then allows the user to control which columns ultimately will be activated (i.e., in this case, written to the new file). For example:
  funtable test.ev foo.ev "pi pha time"
will process only the three columns mentioned, while:
  funtable test.ev foo.ev "-time"
will process all columns except "time".

If FunColumnActivate() is called with a null string, then the environment variable FUN_COLUMNS will be used to provide a global value, if present. This is the reason why we call the routine even if no columns are specified on the command line (see example above), instead of calling it this way:

  /* set active flag for specified columns */
  if( argc >= 4 ){
    FunColumnActivate(fun, argv[3], NULL);
  }

FunColumnLookup - lookup a Funtools column

  #include <funtools.h>

  int FunColumnLookup(Fun fun, char *s, int which,
                      char **name, int *type, int *mode,
                      int *offset, int *n, int *width)

The FunColumnLookup() routine returns information about a named (or indexed) column. The first argument is the Fun handle associated with this set of columns. The second argument is the name of the column to look up. If the name argument is NULL, the argument that follows is the zero-based index into the column array of the column for which information should be returned. The next argument is a pointer to a char *, which will contain the name of the column. The arguments that follow are the addresses of int values into which the following information will be returned:

  • type: data type of column:
    • A: ASCII characters
    • B: unsigned 8-bit char
    • I: signed 16-bit int
    • U: unsigned 16-bit int (not standard FITS)
    • J: signed 32-bit int
    • V: unsigned 32-bit int (not standard FITS)
    • E: 32-bit float
    • D: 64-bit float
  • mode: bit flag status of column, including:
    • COL_ACTIVE 1 is column activated?
    • COL_IBUF 2 is column in the raw input data?
    • COL_PTR 4 is column a pointer to an array?
    • COL_READ 010 is read mode selected?
    • COL_WRITE 020 is write mode selected?
    • COL_REPLACEME 040 is this column being replaced by user data?
  • offset: byte offset in struct
  • n: number of elements (i.e. size of vector) in this column
  • width: size in bytes of this column
If the named column exists, the routine returns a positive integer, otherwise zero is returned. (The positive integer is the index+1 into the column array where this column was located.) If NULL is passed as the return address of one (or more) of these values, no data is passed back for that information. For example:
  if( !FunColumnLookup(fun, "phas", 0, NULL NULL, NULL, NULL, &npha, NULL) )
    gerror(stderr, "can't find phas column\n");
only returns information about the size of the phas vector.

FunTableRowGet - get Funtools rows

  #include <funtools.h>

  void *FunTableRowGet(Fun fun, void *rows, int maxrow, char *plist,
                       int *nrow)

The FunTableRowGet() routine retrieves rows from a Funtools binary table or raw event file, and places the values of columns selected by FunColumnSelect() into an array of user structs. Selected column values are automatically converted to the specified user data type (and to native data format) as necessary.

The first argument is the Fun handle associated with this row data. The second rows argument is the array of user structs into which the selected columns will be stored. If NULL is passed, the routine will automatically allocate space for this array. (This includes proper allocation of pointers within each struct, if the "@" pointer type is used in the selection of columns. Note that if you pass NULL in the second argument, you should free this space using the standard free() system call when you are finished with the array of rows.) The third maxrow argument specifies the maximum number of rows to be returned. Thus, if rows is allocated by the user, it should be at least of size maxrow*sizeof(evstruct).

The fourth plist argument is a param list string. Currently, the keyword/value pair "mask=transparent" is supported in the plist argument. If this string is passed in the call's plist argument, then all rows are passed back to the user (instead of just rows passing the filter). This is only useful when FunColumnSelect() also is used to specify "$region" as a column to return for each row. In such a case, rows found within a region have a returned region value greater than 0 (corresponding to the region id of the region in which they are located), rows passing the filter but not in a region have region value of -1, and rows not passing any filter have region value of 0. Thus, using "mask=transparent" and the returned region value, a program can process all rows and decide on an action based on whether a given row passed the filter or not.

The final argument is a pointer to an int variable that will return the actual number of rows returned. The routine returns a pointer to the array of stored rows, or NULL if there was an error. (This pointer will be the same as the second argument, if the latter is non-NULL).

  /* get rows -- let routine allocate the row array */
  while( (buf = (Ev)FunTableRowGet(fun, NULL, MAXROW, NULL, &got)) ){
    /* process all rows */
    for(i=0; i<got; i++){
      /* point to the i'th row */
      ev = buf+i;
      /* rearrange some values. etc. */
      ev->energy = (ev->pi+ev->pha)/2.0;
      ev->pha = -ev->pha;
      ev->pi = -ev->pi;
    }
    /* write out this batch of rows */
    FunTableRowPut(fun2, buf, got, 0, NULL);
    /* free row data */
    if( buf ) free(buf);
  }
As shown above, successive calls to FunTableRowGet() will return the next set of rows from the input file until all rows have been read, i.e., the routine behaves like sequential Unix I/O calls such as fread(). See evmerge example code for a more complete example.

Note that FunTableRowGet() also can be called as FunEventsGet(), for backward compatibility.

FunTableRowPut - put Funtools rows


int FunTableRowPut(Fun fun, void *rows, int nev, int idx, char *plist)

The FunTableRowPut() routine writes rows to a FITS binary table, taking its input from an array of user structs that contain column values selected by a previous call to FunColumnSelect(). Selected column values are automatically converted from native data format to FITS data format as necessary.

The first argument is the Fun handle associated with this row data. The second rows argument is the array of user structs to output. The third nrow argument specifies the number number of rows to write. The routine will write nrow records, starting from the location specified by rows.

The fourth idx argument is the index of the first raw input row to write, in the case where rows from the user buffer are being merged with their raw input row counterparts (see below). Note that this idx value is has nothing to do with the row buffer specified in argument 1. It merely matches the row being written with its corresponding (hidden) raw row. Thus, if you read a number of rows, process them, and then write them out all at once starting from the first user row, the value of idx should be 0:

  Ev ebuf, ev;
  /* get rows -- let routine allocate the row array */
  while( (ebuf = (Ev)FunTableRowGet(fun, NULL, MAXROW, NULL, &got)) ){
    /* process all rows */
    for(i=0; i<got; i++){
      /* point to the i'th row */
      ev = ebuf+i;
      ...
    }
    /* write out this batch of rows, starting with the first */
    FunTableRowPut(fun2, (char *)ebuf, got, 0, NULL);
    /* free row data */
    if( ebuf ) free(ebuf);
  }

On the other hand, if you write out the rows one at a time (possibly skipping rows), then, when writing the i'th row from the input array of rows, set idx to the value of i:

  Ev ebuf, ev;
  /* get rows -- let routine allocate the row array */
  while( (ebuf = (Ev)FunTableRowGet(fun, NULL, MAXROW, NULL, &got)) ){
    /* process all rows */
    for(i=0; i<got; i++){
      /* point to the i'th row */
      ev = ebuf+i;
      ...
      /* write out the current (i.e., i'th) row */
      FunTableRowPut(fun2, (char *)ev, 1, i, NULL);
    }
    /* free row data */
    if( ebuf ) free(ebuf);
  }

The final argument is a param list string that is not currently used. The routine returns the number of rows output. This should be equal to the value passed in the third nrow When FunTableRowPut() is first called for a given binary table, Funtools checks to see of the primary header has already been written (either by writing a previous row table or by writing an image.) If not, a dummy primary header is written to the file specifying that an extension should be expected. After this, a binary table header is automatically written containing information about the columns that will populate this table. In addition, if a Funtools reference handle was specified when this table was opened, the parameters from this Funtools reference handle are merged into the new binary table header.

In a typical Funtools row loop, you read rows using FunTableRowGet()() and write rows using FunTableRowPut(). The columns written by FunTableRowPut()() are those defined as writable by a previous call to FunColumnSelect(). If that call to FunColumnSelect also specified merge=[update|replace|append], then the entire corresponding raw input row record will be merged with the output row according to the merge specification (see FunColumnSelect() above).

A call to write rows can either be done once, after all rows in the input batch have been processed, or it can be done (slightly less efficiently) one row at a time (or anything in between). We do recommend that you write all rows associated with a given batch of input rows before reading new rows. This is required if you are merging the output rows with the raw input rows (since the raw rows are destroyed with each successive call to get new rows). For example:

  Ev buf, ev;
  ...
  /* get rows -- let routine allocate the row array */
  while( (buf = (Ev)FunTableRowGet(fun, NULL, MAXROW, NULL, &got)) ){
    /* point to the i'th row */
    ev = buf + i;
    .... process
  }
  /* write out this batch of rows */
  FunTableRowPut(fun2, buf, got, 0, NULL);
  /* free row data */
  if( buf ) free(buf);
  }
or
  Ev buf, ev;
  ...
  /* get rows -- let routine allocate the row array */
  while( (buf = (Ev)FunTableRowGet(fun, NULL, MAXROW, NULL, &got)) ){
    /* process all rows */
    for(i=0; i<got; i++){
      /* point to the i'th row */
      ev = buf + i;
      ... process
      /* write out this batch of rows with the new column */
      if( dowrite )
        FunTableRowPut(fun2, buf, 1, i, NULL);
    }
    /* free row data */
    if( buf ) free(buf);
  }

Note that the difference between these calls is that the first one outputs got rows all at once and therefore passes idx=0 in argument four, so that merging starts at the first raw input row. In the second case, a check it made on each row to see if it needs to be output. If so, the value of idx is passed as the value of the i variable which points to the current row being processed in the batch of input rows.

As shown above, successive calls to FunTableRowPut() will write rows sequentially. When you are finished writing all rows in a table, you should call FunFlush() to write out the FITS binary table padding. However, this is not necessary if you subsequently call FunClose() without doing any other I/O to the FITS file.

Note that FunTableRowPut() also can be called as FunEventsPut(), for backward compatibility.

FunParamGet - get a Funtools param value

  #include <funtools.h>

  int FunParamGetb(Fun fun, char *name, int n, int defval, int *got)

  int FunParamGeti(Fun fun, char *name, int n, int defval, int *got)

  double FunParamGetd(Fun fun, char *name, int n, double defval, int *got)

  char *FunParamGets(Fun fun, char *name, int n, char *defval, int *got)

The four routines FunParamGetb(), FunParamGeti(), FunParamGetd(), and FunParamGets(), return the value of a FITS header parameter as a boolean, int, double, and string, respectively. The string returned by FunParamGets() is a malloc'ed copy of the header value and should be freed when no longer needed.

The first argument is the Fun handle associated with the FITS header being accessed. Normally, the header is associated with the FITS extension that you opened with FunOpen(). However, you can use FunInfoPut() to specify access of the primary header. In particular, if you set the FUN_PRIMARYHEADER parameter to 1, then the primary header is used for all parameter access until the value is reset to 0. For example:

  int val;
  FunParamGeti(fun, "NAXIS", 1, 0, &got);              # current header
  val=1;
  FunInfoPut(fun, FUN_PRIMARYHEADER, &val, 0);         # switch to ...
  FunParamGeti(fun, "NAXIS", 1, 0, &got);              # ... primary header
  FunParamGeti(fun, "NAXIS", 2, 0, &got);              # ... primary header
  val=0;
  FunInfoPut(fun, FUN_PRIMARYHEADER, &val, 0);         # switch back to ...
  FunParamGeti(fun, "NAXIS", 2, 0, &got);              # current header

Alternatively, you can use the FUN_PRIMARY macro to access parameters from the primary header on a per-parameter basis:

  FunParamGeti(fun, "NAXIS1", 0, 0, &got);              # current header
  FunParamGeti(FUN_PRIMARY(fun), "NAXIS1", 0, 0, &got); # primary header
NB: FUN_PRIMARY is deprecated. It makes use of a global parameter and therefore will not not appropriate for threaded applications, when we make funtools thread-safe. We recommend use of FunInfoPut() to switch between the extension header and the primary header.

For output data, access to the primary header is only possible until the header is written out, which usually takes place when the first data are written.

The second argument is the name of the parameter to access. The third n argument, if non-zero, is an integer that will be added as a suffix to the parameter name. This makes it easy to use a simple loop to process parameters having the same root name. For example, to gather up all values of TLMIN and TLMAX for each column in a binary table, you can use:

  for(i=0, got=1; got; i++){
    fun->cols[i]->tlmin = (int)FunParamGeti(fun, "TLMIN", i+1, 0.0, &got);
    fun->cols[i]->tlmax = (int)FunParamGeti(fun, "TLMAX", i+1, 0.0, &got);
  }

The fourth defval argument is the default value to return if the parameter does not exist. Note that the data type of this parameter is different for each specific FunParamGet() call. The final got argument will be 0 if no param was found. Otherwise the data type of the parameter is returned as follows: FUN_PAR_UNKNOWN ('u'), FUN_PAR_COMMENT ('c'), FUN_PAR_LOGICAL ('l'), FUN_PAR_INTEGER ('i'), FUN_PAR_STRING ('s'), FUN_PAR_REAL ('r'), FUN_PAR_COMPLEX ('x').

These routines return the value of the header parameter, or the specified default value if the header parameter does not exist. The returned value is a malloc'ed string and should be freed when no longer needed.

By default, FunParamGets() returns the string value of the named parameter. However, you can use FunInfoPut() to retrieve the raw 80-character FITS card instead. In particular, if you set the FUN_RAWPARAM parameter to 1, then card images will be returned by FunParamGets() until the value is reset to 0.

Alternatively, if the FUN_RAW macro is applied to the name, then the 80-character raw FITS card is returned instead. NB: FUN_RAW is deprecated. It makes use of a global parameter and therefore will not not appropriate for threaded applications, when we make funtools thread-safe. We recommend use of FunInfoPut() to switch between the extension header and the primary header.

Note that in addition to the behaviors described above, the routine FunParamGets() will return the 80 raw characters of the nth FITS card (including the comment) if name is specified as NULL and n is positive. For example, to loop through all FITS header cards in a given extension and print out the raw card, use:

  for(i=1; ;i++){
    if( (s = FunParamGets(fun, NULL, i, NULL, &got)) ){
      fprintf(stdout, "%.80s\n", s);
      free(s);
    }
    else{
      break;
    }
  }

FunParamPut - put a Funtools param value

  #include <funtools.h>

  int FunParamPutb(Fun fun, char *name, int n, int value, char *comm,
                   int append)

  int FunParamPuti(Fun fun, char *name, int n, int value, char *comm,
                   int append)

  int FunParamPutd(Fun fun, char *name, int n, double value, int prec,
                   char *comm, int append)

  int FunParamPuts(Fun fun, char *name, int n, char *value, char *comm,
                   int append)

The four routines FunParamPutb(), FunParamPuti(), FunParamPutd(), and FunParamPuts(), will set the value of a FITS header parameter as a boolean, int, double, and string, respectively.

The first argument is the Fun handle associated with the FITS header being accessed. Normally, the header is associated with the FITS extension that you opened with FunOpen(). However, you can use FunInfoPut() to specify that use of the primary header. In particular, if you set the FUN_PRIMARYHEADER parameter to 1, then the primary header is used for all parameter access until the value is reset to 0. For example:

  int val;
  FunParamPuti(fun, "NAXIS1", 0, 10, NULL, 1);       # current header
  val=1;
  FunInfoPut(fun, FUN_PRIMARYHEADER, &val, 0);       # switch to ...
  FunParamPuti(fun, "NAXIS1", 0, 10, NULL, 1);       # primary header
(You also can use the deprecated FUN_PRIMARY macro, to access parameters from the primary header.)

The second argument is the name of the parameter. ( In accordance with FITS standards, the special names COMMENT and HISTORY, as well as blank names, are output without the "= " value indicator in columns 9 and 10.

The third n argument, if non-zero, is an integer that will be added as a suffix to the parameter name. This makes it easy to use a simple loop to process parameters having the same root name. For example, to set the values of TLMIN and TLMAX for each column in a binary table, you can use:

  for(i=0; i<got; i++){
    FunParamPutd(fun, "TLMIN", i+1, tlmin[i], 7, "min column val", 1);
    FunParamPutd(fun, "TLMAX", i+1, tlmax[i], 7, "max column val", 1);
  }

The fourth defval argument is the value to set. Note that the data type of this argument is different for each specific FunParamPut() call. The comm argument is the comment string to add to this header parameter. Its value can be NULL. The final append argument determines whether the parameter is added to the header if it does not exist. If set to a non-zero value, the header parameter will be appended to the header if it does not exist. If set to 0, the value will only be used to change an existing parameter.

Note that the double precision routine FunParamPutd() supports an extra prec argument after the value argument, in order to specify the precision when converting the double value to ASCII. In general a 20.[prec] format is used (since 20 characters are alloted to a floating point number in FITS) as follows: if the double value being put to the header is less than 0.1 or greater than or equal to 10**(20-2-[prec]), then %20.[prec]e format is used (i.e., scientific notation); otherwise %20.[prec]f format is used (i.e., numeric notation).

As a rule, parameters should be set before writing the table or image. It is, however, possible to update the value of an existing parameter after writing an image or table (but not to add a new one). Such updating only works if the parameter already exists and if the output file is seekable, i.e. if it is a disk file or is stdout being redirected to a disk file.

It is possible to add a new parameter to a header after the data has been written, but only if space has previously been reserved. To reserve space, add a blank parameter whose value is the name of the parameter you eventually will update. Then, when writing the new parameter, specify a value of 2 for the append flag. The parameter writing routine will first look to update an existing parameter, as usual. If an existing parameter is not found, an appropriately-valued blank parameter will be searched for and replaced. For example:

  /* add blank card to be used as a place holder for IPAR1 update */
  FunParamPuts(fun, NULL, 0, "IPAR1", "INTEGER Param", 0);
  ...
  /* write header and data */
  FunTableRowPut(fun, events, got, 0, NULL);
  ...
  /* update param in file after writing data -- note append = 2 here */
  FunParamPuti(fun, "IPAR", 1, 400, "INTEGER Param", 2);

The parameter routines return a 1 if the routine was successful and a 0 on failure. In general, the major reason for failure is that you did not set the append argument to a non-zero value and the parameter did not already exist in the file.

FunInfoGet - get information from Funtools struct

  #include <funtools.h>

  int FunInfoGet(Fun fun, int type, char *addr, ...)

The FunInfoGet() routine returns information culled from the Funtools structure. The first argument is the Fun handle from which information is to be retrieved. This first required argument is followed by a variable length list of pairs of arguments. Each pair consists of an integer representing the type of information to retrieve and the address where the information is to be stored. The list is terminated by a 0. The routine returns the number of get actions performed.

The full list of available information is described below. Please note that only a few of these will be useful to most application developers. For imaging applications, the most important types are:

  FUN_SECT_DIM1   int  /* dim1 for section */
  FUN_SECT_DIM2   int  /* dim2 for section */
  FUN_SECT_BITPIX int  /* bitpix for section */
These would be used to determine the dimensions and data type of image data retrieved using the FunImageGet() routine. For example:
  /* extract and bin the data section into an image buffer */
  buf = FunImageGet(fun, NULL, NULL);
  /* get required information from funtools structure.
     this should come after the FunImageGet() call, in case the call
     changed sect_bitpix */
  FunInfoGet(fun,
             FUN_SECT_BITPIX,  &bitpix,
             FUN_SECT_DIM1,    &dim1,
             FUN_SECT_DIM2,    &dim2,
             0);
  /* loop through pixels and reset values below limit to value */
  for(i=0; i<dim1*dim2; i++){
    switch(bitpix){
    case 8:
      if( cbuf[i] <= blimit ) cbuf[i] = bvalue;
    ...
  }
It is important to bear in mind that the call to FunImageGet() can change the value of FUN_SECT_BITPIX (e.g. if "bitpix=n" is passed in the param list). Therefore, a call to FunInfoGet() should be made after the call to FunImageGet(), in order to retrieve the updated bitpix value. See the imblank example code for more details.

It also can be useful to retrieve the World Coordinate System information from the Funtools structure. Funtools uses the the WCS Library developed by Doug Mink at SAO, which is available here. (More information about the WCSTools project in general can be found here.) The FunOpen() routine initializes two WCS structures that can be used with this WCS Library. Applications can retrieve either of these two WCS structures using FunInfoGet():

  FUN_WCS  struct WorldCoor * /* wcs structure, for image coordinates*/
  FUN_WCS0 struct WorldCoor * /* wcs structure, for physical coordinates */
The structure retrieved by FUN_WCS is a WCS library handle containing parameters suitable for use with image coordinates, regardless of whether the data are images or tables. For this structure, the WCS reference point (CRPIX) has been converted to image coordinates if the underlying file is a table (and therefore in physical coordinates). You therefore must ensure that the positions being passed to a routine like pix2wcs are in image coordinates. The FUN_WCS0 structure has not had its WCS reference point converted to image coordinates. It therefore is useful when passing processing physical coordinates from a table.

Once a WCS structure has been retrieved, it can be used as the first argument to the WCS library routines. (If the structure is NULL, no WCS information was contained in the file.) The two important WCS routines that Funtools uses are:

  #include <wcs.h>
  void pix2wcs (wcs,xpix,ypix,xpos,ypos)
    struct WorldCoor *wcs; /* World coordinate system structure */
    double xpix,ypix;      /* x and y coordinates in pixels */
    double *xpos,*ypos;    /* RA and Dec in degrees (returned) */
which converts pixel coordinates to sky coordinates, and:
  void wcs2pix (wcs, xpos, ypos, xpix, ypix, offscl)
    struct WorldCoor *wcs; /* World coordinate system structure */
    double xpos,ypos;      /* World coordinates in degrees */
    double *xpix,*ypix;    /* coordinates in pixels */
    int *offscl;           /* 0 if within bounds, else off scale */
which converts sky coordinates to pixel coordinates. Again, please note that the wcs structure returned by FUN_WCS assumes that image coordinates are passed to the pix2wcs routine, while FUN_WCS0 assumes that physical coordinates are passed.

Note that funtools.h file automatically includes wcs.h. An example program that utilizes these WCS structure to call WCS Library routines is twcs.c.

The following is the complete list of information that can be returned:

  name            type            comment
  ---------       --------        ---------------------------------------------
  FUN_FNAME     char *            /* file name */
  FUN_GIO       GIO               /* gio handle */
  FUN_HEADER    FITSHead          /* fitsy header struct */
  FUN_TYPE      int               /* TY_TABLE,TY_IMAGE,TY_EVENTS,TY_ARRAY */
  FUN_BITPIX    int               /* bits/pixel in file */
  FUN_MIN1      int               /* tlmin of axis1 -- tables */
  FUN_MAX1      int               /* tlmax of axis1 -- tables */
  FUN_MIN2      int               /* tlmin of axis2 -- tables */
  FUN_MAX2      int               /* tlmax of axis2 -- tables */
  FUN_DIM1      int               /* dimension of axis1 */
  FUN_DIM2      int               /* dimension of axis2 */
  FUN_ENDIAN    int               /* 0=little, 1=big endian */
  FUN_FILTER    char *            /* supplied filter */
  FUN_IFUN      FITSHead          /* pointer to reference header */
  FUN_IFUN0     FITSHead          /* same as above, but no reset performed */
  /* image information */
  FUN_DTYPE     int               /* data type for images */
  FUN_DLEN      int               /* length of image in bytes */
  FUN_DPAD      int               /* padding to end of extension */
  FUN_DOBLANK   int               /* was blank keyword defined? */
  FUN_BLANK     int               /* value for blank */
  FUN_SCALED    int               /* was bscale/bzero defined? */
  FUN_BSCALE    double            /* bscale value */
  FUN_BZERO     double            /* bzero value */
  /* table information */
  FUN_NROWS     int               /* number of rows in file (naxis2) */
  FUN_ROWSIZE   int               /* size of user row struct */
  FUN_BINCOLS   char *            /* specified binning columns */
  FUN_OVERFLOW  int               /* overflow detected during binning? */
  /* array information */
  FUN_SKIP      int               /* bytes to skip in array header */
  /* section information */
  FUN_SECT_X0   int               /* low dim1 value of section */
  FUN_SECT_X1   int               /* hi dim1 value of section */
  FUN_SECT_Y0   int               /* low dim2 value of section */
  FUN_SECT_Y1   int               /* hi dim2 value of section */
  FUN_SECT_BLOCK int              /* section block factor */
  FUN_SECT_BTYPE int              /* 's' (sum), 'a' (average) for binning */
  FUN_SECT_DIM1 int               /* dim1 for section */
  FUN_SECT_DIM2 int               /* dim2 for section */
  FUN_SECT_BITPIX int             /* bitpix for section */
  FUN_SECT_DTYPE int              /* data type for section */
  FUN_RAWBUF    char *            /* pointer to raw row buffer */
  FUN_RAWSIZE   int               /* byte size of raw row records */
  /* column  information */
  FUN_NCOL      int               /* number of row columns defined */
  FUN_COLS      FunCol            /* array of row columns */
  /* WCS information */
  FUN_WCS       struct WorldCoor * /* wcs structure, converted for images*/
  FUN_WCS0      struct WorldCoor * /* wcs structure, not converted */

Row applications would not normally need any of this information. An example of how these values can be used in more complex programs is the evnext example code. In this program, the time value for each row is changed to be the value of the succeeding row. The program thus reads the time values for a batch of rows, changes the time values to be the value for the succeeding row, and then merges these changed time values back with the other columns to the output file. It then reads the next batch, etc.

This does not work for the last row read in each batch, since there is no succeeding row until the next batch is read. Therefore, the program saves that last row until it has read the next batch, then processes the former before starting on the new batch. In order to merge the last row successfully, the code uses FUN_RAWBUF to save and restore the raw input data associated with each batch of rows. Clearly, this requires some information about how funtools works internally. We are happy to help you write such programs as the need arises.

FunInfoPut - put information into a Funtools struct

  #include <funtools.h>

  int FunInfoPut(Fun fun, int type, char *addr, ...)

The FunInfoPut() routine puts information into a Funtools structure. The first argument is the Fun handle from which information is to be retrieved. After this first required argument comes a variable length list of pairs of arguments. Each pair consists of an integer representing the type of information to store and the address of the new information to store in the struct. The variable list is terminated by a 0. The routine returns the number of put actions performed.

The full list of available information is described above with the FunInfoPut() routine. Although use of this routine is expected to be uncommon, there is one important situation in which it plays an essential part: writing multiple extensions to a single output file.

For input, multiple extensions are handled by calling FunOpen() for each extension to be processed. When opening multiple inputs, it sometimes is the case that you will want to process them and then write them (including their header parameters) to a single output file. To accomplish this, you open successive input extensions using FunOpen() and then call FunInfoPut() to set the Funtools reference handle of the output file to that of the newly opened input extension:

  /* open a new input extension */
  ifun=FunOpen(tbuf, "r", NULL)) )
  /* make the new extension the reference handle for the output file */
  FunInfoPut(ofun, FUN_IFUN, &ifun, 0);
Resetting FUN_IFUN has same effect as when a funtools handle is passed as the final argument to FunOpen(). The state of the output file is reset so that a new extension is ready to be written. Thus, the next I/O call on the output extension will output the header, as expected.

For example, in a binary table, after resetting FUN_IFUN you can then call FunColumnSelect() to select the columns for output. When you then call FunImagePut() or FunTableRowPut(), a new extension will be written that contains the header parameters from the reference extension. Remember to call FunFlush() to complete output of a given extension.

A complete example of this capability is given in the evcol example code. The central algorithm is:

  • open the output file without a reference handle
  • loop: open each input extension in turn
    • set the reference handle for output to the newly opened input extension
    • read the input rows or image and perform processing
    • write new rows or image to the output file
    • flush the output
    • close input extension
  • close output file
Note that FunFlush() is called after processing each input extension in order to ensure that the proper padding is written to the output file. A call to FunFlush() also ensures that the extension header is written to the output file in the case where there are no rows to output.

If you wish to output a new extension without using a Funtools reference handle, you can call FunInfoPut() to reset the FUN_OPS value directly. For a binary table, you would then call FunColumnSelect() to set up the columns for this new extension.

  /* reset the operations performed on this handle */
  int ops=0;
  FunInfoPut(ofun, FUN_OPS, &ops, 0);
  FunColumnSelect(fun, sizeof(EvRec), NULL,
                  "MYCOL", "J", "w", FUN_OFFSET(Ev, mycol),
                  NULL);
Once the FUN_OPS variable has been reset, the next I/O call on the output extension will output the header, as expected.

FunFlush - flush data to output file

  #include <funtools.h>

  void FunFlush(Fun fun, char *plist)

The FunFlush routine will flush data to a FITS output file. In particular, it can be called after all rows have been written (using the FunTableRowPut() routine) in order to add the null padding that is required to complete a FITS block. It also should be called after completely writing an image using FunImagePut() or after writing the final row of an image using FunTableRowPut().

The plist (i.e., parameter list) argument is a string containing one or more comma-delimited keyword=value parameters. If the plist string contains the parameter "copy=remainder" and the file was opened with a reference file, which, in turn, was opened for extension copying (i.e. the input FunOpen() mode also was "c" or "C"), then FunFlush also will copy the remainder of the FITS extensions from the input reference file to the output file. This normally would be done only at the end of processing.

Note that FunFlush() is called with "copy=remainder" in the mode string by FunClose(). This means that if you close the output file before the reference input file, it is not necessary to call FunFlush() explicitly, unless you are writing more than one extension. See the evmerge example code. However, it is safe to call FunFlush() more than once without fear of re-writing either the padding or the copied extensions.

In addition, if FunFlush() is called on an output file with the plist set to "copy=reference" and if the file was opened with a reference file, the reference extension is written to the output file. This mechanism provides a simple way to copy input extensions to an output file without processing the former. For example, in the code fragment below, an input extension is set to be the reference file for a newly opened output extension. If that reference extension is not a binary table, it is written to the output file:

  /* process each input extension in turn */
  for(ext=0; ;ext++){
    /* get new extension name */
    sprintf(tbuf, "%s[%d]", argv[1], ext);
    /* open input extension -- if we cannot open it, we are done */
    if( !(ifun=FunOpen(tbuf, "r", NULL)) )
      break;
    /* make the new extension the reference handle for the output file */
    FunInfoPut(ofun, FUN_IFUN, &ifun, 0);
    /* if its not a binary table, just write it out */
    if( !(s=FunParamGets(ifun, "XTENSION", 0, NULL, &got)) || 
      strcmp(s, "BINTABLE")){
      if( s ) free(s);
      FunFlush(ofun, "copy=reference");
      FunClose(ifun);
      continue;
    }
    else{
      /* process binary table */
      ....
    }
  }

FunClose - close a Funtools data file

  #include <funtools.h>

  void FunClose(Fun fun)

The FunClose() routine closes a previously-opened Funtools data file, freeing control structures. If a Funtools reference handle was passed to the FunOpen() call for this file, and if copy mode also was specified for that file, then FunClose() also will copy the remaining extensions from the input file to the output file (if the input file still is open). Thus, we recommend always closing the output Funtools file before the input file. (Alternatively, you can call FunFlush() explicitly).

FunRef: the Funtools Reference Handle

Summary

A description of how to use a Funtools reference handle to connect a Funtools input file to an output file.

Description

The Funtools reference handle connects a Funtools input file to a Funtools output file so that parameters (or even whole extensions) can be copied from the one to the other. To make the connection, the Funtools handle of the input file is passed to the final argument of the FunOpen() call for the output file:

  if( !(ifun = FunOpen(argv[1], "r", NULL)) )
    gerror(stderr, "could not FunOpen input file: %s\n", argv[1]);
  if( !(ofun = FunOpen(argv[2], "w", ifun)) )
    gerror(stderr, "could not FunOpen output file: %s\n", argv[2]);
It does not matter what type of input or output file (or extension) is opened, or whether they are the same type. When the output image or binary table is written using FunImagePut() or FunTableRowPut() an appropriate header will be written first, with parameters copied from the input extension. Of course, invalid parameters will be removed first, e.g., if the input is a binary table and the output is an image, then binary table parameters such as TFORM, TUNIT, etc. parameters will not be copied to the output.

Use of a reference handle also allows default values to be passed to FunImagePut() in order to write out an output image with the same dimensions and data type as the input image. To use the defaults from the input, a value of 0 is entered for dim1, dim2, and bitpix. For example:

  fun = FunOpen(argv[1], "r", NULL);
  fun2 = FunOpen(argv[2], "w", fun);
  buf = FunImageGet(fun, NULL, NULL);
  ... process image data ...
  FunImagePut(fun2, buf, 0, 0, 0, NULL);
Of course, you often want to get information about the data type and dimensions of the image for processing. The above code is equivalent to the following:
  fun = FunOpen(argv[1], "r", NULL);
  fun2 = FunOpen(argv[2], "w", fun);
  buf = FunImageGet(fun, NULL, NULL);
  FunInfoGet(fun, FUN_SECT_DIM1, &dim1, FUN_SECT_DIM2, &dim2, 
             FUN_SECT_BITPIX, &bitpix, 0);
  ... process image data ...
  FunImagePut(fun2, buf, dim1, dim2, bitpix, NULL);

It is possible to change the reference handle for a given output Funtools handle using the FunInfoPut() routine:

  /* make the new extension the reference handle for the output file */
  FunInfoPut(fun2, FUN_IFUN, &fun, 0);
When this is done, Funtools specially resets the output file to start a new output extension, which is connected to the new input reference handle. You can use this mechanism to process multiple input extensions into a single output file, by successively opening the former and setting the reference handle for the latter. For example:
  /* open a new output FITS file */
  if( !(fun2 = FunOpen(argv[2], "w", NULL)) )
    gerror(stderr, "could not FunOpen output file: %s\n", argv[2]);
  /* process each input extension in turn */
  for(ext=0; ;ext++){
    /* get new extension name */
    sprintf(tbuf, "%s[%d]", argv[1], ext);
    /* open it -- if we cannot open it, we are done */
    if( !(fun=FunOpen(tbuf, "r", NULL)) )
      break;
    /* make the new extension the reference handle for the output file */
    FunInfoPut(fun2, FUN_IFUN, &fun, 0);
    ... process ...
    /* flush output extension (write padding, etc.) */
    FunFlush(fun2, NULL);
    /* close the input extension */
    FunClose(fun);
  }
In this example, the output file is opened first. Then each successive input extension is opened, and the output reference handle is set to the newly opened input handle. After data processing is performed, the output extension is flushed and the input extension is closed, in preparation for the next input extension.

Finally, a reference handle can be used to copy other extensions from the input file to the output file. Copy of other extensions is controlled by adding a "C" or "c" to the mode string of the FunOpen() call of the input reference file. If "C" is specified, then other extensions are always copied (i.e., copy is forced by the application). If "c" is used, then other extensions are copied if the user requests copying by adding a plus sign "+" to the extension name in the bracket specification. For example, the funtable program utilizes user-specified "c" mode so that the second example below will copy all extensions:

  # copy only the EVENTS extension
  csh> funtable "test.ev[EVENTS,circle(512,512,10)]" foo.ev
  # copy ALL extensions
  csh> funtable "test.ev[EVENTS+,circle(512,512,10)]" foo.ev
When extension copy is specified in the input file, the call to FunOpen() on the input file delays the actual file open until the output file also is opened (or until I/O is performed on the input file, which ever happens first). Then, when the output file is opened, the input file is also opened and input extensions are copied to the output file, up to the specific extension being opened. Processing of input and output extensions then proceed.

When extension processing is complete, the remaining extensions need to be copied from input to output. This can be done explicitly, using the FunFlush() call with the "copy=remaining" plist:

  FunFlush(fun, "copy=remaining");
Alternatively, this will happen automatically, if the output file is closed before the input file:
  /* we could explicitly flush remaining extensions that need copying */
  /* FunFlush(fun2, "copy=remaining"); */
  /* but if we close output before input, end flush is done automatically  */
  FunClose(fun2);
  FunClose(fun);

Go to Funtools Help Index

Last updated: December 1, 2005
funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/pod/000077500000000000000000000000001256243640000220255ustar00rootroot00000000000000funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/pod/funcalc.pod000066400000000000000000000405551256243640000241550ustar00rootroot00000000000000=pod =head1 NAME B =head1 SYNOPSIS funcalc [-n] [-a argstr] [-e expr] [-f file] [-l link] [-p prog] [oname [columns]] =head1 OPTIONS -a argstr # user arguments to pass to the compiled program -e expr # funcalc expression -f file # file containing funcalc expression -l libs # libs to add to link command -n # output generated code instead of compiling and executing -p prog # generate named program, no execution -u # die if any variable is undeclared (don't auto-declare) =head1 DESCRIPTION B is a calculator program that allows arbitrary expressions to be constructed, compiled, and executed on columns in a Funtools table (FITS binary table or raw event file). It works by integrating user-supplied expression(s) into a template C program, then compiling and executing the program. B expressions are C statements, although some important simplifications (such as automatic declaration of variables) are supported. B expressions can be specified in three ways: on the command line using the B<-e [expression]> switch, in a file using the B<-f [file]> switch, or from stdin (if neither B<-e> nor B<-f> is specified). Of course a file containing B expressions can be read from stdin. Each invocation of B requires an input Funtools table file to be specified as the first command line argument. The output Funtools table file is the second optional argument. It is needed only if an output FITS file is being created (i.e., in cases where the B expression only prints values, no output file is needed). If input and output file are both specified, a third optional argument can specify the list of columns to activate (using FunColumnActivate()). Note that B determines whether or not to generate code for writing an output file based on the presence or absence of an output file argument. A B expression executes on each row of a table and consists of one or more C statements that operate on the columns of that row (possibly using temporary variables). Within an expression, reference is made to a column of the B row using the C struct syntax B[colname]>, e.g. cur->x, cur->pha, etc. Local scalar variables can be defined using C declarations at very the beginning of the expression, or else they can be defined automatically by B (to be of type double). Thus, for example, a swap of columns x and y in a table can be performed using either of the following equivalent B expressions: double temp; temp = cur->x; cur->x = cur->y; cur->y = temp; or: temp = cur->x; cur->x = cur->y; cur->y = temp; When this expression is executed using a command such as: funcalc -f swap.expr itest.ev otest.ev the resulting file will have values of the x and y columns swapped. By default, the data type of the variable for a column is the same as the data type of the column as stored in the file. This can be changed by appending ":[dtype]" to the first reference to that column. In the example above, to force x and y to be output as doubles, specify the type 'D' explicitly: temp = cur->x:D; cur->x = cur->y:D; cur->y = temp; Data type specifiers follow standard FITS table syntax for defining columns using TFORM: =over 4 =item * A: ASCII characters =item * B: unsigned 8-bit char =item * I: signed 16-bit int =item * U: unsigned 16-bit int (not standard FITS) =item * J: signed 32-bit int =item * V: unsigned 32-bit int (not standard FITS) =item * E: 32-bit float =item * D: 64-bit float =item * X: bits (treated as an array of chars) =back Note that only the first reference to a column should contain the explicit data type specifier. Of course, it is important to handle the data type of the columns correctly. One of the most frequent cause of error in B programming is the implicit use of the wrong data type for a column in expression. For example, the calculation: dx = (cur->x - cur->y)/(cur->x + cur->y); usually needs to be performed using floating point arithmetic. In cases where the x and y columns are integers, this can be done by reading the columns as doubles using an explicit type specification: dx = (cur->x:D - cur->y:D)/(cur->x + cur->y); Alternatively, it can be done using C type-casting in the expression: dx = ((double)cur->x - (double)cur->y)/((double)cur->x + (double)cur->y); In addition to accessing columns in the current row, reference also can be made to the B row using B[colname]>, and to the B row using B[colname]>. Note that if B[colname]> is specified in the B expression, the very first row is not processed. If B[colname]> is specified in the B expression, the very last row is not processed. In this way, B and B are guaranteed always to point to valid rows. For example, to print out the values of the current x column and the previous y column, use the C fprintf function in a B expression: fprintf(stdout, "%d %d\n", cur->x, prev->y); New columns can be specified using the same B[colname]> syntax by appending the column type (and optional tlmin/tlmax/binsiz specifiers), separated by colons. For example, cur->avg:D will define a new column of type double. Type specifiers are the same those used above to specify new data types for existing columns. For example, to create and output a new column that is the average value of the x and y columns, a new "avg" column can be defined: cur->avg:D = (cur->x + cur->y)/2.0 Note that the final ';' is not required for single-line expressions. As with FITS TFORM data type specification, the column data type specifier can be preceded by a numeric count to define an array, e.g., "10I" means a vector of 10 short ints, "2E" means two single precision floats, etc. A new column only needs to be defined once in a B expression, after which it can be used without re-specifying the type. This includes reference to elements of a column array: cur->avg[0]:2D = (cur->x + cur->y)/2.0; cur->avg[1] = (cur->x - cur->y)/2.0; The 'X' (bits) data type is treated as a char array of dimension (numeric_count/8), i.e., 16X is processed as a 2-byte char array. Each 8-bit array element is accessed separately: cur->stat[0]:16X = 1; cur->stat[1] = 2; Here, a 16-bit column is created with the MSB is set to 1 and the LSB set to 2. By default, all processed rows are written to the specified output file. If you want to skip writing certain rows, simply execute the C "continue" statement at the end of the B expression, since the writing of the row is performed immediately after the expression is executed. For example, to skip writing rows whose average is the same as the current x value: cur->avg[0]:2D = (cur->x + cur->y)/2.0; cur->avg[1] = (cur->x - cur->y)/2.0; if( cur->avg[0] == cur->x ) continue; If no output file argument is specified on the B command line, no output file is opened and no rows are written. This is useful in expressions that simply print output results instead of generating a new file: fpv = (cur->av3:D-cur->av1:D)/(cur->av1+cur->av2:D+cur->av3); fbv = cur->av2/(cur->av1+cur->av2+cur->av3); fpu = ((double)cur->au3-cur->au1)/((double)cur->au1+cur->au2+cur->au3); fbu = cur->au2/(double)(cur->au1+cur->au2+cur->au3); fprintf(stdout, "%f\t%f\t%f\t%f\n", fpv, fbv, fpu, fbu); In the above example, we use both explicit type specification (for "av" columns) and type casting (for "au" columns) to ensure that all operations are performed in double precision. When an output file is specified, the selected input table is processed and output rows are copied to the output file. Note that the output file can be specified as "stdout" in order to write the output rows to the standard output. If the output file argument is passed, an optional third argument also can be passed to specify which columns to process. In a FITS binary table, it sometimes is desirable to copy all of the other FITS extensions to the output file as well. This can be done by appending a '+' sign to the name of the extension in the input file name. See B for a related example. B works by integrating the user-specified expression into a template C program called tabcalc.c. The completed program then is compiled and executed. Variable declarations that begin the B expression are placed in the local declaration section of the template main program. All other lines are placed in the template main program's inner processing loop. Other details of program generation are handled automatically. For example, column specifiers are analyzed to build a C struct for processing rows, which is passed to FunColumnSelect() and used in FunTableRowGet(). If an unknown variable is used in the expression, resulting in a compilation error, the program build is retried after defining the unknown variable to be of type double. Normally, B expression code is added to B row processing loop. It is possible to add code to other parts of the program by placing this code inside special directives of the form: [directive name] ... code goes here ... end The directives are: =over 4 =item * B add code and declarations in global space, before the main routine. =item * B add declarations (and code) just after the local declarations in main =item * B add code just before entering the main row processing loop =item * B add code just after exiting the main row processing loop =back Thus, the following B expression will declare global variables and make subroutine calls just before and just after the main processing loop: global double v1, v2; double init(void); double finish(double v); end before v1 = init(); end ... process rows, with calculations using v1 ... after v2 = finish(v1); if( v2 < 0.0 ){ fprintf(stderr, "processing failed %g -> %g\n", v1, v2); exit(1); } end Routines such as init() and finish() above are passed to the generated program for linking using the B<-l [link directives ...]> switch. The string specified by this switch will be added to the link line used to build the program (before the funtools library). For example, assuming that init() and finish() are in the library libmysubs.a in the /opt/special/lib directory, use: funcalc -l "-L/opt/special/lib -lmysubs" ... User arguments can be passed to a compiled funcalc program using a string argument to the "-a" switch. The string should contain all of the user arguments. For example, to pass the integers 1 and 2, use: funcalc -a "1 2" ... The arguments are stored in an internal array and are accessed as strings via the ARGV(n) macro. For example, consider the following expression: local int pmin, pmax; end before pmin=atoi(ARGV(0)); pmax=atoi(ARGV(1)); end if( (cur->pha >= pmin) && (cur->pha <= pmax) ) fprintf(stderr, "%d %d %d\n", cur->x, cur->y, cur->pha); This expression will print out x, y, and pha values for all rows in which the pha value is between the two user-input values: funcalc -a '1 12' -f foo snr.ev'[cir 512 512 .1]' 512 512 6 512 512 8 512 512 5 512 512 5 512 512 8 funcalc -a '5 6' -f foo snr.ev'[cir 512 512 .1]' 512 512 6 512 512 5 512 512 5 Note that it is the user's responsibility to ensure that the correct number of arguments are passed. The ARGV(n) macro returns a NULL if a requested argument is outside the limits of the actual number of args, usually resulting in a SEGV if processed blindly. To check the argument count, use the ARGC macro: local long int seed=1; double limit=0.8; end before if( ARGC >= 1 ) seed = atol(ARGV(0)); if( ARGC >= 2 ) limit = atof(ARGV(1)); srand48(seed); end if ( drand48() > limit ) continue; The macro WRITE_ROW expands to the FunTableRowPut() call that writes the current row. It can be used to write the row more than once. In addition, the macro NROW expands to the row number currently being processed. Use of these two macros is shown in the following example: if( cur->pha:I == cur->pi:I ) continue; a = cur->pha; cur->pha = cur->pi; cur->pi = a; cur->AVG:E = (cur->pha+cur->pi)/2.0; cur->NR:I = NROW; if( NROW < 10 ) WRITE_ROW; If the B<-p [prog]> switch is specified, the expression is not executed. Rather, the generated executable is saved with the specified program name for later use. If the B<-n> switch is specified, the expression is not executed. Rather, the generated code is written to stdout. This is especially useful if you want to generate a skeleton file and add your own code, or if you need to check compilation errors. Note that the comment at the start of the output gives the compiler command needed to build the program on that platform. (The command can change from platform to platform because of the use of different libraries, compiler switches, etc.) As mentioned previously, B will declare a scalar variable automatically (as a double) if that variable has been used but not declared. This facility is implemented using a sed script named funcalc.sed, which processes the compiler output to sense an undeclared variable error. This script has been seeded with the appropriate error information for gcc, and for cc on Solaris, DecAlpha, and SGI platforms. If you find that automatic declaration of scalars is not working on your platform, check this sed script; it might be necessary to add to or edit some of the error messages it senses. In order to keep the lexical analysis of B expressions (reasonably) simple, we chose to accept some limitations on how accurately C comments, spaces, and new-lines are placed in the generated program. In particular, comments associated with local variables declared at the beginning of an expression (i.e., not in a B block) will usually end up in the inner loop, not with the local declarations: /* this comment will end up in the wrong place (i.e, inner loop) */ double a; /* also in wrong place */ /* this will be in the the right place (inner loop) */ if( cur->x:D == cur->y:D ) continue; /* also in right place */ a = cur->x; cur->x = cur->y; cur->y = a; cur->avg:E = (cur->x+cur->y)/2.0; Similarly, spaces and new-lines sometimes are omitted or added in a seemingly arbitrary manner. Of course, none of these stylistic blemishes affect the correctness of the generated code. Because B must analyze the user expression using the data file(s) passed on the command line, the input file(s) must be opened and read twice: once during program generation and once during execution. As a result, it is not possible to use stdin for the input file: B cannot be used as a filter. We will consider removing this restriction at a later time. Along with C comments, B expressions can have one-line internal comments that are not passed on to the generated C program. These internal comment start with the B<#> character and continue up to the new-line: double a; # this is not passed to the generated C file # nor is this a = cur->x; cur->x = cur->y; cur->y = a; /* this comment is passed to the C file */ cur->avg:E = (cur->x+cur->y)/2.0; As previously mentioned, input columns normally are identified by their being used within the inner event loop. There are rare cases where you might want to read a column and process it outside the main loop. For example, qsort might use a column in its sort comparison routine that is not processed inside the inner loop (and therefore not implicitly specified as a column to be read). To ensure that such a column is read by the event loop, use the B keyword. The arguments to this keyword specify columns that should be read into the input record structure even though they are not mentioned in the inner loop. For example: explicit pi pha will ensure that the pi and pha columns are read for each row, even if they are not processed in the inner event loop. The B statement can be placed anywhere. Finally, note that B currently works on expressions involving FITS binary tables and raw event files. We will consider adding support for image expressions at a later point, if there is demand for such support from the community. =head1 SEE ALSO See funtools(n) for a list of Funtools help pages =cut funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/pod/funcen.pod000066400000000000000000000103241256243640000240070ustar00rootroot00000000000000=pod =head1 NAME B =head1 SYNOPSIS funcen [-i] [-n iter] [-t tol] [-v lev] =head1 OPTIONS -i # use image filtering (default: event filtering) -n iter # max number of iterations (default: 0) -t tol # pixel tolerance distance (default: 1.0) -v [0,1,2,3] # output verbosity level (default: 0) =head1 DESCRIPTION B iteratively calculates the centroid position within one or more regions of a Funtools table (FITS binary table or raw event file). Starting with an input table, an initial region specification, and an iteration count, the program calculates the average x and y position within the region and then uses this new position as the region center for the next iteration. Iteration terminates when the maximum number of iterations is reached or when the input tolerance distance is met for that region. A count of events in the final region is then output, along with the pixel position value (and, where available, WCS position). The first argument to the program specifies the Funtools table file to process. Since the file must be read repeatedly, a value of "stdin" is not permitted when the number of iterations is non-zero. Use Funtools Bracket Notation to specify FITS extensions and filters. The second required argument is the initial region descriptor. Multiple regions are permitted. However, compound regions (accelerators, variable argument regions and regions connected via boolean algebra) are not permitted. Points and polygons also are illegal. These restrictions might be lifted in a future version, if warranted. The B<-n> (iteration number) switch specifies the maximum number of iterations to perform. The default is 0, which means that the program will simply count and display the number of events in the initial region(s). Note that when iterations is 0, the data can be input via stdin. The B<-t> (tolerance) switch specifies a floating point tolerance value. If the distance between the current centroid position value and the last position values is less than this value, iteration terminates. The default value is 1 pixel. The B<-v> (verbosity) switch specifies the verbosity level of the output. The default is 0, which results in a single line of output for each input region consisting of the following values: counts x y [ra dec coordsys] The last 3 WCS values are output if WCS information is available in the data file header. Thus, for example: [sh] funcen -n 0 snr.ev "cir 505 508 5" 915 505.00 508.00 345.284038 58.870920 j2000 [sh] funcen -n 3 snr.ev "cir 505 508 5" 1120 504.43 509.65 345.286480 58.874587 j2000 The first example simply counts the number of events in the initial region. The second example iterates the centroid calculation three times to determine a final "best" position. Higher levels of verbosity obviously imply more verbose output. At level 1, the output essentially contains the same information as level 0, but with keyword formatting: [sh] funcen -v 1 -n 3 snr.ev "cir 505 508 5" event_file: snr.ev initial_region: cir 505 508 5 tolerance: 1.0000 iterations: 1 events: 1120 x,y(physical): 504.43 509.65 ra,dec(j2000): 345.286480 58.874587 final_region1: cir 504.43 509.65 5 Level 2 outputs results from intermediate calculations as well. Ordinarily, region filtering is performed using analytic (event) filtering, i.e. that same style of filtering as is performed by B and B. Use the B<-i> switch to specify image filtering, i.e. the same style filtering as is performed by B. Thus, you can perform a quick calculation of counts in regions, using either the analytic or image filtering method, by specifying the B<-n 0> and optional B<-i> switches. These two method often give different results because of how boundary events are processed: [sh] funcen snr.ev "cir 505 508 5" 915 505.00 508.00 345.284038 58.870920 j2000 [sh] funcen -i snr.ev "cir 505 508 5" 798 505.00 508.00 345.284038 58.870920 j2000 See Region Boundaries for more information about how boundaries are calculated using these two methods. =head1 SEE ALSO See funtools(n) for a list of Funtools help pages =cut funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/pod/funclose.pod000066400000000000000000000013531256243640000243510ustar00rootroot00000000000000=pod =head1 NAME B =head1 SYNOPSIS #include void FunClose(Fun fun) =head1 DESCRIPTION The B routine closes a previously-opened Funtools data file, freeing control structures. If a Funtools reference handle was passed to the FunOpen() call for this file, and if copy mode also was specified for that file, then FunClose() also will copy the remaining extensions from the input file to the output file (if the input file still is open). Thus, we recommend always closing the output Funtools file B the input file. (Alternatively, you can call FunFlush() explicitly). =head1 SEE ALSO See funtools(n) for a list of Funtools help pages =cut funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/pod/funcnts.pod000066400000000000000000000566411256243640000242250ustar00rootroot00000000000000=pod =head1 NAME B =head1 SYNOPSIS funcnts [switches] [source_region] [bkgd_file] [bkgd_region|bkgd_value] =head1 OPTIONS -e "source_exposure[;bkgd_exposure]" # source (bkgd) FITS exposure image using matching files -w "source_exposure[;bkgd_exposure]" # source (bkgd) FITS exposure image using WCS transform -t "source_timecorr[;bkgd_timecorr]" # source (bkgd) time correction value or header parameter name -g # output using nice g format -G # output using %.14g format (maximum precision) -i "[column;]int1;int2..." # column-based intervals -m # match individual source and bkgd regions -p # output in pixels, even if wcs is present -r # output inner/outer radii (and angles) for annuli (and pandas) -s # output summed values -v "scol[;bcol]" # src and bkgd value columns for tables -T # output in starbase/rdb format -z # output regions with zero area =head1 DESCRIPTION B counts photons in the specified source regions and reports the results for each region. Regions are specified using the Spatial Region Filtering mechanism. Photons are also counted in the specified bkgd regions applied to the same data file or a different data file. (Alternatively, a constant background value in counts/pixel**2 can be specified.) The bkgd regions are either paired one-to-one with source regions or pooled and normalized by area, and then subtracted from the source counts in each region. Displayed results include the bkgd-subtracted counts in each region, as well as the error on the counts, the area in each region, and the surface brightness (cnts/area**2) calculated for each region. The first argument to the program specifies the FITS input image, array, or raw event file to process. If "stdin" is specified, data are read from the standard input. Use Funtools Bracket Notation to specify FITS extensions, image sections, and filters. The optional second argument is the source region descriptor. If no region is specified, the entire field is used. The background arguments can take one of two forms, depending on whether a separate background file is specified. If the source file is to be used for background as well, the third argument can be either the background region, or a constant value denoting background cnts/pixel. Alternatively, the third argument can be a background data file, in which case the fourth argument is the background region. If no third argument is specified, a constant value of 0 is used (i.e., no background). In summary, the following command arguments are valid: [sh] funcnts sfile # counts in source file [sh] funcnts sfile sregion # counts in source region [sh] funcnts sfile sregion bregion # bkgd reg. is from source file [sh] funcnts sfile sregion bvalue # bkgd reg. is constant [sh] funcnts sfile sregion bfile bregion # bkgd reg. is from separate file NB: unlike other Funtools programs, source and background regions are specified as separate arguments on the command line, rather than being placed inside brackets as part of the source and background filenames. This is because regions in funcnts are not simply used as data filters, but also are used to calculate areas, exposure, etc. If you put the source region inside the brackets (i.e. use it simply as a filter) rather than specifying it as argument two, the program still will only count photons that pass the region filter. However, the area calculation will be performed on the whole field, since field() is the default source region. This rarely is the desired behavior. On the other hand, with FITS binary tables, it often is useful to put a column filter in the filename brackets, so that only events matching the column filter are counted inside the region. For example, to extract the counts within a radius of 22 pixels from the center of the FITS binary table snr.ev and subtract the background determined from the same image within an annulus of radii 50-100 pixels: [sh] funcnts snr.ev "circle(502,512,22)" "annulus(502,512,50,100)" # source # data file: snr.ev # degrees/pix: 0.00222222 # background # data file: snr.ev # column units # area: arcsec**2 # surf_bri: cnts/arcsec**2 # surf_err: cnts/arcsec**2 # background-subtracted results reg net_counts error background berror area surf_bri surf_err ---- ------------ --------- ------------ --------- --------- --------- --------- 1 3826.403 66.465 555.597 5.972 96831.98 0.040 0.001 # the following source and background components were used: source region(s) ---------------- circle(502,512,22) reg counts pixels ---- ------------ --------- 1 4382.000 1513 background region(s) -------------------- annulus(502,512,50,100) reg counts pixels ---- ------------ --------- all 8656.000 23572 The area units for the output columns labeled "area", "surf_bri" (surface brightness) and "surf_err" will be given either in arc-seconds (if appropriate WCS information is in the data file header(s)) or in pixels. If the data file has WCS info, but you do not want arc-second units, use the B<-p> switch to force output in pixels. Also, regions having zero area are not normally included in the primary (background-subtracted) table, but are included in the secondary source and bkgd tables. If you want these regions to be included in the primary table, use the B<-z> switch. Note that a simple sed command will extract the background-subtracted results for further analysis: [sh] cat funcnts.sed 1,/---- .*/d /^$/,$d [sh] sed -f funcnts.sed funcnts.out 1 3826.403 66.465 555.597 5.972 96831.98 0.040 0.001 If separate source and background files are specified, B will attempt to normalize the the background area so that the background pixel size is the same as the source pixel size. This normalization can only take place if the appropriate WCS information is contained in both files (e.g. degrees/pixel values in CDELT). If either file does not contain the requisite size information, the normalization is not performed. In this case, it is the user's responsibility to ensure that the pixel sizes are the same for the two files. Normally, if more than one background region is specified, B will combine them all into a single region and use this background region to produce the background-subtracted results for each source region. The B<-m> (match multiple backgrounds) switch tells B to make a one to one correspondence between background and source regions, instead of using a single combined background region. For example, the default case is to combine 2 background regions into a single region and then apply that region to each of the source regions: [sh] funcnts snr.ev "annulus(502,512,0,22,n=2)" "annulus(502,512,50,100,n=2)" # source # data file: snr.ev # degrees/pix: 0.00222222 # background # data file: snr.ev # column units # area: arcsec**2 # surf_bri: cnts/arcsec**2 # surf_err: cnts/arcsec**2 # background-subtracted results reg net_counts error background berror area surf_bri surf_err ---- ------------ --------- ------------ --------- --------- --------- --------- 1 3101.029 56.922 136.971 1.472 23872.00 0.130 0.002 2 725.375 34.121 418.625 4.500 72959.99 0.010 0.000 # the following source and background components were used: source region(s) ---------------- annulus(502,512,0,22,n=2) reg counts pixels ---- ------------ --------- 1 3238.000 373 2 1144.000 1140 background region(s) -------------------- annulus(502,512,50,100,n=2) reg counts pixels ---- ------------ --------- all 8656.000 23572 Note that the basic region filter rule "each photon is counted once and no photon is counted more than once" still applies when using The B<-m> to match background regions. That is, if two background regions overlap, the overlapping pixels will be counted in only one of them. In a worst-case scenario, if two background regions are the same region, the first will get all the counts and area and the second will get none. Using the B<-m> switch causes B to use each of the two background regions independently with each of the two source regions: [sh] funcnts -m snr.ev "annulus(502,512,0,22,n=2)" "ann(502,512,50,100,n=2)" # source # data file: snr.ev # degrees/pix: 0.00222222 # background # data file: snr.ev # column units # area: arcsec**2 # surf_bri: cnts/arcsec**2 # surf_err: cnts/arcsec**2 # background-subtracted results reg net_counts error background berror area surf_bri surf_err ---- ------------ --------- ------------ --------- --------- --------- --------- 1 3087.015 56.954 150.985 2.395 23872.00 0.129 0.002 2 755.959 34.295 388.041 5.672 72959.99 0.010 0.000 # the following source and background components were used: source region(s) ---------------- annulus(502,512,0,22,n=2) reg counts pixels ---- ------------ --------- 1 3238.000 373 2 1144.000 1140 background region(s) -------------------- ann(502,512,50,100,n=2) reg counts pixels ---- ------------ --------- 1 3975.000 9820 2 4681.000 13752 Note that most floating point quantities are displayed using "f" format. You can change this to "g" format using the B<-g> switch. This can be useful when the counts in each pixel is very small or very large. If you want maximum precision and don't care about the columns lining up nicely, use B<-G>, which outputs all floating values as %.14g. When counting photons using the annulus and panda (pie and annuli) shapes, it often is useful to have access to the radii (and panda angles) for each separate region. The B<-r> switch will add radii and angle columns to the output table: [sh] funcnts -r snr.ev "annulus(502,512,0,22,n=2)" "ann(502,512,50,100,n=2)" # source # data file: snr.ev # degrees/pix: 0.00222222 # background # data file: snr.ev # column units # area: arcsec**2 # surf_bri: cnts/arcsec**2 # surf_err: cnts/arcsec**2 # radii: arcsecs # angles: degrees # background-subtracted results reg net_counts error background berror area surf_bri surf_err radius1 radius2 angle1 angle2 ---- ------------ --------- ------------ --------- --------- --------- --------- --------- --------- --------- --------- 1 3101.029 56.922 136.971 1.472 23872.00 0.130 0.002 0.00 88.00 NA NA 2 725.375 34.121 418.625 4.500 72959.99 0.010 0.000 88.00 176.00 NA NA # the following source and background components were used: source region(s) ---------------- annulus(502,512,0,22,n=2) reg counts pixels ---- ------------ --------- 1 3238.000 373 2 1144.000 1140 background region(s) -------------------- ann(502,512,50,100,n=2) reg counts pixels ---- ------------ --------- all 8656.000 23572 Radii are given in units of pixels or arc-seconds (depending on the presence of WCS info), while the angle values (when present) are in degrees. These columns can be used to plot radial profiles. For example, the script B in the funtools distribution) will plot a radial profile using gnuplot (version 3.7 or above). A simplified version of this script is shown below: #!/bin/sh if [ x"$1" = xgnuplot ]; then if [ x`which gnuplot 2>/dev/null` = x ]; then echo "ERROR: gnuplot not available" exit 1 fi awk ' BEGIN{HEADER=1; DATA=0; FILES=""; XLABEL="unknown"; YLABEL="unknown"} HEADER==1{ if( $1 == "#" && $2 == "data" && $3 == "file:" ){ if( FILES != "" ) FILES = FILES "," FILES = FILES $4 } else if( $1 == "#" && $2 == "radii:" ){ XLABEL = $3 } else if( $1 == "#" && $2 == "surf_bri:" ){ YLABEL = $3 } else if( $1 == "----" ){ printf "set nokey; set title \"funcnts(%s)\"\n", FILES printf "set xlabel \" radius(%s)\"\n", XLABEL printf "set ylabel \"surf_bri(%s)\"\n", YLABEL print "plot \"-\" using 3:4:6:7:8 with boxerrorbars" HEADER = 0 DATA = 1 next } } DATA==1{ if( NF == 12 ){ print $9, $10, ($9+$10)/2, $7, $8, $7-$8, $7+$8, $10-$9 } else{ exit } } ' | gnuplot -persist - 1>/dev/null 2>&1 elif [ x"$1" = xds9 ]; then awk ' BEGIN{HEADER=1; DATA=0; XLABEL="unknown"; YLABEL="unknown"} HEADER==1{ if( $1 == "#" && $2 == "data" && $3 == "file:" ){ if( FILES != "" ) FILES = FILES "," FILES = FILES $4 } else if( $1 == "#" && $2 == "radii:" ){ XLABEL = $3 } else if( $1 == "#" && $2 == "surf_bri:" ){ YLABEL = $3 } else if( $1 == "----" ){ printf "funcnts(%s) radius(%s) surf_bri(%s) 3\n", FILES, XLABEL, YLABEL HEADER = 0 DATA = 1 next } } DATA==1{ if( NF == 12 ){ print $9, $7, $8 } else{ exit } } ' else echo "funcnts -r ... | funcnts.plot [ds9|gnuplot]" exit 1 fi Thus, to run B and plot the results using gnuplot (version 3.7 or above), use: funcnts -r snr.ev "annulus(502,512,0,50,n=5)" ... | funcnts.plot gnuplot The B<-s> (sum) switch causes B to produce an additional table of summed (integrated) background subtracted values, along with the default table of individual values: [sh] funcnts -s snr.ev "annulus(502,512,0,50,n=5)" "annulus(502,512,50,100)" # source # data file: snr.ev # degrees/pix: 0.00222222 # background # data file: snr.ev # column units # area: arcsec**2 # surf_bri: cnts/arcsec**2 # surf_err: cnts/arcsec**2 # summed background-subtracted results upto net_counts error background berror area surf_bri surf_err ---- ------------ --------- ------------ --------- --------- --------- --------- 1 2880.999 54.722 112.001 1.204 19520.00 0.148 0.003 2 3776.817 65.254 457.183 4.914 79679.98 0.047 0.001 3 4025.492 71.972 1031.508 11.087 179775.96 0.022 0.000 4 4185.149 80.109 1840.851 19.786 320831.94 0.013 0.000 5 4415.540 90.790 2873.460 30.885 500799.90 0.009 0.000 # background-subtracted results reg counts error background berror area surf_bri surf_err ---- ------------ --------- ------------ --------- --------- --------- --------- 1 2880.999 54.722 112.001 1.204 19520.00 0.148 0.003 2 895.818 35.423 345.182 3.710 60159.99 0.015 0.001 3 248.675 29.345 574.325 6.173 100095.98 0.002 0.000 4 159.657 32.321 809.343 8.699 141055.97 0.001 0.000 5 230.390 37.231 1032.610 11.099 179967.96 0.001 0.000 # the following source and background components were used: source region(s) ---------------- annulus(502,512,0,50,n=5) reg counts pixels sumcnts sumpix ---- ------------ --------- ------------ --------- 1 2993.000 305 2993.000 305 2 1241.000 940 4234.000 1245 3 823.000 1564 5057.000 2809 4 969.000 2204 6026.000 5013 5 1263.000 2812 7289.000 7825 background region(s) -------------------- annulus(502,512,50,100) reg counts pixels ---- ------------ --------- all 8656.000 23572 The B<-t> and B<-e> switches can be used to apply timing and exposure corrections, respectively, to the data. Please note that these corrections are meant to be used qualitatively, since application of more accurate correction factors is a complex and mission-dependent effort. The algorithm for applying these simple corrections is as follows: C = Raw Counts in Source Region Ac= Area of Source Region Tc= Exposure time for Source Data Ec= Average exposure in Source Region, from exposure map B= Raw Counts in Background Region Ab= Area of Background Region Tb= (Exposure) time for Background Data Eb= Average exposure in Background Region, from exposure map Then, Net Counts in Source region is Net= C - B * (Ac*Tc*Ec)/(Ab*Tb*Eb) with the standard propagation of errors for the Error on Net. The net rate would then be Net Rate = Net/(Ac*Tc*Ec) The average exposure in each region is calculated by summing up the pixel values in the exposure map for the given region and then dividing by the number of pixels in that region. Exposure maps often are generated at a block factor > 1 (e.g., block 4 means that each exposure pixel contains 4x4 pixels at full resolution) and B will deal with the blocking automatically. Using the B<-e> switch, you can supply both source and background exposure files (separated by ";"), if you have separate source and background data files. If you do not supply a background exposure file to go with a separate background data file, B assumes that exposure already has been applied to the background data file. In addition, it assumes that the error on the pixels in the background data file is zero. NB: The B<-e> switch assumes that the exposure map overlays the image file B, except for the block factor. Each pixel in the image is scaled by the block factor to access the corresponding pixel in the exposure map. If your exposure map does not line up exactly with the image, B the B<-e> exposure correction. In this case, it still is possible to perform exposure correction B both the image and the exposure map have valid WCS information: use the B<-w> switch so that the transformation from image pixel to exposure pixel uses the WCS information. That is, each pixel in the image region will be transformed first from image coordinates to sky coordinates, then from sky coordinates to exposure coordinates. Please note that using B<-w> can increase the time required to process the exposure correction considerably. A time correction can be applied to both source and background data using the B<-t> switch. The value for the correction can either be a numeric constant or the name of a header parameter in the source (or background) file: [sh] funcnts -t 23.4 ... # number for source [sh] funcnts -t "LIVETIME;23.4" ... # param for source, numeric for bkgd When a time correction is specified, it is applied to the net counts as well (see algorithm above), so that the units of surface brightness become cnts/area**2/sec. The B<-i> (interval) switch is used to run B on multiple column-based intervals with only a single pass through the data. It is equivalent to running B several times with a different column filter added to the source and background data each time. For each interval, the full B output is generated, with a linefeed character (^L) inserted between each run. In addition, the output for each interval will contain the interval specification in its header. Intervals are very useful for generating X-ray hardness ratios efficiently. Of course, they are only supported when the input data are contained in a table. Two formats are supported for interval specification. The most general format is semi-colon-delimited list of filters to be used as intervals: funcnts -i "pha=1:5;pha=6:10;pha=11:15" snr.ev "circle(502,512,22)" ... Conceptually, this will be equivalent to running B three times: funcnts snr.ev'[pha=1:5]' "circle(502,512,22)" funcnts snr.ev'[pha=6:10]' "circle(502,512,22)" funcnts snr.ev'[pha=11:15]' "circle(502,512,22)" However, using the B<-i> switch will require only one pass through the data. Note that complex filters can be used to specify intervals: funcnts -i "pha=1:5&&pi=4;pha=6:10&&pi=5;pha=11:15&&pi=6" snr.ev ... The program simply runs the data through each filter in turn and generates three B outputs, separated by the line-feed character. In fact, although the intent is to support intervals for hardness ratios, the specified filters do not have to be intervals at all. Nor does one "interval" filter have to be related to another. For example: funcnts -i "pha=1:5;pi=6:10;energy=11:15" snr.ev "circle(502,512,22)" ... is equivalent to running B three times with unrelated filter specifications. A second interval format is supported for the simple case in which a single column is used to specify multiple homogeneous intervals for that column. In this format, a column name is specified first, followed by intervals: funcnts -i "pha;1:5;6:10;11:15" snr.ev "circle(502,512,22)" ... This is equivalent to the first example, but requires less typing. The B program will simply prepend "pha=" before each of the specified intervals. (Note that this format does not contain the "=" character in the column argument.) Ordinarily, when B is run on a FITS binary table (or a raw event table), one integral count is accumulated for each row (event) contained within a given region. The B<-v "scol[;bcol]"> (value column) switch will accumulate counts using the value from the specified column for the given event. If only a single column is specified, it is used for both the source and background regions. Two separate columns, separated by a semi-colon, can be specified for source and background. The special token '$none' can be used to specify that a value column is to be used for one but not the other. For example, 'pha;$none' will use the pha column for the source but use integral counts for the background, while '$none;pha' will do the converse. If the value column is of type logical, then the value used will be 1 for T and 0 for F. Value columns are used, for example, to integrate probabilities instead of integral counts. If the B<-T> (rdb table) switch is used, the output will conform to starbase/rdb data base format: tabs will be inserted between columns rather than spaces and line-feed will be inserted between tables. Finally, note that B is an image program, even though it can be run directly on FITS binary tables. This means that image filtering is applied to the rows in order to ensure that the same results are obtained regardless of whether a table or the equivalent binned image is used. Because of this, however, the number of counts found using B can differ from the number of events found using row-filter programs such as B or B For more information about these difference, see the discussion of Region Boundaries. =head1 SEE ALSO See funtools(n) for a list of Funtools help pages =cut funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/pod/funcolumnactivate.pod000066400000000000000000000167151256243640000262720ustar00rootroot00000000000000=pod =head1 NAME B =head1 SYNOPSIS #include void FunColumnActivate(Fun fun, char *s, char *plist) =head1 DESCRIPTION The B routine determines which columns (set up by FunColumnSelect()) ultimately will be read and/or written. By default, all columns that are selected using FunColumnSelect() are activated. The FunColumnActivate() routine can be used to turn off/off activation of specific columns. The first argument is the Fun handle associated with this set of columns. The second argument is a space-delimited list of columns to activate or de-activate. Columns preceded by "+" are activated and columns preceded by a "-" are de-activated. If a column is named without "+" or "-", it is activated. The reserved strings "$region" and '$n' are used to activate a special columns containing the filter region value and row value, respectively, associated with this row. For example, if a filter containing two circular regions is specified as part of the Funtools file name, this column will contain a value of 1 or 2, depending on which region that row was in. The reserved strings "$x" and "$y" are used to activate the current binning columns. Thus, if the columns DX and DY are specified as binning columns: [sh $] fundisp foo.fits[bincols=(DX,DY)] then "$x" and "$y" will refer to these columns in a call to FunColumnActivate(). In addition, if the activation string contains only columns to be activated, then the routine will de-activate all other columns. Similarly, if the activation string contains only columns to de-activate, then the routine will activate all other columns before activating the list. This makes it simple to change the activation state of all columns without having to know all of the column names. For example: =over 4 =item * B<"pi pha time"> # only these three columns will be active =item * B<"-pi -pha -time"> # all but these columns will be active =item * B<"pi -pha"> # only pi is active, pha is not, others are not =item * B<"+pi -pha"> # same as above =item * B<"pi -pha -time"> # only pi is active, all others are not =item * B<"pi pha"> # pha and pi are active, all others are not =item * B<"pi pha -x -y"> # pha and pi are active, all others are not =back You can use the column activation list to reorder columns, since columns are output in the order specified. For example: # default output order fundisp snr.ev'[cir 512 512 .1]' X Y PHA PI TIME DX DY -------- -------- -------- -------- --------------------- -------- -------- 512 512 6 7 79493997.45854475 578 574 512 512 8 9 79494575.58943175 579 573 512 512 5 6 79493631.03866175 578 575 512 512 5 5 79493290.86521725 578 575 512 512 8 9 79493432.00990875 579 573 # re-order the output by specifying explicit order fundisp snr.ev'[cir 512 512 .1]' "time x y dy dx pi pha" TIME X Y DY DX PI PHA --------------------- -------- -------- -------- -------- -------- -------- 79493997.45854475 512 512 574 578 7 6 79494575.58943175 512 512 573 579 9 8 79493631.03866175 512 512 575 578 6 5 79493290.86521725 512 512 575 578 5 5 79493432.00990875 512 512 573 579 9 8 A "+" sign by itself means to activate all columns, so that you can reorder just a few columns without specifying all of them: # reorder 3 columns and then output the rest fundisp snr.ev'[cir 512 512 .1]' "time pi pha +" TIME PI PHA Y X DX DY --------------------- -------- -------- -------- -------- -------- -------- 79493997.45854475 7 6 512 512 578 574 79494575.58943175 9 8 512 512 579 573 79493631.03866175 6 5 512 512 578 575 79493290.86521725 5 5 512 512 578 575 79493432.00990875 9 8 512 512 579 573 The column activation/deactivation is performed in the order of the specified column arguments. This means you can mix "+", "-" (which de-activates all columns) and specific column names to reorder and select columns in one command. For example, consider the following: # reorder and de-activate fundisp snr.ev'[cir 512 512 .1]' "time pi pha + -x -y" TIME PI PHA DX DY --------------------- -------- -------- -------- -------- 79493997.45854475 7 6 578 574 79494575.58943175 9 8 579 573 79493631.03866175 6 5 578 575 79493290.86521725 5 5 578 575 79493432.00990875 9 8 579 573 We first activate "time", "pi", and "pha" so that they are output first. We then activate all of the other columns, and then de-activate "x" and "y". Note that this is different from: # probably not what you want ... fundisp snr.ev'[cir 512 512 .1]' "time pi pha -x -y +" TIME PI PHA Y X DX DY --------------------- -------- -------- -------- -------- -------- -------- 79493997.45854475 7 6 512 512 578 574 79494575.58943175 9 8 512 512 579 573 79493631.03866175 6 5 512 512 578 575 79493290.86521725 5 5 512 512 578 575 79493432.00990875 9 8 512 512 579 573 Here, "x" and "y" are de-activated, but then all columns including "x" and "y" are again re-activated. Typically, FunColumnActivate() uses a list of columns that are passed into the program from the command line. For example, the code for funtable contains the following: char *cols=NULL; /* open the input FITS file */ if( !(fun = FunOpen(argv[1], "rc", NULL)) ) gerror(stderr, "could not FunOpen input file: %s\n", argv[1]); /* set active flag for specified columns */ if( argc >= 4 ) cols = argv[3]; FunColumnActivate(fun, cols, NULL); The FunOpen() call sets the default columns to be all columns in the input file. The FunColumnActivate() call then allows the user to control which columns ultimately will be activated (i.e., in this case, written to the new file). For example: funtable test.ev foo.ev "pi pha time" will process only the three columns mentioned, while: funtable test.ev foo.ev "-time" will process all columns except "time". If FunColumnActivate() is called with a null string, then the environment variable B will be used to provide a global value, if present. This is the reason why we call the routine even if no columns are specified on the command line (see example above), instead of calling it this way: /* set active flag for specified columns */ if( argc >= 4 ){ FunColumnActivate(fun, argv[3], NULL); } =head1 SEE ALSO See funtools(n) for a list of Funtools help pages =cut funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/pod/funcolumnlookup.pod000066400000000000000000000046221256243640000257750ustar00rootroot00000000000000=pod =head1 NAME B =head1 SYNOPSIS #include int FunColumnLookup(Fun fun, char *s, int which, char **name, int *type, int *mode, int *offset, int *n, int *width) =head1 DESCRIPTION The B routine returns information about a named (or indexed) column. The first argument is the Fun handle associated with this set of columns. The second argument is the name of the column to look up. If the name argument is NULL, the argument that follows is the zero-based index into the column array of the column for which information should be returned. The next argument is a pointer to a char *, which will contain the name of the column. The arguments that follow are the addresses of int values into which the following information will be returned: =over 4 =item * B: data type of column: =over 4 =item * A: ASCII characters =item * B: unsigned 8-bit char =item * I: signed 16-bit int =item * U: unsigned 16-bit int (not standard FITS) =item * J: signed 32-bit int =item * V: unsigned 32-bit int (not standard FITS) =item * E: 32-bit float =item * D: 64-bit float =back =item * B: bit flag status of column, including: =over 4 =item * COL_ACTIVE 1 is column activated? =item * COL_IBUF 2 is column in the raw input data? =item * COL_PTR 4 is column a pointer to an array? =item * COL_READ 010 is read mode selected? =item * COL_WRITE 020 is write mode selected? =item * COL_REPLACEME 040 is this column being replaced by user data? =back =item * B: byte offset in struct =item * B: number of elements (i.e. size of vector) in this column =item * B: size in bytes of this column =back If the named column exists, the routine returns a positive integer, otherwise zero is returned. (The positive integer is the index+1 into the column array where this column was located.) If NULL is passed as the return address of one (or more) of these values, no data is passed back for that information. For example: if( !FunColumnLookup(fun, "phas", 0, NULL NULL, NULL, NULL, &npha, NULL) ) gerror(stderr, "can't find phas column\n"); only returns information about the size of the phas vector. =head1 SEE ALSO See funtools(n) for a list of Funtools help pages =cut funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/pod/funcolumnselect.pod000066400000000000000000000467341256243640000257550ustar00rootroot00000000000000=pod =head1 NAME B =head1 SYNOPSIS #include int FunColumnSelect(Fun fun, int size, char *plist, char *name1, char *type1, char *mode1, int offset1, char *name2, char *type2, char *mode2, int offset2, ..., NULL) int FunColumnSelectArr(Fun fun, int size, char *plist, char **names, char **types, char **modes, int *offsets, int nargs); =head1 DESCRIPTION The B routine is used to select the columns from a Funtools binary table extension or raw event file for processing. This routine allows you to specify how columns in a file are to be read into a user record structure or written from a user record structure to an output FITS file. The first argument is the Fun handle associated with this set of columns. The second argument specifies the size of the user record structure into which columns will be read. Typically, the sizeof() macro is used to specify the size of a record structure. The third argument allows you to specify keyword directives for the selection and is described in more detail below. Following the first three required arguments is a variable length list of column specifications. Each column specification will consist of four arguments: =over 4 =item * B: the name of the column =item * B: the data type of the column as it will be stored in the user record struct (not the data type of the input file). The following basic data types are recognized: =over 4 =item * A: ASCII characters =item * B: unsigned 8-bit char =item * I: signed 16-bit int =item * U: unsigned 16-bit int (not standard FITS) =item * J: signed 32-bit int =item * V: unsigned 32-bit int (not standard FITS) =item * E: 32-bit float =item * D: 64-bit float =back The syntax used is similar to that which defines the TFORM parameter in FITS binary tables. That is, a numeric repeat value can precede the type character, so that "10I" means a vector of 10 short ints, "E" means a single precision float, etc. Note that the column value from the input file will be converted to the specified data type as the data is read by FunTableRowGet(). [ A short digression regarding bit-fields: Special attention is required when reading or writing the FITS bit-field type ("X"). Bit-fields almost always have a numeric repeat character preceding the 'X' specification. Usually this value is a multiple of 8 so that bit-fields fit into an integral number of bytes. For all cases, the byte size of the bit-field B is (N+7)/8, where N is the numeric repeat character. A bit-field is most easily declared in the user struct as an array of type char of size B as defined above. In this case, bytes are simply moved from the file to the user space. If, instead, a short or int scalar or array is used, then the algorithm for reading the bit-field into the user space depends on the size of the data type used along with the value of the repeat character. That is, if the user data size is equal to the byte size of the bit-field, then the data is simply moved (possibly with endian-based byte-swapping) from one to the other. If, on the other hand, the data storage is larger than the bit-field size, then a data type cast conversion is performed to move parts of the bit-field into elements of the array. Examples will help make this clear: =over 4 =item * If the file contains a 16X bit-field and user space specifies a 2B char array[2], then the bit-field is moved directly into the char array. =item * If the file contains a 16X bit-field and user space specifies a 1I scalar short int, then the bit-field is moved directly into the short int. =item * If the file contains a 16X bit-field and user space specifies a 1J scalar int, then the bit-field is type-cast to unsigned int before being moved (use of unsigned avoids possible sign extension). =item * If the file contains a 16X bit-field and user space specifies a 2J int array[2], then the bit-field is handled as 2 chars, each of which are type-cast to unsigned int before being moved (use of unsigned avoids possible sign extension). =item * If the file contains a 16X bit-field and user space specifies a 1B char, then the bit-field is treated as a char, i.e., truncation will occur. =item * If the file contains a 16X bit-field and user space specifies a 4J int array[4], then the results are undetermined. =back For all user data types larger than char, the bit-field is byte-swapped as necessary to convert to native format, so that bits in the resulting data in user space can be tested, masked, etc. in the same way regardless of platform.] In addition to setting data type and size, the B specification allows a few ancillary parameters to be set, using the full syntax for B: [@][n][[['B']poff]][:[tlmin[:tlmax[:binsiz]]]] The special character "@" can be prepended to this specification to indicated that the data element is a pointer in the user record, rather than an array stored within the record. The [n] value is an integer that specifies the number of elements that are in this column (default is 1). TLMIN, TLMAX, and BINSIZ values also can be specified for this column after the type, separated by colons. If only one such number is specified, it is assumed to be TLMAX, and TLMIN and BINSIZ are set to 1. The [poff] value can be used to specify the offset into an array. By default, this offset value is set to zero and the data specified starts at the beginning of the array. The offset usually is specified in terms of the data type of the column. Thus an offset specification of [5] means a 20-byte offset if the data type is a 32-bit integer, and a 40-byte offset for a double. If you want to specify a byte offset instead of an offset tied to the column data type, precede the offset value with 'B', e.g. [B6] means a 6-bye offset, regardless of the column data type. The [poff] is especially useful in conjunction with the pointer @ specification, since it allows the data element to anywhere stored anywhere in the allocated array. For example, a specification such as "@I[2]" specifies the third (i.e., starting from 0) element in the array pointed to by the pointer value. A value of "@2I[4]" specifies the fifth and sixth values in the array. For example, consider the following specification: typedef struct EvStruct{ short x[4], *atp; } *Event, EventRec; /* set up the (hardwired) columns */ FunColumnSelect( fun, sizeof(EventRec), NULL, "2i", "2I ", "w", FUN_OFFSET(Event, x), "2i2", "2I[2]", "w", FUN_OFFSET(Event, x), "at2p", "@2I", "w", FUN_OFFSET(Event, atp), "at2p4", "@2I[4]", "w", FUN_OFFSET(Event, atp), "atp9", "@I[9]", "w", FUN_OFFSET(Event, atp), "atb20", "@I[B20]", "w", FUN_OFFSET(Event, atb), NULL); Here we have specified the following columns: =over 4 =item * 2i: two short ints in an array which is stored as part the record =item * 2i2: the 3rd and 4th elements of an array which is stored as part of the record =item * an array of at least 10 elements, not stored in the record but allocated elsewhere, and used by three different columns: =over 4 =item * at2p: 2 short ints which are the first 2 elements of the allocated array =item * at2p4: 2 short ints which are the 5th and 6th elements of the allocated array =item * atp9: a short int which is the 10th element of the allocated array =back =item * atb20: a short int which is at byte offset 20 of another allocated array =back In this way, several columns can be specified, all of which are in a single array. B: it is the programmer's responsibility to ensure that specification of a positive value for poff does not point past the end of valid data. =item * B: "r" means that the column is read from an input file into user space by FunTableRowGet(), "w" means that the column is written to an output file. Both can specified at the same time. =item * B: the offset into the user data to store this column. Typically, the macro FUN_OFFSET(recname, colname) is used to define the offset into a record structure. =back When all column arguments have been specified, a final NULL argument must added to signal the column selection list. As an alternative to the varargs FunColumnSelect() routine, a non-varargs routine called FunColumnSelectArr() also is available. The first three arguments (fun, size, plist) of this routine are the same as in FunColumnSelect(). Instead of a variable argument list, however, FunColumnSelectArr() takes 5 additional arguments. The first 4 arrays arguments contain the names, types, modes, and offsets, respectively, of the columns being selected. The final argument is the number of columns that are contained in these arrays. It is the user's responsibility to free string space allocated in these arrays. Consider the following example: typedef struct evstruct{ int status; float pi, pha, *phas; double energy; } *Ev, EvRec; FunColumnSelect(fun, sizeof(EvRec), NULL, "status", "J", "r", FUN_OFFSET(Ev, status), "pi", "E", "r", FUN_OFFSET(Ev, pi), "pha", "E", "r", FUN_OFFSET(Ev, pha), "phas", "@9E", "r", FUN_OFFSET(Ev, phas), NULL); Each time a row is read into the Ev struct, the "status" column is converted to an int data type (regardless of its data type in the file) and stored in the status value of the struct. Similarly, "pi" and "pha", and the phas vector are all stored as floats. Note that the "@" sign indicates that the "phas" vector is a pointer to a 9 element array, rather than an array allocated in the struct itself. The row record can then be processed as required: /* get rows -- let routine allocate the row array */ while( (ebuf = (Ev)FunTableRowGet(fun, NULL, MAXROW, NULL, &got)) ){ /* process all rows */ for(i=0; ipi = (ev->pi+.5); ev->pha = (ev->pi-.5); } FunColumnSelect() can also be called to define "writable" columns in order to generate a FITS Binary Table, without reference to any input columns. For example, the following will generate a 4-column FITS binary table when FunTableRowPut() is used to write Ev records: typedef struct evstruct{ int status; float pi, pha double energy; } *Ev, EvRec; FunColumnSelect(fun, sizeof(EvRec), NULL, "status", "J", "w", FUN_OFFSET(Ev, status), "pi", "E", "w", FUN_OFFSET(Ev, pi), "pha", "E", "w", FUN_OFFSET(Ev, pha), "energy", "D", "w", FUN_OFFSET(Ev, energy), NULL); All columns are declared to be write-only, so presumably the column data is being generated or read from some other source. In addition, FunColumnSelect() can be called to define B "readable" and "writable" columns. In this case, the "read" columns are associated with an input file, while the "write" columns are associated with the output file. Of course, columns can be specified as both "readable" and "writable", in which case they are read from input and (possibly modified data values are) written to the output. The FunColumnSelect() call itself is made by passing the input Funtools handle, and it is assumed that the output file has been opened using this input handle as its Funtools reference handle. Consider the following example: typedef struct evstruct{ int status; float pi, pha, *phas; double energy; } *Ev, EvRec; FunColumnSelect(fun, sizeof(EvRec), NULL, "status", "J", "r", FUN_OFFSET(Ev, status), "pi", "E", "rw", FUN_OFFSET(Ev, pi), "pha", "E", "rw", FUN_OFFSET(Ev, pha), "phas", "@9E", "rw", FUN_OFFSET(Ev, phas), "energy", "D", "w", FUN_OFFSET(Ev, energy), NULL); As in the "read" example above, each time an row is read into the Ev struct, the "status" column is converted to an int data type (regardless of its data type in the file) and stored in the status value of the struct. Similarly, "pi" and "pha", and the phas vector are all stored as floats. Since the "pi", "pha", and "phas" variables are declared as "writable" as well as "readable", they also will be written to the output file. Note, however, that the "status" variable is declared as "readable" only, and hence it will not be written to an output file. Finally, the "energy" column is declared as "writable" only, meaning it will not be read from the input file. In this case, it can be assumed that "energy" will be calculated in the program before being output along with the other values. In these simple cases, only the columns specified as "writable" will be output using FunTableRowPut(). However, it often is the case that you want to merge the user columns back in with the input columns, even in cases where not all of the input column names are explicitly read or even known. For this important case, the B keyword is provided in the plist string. The B keyword tells Funtools to merge the columns from the input file with user columns on output. It is normally used when an input and output file are opened and the input file provides the Funtools reference handle for the output file. In this case, each time FunTableRowGet() is called, the raw input rows are saved in a special buffer. If FunTableRowPut() then is called (before another call to FunTableRowGet()), the contents of the raw input rows are merged with the user rows according to the value of B as follows: =over 4 =item * B: add new user columns, and update value of existing ones (maintaining the input data type) =item * B: add new user columns, and replace the data type and value of existing ones. (Note that if tlmin/tlmax values are not specified in the replacing column, but are specified in the original column being replaced, then the original tlmin/tlmax values are used in the replacing column.) =item * B: only add new columns, do not "replace" or "update" existing ones =back Consider the example above. If B is specified in the plist string, then "energy" will be added to the input columns, and the values of "pi", "pha", and "phas" will be taken from the user space (i.e., the values will be updated from the original values, if they were changed by the program). The data type for "pi", "pha", and "phas" will be the same as in the original file. If B is specified, both the data type and value of these three input columns will be changed to the data type and value in the user structure. If B is specified, none of these three columns will be updated, and only the "energy" column will be added. Note that in all cases, "status" will be written from the input data, not from the user record, since it was specified as read-only. Standard applications will call FunColumnSelect() to define user columns. However, if this routine is not called, the default behavior is to transfer all input columns into user space. For this purpose a default record structure is defined such that each data element is properly aligned on a valid data type boundary. This mechanism is used by programs such as fundisp and funtable to process columns without needing to know the specific names of those columns. It is not anticipated that users will need such capabilities (contact us if you do!) By default, FunColumnSelect() reads/writes rows to/from an "array of structs", where each struct contains the column values for a single row of the table. This means that the returned values for a given column are not contiguous. You can set up the IO to return a "struct of arrays" so that each of the returned columns are contiguous by specifying B (abbreviation: B) in the plist. (The default case is B or B.) For example, the default setup to retrieve rows from a table would be to define a record structure for a single event and then call FunColumnSelect() as follows: typedef struct evstruct{ short region; double x, y; int pi, pha; double time; } *Ev, EvRec; got = FunColumnSelect(fun, sizeof(EvRec), NULL, "x", "D:10:10", mode, FUN_OFFSET(Ev, x), "y", "D:10:10", mode, FUN_OFFSET(Ev, y), "pi", "J", mode, FUN_OFFSET(Ev, pi), "pha", "J", mode, FUN_OFFSET(Ev, pha), "time", "1D", mode, FUN_OFFSET(Ev, time), NULL); Subsequently, each call to FunTableRowGet() will return an array of structs, one for each returned row. If instead you wanted to read columns into contiguous arrays, you specify B: typedef struct aevstruct{ short region[MAXROW]; double x[MAXROW], y[MAXROW]; int pi[MAXROW], pha[MAXROW]; double time[MAXROW]; } *AEv, AEvRec; got = FunColumnSelect(fun, sizeof(AEvRec), "org=soa", "x", "D:10:10", mode, FUN_OFFSET(AEv, x), "y", "D:10:10", mode, FUN_OFFSET(AEv, y), "pi", "J", mode, FUN_OFFSET(AEv, pi), "pha", "J", mode, FUN_OFFSET(AEv, pha), "time", "1D", mode, FUN_OFFSET(AEv, time), NULL); Note that the only modification to the call is in the plist string. Of course, instead of using staticly allocated arrays, you also can specify dynamically allocated pointers: /* pointers to arrays of columns (used in struct of arrays) */ typedef struct pevstruct{ short *region; double *x, *y; int *pi, *pha; double *time; } *PEv, PEvRec; got = FunColumnSelect(fun, sizeof(PEvRec), "org=structofarrays", "$region", "@I", mode, FUN_OFFSET(PEv, region), "x", "@D:10:10", mode, FUN_OFFSET(PEv, x), "y", "@D:10:10", mode, FUN_OFFSET(PEv, y), "pi", "@J", mode, FUN_OFFSET(PEv, pi), "pha", "@J", mode, FUN_OFFSET(PEv, pha), "time", "@1D", mode, FUN_OFFSET(PEv, time), NULL); Here, the actual storage space is either allocated by the user or by the FunColumnSelect() call). In all of the above cases, the same call is made to retrieve rows, e.g.: buf = (void *)FunTableRowGet(fun, NULL, MAXROW, NULL, &got); However, the individual data elements are accessed differently. For the default case of an "array of structs", the individual row records are accessed using: for(i=0; ix, ev->y, ev->pi, ev->pha, ev->dx, ev->dy, ev->time); } For a struct of arrays or a struct of array pointers, we have a single struct through which we access individual columns and rows using: aev = (AEv)buf; for(i=0; ix[i], aev->y[i], aev->pi[i], aev->pha[i], aev->dx[i], aev->dy[i], aev->time[i]); } Support for struct of arrays in the FunTableRowPut() call is handled analogously. See the evread example code and evmerge example code for working examples of how FunColumnSelect() is used. =head1 SEE ALSO See funtools(n) for a list of Funtools help pages =cut funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/pod/funcombine.pod000066400000000000000000000054661256243640000246710ustar00rootroot00000000000000=pod =head1 NAME B =head1 SYNOPSIS This document discusses the conventions for combining region and table filters, especially with regards to the comma operator. =head1 DESCRIPTION B Filter specifications consist of a series of boolean expressions, separated by commas. These expressions can be table filters, spatial region filters, or combinations thereof. Unfortunately, common usage requires that the comma operator must act differently in different situations. Therefore, while its use is intuitive in most cases, commas can be a source of confusion. According to long-standing usage in IRAF, when a comma separates two table filters, it takes on the meaning of a boolean B. Thus: foo.fits[pha==1,pi==2] is equivalent to: foo.fits[pha==1 && pi==2] When a comma separates two spatial region filters, however, it has traditionally taken on the meaning of a boolean B. Thus: foo.fits[circle(10,10,3),ellipse(20,20,8,5)] is equivalent to: foo.fits[circle(10,10,3) || ellipse(20,20,8,5)] (except that in the former case, each region is given a unique id in programs such as funcnts). Region and table filters can be combined: foo.fits[circle(10,10,3),pi=1:5] or even: foo.fits[pha==1&&circle(10,10,3),pi==2&&ellipse(20,20,8,5)] In these cases, it is not obvious whether the command should utilize an B or B operator. We therefore arbitrarily chose to implement the following rule: =over 4 =item * if both expressions contain a region, the operator used is B. =item * if one (or both) expression(s) does not contain a region, the operator used is B. =back This rule handles the cases of pure regions and pure column filters properly. It unambiguously assigns the boolean B to all mixed cases. Thus: foo.fits[circle(10,10,3),pi=1:5] and foo.fits[pi=1:5,circle(10,10,3)] both are equivalent to: foo.fits[circle(10,10,3) && pi=1:5] [NB: This arbitrary rule B (pre-funtools 1.2.3) which stated: =over 4 =item * if the 2nd expression contains a region, the operator used is B. =item * if the 2nd expression does not contain a region, the operator used is B. =back In that scenario, the B operator was implied by: pha==4,circle 5 5 1 while the B operator was implied by circle 5 5 1,pha==4 Experience showed that this non-commutative treatment of the comma operator was confusing and led to unexpected results.] The comma rule must be considered provisional: comments and complaints are welcome to help clarify the matter. Better still, we recommend that the comma operator be avoided in such cases in favor of an explicit boolean operator. =head1 SEE ALSO See funtools(n) for a list of Funtools help pages =cut funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/pod/funcone.pod000066400000000000000000000156531256243640000242000ustar00rootroot00000000000000=pod =head1 NAME B =head1 SYNOPSIS funcone [columns] =head1 OPTIONS -d deccol:[hdr] # Dec column name, units (def: DEC:d) -j # join columns from list file -J # join columns from list file, output all rows -l listfile # read centers and radii from a list -L listfile # read centers and radii from a list, output list rows -n # don't use cone limits as a filter -r racol:[hdr] # RA column name, units (def: RA:h) -x # append RA_CEN, DEC_CEN, RAD_CEN, CONE_KEY cols -X # append RA_CEN, DEC_CEN, RAD_CEN, CONE_KEY cols, output all rows =head1 DESCRIPTION Funcone performs a cone search on the RA and Dec columns of a FITS binary table. The distance from the center RA, Dec position to the RA, Dec in each row in the table is calculated. Rows whose distance is less than the specified radius are output. The first argument to the program specifies the FITS file, raw event file, or raw array file. If "stdin" is specified, data are read from the standard input. Use Funtools Bracket Notation to specify FITS extensions, and filters. The second argument is the output FITS file. If "stdout" is specified, the FITS binary table is written to the standard output. The third and fourth required arguments are the RA and Dec center position. By default, RA is specified in hours while Dec is specified in degrees. You can change the units of either of these by appending the character "d" (degrees), "h" (hours) or "r" (radians). Sexagesimal notation is supported, with colons or spaces separating hms and dms. (When using spaces, please ensure that the entire string is quoted.) The fifth required argument is the radius of the cone search. By default, the radius value is given in degrees. The units can be changed by appending the character "d" (degrees), "r" (radians), "'" (arc minutes) or '"' (arc seconds). By default, all columns of the input file are copied to the output file. Selected columns can be output using an optional sixth argument in the form: "column1 column1 ... columnN" A seventh argument allows you to output selected columns from the list file when B<-j> switch is used. Note that the RA and Dec columns used in the cone calculation must not be de-selected. Also by default, the RA and Dec column names are named "RA" and "Dec", and are given in units of hours and degrees respectively. You can change both the name and the units using the -r [RA] and/or -d [Dec] switches. Once again, one of "h", "d", or "r" is appended to the column name to specify units but in this case, there must be a colon ":" between the name and the unit specification. If the B<-l [listfile]> switch is used, then one or more of the center RA, center Dec, and radius can be taken from a list file (which can be a FITS table or an ASCII column text file). In this case, the third (center RA), fourth (center Dec), and fifth (radius) command line arguments can either be a column name in the list file (if that parameter varies) or else a numeric value (if that parameter is static). When a column name is specified for the RA, Dec, or radius, you can append a colon followed by "h", "d", or "r" to specify units (also ' and " for radius). The cone search algorithm is run once for each row in the list, taking RA, Dec, and radius values from the specified columns or from static numeric values specified on the command line. When using a list, all valid rows from each iteration are written to a single output file. Use the B<-x> switch to help delineate which line of the list file was used to produce the given output row(s). This switch causes the values for the center RA, Dec, radius, and row number to be appended to the output file, in columns called RA_CEN, DEC_CEN, RAD_CEN and CONE_KEY, respectively. Alternatively, the B<-j> (join) switch will append all columns from the list row to the output row (essentially a join of the list row and input row), along with the CONE_KEY row number. These two switches are mutually exclusive. The B<-X> and B<-J> switches write out the same data as their lower case counterparts for each row satisfying a cone search. In addition, these switches also write out rows from the event file that do not satisfy any cone search. In such cases, that CONE_KEY column will be given a value of -1 and the center and list position information will be set to zero for the given row. Thus, all rows of the input event file are guaranteed to be output, with rows satisfying at least one cone search having additional search information. The B<-L> switch acts similarly to the B<-l> switch in that it takes centers from a list file. However, it also implicitly sets the -j switch, so that output rows are the join of the input event row and the center position row. In addition, this switch also writes out all center position rows for which no event satisfies the cone search criteria of that row. The CONE_KEY column will be given a value of -2 for center rows that were not close to any data row and the event columns will be zeroed out for such rows. In this way, all centers rows are guaranteed to be output at least once. If any of "all row" switches (B<-X>, B<-J>, or B<-L>) are specified, then a new column named JSTAT is added to the output table. The positive values in this column indicate the center position row number (starting from 1) in the list file that this data row successful matched in a cone search. A value of -1 means that the data row did not match any center position. A value of -2 means that the center position was not matched by any data row. Given a center position and radius, the cone search algorithm calculates limit parameters for a box enclosing the specified cone, and only tests rows whose positions values lie within those limits. For small files, the overhead associated with this cone limit filtering can cause the program to run more slowly than if all events were tested. You can turn off cone limit filtering using the B<-n> switch to see if this speeds up the processing (especially useful when processing a large list of positions). For example, the default cone search uses columns "RA" and "Dec" in hours and degrees (respectively) and RA position in hours, Dec and radius in degrees: funone in.fits out.fits 23.45 34.56 0.01 To specify the RA position in degrees: funcone in.fits out.fits 23.45d 34.56 0.01 To get RA and Dec from a list but use a static value for radius (and also write identifying info for each row in the list): funcone -x -l list.txt in.fits out.fits MYRA MYDec 0.01 User specified columns in degrees, RA position in hours (sexagesimal notation), Dec position in degrees (sexagesimal notation) and radius in arc minutes: funcone -r myRa:d -d myDec in.fits out.fits 12:30:15.5 30:12 15' =head1 SEE ALSO See funtools(n) for a list of Funtools help pages =cut funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/pod/fundisp.pod000066400000000000000000000416521256243640000242110ustar00rootroot00000000000000=pod =head1 NAME B =head1 SYNOPSIS fundisp [-f format] [-l] [-n] [-T] [columns|bitpix=n] =head1 OPTIONS -f # format string for display -l # display image as a list containing the columns X, Y, VAL -n # don't output header -F [c] # use specified character as column separator (def: space) -T # output in rdb/starbase format (tab separators) =head1 DESCRIPTION B displays the data in the specified FITS Extension and/or Image Section of a FITS file, or in a Section of a non-FITS array or raw event file. The first argument to the program specifies the FITS input image, array, or raw event file to display. If "stdin" is specified, data are read from the standard input. Use Funtools Bracket Notation to specify FITS extensions, image sections, and filters. If the data being displayed are columns (either in a FITS binary table or a raw event file), the individual rows are listed. Filters can be added using bracket notation. Thus: [sh] fundisp "test.ev[time-(int)time>.15]" X Y PHA PI TIME DX DY ------- ------- ------- --------- ---------------- ---------- ---------- 10 8 10 8 17.1600 8.50 10.50 9 9 9 9 17.1600 9.50 9.50 10 9 10 9 18.1600 9.50 10.50 10 9 10 9 18.1700 9.50 10.50 8 10 8 10 17.1600 10.50 8.50 9 10 9 10 18.1600 10.50 9.50 9 10 9 10 18.1700 10.50 9.50 10 10 10 10 19.1600 10.50 10.50 10 10 10 10 19.1700 10.50 10.50 10 10 10 10 19.1800 10.50 10.50 [NB: The FITS binary table test file test.ev, as well as the FITS image test.fits, are contained in the funtools funtest directory.] When a table is being displayed using B, a second optional argument can be used to specify the columns to display. For example: [sh] fundisp "test.ev[time-(int)time>=.99]" "x y time" X Y TIME -------- -------- --------------------- 5 -6 40.99000000 4 -5 59.99000000 -1 0 154.99000000 -2 1 168.99000000 -3 2 183.99000000 -4 3 199.99000000 -5 4 216.99000000 -6 5 234.99000000 -7 6 253.99000000 The special column B<$REGION> can be specified to display the region id of each row: [sh $] fundisp "test.ev[time-(int)time>=.99&&annulus(0 0 0 10 n=3)]" 'x y time $REGION' X Y TIME REGION -------- -------- --------------------- ---------- 5 -6 40.99000000 3 4 -5 59.99000000 2 -1 0 154.99000000 1 -2 1 168.99000000 1 -3 2 183.99000000 2 -4 3 199.99000000 2 -5 4 216.99000000 2 -6 5 234.99000000 3 -7 6 253.99000000 3 Here only rows with the proper fractional time and whose position also is within one of the three annuli are displayed. Columns can be excluded from display using a minus sign before the column: [sh $] fundisp "test.ev[time-(int)time>=.99]" "-time" X Y PHA PI DX DY -------- -------- -------- ---------- ----------- ----------- 5 -6 5 -6 5.50 -6.50 4 -5 4 -5 4.50 -5.50 -1 0 -1 0 -1.50 0.50 -2 1 -2 1 -2.50 1.50 -3 2 -3 2 -3.50 2.50 -4 3 -4 3 -4.50 3.50 -5 4 -5 4 -5.50 4.50 -6 5 -6 5 -6.50 5.50 -7 6 -7 6 -7.50 6.50 All columns except the time column are displayed. The special column B<$N> can be specified to display the ordinal value of each row. Thus, continuing the previous example: fundisp "test.ev[time-(int)time>=.99]" '-time $n' X Y PHA PI DX DY N ------- -------- -------- ---------- ----------- ----------- ---------- 5 -6 5 -6 5.50 -6.50 337 4 -5 4 -5 4.50 -5.50 356 -1 0 -1 0 -1.50 0.50 451 -2 1 -2 1 -2.50 1.50 465 -3 2 -3 2 -3.50 2.50 480 -4 3 -4 3 -4.50 3.50 496 -5 4 -5 4 -5.50 4.50 513 -6 5 -6 5 -6.50 5.50 531 -7 6 -7 6 -7.50 6.50 550 Note that the column specification is enclosed in single quotes to protect '$n' from begin expanded by the shell. In general, the rules for activating and de-activating columns are: =over 4 =item * If only exclude columns are specified, then all columns but the exclude columns will be activated. =item * If only include columns are specified, then only the specified columns are activated. =item * If a mixture of include and exclude columns are specified, then all but the exclude columns will be active; this last case is ambiguous and the rule is arbitrary. =back In addition to specifying columns names explicitly, the special symbols B<+> and B<-> can be used to activate and de-activate B columns. This is useful if you want to activate the $REGION column along with all other columns. According to the rules, the syntax "$REGION" only activates the region column and de-activates the rest. Use "+ $REGION" to activate all columns as well as the region column. If the data being displayed are image data (either in a FITS primary image, a FITS image extension, or an array file), an mxn pixel display is produced, where m and n are the dimensions of the image. By default, pixel values are displayed using the same data type as in the file. However, for integer data where the BSCALE and BZERO header parameters are present, the data is displayed as floats. In either case, the display data type can be overridden using an optional second argument of the form: bitpix=n where n is 8,16,32,-32,-64, for unsigned char, short, int, float and double, respectively. Of course, running B on anything but the smallest image usually results in a display whose size makes it unreadable. Therefore, one can uses bracket notation (see below) to apply section and/or blocking to the image before generating a display. For example: [sh] fundisp "test.fits[2:6,2:7]" bitpix=-32 2 3 4 5 6 ---------- ---------- ---------- ---------- ---------- 2: 3.00 4.00 5.00 6.00 7.00 3: 4.00 5.00 6.00 7.00 8.00 4: 5.00 6.00 7.00 8.00 9.00 5: 6.00 7.00 8.00 9.00 10.00 6: 7.00 8.00 9.00 10.00 11.00 7: 8.00 9.00 10.00 11.00 12.00 Note that is is possible to display a FITS binary table as an image simply by passing the table through B first: [sh] ./funimage test.ev stdout | fundisp "stdin[2:6,2:7]" bitpix=8 2 3 4 5 6 ------- ------- ------- ------- ------- 2: 3 4 5 6 7 3: 4 5 6 7 8 4: 5 6 7 8 9 5: 6 7 8 9 10 6: 7 8 9 10 11 7: 8 9 10 11 12 If the B<-l> (list) switch is used, then an image is displayed as a list containing the columns: X, Y, VAL. For example: fundisp -l "test1.fits[2:6,2:7]" bitpix=-32 X Y VAL ---------- ---------- ----------- 2 2 6.00 3 2 1.00 4 2 1.00 5 2 1.00 6 2 1.00 2 3 1.00 3 3 5.00 4 3 1.00 5 3 1.00 6 3 1.00 2 4 1.00 3 4 1.00 4 4 4.00 5 4 1.00 6 4 1.00 2 5 1.00 3 5 1.00 4 5 1.00 5 5 3.00 6 5 1.00 2 6 1.00 3 6 1.00 4 6 1.00 5 6 1.00 6 6 2.00 2 7 1.00 3 7 1.00 4 7 1.00 5 7 1.00 6 7 1.00 If the B<-n> (nohead) switch is used, then no header is output for tables. This is useful, for example, when fundisp output is being directed into gnuplot. The B program uses a default set of display formats: datatype TFORM format -------- ----- -------- double D "%21.8f" float E "%11.2f" int J "%10d" short I "%8d" byte B "%6d" string A "%12.12s" bits X "%8x" logical L "%1x" Thus, the default display of 1 double and 2 shorts gives: [sh] fundisp snr.ev "time x y" TIME X Y --------------------- -------- -------- 79494546.56818075 546 201 79488769.94469175 548 201 ... You can change the display format for individual columns or for all columns of a given data types by means of the -f switch. The format string that accompanies -f is a space-delimited list of keyword=format values. The keyword values can either be column names (in which case the associated format pertains only to that column) or FITS table TFORM specifiers (in which case the format pertains to all columns having that data type). For example, you can change the double and short formats for all columns like this: [sh] fundisp -f "D=%22.11f I=%3d" snr.ev "time x y" TIME X Y ---------------------- --- --- 79494546.56818075478 546 201 79488769.94469174743 548 201 ... Alternatively, you can change the format of the time and x columns like this: [sh] fundisp -f "time=%22.11f x=%3d" snr.ev "time x y" TIME X Y ---------------------- --- -------- 79494546.56818075478 546 201 79488769.94469174743 548 201 ... Note that there is a potential conflict if a column has the same name as one of the TFORM specifiers. In the examples above, the the "X" column in the table has the same name as the X (bit) datatype. To resolve this conflict, the format string is processed such that TFORM datatype specifiers are checked for first, using a case-sensitive comparison. If the specified format value is not an upper case TFORM value, then a case-insensitive check is made on the column name. This means that, in the examples above, "X=%3d" will refer to the X (bit) datatype, while "x=%3d" will refer to the X column: [sh] fundisp -f "X=%3d" snr.ev "x y" X Y -------- -------- 546 201 548 201 ... [sh] fundisp -f "x=%3d" snr.ev "x y" X Y --- -------- 546 201 548 201 ... As a rule, therefore, it is best always to specify the column name in lower case and TFORM data types in upper case. The B<-f [format]> will change the format for a single execution of fundisp. You also can use the B envronment variable to change the format for all invocations of fundisp. The format of this environment variable's value is identical to that used with the B<-f> switch. This global value can be overridden in individual cases by use of the B<-f [format]> switch. Caveats: Please also note that it is the user's responsibility to match the format specifier to the column data type correctly. Also note that, in order to maintain visual alignment between names and columns, the column name will be truncated (on the left) if the format width is less than the length of the name. However, truncation is not performed if the output is in RDB format (using the -T switch). [An older-style format string is supported but deprecated. It consists of space-delimited C format statements for all data types, specified in the following order: double float int short byte string bit. This order of the list is based on the assumption that people generally will want to change the float formats. If "-" is entered instead of a format statement for a given data type, the default format is used. Also, the format string can be terminated without specifying all formats, and defaults will be used for the rest of the list. Note that you must supply a minimum field width, i.e., "%6d" and "%-6d" are legal, "%d" is not legal. By using -f [format], you can change the double and short formats like this: [sh] fundisp -f "22.11f - - 3d" snr.ev "time x y" TIME X Y ---------------------- --- --- 79494546.56818075478 546 201 79488769.94469174743 548 201 ... NB: This format is deprecated and will be removed in a future release.] The B<-F[c]> switch can be used to specify a (single-character) column separator (where the default is a space). Note that column formatting will almost certainly also add spaces to pad individual columns to the required width. These can be removed with a program such as sed, at the cost of generating unaligned columns. For example: fundisp -F',' snr.ev'[cir 512 512 .1]' X, Y, PHA, PI, TIME, DX, DY --------,--------,--------,--------,---------------------,--------,-------- 512, 512, 6, 7, 79493997.45854475, 578, 574 512, 512, 8, 9, 79494575.58943175, 579, 573 512, 512, 5, 6, 79493631.03866175, 578, 575 512, 512, 5, 5, 79493290.86521725, 578, 575 512, 512, 8, 9, 79493432.00990875, 579, 573 fundisp -F',' snr.ev'[cir 512 512 .1]' | sed 's/ *, */,/g' X,Y,PHA,PI,TIME,DX,DY --------,--------,--------,--------,---------------------,--------,-------- 512,512,6,7,79493997.45854475,578,574 512,512,8,9,79494575.58943175,579,573 512,512,5,6,79493631.03866175,578,575 512,512,5,5,79493290.86521725,578,575 512,512,8,9,79493432.00990875,579,573 fundisp -f "x=%3d y=%3d pi=%1d pha=%1d time=%20.11f dx=%3d dy=%3d" -F',' snr.ev'[cir 512 512 .1]' | sed 's/ *, */,/g' X,Y,A,I,TIME,DX,DY ---,---,-,-,--------------------,---,--- 512,512,6,7,79493997.45854474604,578,574 512,512,8,9,79494575.58943174779,579,573 512,512,5,6,79493631.03866174817,578,575 512,512,5,5,79493290.86521725357,578,575 512,512,8,9,79493432.00990875065,579,573 If the B<-T> (rdb table) switch is used, the output will conform to starbase/rdb data base format: tabs will be inserted between columns rather than spaces. This format is not available when displaying image pixels (except in conjunction with the B<-l> switch). Finally, note that B can be used to create column filters from the auxiliary tables in a FITS file. For example, the following shell code will generate a good-time interval (GTI) filter for X-ray data files that contain a standard GTI extension: #!/bin/sh sed '1,/---- .*/d /^$/,$d' | awk 'tot>0{printf "||"};{printf "time="$1":"$2; tot++}' If this script is placed in a file called "mkgti", it can be used in a command such as: fundisp foo.fits"[GTI]" | mkgti > gti.filter The resulting filter file can then be used in various funtools programs: funcnts foo.fits"[@gti.filter]" ... to process only the events in the good-time intervals. =head1 SEE ALSO See funtools(n) for a list of Funtools help pages =cut funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/pod/funds9.pod000066400000000000000000000072611256243640000237470ustar00rootroot00000000000000=pod =head1 NAME B =head1 SYNOPSIS Describes how funtools can be integrated into the ds9 Analysis menu. =head1 DESCRIPTION SAOImage/DS9 is an astronomical imaging and data visualization application used by astronomers around the world. DS9 can display standard astronomical FITS images and binary tables, but also has support for displaying raw array files, shared memory files, and data files automatically retrieved via FTP and HTTP. Standard functional capabilities include multiple frame buffers, colormap and region manipulation, and many data scaling algorithms. DS9's advanced features include TrueColor visuals, deep frame buffers, true PostScript printing, and display of image mosaics. The program's support of image tiling, "blinking", arbitrary zoom, rotation, and pan is unparalleled in astronomy. It also has innovative support for automatic retrieval and display of standard image data such as the Digital Sky Survey (using servers at SAO, StScI, or ESO). DS9 can communicate with external programs such as Funtools using the XPA messaging system. In addition, programs can be integrated directly into the DS9 GUI by means of a configurable Analysis menu. By default, the DS9 Analysis menu contains algorithms deemed essential to the core functions of DS9, e.g., display cross-cuts of data, iso-intensity contours, and WCS grids. However, new programs can be added to DS9 by creating a set-up file which can be loaded into DS9 to reconfigure the Analysis menu. The basic format of the analysis set-up file is: # # Analysis command descriptions: # menu label/description # file templates for this command # "menu" (add to menu) |"bind" (bind to key) # analysis command line For example, the funcnts program can be specified in this way: Funcnts (counts in source/bkgd regions; options: none) * menu funcnts $filename $regions(source,,) $regions(background,,) | $text As shown above, DS9 supports a macro facility to provide information as well as task support to command lines. For example, the $regions macro is expanded by DS9 to provide the current source and/or background region to the analysis command. The $text macro is expanded to generate a text window display. It also is possible to query for parameters using a $param macro, plot data using a $plot macro, etc. See the DS9 documentation for further details. A set-up file called funtools.ds9 will load some useful Funtools applications (counts in regions, radial profile, X-ray light curve and energy spectrum, 1D histogram) into the DS9 Analysis menu (version 2.1 and above). The file resides in the bin directory where Funtools programs are installed. It can be manually loaded into DS9 from the B option of the B menu. Alternatively, you can tell DS9 to load this file automatically at start-up time by adding the pathname to the B->B->B->Analysis File menu option. (NB: make sure you select B->B->B after setting the pathname.) The tasks in this setup file generally process the original disk-based FITS file. Funcnts-based results (radial profile, counts in regions) are presented in WCS units, if present in the FITS header. For situations where a disk file is not available (e.g., image data generated and sent to DS9's 'fits' XPA access point), versions of the radial profile and counts in regions tasks also are also offered utilizing DS9's internal image data. Results are presented in pixels. Aside from the units, the results should be identical to the file-based results. =head1 SEE ALSO See funtools(n) for a list of Funtools help pages =cut funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/pod/funenv.pod000066400000000000000000000170161256243640000240370ustar00rootroot00000000000000=pod =head1 NAME B =head1 SYNOPSIS Describes the environment variables which can be used to tailor the overall Funtools environment. =head1 DESCRIPTION The following environment variables are supported by Funtools: =over 4 =item * B The B environment variable specifies the default FITS extension name when FunOpen() is called on a file lacking a primary image. Thus, setenv FITS_EXTNAME "NEWEV" will allow you to call FunOpen() on files without specifying NEWEV in the Funtools bracket specification. If no FITS_EXTNAME variable is defined and the extension name also is not passed in the bracket specification, then the default will be to look for standard X-ray event table extension names "EVENTS" or "STDEVT" (we are, after all, and X-ray astronomy group at heart!). =item * B The B environment variable specifies the default FITS extension number when FunOpen() is called on a file lacking a primary image. Thus, setenv FITS_EXTNUM 7 will allow you to call FunOpen() on files to open the seventh extension without specifying the number in the Funtools bracket specification. =item * B and B These environment variable specifies the default binning key for FITS binary tables and raw event files, respectively. They can be over-ridden using the B keyword in a Funtools bracket specification. The value of each environment variable is a pair of comma-delimited columns, enclosed in parentheses, to use for binning. For example, if you want to bin on detx and dety by default, then use: setenv FITS_BINCOLS "(detx,dety)" in preference to adding a bincols specification to each filename: foo.fits[bincols=(detx,dety)] =item * B and B These environment variable specifies the default bitpix value for binning FITS binary tables and raw event files, respectively. They can be over-ridden using the B keyword in a Funtools bracket specification. The value of each environment variable is one of the standard FITS bitpix values (8,16,32,-32,-64). For example, if you want binning routines to create a floating array, then use: setenv FITS_BITPIX -32 in preference to adding a bitpix specification to each filename: foo.fits[bitpix=-32] =item * B The B environment variable specifies the default definition of an array file for Funtools. It is used if there is no array specification passed in the B directive in a Non-FITS Array specification. The value of the environment variable is a valid array specification such as: setenv ARRAY "s100.150" foo.arr[ARRAY()] This can be defined in preference to adding the specification to each filename: foo.arr[ARRAY(s100.150)] =item * B The B environment variable specifies the default definition of an raw event file for Funtools. It is used if there is no EVENTS specification passed in the B directive in a Non-FITS EVENTS specification. The value of the environment variable is a valid EVENTS specification such as: setenv EVENTS "x:J:1024,y:J:1024,pi:I,pha:I,time:D,dx:E:1024,dx:E:1024" foo.ev[EVENTS()] This can be defined in preference to adding the specification to each filename: foo.ev[EVENTS(x:J:1024,y:J:1024,pi:I,pha:I,time:D,dx:E:1024,dx:E:1024)] =back The following filter-related environment variables are supported by Funtools: =over 4 =item * B The B environment variable specifies how to build a filter. There are three possible methods: =over 4 =item * process or p The filter is compiled and linked against the funtools library (which must therefore be accessible in the original install directory) to produce a slave program. This program is fed events or image data and returns filter results. =item * dynamic or d (gcc only) The filter is compiled and linked against the funtools library (which must therefore be accessible in the original install directory) to produce a dynamic shared object, which is loaded into the funtools program and executed as a subroutine. (Extensive testing has shown that, contrary to expectations, this method is no faster than using a slave process.) =item * contained or c The filter and all supporting region code is compiled and linked without reference to the funtools library to produce a slave program (which is fed events or image data and returns filter results). This method is slower than the other two, because of the time it takes to compile the region filtering code. It is used by stand-alone programs such as ds9, which do not have access to the funtools library. =back By default, B is generally used for gcc compilers and B for other compilers. However the filter building algorithm will check for required external files and will use B is these are missing. =item * B The B environment variable is used by core row-processing Funtools programs (funtable, fundisp, funcnts, funhist, funmerge, and funcalc) to set the maximum number of rows read at once (i.e. it sets the third argument to the FunTableRowGet() call). The default is 8192. Note that this variable is a convention only: it will not be a part of a non-core Funtools program unless code is explicitly added, since each call to FunTableRowGet() specifies its own maximum number of rows to read. NB: if you make this value very large, you probably will need to increase B (see below) as well. =item * B The B environment variable is used to limit the max buffer size that will be allocated to hold table row data. This buffer size is calculated to be the row size of the table multiplied by the maximum number of rows read at once (see above). Since the row size is unlimited (and we have examples of it being larger than 5 Mb), it is possible that the total buffer size will exceed the machine capabilities. We therefore set a default value of 5Mb for the max buffer size, and adjust maxrow so that the total size calculated is less than this max buffer size. (If the row size is greater than this max buffer size, then maxrow is set to 1.) This environment variable will change the max buffer size allowed. =item * B The B environment variable specifies the compiler to use for compiling a filter specification. You also can use the B environment variable. If neither has been set, then gcc will be used if available. Otherwise cc is used if available. =item * B The B environment variable specifies extra options to add to a filter compile command line. In principle, you can add libraries, include files, and compiler switches. This variable should be used with care. =item * B The B environment variable specifies the temporary directory for filter compilation intermediate files. You also can use the B and B variables. By default, /tmp is used as the temporary directory. =item * B The B environment variable specifies whether the intermediate filter files (i.e. C source file and compile log file) should be saved after a filter is built. The default is "false", so that these intermediate files are deleted. This variable is useful for debugging, but care should be taken to reset its value to false when debugging is complete. =back =head1 SEE ALSO See funtools(n) for a list of Funtools help pages =cut funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/pod/funfiles.pod000066400000000000000000000547421256243640000243600ustar00rootroot00000000000000=pod =head1 NAME B =head1 SYNOPSIS This document describes the data file formats (FITS, array, raw events) as well as the file types (gzip, socket, etc.) supported by Funtools. =head1 DESCRIPTION Funtools supports FITS images and binary tables, and binary files containing array (homogeneous) data or event (heterogeneous) data. IRAF-style brackets are appended to the filename to specify various kinds of information needed to characterize these data: file[ext|ind|ARRAY()|EVENTS(),section][filters] or file[ext|ind|ARRAY()|EVENTS(),section,filters] where: =over 4 =item * B is the Funtools file name =item * B is the FITS extension name =item * B is the FITS extension number =item * B is an array specification =item * B is an event specification =item * B
is the image section specification =item * B are spatial region and table (row) filters =back B Funtools programs (and the underlying libraries) support the following data file formats: =over 4 =item * FITS images (and image extensions) =item * FITS binary tables =item * binary files containing an array of homogeneous data =item * binary files containing events, i.e. records of heterogeneous data =item * column-based text files, which are documented here =item * non-disk files and lists of files =back Information needed to identify and characterize the event or image data can be specified on the command line using IRAF-style bracket notation appended to the filename: foo.fits # open FITS default extension image.fits[3] # open FITS extension #3 events.fits[EVENTS] # open EVENTS extension array.file[ARRAY(s1024)] # open 1024x1024 short array events.file[EVENTS(x:1024,y:1024...)] # open non-FITS event list Note that in many Unix shells (e.g., csh and tcsh), filenames must be enclosed in quotes to protect the brackets from shell processing. B When FunOpen() opens a FITS file without a bracket specifier, the default behavior is to look for a valid image in the primary HDU. In the absence of a primary image, Funtools will try to open an extension named either B or B, if one of these exists. This default behavior supports both FITS image processing and standard X-ray event list processing (which, after all, is what we at SAO/HEAD do). In order to open a FITS binary table or image extension explicitly, it is necessary to specify either the extension name or the extension number in brackets: foo.fits[1] # open extension #1: the primary HDU foo.fits[3] # open extension #3 of a FITS file foo.fits[GTI] # open GTI extension of a FITS file The ext argument specifies the name of the FITS extension (i.e. the value of the EXTENSION header parameter in a FITS extension), while the index specifies the value of the FITS EXTVER header parameter. Following FITS conventions, extension numbers start at 1. When a FITS data file is opened for reading using FunOpen(), the specified extension is automatically located and is used to initialize the Funtools internal data structures. B In addition to FITS tables, Funtools programs and libraries can operate on non-FITS files containing heterogeneous event records. To specify such an event file, use: =over 4 =item * file[EVENTS(event-spec)] =item * file[EVENTS()] =back where B is a string that specified the names, data types, and optional image dimensions for each element of the event record: =over 4 =item * [name]:[n][type]:[(lodim:)hidim] =back Data types follow standard conventions for FITS binary tables, but include two extra unsigned types ('U' and 'V'): =over 4 =item * B -- unsigned 8-bit char =item * B -- signed 16-bit int =item * B -- signed 32-bit int =item * B -- signed 64-bit int =item * B -- 32-bit float =item * B -- 64-bit float =item * B -- unsigned 16-bit int =item * B -- unsigned 32-bit int =back An optional integer value B can be prefixed to the type to indicate that the element is an array of n values. For example: foo.fits[EVENTS(x:I,y:I,status:4J)] defines x and y as 16-bit ints and status as an array of 4 32-bit ints. Furthermore, image dimensions can be attached to the event specification in order to tell Funtools how to bin the events into an image. They follow the conventions for the FITS TLMIN/TLMAX keywords. If the low image dimension is not specified, it defaults to 1. Thus: =over 4 =item * RAWX:J:1:100 =item * RAWX:J:100 =back both specify that the dimension of this column runs from 1 to 100. NB: it is required that all padding be specified in the record definition. Thus, when writing out whole C structs instead of individual record elements, great care must be taken to include the compiler-added padding in the event definition. For example, suppose a FITS binary table has the following set of column definitions: TTYPE1 = 'X ' / Label for field TFORM1 = '1I ' / Data type for field TLMIN1 = 1 / Min. axis value TLMAX1 = 10 / Max. axis value TTYPE2 = 'Y ' / Label for field TFORM2 = '1I ' / Data type for field TLMIN2 = 2 / Min. axis value TLMAX2 = 11 / Max. axis value TTYPE3 = 'PHA ' / Label for field TFORM3 = '1I ' / Data type for field TTYPE4 = 'PI ' / Label for field TFORM4 = '1J ' / Data type for field TTYPE5 = 'TIME ' / Label for field TFORM5 = '1D ' / Data type for field TTYPE6 = 'DX ' / Label for field TFORM6 = '1E ' / Data type for field TLMIN6 = 1 / Min. axis value TLMAX6 = 10 / Max. axis value TTYPE7 = 'DY ' / Label for field TFORM7 = '1E ' / Data type for field TLMIN7 = 3 / Min. axis value TLMAX7 = 12 / Max. axis value An raw event file containing these same data would have the event specification: EVENTS(X:I:10,Y:I:2:11,PHA:I,PI:J,TIME:D,DX:E:10,DY:E:3:12) If no event specification string is included within the EVENTS() operator, then the event specification is taken from the B environment variable: setenv EVENTS "X:I:10,Y:I:10,PHA:I,PI:J,TIME:D,DX:E:10,DY:E:10" In addition to knowing the data structure, it is necessary to know the I ordering of the data, i.e., whether or not the data is in I format, so that we can convert to the native format for this platform. This issue does not arise for FITS Binary Tables because all FITS files use big-endian ordering, regardless of platform. But for non-FITS data, big-endian data produced on a Sun workstation but read on a Linux PC needs to be byte-swapped, since PCs use little-endian ordering. To specify an ordering, use the I or I keywords on the command-line or the EVENTS_BIGENDIAN or EVENTS_ENDIAN environment variables. The value of the I variables should be "true" or "false", while the value of the I variables should be "little" or "big". For example, a PC can access data produced by a Sun using: hrc.nepr[EVENTS(),bigendian=true] or hrc.nepr[EVENTS(),endian=big] or setenv EVENTS_BIGENDIAN true or setenv EVENTS_ENDIAN big If none of these are specified, the data are assumed to follow the format for that platform and no byte-swapping is performed. B In addition to FITS images, Funtools programs and libraries can operate on non-FITS files containing arrays of homogeneous data. To specify an array file, use: =over 4 =item * file[ARRAY(array-spec)] =item * file[ARRAY()] =back where array-spec is of the form: =over 4 =item * [type][dim1][.dim2][:skip][endian] =back and where [type] is: =over 4 =item * b (8-bit unsigned char) =item * s (16-bit short int) =item * u (16-bit unsigned short int) =item * i (32-bit int) =item * r,f (32-bit float) =item * d (64-bit float) =back The dim1 specification is required, but dim2 is optional and defaults to dim1. The skip specification is optional and defaults to 0. The optional endian specification can be 'l' or 'b' and defaults to the endian type for the current machine. If no array specification is included within the ARRAY() operator, then the array specification is taken from the B environment variable. For example: foo.arr[ARRAY(r512)] # bitpix=-32 dim1=512 dim2=512 foo.arr[ARRAY(r512.400)] # bitpix=-32 dim1=512 dim2=400 foo.arr[ARRAY(r512.400]) # bitpix=-32 dim1=512 dim2=400 foo.arr[ARRAY(r512.400:2880)] # bitpix=-32 dim1=512 dim2=400 skip=2880 foo.arr[ARRAY(r512l)] # bitpix=-32 dim1=512 dim2=512 endian=little setenv ARRAY "r512.400:2880" foo.arr[ARRAY()] # bitpix=-32 dim1=512 dim2=400 skip=2880 B Once a data file (and possibly, a FITS extension) has been specified, the next (optional) part of a bracket specification can be used to select image B
information, i.e., to specify the x,y limits of an image section, as well as the blocking factor to apply to that section. This information can be added to any file specification but only is used by Funtools image processing routines. The format of the image section specification is one of the following: =over 4 =item * file[xy0:xy1,block] =item * file[x0:x1,y0:y1,block] =item * file[x0:x1,*,block] =item * file[*,y0:y1,block] =item * file[*,block] =back where the limit values can be ints or "*" for default. A single "*" can be used instead of val:val, as shown. Note that blocking is applied to the section after it is extracted. In addition to image sections specified by the lo and hi x,y limits, image sections using center positions can be specified: =over 4 =item * file[dim1@xcen,dim2@ycen] =item * file[xdim2@xcen@ycen] =item * file[dim1@xcen,dim2@ycen,block] =item * file[dim@xcen@ycen,block] =back Note that the (float) values for dim, dim1, dim2, xcen, ycen must be specified or else the expression does not make sense! In all cases, block is optional and defaults to 1. An 's' or 'a' can be appended to signify "sum" or "average" blocking (default is "sum"). Section specifications are given in image coordinates by default. If you wish to specify physical coordinates, add a 'p' as the last character of the section specification, before the closing bracket. For example: =over 4 =item * file[-8:-7,-8:-7p] =item * file[-8:-7,-8:-7,2p] =back A section can be specified in any Funtools file name. If the operation to be applied to that file is an imaging operation, then the specification will be utilized. If the operation is purely a table operation, then the section specification is ignored. Do not be confused by: foo.fits[2] foo.fits[*,2] The former specifies opening the second extension of the FITS file. The latter specifies application of block 2 to the image section. Note that the section specification must come after any of FITS B name or B number, but all sensible defaults are supported: =over 4 =item * file[ext] =item * file[ext,index] =item * file[index] =item * file[ext,section] =item * file[ext,index,section] =item * file[index,section] =item * file[section] =back B If a FITS binary table or a non-FITS raw event file is to be binned into a 2D image (e.g., using the funimage program), it is necessary to specify the two columns to be used for the binning, as well as the dimensions of the image. Funtools first looks for a specifier of the form: bincols=([xnam[:tlmin[:tlmax:[binsiz]]]],[ynam[:tlmin[:tlmax[:binsiz]]]]) in bracket syntax, and uses the column names thus specified. The tlmin, tlmax, and binsiz specifiers determine the image binning dimensions using: dim = (tlmax - tlmin)/binsiz (floating point data) dim = (tlmax - tlmin)/binsiz + 1 (integer data) These tlmin, tlmax, and binsiz specifiers can be omitted if TLMIN, TLMAX, and TDBIN header parameters are present in the FITS binary table header, respectively. If only one parameter is specified, it is assumed to be tlmax, and tlmin defaults to 1. If two parameters are specified, they are assumed to be tlmin and tlmax. For example, to bin an HRC event list columns "VPOS" and "UPOS", use: hrc.nepr[bincols=(VPOS,UPOS)] or hrc.nepr[bincols=(VPOS:49152,UPOS:4096)] Note that you can optionally specify the dimensions of these columns to cover cases where neither TLMAX keywords are defined in the header. If either dimension is specified, then both must be specified. You can set the FITS_BINCOLS or EVENTS_BINCOLS environment variable as an alternative to adding the "bincols=" specifier to each file name for FITS binary tables and raw event files, respectively. If no binning keywords or environment variables are specified, or if the specified columns are not in the binary table, the Chandra parameters CPREF (or PREFX) are searched for in the FITS binary table header. Failing this, columns named "X" and "Y" are sought. If these are not found, the code looks for columns containing the characters "X" and "Y". Thus, you can bin on "DETX" and "DETX" columns without specifying them, if these are the only column names containing the "X" and "Y" characters. Ordinarily, each event or row contributes one count to an image pixel during the 2D binning process. Thus, if five events all have the same (x,y) position, the image pixel value for that position will have a value of five. It is possible to specify a variable contribution for each event by using the vcol=[colname] filter spec: vcol=[colname] The vcol colname is a column containing a numeric value in each event row that will be used as the contribution of the given event to its image pixel. For example, consider an event file that has the following content: x:e:4 y:e:4 v:e ------ ------ ---- 1 1 1.0 2 2 2.0 3 3 3.0 4 4 0.0 1 1 1.0 2 2 2.0 3 3 3.0 4 4 4.0 There are two events with x,y value of (1,1) so ordinarily a 2D image will have a value of 2 in the (1,1) pixel. If the v column is specified as the value column: foo.fits'[vcol=v]' then each pixel will contain the additive sum of the associated (x,y) column values from the v column. For example, image pixel (1,1) will contain 1. + 1. = 2, image pixel (2,2) will contain (2 + 2) = 4, etc. An important variation on the use of a value column to specify the contribution an event makes to an image pixel is when the value column contains the reciprocal of the event contribution. For this case, the column name should be prefixed with a / (divide sign) thus: foo.fits'[vcol=/v]' Each image pixel value will then be the sum of the reciprocals of the value column. A zero in the value column results in NaN (not a number). Thus, in the above example, image pixel (1.1) will contain 1/1 + 1/1 = 2, image pixel (2,2) will contain (1/2 + 1/2) = 1, etc. Image pixel (4,4) will contain (1/0 + 1/4) = NaN. You can set the FITS_VCOL or EVENTS_VCOL environment variable as an alternative to adding the "vcol=" specifier to each file name for FITS binary tables and raw event files, respectively. Finally, when binning events, the data type of the resulting 2D image must be specified. This can be done with the "bitpix=[n]" keyword in the bracket specification. For example: events.fits[bincols=(VPOS,UPOS),bitpix=-32] will create a floating point image binned on columns VPOS and UPOS. If no bitpix keyword is specified, bitpix=32 is assumed. As with bincols values, you also can use the FITS_BITPIX and EVENTS_BITPIX environment variables to set this value for FITS binary tables and raw event files, respectively. The B program also allows you to create a 1D image projection along any column of a table by using the B filter specification and specifying a single column. For example, the following command projects a 1D image along the chipx column of a table: funimage ev.fits'[bincols=chipx]' im.fits See funimage for more information about creating 1D and 2D images. Finally, please note that Funtools supports most FITS standards. We will add missing support as required by the community. In general, however, we do not support non-standard extensions. For example, we sense the presence of the binary table 'variable length array' proposed extension and we pass it along when copying and filtering files, but we do not process it. We will add support for new standards as they become official. B Note that, in addition extensions and image sections, Funtools bracket notation can be used to specify table and spatial region filters. These filters are always placed after the image section information. They can be specified in the same bracket or in a separate bracket immediately following: =over 4 =item * file[ext|ind|ARRAY()|EVENTS(),section][filters] =item * file[ext|ind|ARRAY()|EVENTS(),section,filters] =back where: =over 4 =item * B is the Funtools file name =item * B is an array specification =item * B is an event list specification =item * B is the FITS extension name =item * B is the FITS extension number =item * B
is the image section to extract =item * B are spatial region and table (row) filters to apply =back The topics of table and region filtering are covered in detail in: =over 4 =item * Table Filtering =item * Spatial Region Filtering =back B The specified B usually is an ordinary disk file. In addition, gzip'ed files are supported in Funtools: gzip'ed input files are automatically uncompressed as they are read, and gzip'ed output files are compressed as they are written. NB: if a FITS binary table is written in gzip format, the number of rows in the table will be set to -1. Such a file will work with Funtools programs but will not work with other FITS programs such as ds9. The special keywords "stdin" and "stdout" designate Unix standard input and standard output, respectively. The string "-" (hyphen) will be taken to mean "stdin" if the file is opened for reading and "stdout" if the file is opened for writing. A file also can be an INET socket on the same or another machine using the syntax: machine:port Thus, for example: karapet:1428 specifies that I/O should be performed to/from port 1428 on the machine karapet. If no machine name is specified, the default is to use the current machine: :1428 This means to open port 1428 on the current machine. Socket support allows you to generate a distributed pipe: on karapet: funtask1 in.fits bynars:1428 on bynars: funtask2 :1428 out.fits The socket mechanism thus supports simple parallel processing using B. Note that parallel processing using B is supported via the B
specifier (see below), and the B specifier, which is part of Table Filtering. A file also can be a pointer to shared memory using the syntax: shm:[id|@key][:size] A shared memory segment is specified with a B prefix, followed by either the shared memory id or the shared memory key (where the latter is prefixed by the '@' character). The size (in bytes) of the shared memory segment can then be appended (preceded by the ':' character). If the size specification is absent, the code will attempt to determine the length automatically. If the open mode contains the string "w+", then the memory segment will be created if it does not exist. (It also will be released and deleted when the file is closed.) In the case where a memory segment is being created, the length of the segment is required. A file also can be Unix piped command (i.e. a program to run) using the syntax: "pipe: command arg1 ... argn" The output from the command must be a valid FITS file. It is important to use quotes to protect spaces so that command arguments are passed correctly. A silly example is: fundisp "pipe: funtable 'foo.fits[cir 512 512 .1]' stdout" This seemed like a good idea at the time ... B Funtools also will process a list of files as a single file using the syntax: "list: file1 file2 ... filen" The files in the list are separated by whitespace. Any of the above file types can be used. For example, if two files, foo1.fits and foo2.fits, are part of the same observation, they can be processed as a single file (using their own filters): fundisp "list: foo1.fits[cir(512,512,10)] foo2.fits[cir(511,511,10)]" X Y PHA PI TIME DX DY -------- -------- -------- -------- --------------------- -------- -------- 512 512 6 7 79493997.45854475 578 574 512 512 8 9 79494575.58943175 579 573 512 512 5 6 79493631.03866175 578 575 512 512 5 5 79493290.86521725 578 575 512 512 8 9 79493432.00990875 579 573 511 511 5 5 79488631.09462625 580 575 511 511 10 11 79488780.60006675 580 573 511 511 4 4 79494562.35474326 580 575 511 511 6 6 79488203.01561825 580 575 511 511 6 6 79488017.99730176 580 575 511 511 4 4 79494332.45355175 580 575 511 511 9 10 79492685.94014275 581 574 511 511 5 5 79487708.71298325 580 575 511 511 8 9 79493719.00160225 581 573 Again, note that it is important to avoid spaces in the filters because the list separator also is whitespace. To protect whitespace in a filter, enclose the file specification in quotes: fundisp "list: 'foo1.fits[cir 512 512 .1]' foo2.fits[cir(511,511,.1)]" =head1 SEE ALSO See funtools(n) for a list of Funtools help pages =cut funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/pod/funfilters.pod000066400000000000000000000231171256243640000247160ustar00rootroot00000000000000=pod =head1 NAME B =head1 SYNOPSIS This document contains a summary of the user interface for filtering rows in binary tables. =head1 DESCRIPTION Table filtering allows a program to select rows from an table (e.g., X-ray event list) by checking each row against one or more expressions involving the columns in the table. When a table is filtered, only valid rows satisfying these expressions are passed through for processing. A filter expression is specified using bracket notation appended to the filename of the data being processed: foo.fits[pha==1&&pi==2] It is also possible to put region specification inside a file and then pass the filename in bracket notation: foo.fits[@my.reg] Filters must be placed after the extension and image section information, when such information is present. The correct order is: =over 4 =item * file[fileinfo,sectioninfo][filters] =item * file[fileinfo,sectioninfo,filters] =back where: =over 4 =item * B is the Funtools file name =item * B is an ARRAY, EVENT, FITS extension, or FITS index =item * B is the image section to extract =item * B are spatial region and table (row) filters to apply =back See Funtools Files for more information on file and image section specifications. B Table filtering can be performed on columns of data in a FITS binary table or a raw event file. Table filtering is accomplished by means of B
. An table filter specification consists of one or more B Filter specifications also can contain comments and local/global processing directives. More specifically, a filter specification consist of one or more lines containing: # comment until end of line # include the following file in the table descriptor @file # each row expression can contain filters separated by operators [filter_expression] BOOLOP [filter_expression2], ... # each row expression can contain filters separated by the comma operator [filter_expression1], [filter_expression2], ... # the special row# keyword allows a range of rows to be processed row#=m:n # or a single row row#=m # regions are supported -- but are described elsewhere [spatial_region_expression] A single filter expression consists of an arithmetic, logical, or other operations involving one or more column values from a table. Columns can be compared to other columns, to header values, or to numeric constants. Standard math functions can be applied to columns. Separate filter expressions can be combined using boolean operators. Standard C semantics can be used when constructing expressions, with the usual precedence and associativity rules holding sway: Operator Associativity -------- ------------- () left to right !! (logical not) right to left ! (bitwise not) - (unary minus) right to left * / left to right + - left to right < <= > >= left to right == != left to right & (bitwise and) left to right ^ (bitwise exclusive or) left to right | (bitwise inclusive or) left to right && (logical and) left to right || (logical or) left to right = right to left For example, if energy and pha are columns in a table, then the following are valid expressions: pha>1 energy == pha (pha>1) && (energy<=2) max(pha,energy)>=2.5 Comparison values can be integers or floats. Integer comparison values can be specified in decimal, octal (using '0' as prefix), hex (using '0x' as prefix) or binary (using '0b' as prefix). Thus, the following all specify the same comparison test of a status mask: (status & 15) == 8 # decimal (status & 017) == 010 # octal (status & 0xf) == 0x8 # hex (status & 0b1111) == 0b1000 # binary The special keyword row# allows you to process a range of rows. When row# is specified, the filter code skips to the designated row and only processes the specified number of rows. The "*" character can be utilized as the high limit value to denote processing of the remaining rows. Thus: row#=100:109 processes 10 rows, starting with row 100 (counting from 1), while: row#=100:* specifies that all but the first 99 rows are to be processed. Spatial region filtering allows a program to select regions of an image or rows of a table (e.g., X-ray events) using simple geometric shapes and boolean combinations of shapes. For a complete description of regions, see Spatial Region Filtering. B As mentioned previously, multiple filter expressions can be specified in a filter descriptor, separated by commas or new-lines. When such a comma or new-line separator is used, the boolean AND operator is automatically generated in its place. Thus and expression such as: pha==1,pi=2:4 is equivalent to: (pha==1) && (pi>=2&&pi<=4) [Note that the behavior of separators is different for filter expressions and spatial region expressions. The former uses AND as the operator, while the latter user OR. See Combining Region and Table Filters for more information about these conventions and how they are treated when combined.] B Aside from the standard C syntax, filter expressions can make use of IRAF-style B which specify a range of values. The syntax requires that the column name be followed by an '=' sign, which is followed by one or more comma-delimited range expressions of the form: col = vv # col == vv in range col = :vv # col <= vv in range col = vv: # col >= vv in range col = vv1:vv2 # vv1 <= col <= vv2 in range The vv's above must be numeric constants; the right hand side of a range list cannot contain a column name or header value. Note that, unlike an ordinary comma separator, the comma separator used between two or more range expressions denotes OR. Thus, when two or more range expressions are combined with a comma separator, the resulting expression is a shortcut for more complicated boolean logic. For example: col = :3,6:8,10: is equivalent to: (col=6 && col =10) Note also that the single-valued rangelist: col = val is equivalent to the C-based filter expression: col == val assuming, of course, that val is a numeric constant. B It is permissible to specify C math functions as part of the filter syntax. When the filter parser recognizes a function call, it automatically includes the math.h and links in the C math library. Thus, it is possible to filter rows by expressions such as these: =over 4 =item * (pi+pha)>(2+log(pi)-pha) =item * min(pi,pha)*14>x =item * max(pi,pha)==(pi+1) =item * feq(pi,pha) =item * div(pi,pha)>0 =back The function feq(a,b) returns true (1) if the difference between a and b (taken as double precision values) is less than approximately 10E-15. The function div(a,b) divides a by b, but returns NaN (not a number) if b is 0. It is a safe way to avoid floating point errors when dividing one column by another. B The special B<@filename> directive specifies an include file containing filter expressions. This file is processed as part of the overall filter descriptor: foo.fits[pha==1,@foo] B
The filter syntax supports comparison between a column value and a header parameter value of a FITS binary tables (raw event files have no such header). The header parameters can be taken from the binary table header or the primary header. For example, assuming there is a header value MEAN_PHA in one of these headers, you can select photons having exactly this value using: =over 4 =item * pha==MEAN_PHA =back Table filtering is more easily described by means of examples. Consider data containing the following table structure: =over 4 =item * double TIME =item * int X =item * int Y =item * short PI =item * short PHA =item * int DX =item * int DY =back Tables can be filtered on these columns using IRAF/QPOE range syntax or any valid C syntax. The following examples illustrate the possibilities: =over 4 =item * pha=10 =item * pha==10 select rows whose pha value is exactly 10 =item * pha=10:50 select rows whose pha value is in the range of 10 to 50 =item * pha=10:50,100 select rows whose pha value is in the range of 10 to 50 or is equal to 100 =item * pha>=10 && pha<=50 select rows whose pha value is in the range of 10 to 50 =item * pi=1,2&&pha>3 select rows whose pha value is 1 or 2 and whose pi value is 3 =item * pi=1,2 || pha>3 select rows whose pha value is 1 or 2 or whose pi value is 3 =item * pha==pi+1 select rows whose pha value is 1 less than the pi value =item * (pha==pi+1) && (time>50000.0) select rows whose pha value is 1 less than the pi value and whose time value is greater than 50000 =item * (pi+pha)>20 select rows in which the sum of the pi and pha values is greater than 20 =item * pi%2==1 select rows in which the pi value is odd =back Currently, integer range list limits cannot be specified in binary notation (use decimal, hex, or octal instead). Please contact us if this is a problem. =head1 SEE ALSO See funtools(n) for a list of Funtools help pages =cut �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/pod/funflush.pod������������������������������0000664�0000000�0000000�00000005377�12562436400�0024377�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������=pod =head1 NAME B =head1 SYNOPSIS #include void FunFlush(Fun fun, char *plist) =head1 DESCRIPTION The B routine will flush data to a FITS output file. In particular, it can be called after all rows have been written (using the FunTableRowPut() routine) in order to add the null padding that is required to complete a FITS block. It also should be called after completely writing an image using FunImagePut() or after writing the final row of an image using FunTableRowPut(). The B (i.e., parameter list) argument is a string containing one or more comma-delimited B parameters. If the plist string contains the parameter "copy=remainder" and the file was opened with a reference file, which, in turn, was opened for extension copying (i.e. the input FunOpen() mode also was "c" or "C"), then FunFlush also will copy the remainder of the FITS extensions from the input reference file to the output file. This normally would be done only at the end of processing. Note that FunFlush() is called with "copy=remainder" in the mode string by FunClose(). This means that if you close the output file before the reference input file, it is not necessary to call FunFlush() explicitly, unless you are writing more than one extension. See the evmerge example code. However, it is safe to call FunFlush() more than once without fear of re-writing either the padding or the copied extensions. In addition, if FunFlush() is called on an output file with the plist set to "copy=reference" and if the file was opened with a reference file, the reference extension is written to the output file. This mechanism provides a simple way to copy input extensions to an output file without processing the former. For example, in the code fragment below, an input extension is set to be the reference file for a newly opened output extension. If that reference extension is not a binary table, it is written to the output file: /* process each input extension in turn */ for(ext=0; ;ext++){ /* get new extension name */ sprintf(tbuf, "%s[%d]", argv[1], ext); /* open input extension -- if we cannot open it, we are done */ if( !(ifun=FunOpen(tbuf, "r", NULL)) ) break; /* make the new extension the reference handle for the output file */ FunInfoPut(ofun, FUN_IFUN, &ifun, 0); /* if its not a binary table, just write it out */ if( !(s=FunParamGets(ifun, "XTENSION", 0, NULL, &got)) || strcmp(s, "BINTABLE")){ if( s ) free(s); FunFlush(ofun, "copy=reference"); FunClose(ifun); continue; } else{ /* process binary table */ .... } } =head1 SEE ALSO See funtools(n) for a list of Funtools help pages =cut �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/pod/funhead.pod�������������������������������0000664�0000000�0000000�00000015260�12562436400�0024147�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������=pod =head1 NAME B =head1 SYNOPSIS funhead [-a] [-s] [-t] [-L] [oname ename] =head1 OPTIONS -a # display all extension headers -s # display 79 chars instead of 80 before the new-line -t # prepend data type char to each line of output -L # output in rdb/starbase list format =head1 DESCRIPTION B displays the FITS header parameters in the specified FITS Extension. The first argument to the program specifies the Funtools input file to display. If "stdin" is specified, data are read from the standard input. Funtools Bracket Notation is used to specify particular FITS extension to process. Normally, the full 80 characters of each header card is output, followed by a new-line. If the B<-a> switch is specified, the header from each FITS extensions in the file is displayed. Note, however, that the B<-a> switch does not work with FITS files input via stdin. We hope to remove this restriction in a future release. If the B<-s> switch is specified, only 79 characters are output before the new-line. This helps the display on 80 character terminals. If the B<-t> switch is specified, the data type of the parameter is output as a one character prefix, followed by 77 characters of the param. The parameter data types are defined as: FUN_PAR_UNKNOWN ('u'), FUN_PAR_COMMENT ('c'), FUN_PAR_LOGICAL ('l'), FUN_PAR_INTEGER ('i'), FUN_PAR_STRING ('s'), FUN_PAR_REAL ('r'), FUN_PAR_COMPLEX ('x'). If the B<-L> (rdb table) switch is used, the output will conform to starbase/rdb data base list format. For example to display the EVENTS extension (binary table): [sh] funhead "foo.fits[EVENTS]" XTENSION= 'BINTABLE' / FITS 3D BINARY TABLE BITPIX = 8 / Binary data NAXIS = 2 / Table is a matrix NAXIS1 = 20 / Width of table in bytes NAXIS2 = 30760 / Number of entries in table PCOUNT = 0 / Random parameter count GCOUNT = 1 / Group count TFIELDS = 7 / Number of fields in each row EXTNAME = 'EVENTS ' / Table name EXTVER = 1 / Version number of table TFORM1 = '1I ' / Data type for field TTYPE1 = 'X ' / Label for field TUNIT1 = ' ' / Physical units for field TFORM2 = '1I ' / Data type for field etc. ... END To display the third header: [sh] funhead "foo.fits[3]" XTENSION= 'BINTABLE' / FITS 3D BINARY TABLE BITPIX = 8 / Binary data NAXIS = 2 / Table is a matrix NAXIS1 = 32 / Width of table in bytes NAXIS2 = 40 / Number of entries in table PCOUNT = 0 / Random parameter count GCOUNT = 1 / Group count TFIELDS = 7 / Number of fields in each row EXTNAME = 'TGR ' / Table name EXTVER = 1 / Version number of table TFORM1 = '1D ' / Data type for field etc. ... END To display the primary header (i.e., extension 0): sh> funhead "coma.fits[0]" SIMPLE = T /STANDARD FITS FORMAT BITPIX = 16 /2-BYTE TWOS-COMPL INTEGER NAXIS = 2 /NUMBER OF AXES NAXIS1 = 800 / NAXIS2 = 800 / DATATYPE= 'INTEGER*2' /SHORT INTEGER END The funhead program also can edit (i.e. add, delete, or modify) or display individual headers parameters. Edit mode is signalled by the presence of two additional command-line arguments: output file and edit command file, in that order. Edit mode acts as a filter: the output file will contain the entire input FITS file, including other extensions. The edit command file can be "stdin", in which case edit command are read from the standard input. The edit command file contains parameter comments (having '#' in the first column) and delete and assignment(modify or add) operations. A delete operation is specified by preceding the parameter name with a minus sign "-". A display operation (very useful in interactive sessions, i.e., where the edit commands are taken from stdin) is specified by preceding the parameter name with a question mark "?". In either case, a parameter value need not be specified. An assignment operation is specified in the same two ways that a parameter is specified in a text header (but without the comment character that precedes header params), i.e.: =over 4 =item * FITS-style comments have an equal sign "=" between the keyword and value and an optional slash "/" to signify a comment. The strict FITS rules on column positions are not enforced. =item * Free-form comments can have an optional colon separator between the keyword and value. In the absence of quote, all tokens after the keyword are part of the value, i.e. no comment is allowed. =back For example, the following interactive session checks for the existence of parameters, adds new parameters, modifies them, and modifies and deletes existing parameters: sh$ ./funhead snr.ev foo.fits - # look for FOO1 ? FOO1 WARNING: FOO1 not found # add new foo1 FOO1 = 100 # add foo2 FOO2 = 200 # reset foo1 to a different value FOO1 -1 # delete foo2 -FOO2 # change existing value EXTVER 2 ? XS-SORT XS-SORT = 'EOF ' / type of event sort # delete existing value -XS-SORT # exit ^D See Column-based Text Files for more information about header parameter format. =head1 SEE ALSO See funtools(n) for a list of Funtools help pages =cut ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/pod/funhist.pod�������������������������������0000664�0000000�0000000�00000022302�12562436400�0024210�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������=pod =head1 NAME B =head1 SYNOPSIS funhist [-n|-w|-T] [column] [[lo:hi:]bins] =head1 OPTIONS -n # normalize bin value by the width of each bin -w # specify bin width instead of number of bins in arg3 -T # output in rdb/starbase format (tab separators) =head1 DESCRIPTION B creates a one-dimensional histogram from the specified columns of a FITS Extension binary table of a FITS file (or from a non-FITS raw event file), or from a FITS image or array, and writes that histogram as an ASCII table. Alternatively, the program can perform a 1D projection of one of the image axes. The first argument to the program is required, and specifies the Funtools file: FITS table or image, raw event file, or array. If "stdin" is specified, data are read from the standard input. Use Funtools Bracket Notation to specify FITS extensions, and filters. For a table, the second argument also is required. It specifies the column to use in generating the histogram. If the data file is of type image (or array), the column is optional: if "x" (or "X"), "y" (or "Y") is specified, then a projection is performed over the x (dim1) or y (dim2) axes, respectively. (That is, this projection will give the same results as a histogram performed on a table containing the equivalent x,y event rows.) If no column name is specified or "xy" (or "XY") is specified for the image, then a histogram is performed on the values contained in the image pixels. The argument that follows is optional and specifies the number of bins to use in creating the histogram and, if desired, the range of bin values. For image and table histograms, the range should specify the min and max data values. For image histograms on the x and y axes, the range should specify the min and max image bin values. If this argument is omitted, the number of output bins for a table is calculated either from the TLMIN/TLMAX headers values (if these exist in the table FITS header for the specified column) or by going through the data to calculate the min and max value. For an image, the number of output bins is calculated either from the DATAMIN/DATAMAX header values, or by going through the data to calculate min and max value. (Note that this latter calculation might fail if the image cannot be fit in memory.) If the data are floating point (table or image) and the number of bins is not specified, an arbitrary default of 128 is used. For binary table processing, the B<-w> (bin width) switch can be used to specify the width of each bin rather than the number of bins. Thus: funhist test.ev pha 1:100:5 means that 5 bins of width 20 are used in the histogram, while: funhist -w test.ev pha 1:100:5 means that 20 bins of width 5 are used in the histogram. The data are divvied up into the specified number of bins and the resulting 1D histogram (or projection) is output in ASCII table format. For a table, the output displays the low_edge (inclusive) and hi_edge (exclusive) values for the data. For example, a 15-row table containing a "pha" column whose values range from -7.5 to 7.5 can be processed thus: [sh] funhist test.ev pha # data file: /home/eric/data/test.ev # column: pha # min,max,bins: -7.5 7.5 15 bin value lo_edge hi_edge ------ --------- --------------------- --------------------- 1 22 -7.50000000 -6.50000000 2 21 -6.50000000 -5.50000000 3 20 -5.50000000 -4.50000000 4 19 -4.50000000 -3.50000000 5 18 -3.50000000 -2.50000000 6 17 -2.50000000 -1.50000000 7 16 -1.50000000 -0.50000000 8 30 -0.50000000 0.50000000 9 16 0.50000000 1.50000000 10 17 1.50000000 2.50000000 11 18 2.50000000 3.50000000 12 19 3.50000000 4.50000000 13 20 4.50000000 5.50000000 14 21 5.50000000 6.50000000 15 22 6.50000000 7.50000000 [sh] funhist test.ev pha 1:6 # data file: /home/eric/data/test.ev # column: pha # min,max,bins: 0.5 6.5 6 bin value lo_edge hi_edge ------ --------- --------------------- --------------------- 1 16 0.50000000 1.50000000 2 17 1.50000000 2.50000000 3 18 2.50000000 3.50000000 4 19 3.50000000 4.50000000 5 20 4.50000000 5.50000000 6 21 5.50000000 6.50000000 [sh] funhist test.ev pha 1:6:3 # data file: /home/eric/data/test.ev # column: pha # min,max,bins: 0.5 6.5 3 bin value lo_edge hi_edge ------ --------- --------------------- --------------------- 1 33 0.50000000 2.50000000 2 37 2.50000000 4.50000000 3 41 4.50000000 6.50000000 For a table histogram, the B<-n>(normalize) switch can be used to normalize the bin value by the width of the bin (i.e., hi_edge-lo_edge): [sh] funhist -n test.ev pha 1:6:3 # data file: test.ev # column: pha # min,max,bins: 0.5 6.5 3 # width normalization (val/(hi_edge-lo_edge)) is applied bin value lo_edge hi_edge ------ --------------------- --------------------- --------------------- 1 16.50000000 0.50000000 2.50000000 2 6.16666667 2.50000000 4.50000000 3 4.10000000 4.50000000 6.50000000 This could used, for example, to produce a light curve with values having units of counts/second instead of counts. For an image histogram, the output displays the low and high image values (both inclusive) used to generate the histogram. For example, in the following example, 184 pixels had a value of 1, 31 had a value of 2, while only 2 had a value of 3,4,5,6, or 7: [sh] funhist test.fits # data file: /home/eric/data/test.fits # min,max,bins: 1 7 7 bin value lo_val hi_val ------ --------------------- --------------------- --------------------- 1 184.00000000 1.00000000 1.00000000 2 31.00000000 2.00000000 2.00000000 3 2.00000000 3.00000000 3.00000000 4 2.00000000 4.00000000 4.00000000 5 2.00000000 5.00000000 5.00000000 6 2.00000000 6.00000000 6.00000000 7 2.00000000 7.00000000 7.00000000 For the axis projection of an image, the output displays the low and high image bins (both inclusive) used to generate the projection. For example, in the following example, 21 counts had their X bin value of 2, etc.: [sh] funhist test.fits x 2:7 # data file: /home/eric/data/test.fits # column: X # min,max,bins: 2 7 6 bin value lo_bin hi_bin ------ --------------------- --------------------- --------------------- 1 21.00000000 2.00000000 2.00000000 2 20.00000000 3.00000000 3.00000000 3 19.00000000 4.00000000 4.00000000 4 18.00000000 5.00000000 5.00000000 5 17.00000000 6.00000000 6.00000000 6 16.00000000 7.00000000 7.00000000 [sh] funhist test.fits x 2:7:2 # data file: /home/eric/data/test.fits # column: X # min,max,bins: 2 7 2 bin value lo_bin hi_bin ------ --------------------- --------------------- --------------------- 1 60.00000000 2.00000000 4.00000000 2 51.00000000 5.00000000 7.00000000 You can use gnuplot or other plotting programs to graph the results, using a script such as: #!/bin/sh sed -e '1,/---- .*/d /^$/,$d' | \ awk '\ BEGIN{print "set nokey; set title \"funhist\"; set xlabel \"bin\"; set ylabel \"counts\"; plot \"-\" with boxes"} \ {print $3, $2, $4-$3}' | \ gnuplot -persist - 1>/dev/null 2>&1 Similar plot commands are supplied in the script B: funhist test.ev pha ... | funhist.plot gnuplot =head1 SEE ALSO See funtools(n) for a list of Funtools help pages =cut ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/pod/funidx.pod��������������������������������0000664�0000000�0000000�00000017570�12562436400�0024040�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������=pod =head1 NAME B =head1 SYNOPSIS This document contains a summary of the user interface for filtering rows in binary tables with indexes. =head1 DESCRIPTION Funtools Table Filtering allows rows in a table to be selected based on the values of one or more columns in the row. Because the actual filter code is compiled on the fly, it is very efficient. However, for very large files (hundreds of Mb or larger), evaluating the filter expression on each row can take a long time. Therefore, funtools supports index files for columns, which are used automatically during filtering to reduce dramatically the number of row evaluations performed. The speed increase for indexed filtering can be an order of magnitude or more, depending on the size of the file. The funindex program creates an index on one or more columns in a binary table. For example, to create an index for the column pi in the file huge.fits, use: funindex huge.fits pi This will create an index named huge_pi.idx. When a filter expression is initialized for row evaluation, funtools looks for an index file for each column in the filter expression. If found, and if the file modification date of the index file is later than that of the data file, then the index will be used to reduce the number of rows that are evaluated in the filter. When Spatial Region Filtering is part of the expression, the columns associated with the region are checked for index files. If an index file is not available for a given column, then in general, all rows must be checked when that column is part of a filter expression. This is not true, however, when a non-indexed column is part of an AND expression. In this case, only the rows that pass the other part of the AND expression need to be checked. Thus, in some cases, filtering speed can increase significantly even if all columns are not indexed. Also note that certain types of filter expression syntax cannot make use of indices. For example, calling functions with column names as arguments implies that all rows must be checked against the function value. Once again, however, if this function is part of an AND expression, then a significant improvement in speed still is possible if the other part of the AND expression is indexed. For example, note below the dramatic speedup in searching a 1 Gb file using an AND filter, even when one of the columns (pha) has no index: time fundisp \ huge.fits'[idx_activate=0,idx_debug=1,pha=2348&&cir 4000 4000 1]' \ "x y pha" x y pha ---------- ----------- ---------- 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 42.36u 13.07s 6:42.89 13.7% time fundisp \ huge.fits'[idx_activate=1,idx_debug=1,pha=2348&&cir 4000 4000 1]' \ "x y pha" x y pha ---------- ----------- ---------- idxeq: [INDEF] idxand sort: x[ROW 8037025:8070128] y[ROW 5757665:5792352] idxand(1): INDEF [IDX_OR_SORT] idxall(1): [IDX_OR_SORT] 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 1.55u 0.37s 1:19.80 2.4% When all columns are indexed, the increase in speed can be even more dramatic: time fundisp \ huge.fits'[idx_activate=0,idx_debug=1,pi=770&&cir 4000 4000 1]' \ "x y pi" x y pi ---------- ----------- ---------- 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 42.60u 12.63s 7:28.63 12.3% time fundisp \ huge.fits'[idx_activate=1,idx_debug=1,pi=770&&cir 4000 4000 1]' \ "x y pi" x y pi ---------- ----------- ---------- idxeq: pi start=9473025,stop=9492240 => pi[ROW 9473025:9492240] idxand sort: x[ROW 8037025:8070128] y[ROW 5757665:5792352] idxor sort/merge: pi[ROW 9473025:9492240] [IDX_OR_SORT] idxmerge(5): [IDX_OR_SORT] pi[ROW] idxall(1): [IDX_OR_SORT] 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 1.67u 0.30s 0:24.76 7.9% The miracle of indexed filtering (and indeed, of any indexing) is the speed of the binary search on the index, which is of order log2(n) instead of n. (The funtools binary search method is taken from http://www.tbray.org/ongoing/When/200x/2003/03/22/Binary, to whom grateful acknowledgement is made.) This means that the larger the file, the better the performance. Conversely, it also means that for small files, using an index (and the overhead involved) can slow filtering down somewhat. Our tests indicate that on a file containing a few tens of thousands of rows, indexed filtering can be 10 to 20 percent slower than non-indexed filtering. Of course, your mileage will vary with conditions (disk access speed, amount of available memory, process load, etc.) Any problem encountered during index processing will result in indexing being turned off, and replaced by filtering all rows. You can turn filtering off manually by setting the idx_activate variable to 0 (in a filter expression) or the FILTER_IDX_ACTIVATE environment variable to 0 (in the global environment). Debugging output showing how the indexes are being processed can be displayed to stderr by setting the idx_debug variable to 1 (in a filter expression) or the FILTER_IDX_DEBUG environment variable to 1 (in the global environment). Currently, indexed filtering only works with FITS binary tables and raw event files. It does not work with text files. This restriction might be removed in a future release. =head1 SEE ALSO See funtools(n) for a list of Funtools help pages =cut ����������������������������������������������������������������������������������������������������������������������������������������funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/pod/funimage.pod������������������������������0000664�0000000�0000000�00000025261�12562436400�0024332�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������=pod =head1 NAME B =head1 SYNOPSIS funimage [-a] [bitpix=n] funimage [-l] [bitpix=n] funimage [-p x|y] [bitpix=n] =head1 OPTIONS -a # append to existing output file as an image extension -l # input is a list file containing xcol, ycol, value -p [x|y] # project along x or y axis to create a 1D image =head1 DESCRIPTION B creates a primary FITS image from the specified FITS Extension and/or Image Section of a FITS file, or from an Image Section of a non-FITS array, or from a raw event file. The first argument to the program specifies the FITS input image, array, or raw event file to process. If "stdin" is specified, data are read from the standard input. Use Funtools Bracket Notation to specify FITS extensions, image sections, and filters. The second argument is the output FITS file. If "stdout" is specified, the FITS image is written to the standard output. By default, the output pixel values are of the same data type as those of the input file (or type "int" when binning a table), but this can be overridden using an optional third argument of the form: bitpix=n where n is 8,16,32,-32,-64, for unsigned char, short, int, float and double, respectively. If the input data are of type image, the appropriate section is extracted and blocked (based on how the Image Section is specified), and the result is written to the FITS primary image. When an integer image containing the BSCALE and BZERO keywords is converted to float, the pixel values are scaled and the scaling keywords are deleted from the output header. When converting integer scaled data to integer (possibly of a different size), the pixels are not scaled and the scaling keywords are retained. If the input data is a binary table or raw event file, these are binned into an image, from which a section is extracted and blocked, and written to a primary FITS image. In this case, it is necessary to specify the two columns that will be used in the 2D binning. This can be done on the command line using the B keyword: funcnts "foo.ev[EVENTS,bincols=(detx,dety)]" The full form of the B specifier is: bincols=([xname[:tlmin[:tlmax:[binsiz]]]],[yname[:tlmin[:tlmax[:binsiz]]]]) where the tlmin, tlmax, and binsiz specifiers determine the image binning dimensions: dim = (tlmax - tlmin)/binsiz (floating point data) dim = (tlmax - tlmin)/binsiz + 1 (integer data) Using this syntax, it is possible to bin any two columns of a binary table at any bin size. Note that the tlmin, tlmax, and binsiz specifiers can be omitted if TLMIN, TLMAX, and TDBIN header parameters (respectively) are present in the FITS binary table header for the column in question. Note also that if only one parameter is specified, it is assumed to be tlmax, and tlmin defaults to 1. If two parameters are specified, they are assumed to be tlmin and tlmax. See Binning FITS Binary Tables and Non-FITS Event Files for more information about binning parameters. By default, a new 2D FITS image file is created and the image is written to the primary HDU. If the B<-a> (append) switch is specified, the image is appended to an existing FITS file as an IMAGE extension. (If the output file does not exist, the switch is effectively ignored and the image is written to the primary HDU.) This can be useful in a shell programming environment when processing multiple FITS images that you want to combine into a single final FITS file. B also can take input from a table containing columns of x, y, and value (e.g., the output from B which displays each image x and y and the number of counts at that position.) When the B<-l> (list) switch is used, the input file is taken to be a FITS or ASCII table containing (at least) three columns that specify the x and y image coordinates and the value of that image pixel. In this case, B requires four extra arguments: xcolumn:xdims, ycolumn:ydims, vcolumn and bitpix=n. The x and y col:dim information takes the form: name:dim # values range from 1 to dim name:min:max # values range from min to max name:min:max:binsiz # dimensions scaled by binsize In particular, the min value should be used whenever the minimum coordinate value is something other than one. For example: funimage -l foo.lst foo.fits xcol:0:512 ycol:0:512 value bitpix=-32 The list feature also can be used to read unnamed columns from standard input: simply replace the column name with a null string. Note that the dimension information is still required: funimage -l stdin foo.fits "":0:512 "":0:512 "" bitpix=-32 240 250 1 255 256 2 ... ^D The list feature provides a simple way to generate a blank image. If you pass a Column-based Text File to funimage in which the text header contains the required image information, then funimage will correctly make a blank image. For example, consider the following text file (called foo.txt): x:I:1:10 y:I:1:10 ------ ------ 0 0 This text file defines two columns, x and y, each of data type 32-bit int and image dimension 10. The command: funimage foo.txt foo.fits bitpix=8 will create an empty FITS image called foo.fits containing a 10x10 image of unsigned char: fundisp foo.fits 1 2 3 4 5 6 7 8 9 10 ------ ------ ------ ------ ------ ------ ------ ------ ------ ------ 10: 0 0 0 0 0 0 0 0 0 0 9: 0 0 0 0 0 0 0 0 0 0 8: 0 0 0 0 0 0 0 0 0 0 7: 0 0 0 0 0 0 0 0 0 0 6: 0 0 0 0 0 0 0 0 0 0 5: 0 0 0 0 0 0 0 0 0 0 4: 0 0 0 0 0 0 0 0 0 0 3: 0 0 0 0 0 0 0 0 0 0 2: 0 0 0 0 0 0 0 0 0 0 1: 1 0 0 0 0 0 0 0 0 0 Note that the text file must contain at least one row of data. However, in the present example, event position 0,0 is outside the limits of the image and will be ignored. (You can, of course, use real x,y values to seed the image with data.) Furthermore, you can use the TEXT filter specification to obviate the need for an input text file altogether. The following command will create the same 10x10 char image without an actual input file: funimage stdin'[TEXT(x:I:10,y:I:10)]' foo.fits bitpix=8 < /dev/null or funimage /dev/null'[TEXT(x:I:10,y:I:10)]' foo.fits bitpix=8 You also can use either of these methods to generate a region mask simply by appending a region inside the filter brackets and specfying B along with the bitpix. For example, the following command will generate a 10x10 char mask using 3 regions: funimage stdin'[TEXT(x:I:10,y:I:10),cir(5,5,4),point(10,1),-cir(5,5,2)]' \ foo.fits bitpix=8,mask=all < /dev/null The resulting mask looks like this: fundisp foo.fits 1 2 3 4 5 6 7 8 9 10 ------ ------ ------ ------ ------ ------ ------ ------ ------ ------ 10: 0 0 0 0 0 0 0 0 0 0 9: 0 0 0 0 0 0 0 0 0 0 8: 0 0 1 1 1 1 1 0 0 0 7: 0 1 1 1 1 1 1 1 0 0 6: 0 1 1 0 0 0 1 1 0 0 5: 0 1 1 0 0 0 1 1 0 0 4: 0 1 1 0 0 0 1 1 0 0 3: 0 1 1 1 1 1 1 1 0 0 2: 0 0 1 1 1 1 1 0 0 0 1: 0 0 0 0 0 0 0 0 0 2 You can use B to create 1D image projections along the x or y axis using the B<-p [x|y]> switch. This capability works for both images and tables. For example consider a FITS table named ev.fits containing the following rows: X Y -------- -------- 1 1 1 2 1 3 1 4 1 5 2 2 2 3 2 4 2 5 3 3 3 4 3 5 4 4 4 5 5 5 A corresponding 5x5 image, called dim2.fits, would therefore contain: 1 2 3 4 5 ---------- ---------- ---------- ---------- ---------- 5: 1 1 1 1 1 4: 1 1 1 1 0 3: 1 1 1 0 0 2: 1 1 0 0 0 1: 1 0 0 0 0 A projection along the y axis can be performed on either the table or the image: funimage -p y ev.fits stdout | fundisp stdin 1 2 3 4 5 ---------- ---------- ---------- ---------- ---------- 1: 1 2 3 4 5 funimage -p y dim2.fits stdout | fundisp stdin 1 2 3 4 5 ---------- ---------- ---------- ---------- ---------- 1: 1 2 3 4 5 Furthermore, you can create a 1D image projection along any column of a table by using the B filter specification and specifying a single column. For example, the following command projects the same 1D image along the y axis of a table as use of the B<-p y> switch: funimage ev.fits'[bincols=y]' stdout | fundisp stdin 1 2 3 4 5 ---------- ---------- ---------- ---------- ---------- 1: 1 2 3 4 5 Examples: Create a FITS image from a FITS binary table: [sh] funimage test.ev test.fits Display the FITS image generated from a blocked section of FITS binary table: [sh] funimage "test.ev[2:8,3:7,2]" stdout | fundisp stdin 1 2 3 --------- --------- --------- 1: 20 28 36 2: 28 36 44 =head1 SEE ALSO See funtools(n) for a list of Funtools help pages =cut �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/pod/funimageget.pod���������������������������0000664�0000000�0000000�00000014145�12562436400�0025031�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������=pod =head1 NAME B =head1 SYNOPSIS #include void *FunImageGet(Fun fun, void *buf, char *plist) =head1 DESCRIPTION The B routine returns an binned image array of the specified section of a Funtools data file. If the input data are already of type image, the array is generated by extracting the specified image section and then binning it according to the specified bin factor. If the input data are contained in a binary table or raw event file, the rows are binned on the columns specified by the B keyword (using appropriate default columns as necessary), after which the image section and bin factors are applied. In both cases, the data is automatically converted from FITS to native format, if necessary. The first argument is the Funtools handle returned by FunOpen(). The second B argument is a pointer to a data buffer to fill. If NULL is specified, FunImageGet will allocate a buffer of the appropriate size. Generally speaking, you always want Funtools to allocate the buffer because the image dimensions will be determined by Funtools image sectioning on the command line. The third B (i.e., parameter list) argument is a string containing one or more comma-delimited B parameters. It can be used to specify the return data type using the B keyword. If no such keyword is specified in the plist string, the data type of the returned image is the same as the data type of the original input file, or is of type int for FITS binary tables. If the B keyword is supplied in the plist string, the data type of the returned image will be one of the supported FITS image data types: =over 4 =item * 8 unsigned char =item * 16 short =item * 32 int =item * -32 float =item * -64 double =back For example: void *buf; /* extract data section into an image buffer */ if( !(buf = FunImageGet(fun, NULL, NULL)) ) gerror(stderr, "could not FunImageGet: %s\n", iname); will allocate buf and retrieve the image in the file data format. In this case, you will have to determine the data type (using the FUN_SECT_BITPIX value in the FunInfoGet() routine) and then use a switch statement to process each data type: int bitpix; void *buf; unsigned char *cbuf; short *sbuf; int *ibuf; ... buf = FunImageGet(fun, NULL, NULL); FunInfoGet(fun, FUN_SECT_BITPIX, &bitpix, 0); /* set appropriate data type buffer to point to image buffer */ switch(bitpix){ case 8: cbuf = (unsigned char *)buf; break; case 16: sbuf = (short *)buf; break; case 32: ibuf = (int *)buf; break; ... See the imblank example code for more details on how to process an image when the data type is not specified beforehand. It often is easier to specify the data type directly: double *buf; /* extract data section into a double image buffer */ if( !(buf = FunImageGet(fun, NULL, "bitpix=-64")) ) gerror(stderr, "could not FunImageGet: %s\n", iname); will extract the image while converting to type double. On success, a pointer to the image buffer is returned. (This will be the same as the second argument, if NULL is not passed to the latter.) On error, NULL is returned. In summary, to retrieve image or row data into a binned image, you simply call FunOpen() followed by FunImageGet(). Generally, you then will want to call FunInfoGet() to retrieve the axis dimensions (and data type) of the section you are processing (so as to take account of sectioning and blocking of the original data): double *buf; int i, j; int dim1, dim2; ... other declarations, etc. /* open the input FITS file */ if( !(fun = FunOpen(argv[1], "rc", NULL)) ) gerror(stderr, "could not FunOpen input file: %s\n", argv[1]); /* extract and bin the data section into a double float image buffer */ if( !(buf = FunImageGet(fun, NULL, "bitpix=-64")) ) gerror(stderr, "could not FunImageGet: %s\n", argv[1]); /* get dimension information from funtools structure */ FunInfoGet(fun, FUN_SECT_DIM1, &dim1, FUN_SECT_DIM2, &dim2, 0); /* loop through pixels and reset values below limit to value */ for(i=0; i keyword: funcnts "foo.ev[EVENTS,bincols=(detx,dety)]" The full form of the B specifier is: bincols=([xname[:tlmin[:tlmax:[binsiz]]]],[yname[:tlmin[:tlmax[:binsiz]]]]) where the tlmin, tlmax, and binsiz specifiers determine the image binning dimensions: dim = (tlmax - tlmin)/binsiz (floating point data) dim = (tlmax - tlmin)/binsiz + 1 (integer data) These tlmin, tlmax, and binsiz specifiers can be omitted if TLMIN, TLMAX, and TDBIN header parameters (respectively) are present in the FITS binary table header for the column in question. Note that if only one parameter is specified, it is assumed to be tlmax, and tlmin defaults to 1. If two parameters are specified, they are assumed to be tlmin and tlmax. If B is not specified on the command line, Funtools tries to use appropriate defaults: it looks for the environment variable FITS_BINCOLS (or FITS_BINKEY). Then it looks for the Chandra parameters CPREF (or PREFX) in the FITS binary table header. Failing this, it looks for columns named "X" and "Y" and if these are not found, it looks for columns containing the characters "X" and "Y". See Binning FITS Binary Tables and Non-FITS Event Files for more information. =head1 SEE ALSO See funtools(n) for a list of Funtools help pages =cut ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/pod/funimageput.pod���������������������������0000664�0000000�0000000�00000006143�12562436400�0025061�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������=pod =head1 NAME B =head1 SYNOPSIS #include int FunImagePut(Fun fun, void *buf, int dim1, int dim2, int bitpix, char *plist) =head1 DESCRIPTION The B routine outputs an image array to a FITS file. The image is written either as a primary header/data unit or as an image extension, depending on whether other data have already been written to the file. That is, if the current file position is at the beginning of the file, a primary HDU is written. Otherwise, an image extension is written. The first argument is the Funtools handle returned by FunOpen(). The second B argument is a pointer to a data buffer to write. The Band B arguments that follow specify the dimensions of the image, where dim1 corresponds to naxis1 and dim2 corresponds to naxis2. The B argument specifies the data type of the image and can have the following FITS-standard values: =over 4 =item * 8 unsigned char =item * 16 short =item * 32 int =item * -32 float =item * -64 double =back When FunTableRowPut() is first called for a given image, Funtools checks to see if the primary header has already been written (by having previously written an image or a binary table.) If not, this image is written to the primary HDU. Otherwise, it is written to an image extension. Thus, a simple program to generate a FITS image might look like this: int i; int dim1=512, dim2=512; double *dbuf; Fun fun; dbuf = malloc(dim1*dim2*sizeof(double)); /* open the output FITS image, preparing to copy input params */ if( !(fun = FunOpen(argv[1], "w", NULL)) ) gerror(stderr, "could not FunOpen output file: %s\n", argv[1]); for(i=0; i<(dim1*dim2); i++){ ... fill dbuf ... } /* put the image (header will be generated automatically */ if( !FunImagePut(fun, buf, dim1, dim2, -64, NULL) ) gerror(stderr, "could not FunImagePut: %s\n", argv[1]); FunClose(fun); free(dbuf); In addition, if a Funtools reference handle was specified when this table was opened, the parameters from this Funtools reference handle are merged into the new image header. Furthermore, if a reference image was specified during FunOpen(), the values of B, B, and B in the calling sequence can all be set to 0. In this case, default values are taken from the reference image section. This is useful if you are reading an image section in its native data format, processing it, and then writing that section to a new FITS file. See the imblank example code. The data are assumed to be in the native machine format and will automatically be swapped to FITS big-endian format if necessary. This behavior can be over-ridden with the B keyword in the B param list string. When you are finished writing the image, you should call FunFlush() to write out the FITS image padding. However, this is not necessary if you subsequently call FunClose() without doing any other I/O to the FITS file. =head1 SEE ALSO See funtools(n) for a list of Funtools help pages =cut �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/pod/funimagerowget.pod������������������������0000664�0000000�0000000�00000005255�12562436400�0025563�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������=pod =head1 NAME B =head1 SYNOPSIS #include void *FunImageRowGet(Fun fun, void *buf, int rstart, int rstop, char *plist) =head1 DESCRIPTION The B routine returns one or more image rows from the specified section of a Funtools data file. If the input data are of type image, the array is generated by extracting the specified image rows and then binning them according to the specified bin factor. If the input data are contained in a binary table or raw event file, the rows are binned on the columns specified by the B keyword (using appropriate default columns as needed), after which the image section and bin factors are applied. The first argument is the Funtools handle returned by FunOpen(). The second B argument is a pointer to a data buffer to fill. If NULL is specified, FunImageGet() will allocate a buffer of the appropriate size. The third and fourth arguments specify the first and last row to retrieve. Rows are counted starting from 1, up to the value of FUN_YMAX(fun). The final B (i.e., parameter list) argument is a string containing one or more comma-delimited B parameters. It can be used to specify the return data type using the B keyword. If no such keyword is specified in the plist string, the data type of the image is the same as the data type of the original input file, or is of type int for FITS binary tables. If the Bvalue is supplied in the plist string, the data type of the returned image will be one of the supported FITS image data types: =over 4 =item * 8 unsigned char =item * 16 short =item * 32 int =item * -32 float =item * -64 double =back For example: double *drow; Fun fun; ... open files ... /* get section dimensions */ FunInfoGet(fun, FUN_SECT_DIM1, &dim1, FUN_SECT_DIM2, &dim2, 0); /* allocate one line's worth */ drow = malloc(dim1*sizeof(double)); /* retrieve and process each input row (starting at 1) */ for(i=1; i <= dim2; i++){ if( !FunImageRowGet(fun, drow, i, i, "bitpix=-64") ) gerror(stderr, "can't FunImageRowGet: %d %s\n", i, iname); /* reverse the line */ for(j=1; j<=dim1; j++){ ... process drow[j-1] ... } } ... On success, a pointer to the image buffer is returned. (This will be the same as the second argument, if NULL is not passed to the latter.) On error, NULL is returned. Note that the considerations described above for specifying binning columns in FunImageGet() also apply to B. =head1 SEE ALSO See funtools(n) for a list of Funtools help pages =cut ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/pod/funimagerowput.pod������������������������0000664�0000000�0000000�00000004157�12562436400�0025614�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������=pod =head1 NAME B =head1 SYNOPSIS #include void *FunImageRowPut(Fun fun, void *buf, int rstart, int rstop, int dim1, int dim2, int bitpix, char *plist) =head1 DESCRIPTION The B routine writes one or more image rows to the specified FITS image file. The first argument is the Funtools handle returned by FunOpen(). The second B argument is a pointer to the row data buffer, while the third and fourth arguments specify the starting and ending rows to write. Valid rows values range from 1 to dim2, i.e., row is one-valued. The Band B arguments that follow specify the dimensions, where dim1 corresponds to naxis1 and dim2 corresponds to naxis2. The B argument data type of the image and can have the following FITS-standard values: =over 4 =item * 8 unsigned char =item * 16 short =item * 32 int =item * -32 float =item * -64 double =back For example: double *drow; Fun fun, fun2; ... open files ... /* get section dimensions */ FunInfoGet(fun, FUN_SECT_DIM1, &dim1, FUN_SECT_DIM2, &dim2, 0); /* allocate one line's worth */ drow = malloc(dim1*sizeof(double)); /* retrieve and process each input row (starting at 1) */ for(i=1; i <= dim2; i++){ if( !FunImageRowGet(fun, drow, i, i, "bitpix=-64") ) gerror(stderr, "can't FunImageRowGet: %d %s\n", i, iname); ... process drow ... if( !FunImageRowPut(fun2, drow, i, i, 64, NULL) ) gerror(stderr, "can't FunImageRowPut: %d %s\n", i, oname); } ... The data are assumed to be in the native machine format and will automatically be swapped to big-endian FITS format if necessary. This behavior can be over-ridden with the B keyword in the B param list string. When you are finished writing the image, you should call FunFlush() to write out the FITS image padding. However, this is not necessary if you subsequently call FunClose() without doing any other I/O to the FITS file. =head1 SEE ALSO See funtools(n) for a list of Funtools help pages =cut �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/pod/funindex.pod������������������������������0000664�0000000�0000000�00000003540�12562436400�0024353�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������=pod =head1 NAME B =head1 SYNOPSIS funindex [oname] =head1 OPTIONS NB: these options are not compatible with Funtools processing. Please use the defaults instead. -c # compress output using gzip" -a # ASCII output, ignore -c (default: FITS table)" -f # FITS table output (default: FITS table)" -l # long output, i.e. with key value(s) (default: long)" -s # short output, i.e. no key value(s) (default: long)" =head1 DESCRIPTION The funindex script creates an index for the specified column (key) by running funtable -s (sort) and then saving the column value and the record number for each sorted row. This index will be used automatically by funtools filtering of that column, provided the index file's modification date is later than that of the data file. The first required argument is the name of the FITS binary table to index. Please note that text files cannot be indexed at this time. The second required argument is the column (key) name to index. While multiple keys can be specified in principle, the funtools index processing assume a single key and will not recognize files containing multiple keys. By default, the output index file name is [root]_[key].idx, where [root] is the root of the input file. Funtools looks for this specific file name when deciding whether to use an index for faster filtering. Therefore, the optional third argument (output file name) should not be used for funtools processing. For example, to create an index on column Y for a given FITS file, use: funindex foo.fits Y This will generate an index named foo_y.idx, which will be used by funtools for filters involving the Y column. =head1 SEE ALSO See funtools(n) for a list of Funtools help pages =cut ����������������������������������������������������������������������������������������������������������������������������������������������������������������funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/pod/funindexes.pod����������������������������0000664�0000000�0000000�00000016474�12562436400�0024715�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������=pod =head1 NAME B =head1 SYNOPSIS This document contains a summary of the user interface for filtering rows in binary tables with indexes. =head1 DESCRIPTION Funtools Table Filtering allows rows in a table to be selected based on the values of one or more columns in the row. Because the actual filter code is compiled on the fly, it is very efficient. For very large files (hundreds of Mb or larger), however, evaluating the filter expression on each row can take a long time. Therefore, funtools supports index files for columns, which are used automatically during filtering to reduce dramatically the number of row evaluations performed. The speed increase for indexed filtering can be an order of magnitude or more, depending on the size of the file. The funindex program creates a index on column in a binary table. For example, to create an index for the column pi in the file huge.fits, use: funindex huge.fits pi This will create an index named huge_pi.idx. When a filter expression is initialized for row evaluation, funtools looks for an index file for each column in the filter expression. If found, and if the file modification date of the index file is later than that of the data file, then the index will be used to reduce the number of rows that are evaluated in the filter. When Spatial Region Filtering is part of the expression, the columns associated with the region checked for index files. If an index file is not available for a given column, then in general, all rows must be checked when that column is part of a filter expression. This is not true, however, when a non-indexed column is part of an AND expression. In this case, only the rows that pass the other part of the AND expression need to be checked. Thus, in some cases, filtering speed can increase significantly even if all columns are not indexed. Also note that certain types of filter expression syntax cannot make use of indices. For example, calling functions with column names as arguments implies that all rows must be checked against the function value. Once again, however, if this function is part of an AND expression, then a significant improvement in speed still is possible if the other part of the AND expression is indexed. As an example, note below the dramatic speedup in searching a 1 Gb file using an AND filter, even when one of the columns (pha) has no index: bynars-16: time fundisp huge.fits'[idx_use=0,idx_debug=1,pha=2348&&cir 4000 4000 1]' "x y pha" x y pha ----------- ----------- ---------- 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 42.36u 13.07s 6:42.89 13.7% bynars-17: time fundisp huge.fits'[idx_use=1,idx_debug=1,pha=2348&&cir 4000 4000 1]' "x y pha" x y pha ----------- ----------- ---------- idxeq: [INDEF] idxand sort: x[ROW 8037025:8070128] y[ROW 5757665:5792352] idxand(1): INDEF [IDX_OR_SORT] idxall(1): [IDX_OR_SORT] 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 3999.48 4000.47 2348 1.55u 0.37s 1:19.80 2.4% When all columns are indexed, the increase in speed can be even more dramatic: bynars-20: time fundisp huge.fits'[idx_use=0,idx_debug=1,pi=770&&cir 4000 4000 1]' "x y pi" x y pi ----------- ----------- ---------- 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 42.60u 12.63s 7:28.63 12.3% bynars-21: time fundisp huge.fits'[idx_use=1,idx_debug=1,pi=770&&cir 4000 4000 1]' "x y pi" x y pi ----------- ----------- ---------- idxeq: pi start=9473025,stop=9492240 => pi[ROW 9473025:9492240] idxand sort: x[ROW 8037025:8070128] y[ROW 5757665:5792352] idxor sort/merge: pi[ROW 9473025:9492240] [IDX_OR_SORT] idxmerge(5): [IDX_OR_SORT] pi[ROW] idxall(1): [IDX_OR_SORT] 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 3999.48 4000.47 770 1.67u 0.30s 0:24.76 7.9% The miracle of indexed filtering (and indeed, of any indexing) is due to the speed of the binary search on the index, which is of order log2(n) instead of n. (The funtools binary search method is taken from http://www.tbray.org/ongoing/When/200x/2003/03/22/Binary, to whom grateful acknowledgement is made.) This means that the larger the file, the better the performance. Conversely, it also means that for small files, using an index (and the overhead involved) can slow filtering down somewhat. Our tests indicate that on a file containing a few tens of thousands of rows, indexed filtering can be 10-20 percent slower. Of course, your mileage will vary with conditions (disk access speed, amount of available memory, process load, etc.) Any problem encountered during index processing is supposed to result in indexing being turned off, replaced by filtering all rows. You can turn filtering off manually by setting the idx_use variable to 0 (in a filter expression) or the FILTER_IDX_USE environment variable to 0 (in the global environment). Debugging output showing how the indexes are being processed can be displayed to stderr by setting the idx_debug variable to 1 (in a filter expression) or the FILTER_IDX_DEBUG environment variable to 1 (in the global environment). Currently, indexed filtering only works with FITS binary tables and raw event files. It does not work with text files. This restriction might be removed in a future release. =head1 SEE ALSO See funtools(n) for a list of Funtools help pages =cut ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/pod/funinfoget.pod����������������������������0000664�0000000�0000000�00000021263�12562436400�0024701�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������=pod =head1 NAME B =head1 SYNOPSIS #include int FunInfoGet(Fun fun, int type, char *addr, ...) =head1 DESCRIPTION The B routine returns information culled from the Funtools structure. The first argument is the Fun handle from which information is to be retrieved. This first required argument is followed by a variable length list of pairs of arguments. Each pair consists of an integer representing the type of information to retrieve and the address where the information is to be stored. The list is terminated by a 0. The routine returns the number of get actions performed. The full list of available information is described below. Please note that only a few of these will be useful to most application developers. For imaging applications, the most important types are: FUN_SECT_DIM1 int /* dim1 for section */ FUN_SECT_DIM2 int /* dim2 for section */ FUN_SECT_BITPIX int /* bitpix for section */ These would be used to determine the dimensions and data type of image data retrieved using the FunImageGet() routine. For example: /* extract and bin the data section into an image buffer */ buf = FunImageGet(fun, NULL, NULL); /* get required information from funtools structure. this should come after the FunImageGet() call, in case the call changed sect_bitpix */ FunInfoGet(fun, FUN_SECT_BITPIX, &bitpix, FUN_SECT_DIM1, &dim1, FUN_SECT_DIM2, &dim2, 0); /* loop through pixels and reset values below limit to value */ for(i=0; i the call to FunImageGet(), in order to retrieve the updated bitpix value. See the imblank example code for more details. It also can be useful to retrieve the World Coordinate System information from the Funtools structure. Funtools uses the the WCS Library developed by Doug Mink at SAO, which is available here. (More information about the WCSTools project in general can be found here.) The FunOpen() routine initializes two WCS structures that can be used with this WCS Library. Applications can retrieve either of these two WCS structures using B: FUN_WCS struct WorldCoor * /* wcs structure, for image coordinates*/ FUN_WCS0 struct WorldCoor * /* wcs structure, for physical coordinates */ The structure retrieved by FUN_WCS is a WCS library handle containing parameters suitable for use with image coordinates, regardless of whether the data are images or tables. For this structure, the WCS reference point (CRPIX) has been converted to image coordinates if the underlying file is a table (and therefore in physical coordinates). You therefore must ensure that the positions being passed to a routine like pix2wcs are in image coordinates. The FUN_WCS0 structure has not had its WCS reference point converted to image coordinates. It therefore is useful when passing processing physical coordinates from a table. Once a WCS structure has been retrieved, it can be used as the first argument to the WCS library routines. (If the structure is NULL, no WCS information was contained in the file.) The two important WCS routines that Funtools uses are: #include =head1 SYNOPSIS #include int FunInfoPut(Fun fun, int type, char *addr, ...) =head1 DESCRIPTION The B routine puts information into a Funtools structure. The first argument is the Fun handle from which information is to be retrieved. After this first required argument comes a variable length list of pairs of arguments. Each pair consists of an integer representing the type of information to store and the address of the new information to store in the struct. The variable list is terminated by a 0. The routine returns the number of put actions performed. The full list of available information is described above with the FunInfoPut() routine. Although use of this routine is expected to be uncommon, there is one important situation in which it plays an essential part: writing multiple extensions to a single output file. For input, multiple extensions are handled by calling FunOpen() for each extension to be processed. When opening multiple inputs, it sometimes is the case that you will want to process them and then write them (including their header parameters) to a single output file. To accomplish this, you open successive input extensions using FunOpen() and then call B to set the Funtools reference handle of the output file to that of the newly opened input extension: /* open a new input extension */ ifun=FunOpen(tbuf, "r", NULL)) ) /* make the new extension the reference handle for the output file */ FunInfoPut(ofun, FUN_IFUN, &ifun, 0); Resetting FUN_IFUN has same effect as when a funtools handle is passed as the final argument to FunOpen(). The state of the output file is reset so that a new extension is ready to be written. Thus, the next I/O call on the output extension will output the header, as expected. For example, in a binary table, after resetting FUN_IFUN you can then call FunColumnSelect() to select the columns for output. When you then call FunImagePut() or FunTableRowPut(), a new extension will be written that contains the header parameters from the reference extension. Remember to call FunFlush() to complete output of a given extension. A complete example of this capability is given in the evcol example code. The central algorithm is: =over 4 =item * open the output file without a reference handle =item * loop: open each input extension in turn =over 4 =item * set the reference handle for output to the newly opened input extension =item * read the input rows or image and perform processing =item * write new rows or image to the output file =item * flush the output =item * close input extension =back =item * close output file =back Note that FunFlush() is called after processing each input extension in order to ensure that the proper padding is written to the output file. A call to FunFlush() also ensures that the extension header is written to the output file in the case where there are no rows to output. If you wish to output a new extension without using a Funtools reference handle, you can call FunInfoPut() to reset the FUN_OPS value directly. For a binary table, you would then call FunColumnSelect() to set up the columns for this new extension. /* reset the operations performed on this handle */ int ops=0; FunInfoPut(ofun, FUN_OPS, &ops, 0); FunColumnSelect(fun, sizeof(EvRec), NULL, "MYCOL", "J", "w", FUN_OFFSET(Ev, mycol), NULL); Once the FUN_OPS variable has been reset, the next I/O call on the output extension will output the header, as expected. =head1 SEE ALSO See funtools(n) for a list of Funtools help pages =cut ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/pod/funjoin.pod�������������������������������0000664�0000000�0000000�00000021204�12562436400�0024200�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������=pod =head1 NAME B =head1 SYNOPSIS funjoin [switches] ... =head1 OPTIONS -a cols # columns to activate in all files -a1 cols ... an cols # columns to activate in each file -b 'c1:bvl,c2:bv2' # blank values for common columns in all files -bn 'c1:bv1,c2:bv2' # blank values for columns in specific files -j col # column to join in all files -j1 col ... jn col # column to join in each file -m min # min matches to output a row -M max # max matches to output a row -s # add 'jfiles' status column -S col # add col as status column -t tol # tolerance for joining numeric cols [2 files only] =head1 DESCRIPTION B joins rows from two or more (up to 32) FITS Binary Table files, based on the values of specified join columns in each file. NB: the join columns must have an index file associated with it. These files are generated using the B program. The first argument to the program specifies the first input FITS table or raw event file. If "stdin" is specified, data are read from the standard input. Subsequent arguments specify additional event files and tables to join. The last argument is the output FITS file. NB: Do B use Funtools Bracket Notation to specify FITS extensions and row filters when running funjoin or you will get wrong results. Rows are accessed and joined using the index files directly, and this bypasses all filtering. The join columns are specified using the B<-j col> switch (which specifies a column name to use for all files) or with B<-j1 col1>, B<-j2 col2>, ... B<-jn coln> switches (which specify a column name to use for each file). A join column must be specified for each file. If both B<-j col> and B<-jn coln> are specified for a given file, then the latter is used. Join columns must either be of type string or type numeric; it is illegal to mix numeric and string columns in a given join. For example, to join three files using the same key column for each file, use: funjoin -j key in1.fits in2.fits in3.fits out.fits A different key can be specified for the third file in this way: funjoin -j key -j3 otherkey in1.fits in2.fits in3.fits out.fits The B<-a "cols"> switch (and B<-a1 "col1">, B<-a2 "cols2"> counterparts) can be used to specify columns to activate (i.e. write to the output file) for each input file. By default, all columns are output. If two or more columns from separate files have the same name, the second (and subsequent) columns are renamed to have an underscore and a numeric value appended. The B<-m min> and B<-M max> switches specify the minimum and maximum number of joins required to write out a row. The default minimum is 0 joins (i.e. all rows are written out) and the default maximum is 63 (the maximum number of possible joins with a limit of 32 input files). For example, to write out only those rows in which exactly two files have columns that match (i.e. one join): funjoin -j key -m 1 -M 1 in1.fits in2.fits in3.fits ... out.fits A given row can have the requisite number of joins without all of the files being joined (e.g. three files are being joined but only two have a given join key value). In this case, all of the columns of the non-joined file are written out, by default, using blanks (zeros or NULLs). The B<-b c1:bv1,c2:bv2> and B<-b1 'c1:bv1,c2:bv2' -b2 'c1:bv1,c2:bv2' ...> switches can be used to set the blank value for columns common to all files and/or columns in a specified file, respectively. Each blank value string contains a comma-separated list of column:blank_val specifiers. For floating point values (single or double), a case-insensitive string value of "nan" means that the IEEE NaN (not-a-number) should be used. Thus, for example: funjoin -b "AKEY:???" -b1 "A:-1" -b3 "G:NaN,E:-1,F:-100" ... means that a non-joined AKEY column in any file will contain the string "???", the non-joined A column of file 1 will contain a value of -1, the non-joined G column of file 3 will contain IEEE NaNs, while the non-joined E and F columns of the same file will contain values -1 and -100, respectively. Of course, where common and specific blank values are specified for the same column, the specific blank value is used. To distinguish which files are non-blank components of a given row, the B<-s> (status) switch can be used to add a bitmask column named "JFILES" to the output file. In this column, a bit is set for each non-blank file composing the given row, with bit 0 corresponds to the first file, bit 1 to the second file, and so on. The file names themselves are stored in the FITS header as parameters named JFILE1, JFILE2, etc. The B<-S col> switch allows you to change the name of the status column from the default "JFILES". A join between rows is the Cartesian product of all rows in one file having a given join column value with all rows in a second file having the same value for its join column and so on. Thus, if file1 has 2 rows with join column value 100, file2 has 3 rows with the same value, and file3 has 4 rows, then the join results in 2*3*4=24 rows being output. The join algorithm directly processes the index file associated with the join column of each file. The smallest value of all the current columns is selected as a base, and this value is used to join equal-valued columns in the other files. In this way, the index files are traversed exactly once. The B<-t tol> switch specifies a tolerance value for numeric columns. At present, a tolerance value can join only two files at a time. (A completely different algorithm is required to join more than two files using a tolerance, somethng we might consider implementing in the future.) The following example shows many of the features of funjoin. The input files t1.fits, t2.fits, and t3.fits contain the following columns: [sh] fundisp t1.fits AKEY KEY A B ----------- ------ ------ ------ aaa 0 0 1 bbb 1 3 4 ccc 2 6 7 ddd 3 9 10 eee 4 12 13 fff 5 15 16 ggg 6 18 19 hhh 7 21 22 fundisp t2.fits AKEY KEY C D ----------- ------ ------ ------ iii 8 24 25 ggg 6 18 19 eee 4 12 13 ccc 2 6 7 aaa 0 0 1 fundisp t3.fits AKEY KEY E F G ------------ ------ -------- -------- ----------- ggg 6 18 19 100.10 jjj 9 27 28 200.20 aaa 0 0 1 300.30 ddd 3 9 10 400.40 Given these input files, the following funjoin command: funjoin -s -a1 "-B" -a2 "-D" -a3 "-E" -b \ "AKEY:???" -b1 "AKEY:XXX,A:255" -b3 "G:NaN,E:-1,F:-100" \ -j key t1.fits t2.fits t3.fits foo.fits will join the files on the KEY column, outputting all columns except B (in t1.fits), D (in t2.fits) and E (in t3.fits), and setting blank values for AKEY (globally, but overridden for t1.fits) and A (in file 1) and G, E, and F (in file 3). A JFILES column will be output to flag which files were used in each row: AKEY KEY A AKEY_2 KEY_2 C AKEY_3 KEY_3 F G JFILES ------------ ------ ------ ------------ ------ ------ ------------ ------ -------- ----------- -------- aaa 0 0 aaa 0 0 aaa 0 1 300.30 7 bbb 1 3 ??? 0 0 ??? 0 -100 nan 1 ccc 2 6 ccc 2 6 ??? 0 -100 nan 3 ddd 3 9 ??? 0 0 ddd 3 10 400.40 5 eee 4 12 eee 4 12 ??? 0 -100 nan 3 fff 5 15 ??? 0 0 ??? 0 -100 nan 1 ggg 6 18 ggg 6 18 ggg 6 19 100.10 7 hhh 7 21 ??? 0 0 ??? 0 -100 nan 1 XXX 0 255 iii 8 24 ??? 0 -100 nan 2 XXX 0 255 ??? 0 0 jjj 9 28 200.20 4 =head1 SEE ALSO See funtools(n) for a list of Funtools help pages =cut ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/pod/funlib.pod��������������������������������0000664�0000000�0000000�00000030300�12562436400�0024004�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������=pod =head1 NAME B =head1 SYNOPSIS A description of the Funtools library. =head1 DESCRIPTION B To create a Funtools application, you need to include the funtools.h definitions file in your code: #include You then call Funtools subroutines and functions to access Funtools data. The most important routines are: =over 4 =item * FunOpen: open a Funtools file =item * FunInfoGet: get info about an image or table =item * FunImageGet: retrieve image data =item * FunImageRowGet: retrieve image data by row =item * FunImagePut: output image data =item * FunImageRowPut: output image data by row =item * FunColumnSelect: select columns in a table for access =item * FunTableRowGet: retrieve rows from a table =item * FunTableRowPut: output rows to a table =item * FunClose: close a Funtools file =back Your program must be linked against the libfuntools.a library, along with the math library. The following libraries also might be required on your system: =over 4 =item * -lsocket -lnsl for socket support =item * -ldl for dynamic loading =back For example, on a Solaris system using gcc, use the following link line: gcc -o foo foo.c -lfuntools -lsocket -lnsl -ldl -lm On a Solaris system using Solaris cc, use the following link line: gcc -o foo foo.c -lfuntools -lsocket -lnsl -lm On a Linux system using gcc, use the following link line: gcc -o foo foo.c -lfuntools -ldl -lm Once configure has built a Makefile on your platform, the required "extra" libraries (aside from -lm, which always is required) are specified in that file's EXTRA_LIBS variable. For example, under Linux you will find: grep EXTRA_LIBS Makefile EXTRA_LIBS = -ldl ... The Funtools library contains both the zlib library (http://www.gzip.org/zlib/) and Doug Mink's WCS library (http://tdc-www.harvard.edu/software/wcstools/). It is not necessary to put these libraries on a Funtools link line. Include files necessary for using these libraries are installed in the Funtools include directory. B The FunOpen() function is used to open a FITS file, an array, or a raw event file: /* open the input FITS file for reading */ ifun = FunOpen(iname, "r", NULL); /* open the output FITS file for writing, and connect it to the input file */ ofun = FunOpen(iname, "w", ifun); A new output file can inherit header parameters automatically from existing input file by passing the input Funtools handle as the last argument to the new file's FunOpen() call as shown above. For image data, you then can call FunImageGet() to read an image into memory. float buf=NULL; /* extract and bin the data section into an image buffer */ buf = FunImageGet(fun, NULL, "bitpix=-32"); If the (second) buf argument to this call is NULL, buffer space is allocated automatically. The (third) plist argument can be used to specify the return data type of the array. If NULL is specified, the data type of the input file is used. To process an image buffer, you would generally make a call to FunInfoGet() to determine the dimensions of the image (which may have been changed from the original file dimensions due to Funtools image sectioning on the command line). In a FITS image, the index along the dim1 axis varies most rapidly, followed by the dim2 axis, etc. Thus, to access each pixel in an 2D image, use a double loop such as: buf = FunImageGet(fun, NULL, "bitpix=-32"); FunInfoGet(fun, FUN_SECT_DIM1, &dim1, FUN_SECT_DIM2, &dim2, 0); for(i=1; i<=dim2; i++){ for(j=1; j<=dim1; j++){ ... process buf[((i-1)*dim1)+(j-1)] ... } } or: buf = FunImageGet(fun, NULL, "bitpix=-32"); FunInfoGet(fun, FUN_SECT_DIM1, &dim1, FUN_SECT_DIM2, &dim2, 0); for(i=0; i<(dim1*dim2); i++){ ... process buf[i] ... } Finally, you can write the resulting image to disk using FunImagePut(): FunImagePut(fun2, buf, dim1, dim2, -32, NULL); Note that Funtools automatically takes care of book-keeping tasks such as reading and writing FITS headers (although you can, of course, write your own header or add your own parameters to a header). For binary tables and raw event files, a call to FunOpen() will be followed by a call to the FunColumnSelect() routine to select columns to be read from the input file and/or written to the output file: typedef struct evstruct{ double time; int time2; } *Ev, EvRec; FunColumnSelect(fun, sizeof(EvRec), NULL, "time", "D", "rw", FUN_OFFSET(Ev, time), "time2", "J", "w", FUN_OFFSET(Ev, time2), NULL); Columns whose (third) mode argument contains an "r" are "readable", i.e., columns will be read from the input file and converted into the data type specified in the call's second argument. These columns values then are stored in the specified offset of the user record structure. Columns whose mode argument contains a "w" are "writable", i.e., these values will be written to the output file. The FunColumnSelect() routine also offers the option of automatically merging user columns with the original input columns when writing the output rows. Once a set of columns has been specified, you can retrieve rows using FunTableRowGet(), and write the rows using FunTableRowPut(): Ev ebuf, ev; /* get rows -- let routine allocate the array */ while( (ebuf = (Ev)FunTableRowGet(fun, NULL, MAXROW, NULL, &got)) ){ /* process all rows */ for(i=0; itime2 = (int)(ev->time+.5); /* change the input time as well */ ev->time = -(ev->time/10.0); } /* write out this batch of rows with the new column */ FunTableRowPut(fun2, (char *)ebuf, got, 0, NULL); /* free row data */ if( ebuf ) free(ebuf); } The input rows are retrieved into an array of user structs, which can be accessed serially as shown above. Once again, Funtools automatically takes care of book-keeping tasks such as reading and writing FITS headers (although you can, of course, write your own header or add your own parameters to a header). When all processing is done, you can call FunClose() to close the file(s): FunClose(fun2); FunClose(fun); These are the basics of processing FITS files (and arrays or raw event data) using Funtools. The routines in these examples are described in more detail below, along with a few other routines that support parameter access, data flushing, etc. B To create a Funtools application, a software developer will include the funtools.h definitions file in Funtools code: #include The program is linked against the libfuntools.a library, along with the math library (and the dynamic load library, if the latter is available on your system): gcc -o foo foo.c -lfuntools -ldl -lm If gcc is used, Funtools filtering can be performed using dynamically loaded shared objects that are built at run-time. Otherwise, filtering is performed using a slave process. Funtools has been built on the following systems: =over 4 =item * Sun/Solaris 5.X =item * Linux/RedHat Linux 5.X,6.X,7.X =item * Dec Alpha/OSF1 V4.X =item * WindowsNT/Cygwin 1.0 =item * SGI/IRIX64 6.5 =back B There is a natural order for all I/O access libraries. You would not think of reading a file without first opening it, or writing a file after closing it. A large part of the experiment in funtools is to use the idea of "natural order" as a means of making programming easier. We do this by maintaining the state of processing for a given funtools file, so that we can do things like write headers and flush extension padding at the right time, without you having to do it. For example, if you open a new funtools file for writing using FunOpen(), then generate an array of image data and call FunImagePut(), funtools knows to write the image header automatically. There is no need to think about writing a standard header. Of course, you can add parameters to the file first by calling one of the FunParamPut() routines, and these parameters will automatically be added to the header when it is written out. There still is no need to write the header explicitly. Maintaining state in this way means that there are certain rules of order which should be maintained in any funtools program. In particular, we strongly recommend the following ordering rules be adhered to: =over 4 =item * When specifying that input extensions be copied to an output file via a reference handle, open the output file B reading the input file. (Otherwise the initial copy will not occur). =item * Always write parameters to an output file using one of the FunParamPut() calls B writing any data. (This is a good idea for all FITS libraries, to avoid having to recopy data is the FITS header needs to be extended by adding a single parameter.) =item * If you retrieve an image, and need to know the data type, use the FUN_SECT_BITPIX option of FunInfoGet(), B calling FunImageGet(), since it is possible to change the value of BITPIX from the latter. =item * When specifying that input extensions be copied to an output file via a reference handle, close the output file B closing input file, or else use FunFlush() explicitly on the output file B closing the input file. (Otherwise the final copy will not occur). =back We believe that these are the natural rules that are implied in most FITS programming tasks. However, we recognize that making explicit use of "natural order" to decide what automatic action to take on behalf of the programmer is experimental. Therefore, if you find that your needs are not compatible with our preferred order, please let us know -- it will be most illuminating for us as we evaluate this experiment. B The following complete coding examples are provided to illustrate the simplicity of Funtools applications. They can be found in the funtest subdirectory of the Funtools distribution. In many cases, you should be able to modify one of these programs to generate your own Funtools program: =over 4 =item * evread.c: read and write binary tables =item * evcols.c: add column and rows to binary tables =item * evmerge.c: merge new columns with existing columns =item * evnext.c: manipulate raw data pointers =item * imblank.c: blank out image values below a threshold =item * asc2fits.c: convert a specific ASCII table to FITS binary table =back B #include Fun FunOpen(char *name, char *mode, Fun ref) void *FunImageGet(Fun fun, void *buf, char *plist) int FunImagePut(Fun fun, void *buf, int dim1, int dim2, int bitpix, char *plist) void * FunImageRowGet(Fun fun, void *buf, int rstart, int rstop, char *plist) void * FunImageRowPut(Fun fun, void *buf, int rstart, int rstop, int dim1, int dim2, int bitpix, char *plist) int FunColumnSelect(Fun fun, int size, char *plist, ...) void FunColumnActivate(Fun fun, char *s, char *plist) int FunColumnLookup(Fun fun, char *s, int which, char **name, int *type, int *mode, int *offset, int *n, int *width) void *FunTableRowGet(Fun fun, void *rows, int maxrow, char *plist, int *nrow) int FunTableRowPut(Fun fun, void *rows, int nev, int idx, char *plist) int FunParamGetb(Fun fun, char *name, int n, int defval, int *got) int FunParamGeti(Fun fun, char *name, int n, int defval, int *got) double FunParamGetd(Fun fun, char *name, int n, double defval, int *got) char *FunParamGets(Fun fun, char *name, int n, char *defval, int *got) int FunParamPutb(Fun fun, char *name, int n, int value, char *comm, int append) int FunParamPuti(Fun fun, char *name, int n, int value, char *comm, int append) int FunParamPutd(Fun fun, char *name, int n, double value, int prec, char *comm, int append) int FunParamPuts(Fun fun, char *name, int n, char *value, char *comm, int append) int FunInfoGet(Fun fun, int type, ...) int FunInfoPut(Fun fun, int type, ...) void FunFlush(Fun fun, char *plist) void FunClose(Fun fun) =head1 SEE ALSO See funtools(n) for a list of Funtools help pages =cut ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/pod/funmerge.pod������������������������������0000664�0000000�0000000�00000006555�12562436400�0024354�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������=pod =head1 NAME B =head1 SYNOPSIS funmerge [-w|-x] -f [colname] ... =head1 OPTIONS -f # output a column specifying file from which this event came -w # adjust position values using WCS info -x # adjust position values using WCS info and save old values =head1 DESCRIPTION B merges FITS data from one or more FITS Binary Table files or raw event files. The first argument to the program specifies the first input FITS table or raw event file. If "stdin" is specified, data are read from the standard input. Use Funtools Bracket Notation to specify FITS extensions and row filters. Subsequent arguments specify additional event files and tables to merge. (NB: Stdin cannot not be used for any of these additional input file arguments.) The last argument is the output FITS file. The columns in each input table must be identical. If an input file begins with the '@' character, it is processed as an include file, i.e., as a text file containing event file names (as well as blank lines and/or comment lines starting with the '#' sign). If standard input is specified as an include file ('@stdin'), then file names are read from the standard input until EOF (^D). Event files and include files can be mixed on a command line. Rows from each table are written sequentially to the output file. If the switch B<-f [colname]> is specified on the command line, an additional column is added to each row containing the number of the file from which that row was taken (starting from one). In this case, the corresponding file names are stored in the header parameters having the prefix B, i.e., FUNFIL01, FUNFIL02, etc. Using the B<-w> switch (or B<-x> switch as described below), B also can adjust the position column values using the WCS information in each file. (By position columns, we mean the columns that the table is binned on, i.e., those columns defined by the B switch, or (X,Y) by default.) To perform WCS alignment, the WCS of the first file is taken as the base WCS. Each position in subsequent files is adjusted by first converting it to the sky coordinate in its own WCS coordinate system, then by converting this sky position to the sky position of the base WCS, and finally converting back to a pixel position in the base system. Note that in order to perform WCS alignment, the appropriate WCS and TLMIN/TLMAX keywords must already exist in each FITS file. When performing WCS alignment, you can save the original positions in the output file by using the B<-x> (for "xtra") switch instead of the B<-w> switch (i.e., using this switch also implies using B<-w>) The old positions are saved in columns having the same name as the original positional columns, with the added prefix "OLD_". Examples: Merge two tables, and preserve the originating file number for each row in the column called "FILE" (along with the corresponding file name in the header): [sh] funmerge -f "FILE" test.ev test2.ev merge.ev Merge two tables with WCS alignment, saving the old position values in 2 additional columns: [sh] funmerge -x test.ev test2.ev merge.ev This program only works on raw event files and binary tables. We have not yet implemented image and array merging. =head1 SEE ALSO See funtools(n) for a list of Funtools help pages =cut ���������������������������������������������������������������������������������������������������������������������������������������������������funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/pod/funopen.pod�������������������������������0000664�0000000�0000000�00000012456�12562436400�0024213�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������=pod =head1 NAME B =head1 SYNOPSIS #include Fun FunOpen(char *name, char *mode, Fun ref); =head1 DESCRIPTION The B routine opens a Funtools data file for reading or appending, or creates a new FITS file for writing. The B argument specifies the name of the Funtools data file to open. You can use IRAF-style bracket notation to specify Funtools Files, Extensions, and Filters. A separate call should be made each time a different FITS extension is accessed: Fun fun; char *iname; ... if( !(fun = FunOpen(iname, "r", NULL)) ){ fprintf(stderr, "could not FunOpen input file: %s\n", iname); exit(1); } If B is "r", the file is opened for reading, and processing is set up to begin at the specified extension. For reading, B can be B, in which case the standard input is read. If B is "w", the file is created if it does not exist, or opened and truncated for writing if it does exist. Processing starts at the beginning of the file. The B can be B, in which case the standard output is readied for processing. If B is "a", the file is created if it does not exist, or opened if it does exist. Processing starts at the end of the file. The B can be B, in which case the standard output is readied for processing. When a Funtools file is opened for writing or appending, a previously opened Funtools reference handle can be specified as the third argument. This handle typically is associated with the input Funtools file that will be used to generate the data for the output data. When a reference file is specified in this way, the output file will inherit the (extension) header parameters from the input file: Fun fun, fun2; ... /* open input file */ if( !(fun = FunOpen(argv[1], "r", NULL)) ) gerror(stderr, "could not FunOpen input file: %s\n", argv[1]); /* open the output FITS image, inheriting params from input */ if( !(fun2 = FunOpen(argv[2], "w", fun)) ) gerror(stderr, "could not FunOpen output file: %s\n", argv[2]); Thus, in the above example, the output FITS binary table file will inherit all of the parameters associated with the input binary table extension. A file opened for writing with a Funtools reference handle also inherits the selected columns (i.e. those columns chosen for processing using the FunColumnSelect() routine) from the reference file as its default columns. This makes it easy to open an output file in such a way that the columns written to the output file are the same as the columns read in the input file. Of course, column selection can easily be tailored using the FunColumnSelect() routine. In particular, it is easy to merge user-defined columns with the input columns to generate a new file. See the evmerge for a complete example. In addition, when a Funtools reference handle is supplied in a FunOpen() call, it is possible also to specify that all other extensions from the reference file (other than the input extension being processed) should be copied from the reference file to the output file. This is useful, for example, in a case where you are processing a FITS binary table or image and you want to copy all of the other extensions to the output file as well. Copy of other extensions is controlled by adding a "C" or "c" to the mode string of the FunOpen() call of the input reference file. If "C" is specified, then other extensions are B copied (i.e., copy is forced by the application). If "c" is used, then other extensions are copied if the user requests copying by adding a plus sign "+" to the extension name in the bracket specification. For example, the B program utilizes "c" mode, giving users the option of copying all other extensions: /* open input file -- allow user copy of other extensions */ if( !(fun = FunOpen(argv[1], "rc", NULL)) ) gerror(stderr, "could not FunOpen input file: %s\n", argv[1]); /* open the output FITS image, inheriting params from input */ if( !(fun2 = FunOpen(argv[2], "w", fun)) ) gerror(stderr, "could not FunOpen output file: %s\n", argv[2]); Thus, B supports either of these command lines: # copy only the EVENTS extension csh> funtable "test.ev[EVENTS,circle(512,512,10)]" foo.ev # copy ALL extensions csh> funtable "test.ev[EVENTS+,circle(512,512,10)]" foo.ev Use of a Funtools reference handle implies that the input file is opened before the output file. However, it is important to note that if copy mode ("c" or "C") is specified for the input file, the actual input file open is delayed until just after the output file is opened, since the copy of prior extensions to the output file takes place while Funtools is seeking to the specified input extension. This implies that the output file should be opened before any I/O is done on the input file or else the copy will fail. Note also that the copy of subsequent extension will be handled automatically by FunClose() if the output file is closed before the input file. Alternatively, it can be done explicitly by FunFlush(), but again, this assumes that the input file still is open. Upon success FunOpen() returns a Fun handle that is used in subsequent Funtools calls. On error, NULL is returned. =head1 SEE ALSO See funtools(n) for a list of Funtools help pages =cut ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/pod/funparamget.pod���������������������������0000664�0000000�0000000�00000011353�12562436400�0025045�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������=pod =head1 NAME B =head1 SYNOPSIS #include int FunParamGetb(Fun fun, char *name, int n, int defval, int *got) int FunParamGeti(Fun fun, char *name, int n, int defval, int *got) double FunParamGetd(Fun fun, char *name, int n, double defval, int *got) char *FunParamGets(Fun fun, char *name, int n, char *defval, int *got) =head1 DESCRIPTION The four routines B, B, B, and B, return the value of a FITS header parameter as a boolean, int, double, and string, respectively. The string returned by B is a malloc'ed copy of the header value and should be freed when no longer needed. The first argument is the Fun handle associated with the FITS header being accessed. Normally, the header is associated with the FITS extension that you opened with B. However, you can use FunInfoPut() to specify access of the primary header. In particular, if you set the FUN_PRIMARYHEADER parameter to 1, then the primary header is used for all parameter access until the value is reset to 0. For example: int val; FunParamGeti(fun, "NAXIS", 1, 0, &got); # current header val=1; FunInfoPut(fun, FUN_PRIMARYHEADER, &val, 0); # switch to ... FunParamGeti(fun, "NAXIS", 1, 0, &got); # ... primary header FunParamGeti(fun, "NAXIS", 2, 0, &got); # ... primary header val=0; FunInfoPut(fun, FUN_PRIMARYHEADER, &val, 0); # switch back to ... FunParamGeti(fun, "NAXIS", 2, 0, &got); # current header Alternatively, you can use the FUN_PRIMARY macro to access parameters from the primary header on a per-parameter basis: FunParamGeti(fun, "NAXIS1", 0, 0, &got); # current header FunParamGeti(FUN_PRIMARY(fun), "NAXIS1", 0, 0, &got); # primary header B It makes use of a global parameter and therefore will not not appropriate for threaded applications, when we make funtools thread-safe. We recommend use of FunInfoPut() to switch between the extension header and the primary header. For output data, access to the primary header is only possible until the header is written out, which usually takes place when the first data are written. The second argument is the name of the parameter to access. The third B argument, if non-zero, is an integer that will be added as a suffix to the parameter name. This makes it easy to use a simple loop to process parameters having the same root name. For example, to gather up all values of TLMIN and TLMAX for each column in a binary table, you can use: for(i=0, got=1; got; i++){ fun->cols[i]->tlmin = (int)FunParamGeti(fun, "TLMIN", i+1, 0.0, &got); fun->cols[i]->tlmax = (int)FunParamGeti(fun, "TLMAX", i+1, 0.0, &got); } The fourth B argument is the default value to return if the parameter does not exist. Note that the data type of this parameter is different for each specific FunParamGet() call. The final B argument will be 0 if no param was found. Otherwise the data type of the parameter is returned as follows: FUN_PAR_UNKNOWN ('u'), FUN_PAR_COMMENT ('c'), FUN_PAR_LOGICAL ('l'), FUN_PAR_INTEGER ('i'), FUN_PAR_STRING ('s'), FUN_PAR_REAL ('r'), FUN_PAR_COMPLEX ('x'). These routines return the value of the header parameter, or the specified default value if the header parameter does not exist. The returned value is a malloc'ed string and should be freed when no longer needed. By default, B returns the string value of the named parameter. However, you can use FunInfoPut() to retrieve the raw 80-character FITS card instead. In particular, if you set the FUN_RAWPARAM parameter to 1, then card images will be returned by FunParamGets() until the value is reset to 0. Alternatively, if the FUN_RAW macro is applied to the name, then the 80-character raw FITS card is returned instead. B It makes use of a global parameter and therefore will not not appropriate for threaded applications, when we make funtools thread-safe. We recommend use of FunInfoPut() to switch between the extension header and the primary header. Note that in addition to the behaviors described above, the routine B will return the 80 raw characters of the B FITS card (including the comment) if B is specified as NULL and B is positive. For example, to loop through all FITS header cards in a given extension and print out the raw card, use: for(i=1; ;i++){ if( (s = FunParamGets(fun, NULL, i, NULL, &got)) ){ fprintf(stdout, "%.80s\n", s); free(s); } else{ break; } } =head1 SEE ALSO See funtools(n) for a list of Funtools help pages =cut �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/pod/funparamput.pod���������������������������0000664�0000000�0000000�00000011404�12562436400�0025073�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������=pod =head1 NAME B =head1 SYNOPSIS #include int FunParamPutb(Fun fun, char *name, int n, int value, char *comm, int append) int FunParamPuti(Fun fun, char *name, int n, int value, char *comm, int append) int FunParamPutd(Fun fun, char *name, int n, double value, int prec, char *comm, int append) int FunParamPuts(Fun fun, char *name, int n, char *value, char *comm, int append) =head1 DESCRIPTION The four routines B, B, B, and B, will set the value of a FITS header parameter as a boolean, int, double, and string, respectively. The first argument is the Fun handle associated with the FITS header being accessed. Normally, the header is associated with the FITS extension that you opened with B. However, you can use FunInfoPut() to specify that use of the primary header. In particular, if you set the FUN_PRIMARYHEADER parameter to 1, then the primary header is used for all parameter access until the value is reset to 0. For example: int val; FunParamPuti(fun, "NAXIS1", 0, 10, NULL, 1); # current header val=1; FunInfoPut(fun, FUN_PRIMARYHEADER, &val, 0); # switch to ... FunParamPuti(fun, "NAXIS1", 0, 10, NULL, 1); # primary header (You also can use the deprecated FUN_PRIMARY macro, to access parameters from the primary header.) The second argument is the B of the parameter. ( In accordance with FITS standards, the special names B and B, as well as blank names, are output without the "= " value indicator in columns 9 and 10. The third B argument, if non-zero, is an integer that will be added as a suffix to the parameter name. This makes it easy to use a simple loop to process parameters having the same root name. For example, to set the values of TLMIN and TLMAX for each column in a binary table, you can use: for(i=0; i argument is the value to set. Note that the data type of this argument is different for each specific FunParamPut() call. The B argument is the comment string to add to this header parameter. Its value can be NULL. The final B argument determines whether the parameter is added to the header if it does not exist. If set to a non-zero value, the header parameter will be appended to the header if it does not exist. If set to 0, the value will only be used to change an existing parameter. Note that the double precision routine FunParamPutd() supports an extra B argument after the B argument, in order to specify the precision when converting the double value to ASCII. In general a 20.[prec] format is used (since 20 characters are alloted to a floating point number in FITS) as follows: if the double value being put to the header is less than 0.1 or greater than or equal to 10**(20-2-[prec]), then %20.[prec]e format is used (i.e., scientific notation); otherwise %20.[prec]f format is used (i.e., numeric notation). As a rule, parameters should be set before writing the table or image. It is, however, possible to update the value of an B parameter after writing an image or table (but not to add a new one). Such updating only works if the parameter already exists and if the output file is seekable, i.e. if it is a disk file or is stdout being redirected to a disk file. It is possible to add a new parameter to a header after the data has been written, but only if space has previously been reserved. To reserve space, add a blank parameter whose value is the name of the parameter you eventually will update. Then, when writing the new parameter, specify a value of 2 for the append flag. The parameter writing routine will first look to update an existing parameter, as usual. If an existing parameter is not found, an appropriately-valued blank parameter will be searched for and replaced. For example: /* add blank card to be used as a place holder for IPAR1 update */ FunParamPuts(fun, NULL, 0, "IPAR1", "INTEGER Param", 0); ... /* write header and data */ FunTableRowPut(fun, events, got, 0, NULL); ... /* update param in file after writing data -- note append = 2 here */ FunParamPuti(fun, "IPAR", 1, 400, "INTEGER Param", 2); The parameter routines return a 1 if the routine was successful and a 0 on failure. In general, the major reason for failure is that you did not set the append argument to a non-zero value and the parameter did not already exist in the file. =head1 SEE ALSO See funtools(n) for a list of Funtools help pages =cut ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/pod/funref.pod��������������������������������0000664�0000000�0000000�00000013053�12562436400�0024020�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������=pod =head1 NAME B =head1 SYNOPSIS A description of how to use a Funtools reference handle to connect a Funtools input file to an output file. =head1 DESCRIPTION The Funtools reference handle connects a Funtools input file to a Funtools output file so that parameters (or even whole extensions) can be copied from the one to the other. To make the connection, the Funtools handle of the input file is passed to the final argument of the FunOpen() call for the output file: if( !(ifun = FunOpen(argv[1], "r", NULL)) ) gerror(stderr, "could not FunOpen input file: %s\n", argv[1]); if( !(ofun = FunOpen(argv[2], "w", ifun)) ) gerror(stderr, "could not FunOpen output file: %s\n", argv[2]); It does not matter what type of input or output file (or extension) is opened, or whether they are the same type. When the output image or binary table is written using FunImagePut() or FunTableRowPut() an appropriate header will be written first, with parameters copied from the input extension. Of course, invalid parameters will be removed first, e.g., if the input is a binary table and the output is an image, then binary table parameters such as TFORM, TUNIT, etc. parameters will not be copied to the output. Use of a reference handle also allows default values to be passed to FunImagePut() in order to write out an output image with the same dimensions and data type as the input image. To use the defaults from the input, a value of 0 is entered for dim1, dim2, and bitpix. For example: fun = FunOpen(argv[1], "r", NULL); fun2 = FunOpen(argv[2], "w", fun); buf = FunImageGet(fun, NULL, NULL); ... process image data ... FunImagePut(fun2, buf, 0, 0, 0, NULL); Of course, you often want to get information about the data type and dimensions of the image for processing. The above code is equivalent to the following: fun = FunOpen(argv[1], "r", NULL); fun2 = FunOpen(argv[2], "w", fun); buf = FunImageGet(fun, NULL, NULL); FunInfoGet(fun, FUN_SECT_DIM1, &dim1, FUN_SECT_DIM2, &dim2, FUN_SECT_BITPIX, &bitpix, 0); ... process image data ... FunImagePut(fun2, buf, dim1, dim2, bitpix, NULL); It is possible to change the reference handle for a given output Funtools handle using the FunInfoPut() routine: /* make the new extension the reference handle for the output file */ FunInfoPut(fun2, FUN_IFUN, &fun, 0); When this is done, Funtools specially resets the output file to start a new output extension, which is connected to the new input reference handle. You can use this mechanism to process multiple input extensions into a single output file, by successively opening the former and setting the reference handle for the latter. For example: /* open a new output FITS file */ if( !(fun2 = FunOpen(argv[2], "w", NULL)) ) gerror(stderr, "could not FunOpen output file: %s\n", argv[2]); /* process each input extension in turn */ for(ext=0; ;ext++){ /* get new extension name */ sprintf(tbuf, "%s[%d]", argv[1], ext); /* open it -- if we cannot open it, we are done */ if( !(fun=FunOpen(tbuf, "r", NULL)) ) break; /* make the new extension the reference handle for the output file */ FunInfoPut(fun2, FUN_IFUN, &fun, 0); ... process ... /* flush output extension (write padding, etc.) */ FunFlush(fun2, NULL); /* close the input extension */ FunClose(fun); } In this example, the output file is opened first. Then each successive input extension is opened, and the output reference handle is set to the newly opened input handle. After data processing is performed, the output extension is flushed and the input extension is closed, in preparation for the next input extension. Finally, a reference handle can be used to copy other extensions from the input file to the output file. Copy of other extensions is controlled by adding a "C" or "c" to the mode string of the FunOpen() call B. If "C" is specified, then other extensions are B copied (i.e., copy is forced by the application). If "c" is used, then other extensions are copied if the user requests copying by adding a plus sign "+" to the extension name in the bracket specification. For example, the B program utilizes user-specified "c" mode so that the second example below will copy all extensions: # copy only the EVENTS extension csh> funtable "test.ev[EVENTS,circle(512,512,10)]" foo.ev # copy ALL extensions csh> funtable "test.ev[EVENTS+,circle(512,512,10)]" foo.ev When extension copy is specified in the input file, the call to FunOpen() on the input file delays the actual file open until the output file also is opened (or until I/O is performed on the input file, which ever happens first). Then, when the output file is opened, the input file is also opened and input extensions are copied to the output file, up to the specific extension being opened. Processing of input and output extensions then proceed. When extension processing is complete, the remaining extensions need to be copied from input to output. This can be done explicitly, using the FunFlush() call with the "copy=remaining" plist: FunFlush(fun, "copy=remaining"); Alternatively, this will happen automatically, if the output file is closed B the input file: /* we could explicitly flush remaining extensions that need copying */ /* FunFlush(fun2, "copy=remaining"); */ /* but if we close output before input, end flush is done automatically */ FunClose(fun2); FunClose(fun); =head1 SEE ALSO See funtools(n) for a list of Funtools help pages =cut �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/pod/funregions.pod����������������������������0000664�0000000�0000000�00000044241�12562436400�0024715�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������=pod =head1 NAME B =head1 SYNOPSIS This document contains a summary of the user interface for spatial region filtering images and tables. =head1 DESCRIPTION Spatial region filtering allows a program to select regions of an image or rows of a table (e.g., X-ray events) to process using simple geometric shapes and boolean combinations of shapes. When an image is filtered, only pixels found within these shapes are processed. When a table is filtered, only rows found within these shapes are processed. Spatial region filtering for images and tables is accomplished by means of B. A region specification consists of one or more B, which are geometric shapes,combined according to the rules of boolean algebra. Region specifications also can contain comments and local/global processing directives. Typically, region specifications are specified using bracket notation appended to the filename of the data being processed: foo.fits[circle(512,512,100)] It is also possible to put region specification inside a file and then pass the filename in bracket notation: foo.fits[@my.reg] When region filters are passed in bracket notation in this manner, the filtering is set up automatically when the file is opened and all processing occurs through the filter. Programs also can use the filter library API to open filters explicitly. B More specifically, region specifications consist of one or more lines containing: # comment until end of line global keyword=value keyword=value ... # set global value(s) # include the following file in the region descriptor @file # use the FITS image as a mask (cannot be used with other regions) @fitsimage # each region expression contains shapes separated by operators [region_expression1], [region_expression2], ... [region_expression], [region_expression], ... A single region expression consists of: # parens and commas are optional, as is the + sign [+-]shape(num , num , ...) OP1 shape num num num OP2 shape ... e.g.: ([+-]shape(num , num , ...) && shape num num || shape(num, num) # a comment can come after a region -- reserved for local properties [+-]shape(num , num , ...) # local properties go here, e.g. color=red Thus, a region descriptor consists of one or more region expressions or B, separated by comas, new-lines, or semi-colons. Each B consists of one or more geometric shapes combined using standard boolean operation. Several types of shapes are supported, including: shape: arguments: ----- ---------------------------------------- ANNULUS xcenter ycenter inner_radius outer_radius BOX xcenter ycenter xwidth yheight (angle) CIRCLE xcenter ycenter radius ELLIPSE xcenter ycenter xwidth yheight (angle) FIELD none LINE x1 y1 x2 y2 PIE xcenter ycenter angle1 angle2 POINT x1 y1 POLYGON x1 y1 x2 y2 ... xn yn In addition, the following regions accept B syntax: shape arguments ----- ------------------------------------------ ANNULUS xcenter ycenter radius1 radius2 ... radiusn ANNULUS xcenter ycenter inner_radius outer_radius n=[number] BOX xcenter ycenter xw1 yh1 xw2 yh2 ... xwn yhn (angle) BOX xcenter ycenter xwlo yhlo xwhi yhhi n=[number] (angle) CIRCLE xcenter ycenter r1 r2 ... rn # same as annulus CIRCLE xcenter ycenter rinner router n=[number] # same as annulus ELLIPSE xcenter ycenter xw1 yh1 xw2 yh2 ... xwn yhn (angle) ELLIPSE xcenter ycenter xwlo yhlo xwhi yhhi n=[number] (angle) PIE xcenter ycenter angle1 angle2 (angle3) (angle4) (angle5) ... PIE xcenter ycenter angle1 angle2 (n=[number]) POINT x1 y1 x2 y2 ... xn yn Note that the circle accelerators are simply aliases for the annulus accelerators. See region geometry for more information about accelerators. Finally, the following are combinations of pie with different shapes (called "panda" for "Pie AND Annulus") allow for easy specification of radial sections: shape: arguments: ----- --------- PANDA xcen ycen ang1 ang2 nang irad orad nrad # circular CPANDA xcen ycen ang1 ang2 nang irad orad nrad # circular BPANDA xcen ycen ang1 ang2 nang xwlo yhlo xwhi yhhi nrad (ang) # box EPANDA xcen ycen ang1 ang2 nang xwlo yhlo xwhi yhhi nrad (ang) # ellipse The panda and cpanda specify combinations of annulus and circle with pie, respectively and give identical results. The bpanda combines box and pie, while epanda combines ellipse and pie. See region geometry for more information about pandas. The following "shapes" are ignored by funtools (generated by ds9): shape: arguments: ----- --------- PROJECTION x1 y1 x2 y2 width # NB: ignored by funtools RULER x1 y1 x2 y2 # NB: ignored by funtools TEXT x y # NB: ignored by funtools GRID # NB: ignored by funtools TILE # NB: ignored by funtools COMPASS # NB: ignored by funtools All arguments to regions are real values; integer values are automatically converted to real where necessary. All angles are in degrees and run from the positive image x-axis to the positive image y-axis. If a rotation angle is part of the associated WCS header, that angle is added implicitly as well. Note that 3-letter abbreviations are supported for all shapes, so that you can specify "circle" or "cir". B By default, the x,y values in a region expression refer to the two "image binning" columns, i.e. the columns that would be used to bin the data into an image. For images, these are just the 2 dimensions of the image. For tables, these usually default to x and y but can be changed as required. For example, in Funtools, new binning columns are specified using a bincols=(col1,col2) statement within the bracket string on the command line. Alternate columns for region filtering can be specified by the syntax: (col1,col2)=region(...) e.g.: (X,Y)=annulus(x,y,ri,ro) (PHA,PI)=circle(x,y,r) (DX,DY)=ellipse(x,y,a,b[,angle]) B (See also Region Algebra for more complete information.) Region shapes can be combined together using Boolean operators: Symbol Operation Use -------- --------- ----------------------------------- ! not Exclude this shape from this region & or && and Include only the overlap of these shapes | or || inclusive or Include all of both shapes ^ exclusive or Include both shapes except their overlap Note that the !region syntax must be combined with another region in order that we be able to assign a region id properly. That is, !circle(512,512,10) is not a legal region because there is no valid region id to work with. To get the full field without a circle, combine the above with field(), as in: field() && !circle(512,512,10) B< Region Separators Also Are Operators> As mentioned previously, multiple region expressions can be specified in a region descriptor, separated by commas, new-lines, or semi-colons. When such a separator is used, the boolean OR operator is automatically generated in its place but, unlike explicit use of the OR operator, the region ID is incremented (starting from 1). For example, the two shapes specified in this example are given the same region value: foo.fits[circle(512,512,10)||circle(400,400,20)] On the other hand, the two shapes defined in the following example are given different region values: foo.fits[circle(512,512,10),circle(400,400,20)] Of course these two examples will both mask the same table rows or pixels. However, in programs that distinguish region id's (such as funcnts ), they will act differently. The explicit OR operator will result in one region expression consisting of two shapes having the same region id and funcnts will report a single region. The comma operator will cause funcnts to report two region expressions, each with one shape, in its output. In general, commas are used to separate region expressions entered in bracket notation on the command line: # regions are added to the filename in bracket notation foo.fits[circle(512,512,100),circle(400,400,20)] New-lines are used to separate region expressions in a file: # regions usually are separated by new-lines in a file # use @filename to include this file on the command line circle(512,512,100) circle(400,400,20) Semi-colons are provided for backward compatibility with the original IRAF/PROS implementation and can be used in either case. If a pixel is covered by two different regions expressions, it is given the mask value of the B region that contains that pixel. That is, successive regions B overwrite previous regions in the mask, as was the case with the original PROS regions. In this way, an individual pixel is covered by one and only one region. This means that one must sometimes be careful about the order in which regions are defined. If region N is fully contained within region M, then N should be defined B M, or else it will be "covered up" by the latter. B Shapes also can be globally excluded from all the region specifiers in a region descriptor by using a minus sign before a region: operator arguments: -------- ----------- - Globally exclude the region expression following '-' sign from ALL regions specified in this file The global exclude region can be used by itself; in such a case, field() is implied. A global exclude differs from the local exclude (i.e. a shape prefixed by the logical not "!" symbol) in that global excludes are logically performed last, so that no region will contain pixels from a globally excluded shape. A local exclude is used in a boolean expression with an include shape, and only excludes pixels from that include shape. Global excludes cannot be used in boolean expressions. B The B<@filename> directive specifies an include file containing region expressions. This file is processed as part of the overall region descriptor: foo.fits[circle(512,512,10),@foo] A filter include file simply includes text without changing the state of the filter. It therefore can be used in expression. That is, if the file foo1 contains "pi==1" and foo2 contains "pha==2" then the following expressions are equivalent: "[@foo1&&@foo2]" is equivalent to "[pi==1&&pha==2]" "[pha==1||@foo2]" is equivalent to "[pi==1||pha==2]" "[@foo1,@foo2]" is equivalent to "[pi==1,pha==2]" Be careful that you specify evaluation order properly using parenthesis, especially if the include file contains multiple filter statements. For example, consider a file containing two regions such as: circle 512 512 10 circle 520 520 10 If you want to include only events (or pixels) that are in these regions and have a pi value of 4, then the correct syntax is: pi==4&&(@foo) since this is equivalent to: pi==4 && (circle 512 512 10 || circle 520 520 10) If you leave out the parenthesis, you are filtering this statement: pi==4 && circle 512 512 10 || circle 520 520 10) which is equivalent to: (pi==4 && circle 512 512 10) || circle 520 520 10) The latter syntax only applies the pi test to the first region. For image-style filtering, the B<@filename> can specify an 8-bit or 16-bit FITS image. In this case, the pixel values in the mask image are used as the region mask. The valid pixels in the mask must have positive values. Zero values are excluded from the mask and negative values are not allowed. Moreover, the region id value is taken as the image pixel value and the total number of regions is taken to be the highest pixel value. The dimensions of the image mask must be less than or equal to the image dimensions of the data. The mask will be replicated as needed to match the size of the image. (Thus, best results are obtained when the data dimensions are an even multiple of the mask dimensions.) An image mask can be used in any image filtering operation, regardless of whether the data is of type image or table. For example, the funcnts ) program performs image filtering on images or tables, and so FITS image masks are valid input for either type of data in this program.. An image mask cannot be used in a program such as fundisp ) when the input data is a table, because fundisp displays rows of a table and processes these rows using event-style filtering. B The ds9 image display program describes a host of properties such as color, font, fix/free state, etc. Such properties can be specified globally (for all regions) or locally (for an individual region). The B keyword specifies properties and qualifiers for all regions, while local properties are specified in comments on the same line as the region: global color=red circle(10,10,2) circle(20,20,3) # color=blue circle(30,30,4) The first and third circles will be red, which the second circle will be blue. Note that funtools currently ignores region properties, as they are used in display only. B< Coordinate Systems> For each region, it is important to specify the coordinate system used to interpret the region, i.e., to set the context in which position and size values are interpreted. For this purpose, the following keywords are recognized: name description ---- ------------------------------------------ PHYSICAL pixel coords of original file using LTM/LTV IMAGE pixel coords of current file FK4, B1950 sky coordinate systems FK5, J2000 sky coordinate systems GALACTIC sky coordinate systems ECLIPTIC sky coordinate systems ICRS currently same as J2000 LINEAR linear wcs as defined in file AMPLIFIER mosaic coords of original file using ATM/ATV DETECTOR mosaic coords of original file using DTM/DTV B The arguments to region shapes can be floats or integers describing positions and sizes. They can be specified as pure numbers or using explicit formatting directives: position arguments description ------------------ ------------------------------ [num] context-dependent (see below) [num]d degrees [num]r radians [num]p physical pixels [num]i image pixels [num]:[num]:[num] hms for 'odd' position arguments [num]:[num]:[num] dms for 'even' position arguments [num]h[num]m[num]s explicit hms [num]d[num]m[num]s explicit dms size arguments description -------------- ----------- [num] context-dependent (see below) [num]" arc seconds [num]' arc minutes [num]d degrees [num]r radians [num]p physical pixels [num]i image pixels When a "pure number" (i.e. one without a format directive such as 'd' for 'degrees') is specified, its interpretation depends on the context defined by the 'coordsys' keyword. In general, the rule is: All pure numbers have implied units corresponding to the current coordinate system. If no such system is explicitly specified, the default system is implicitly assumed to be PHYSICAL. In practice this means that for IMAGE and PHYSICAL systems, pure numbers are pixels. Otherwise, for all systems other than linear, pure numbers are degrees. For LINEAR systems, pure numbers are in the units of the linear system. This rule covers both positions and sizes. The input values to each shape can be specified in several coordinate systems including: name description ---- ---------------------------- IMAGE pixel coords of current file LINEAR linear wcs as defined in file FK4, B1950 various sky coordinate systems FK5, J2000 GALACTIC ECLIPTIC ICRS PHYSICAL pixel coords of original file using LTM/LTV AMPLIFIER mosaic coords of original file using ATM/ATV DETECTOR mosaic coords of original file using DTM/DTV If no coordinate system is specified, PHYSICAL is assumed. PHYSICAL or a World Coordinate System such as J2000 is preferred and most general. The coordinate system specifier should appear at the beginning of the region description, on a separate line (in a file), or followed by a new-line or semicolon; e.g., global coordsys physical circle 6500 9320 200 The use of celestial input units automatically implies WORLD coordinates of the reference image. Thus, if the world coordinate system of the reference image is J2000, then circle 10:10:0 20:22:0 3' is equivalent to: circle 10:10:0 20:22:0 3' # j2000 Note that by using units as described above, you may mix coordinate systems within a region specifier; e.g., circle 6500 9320 3' # physical Note that, for regions which accept a rotation angle: ellipse (x, y, r1, r2, angle) box(x, y, w, h, angle) the angle is relative to the specified coordinate system. In particular, if the region is specified in WCS coordinates, the angle is related to the WCS system, not x/y image coordinate axis. For WCS systems with no rotation, this obviously is not an issue. However, some images do define an implicit rotation (e.g., by using a non-zero CROTA value in the WCS parameters) and for these images, the angle will be relative to the WCS axes. In such case, a region specification such as: fk4;ellipse(22:59:43.985, +58:45:26.92,320", 160", 30) will not, in general, be the same region specified as: physical;ellipse(465, 578, 40, 20, 30) even when positions and sizes match. The angle is relative to WCS axes in the first case, and relative to physical x,y axes in the second. More detailed descriptions are available for: Region Geometry, Region Algebra, Region Coordinates, and Region Boundaries. =head1 SEE ALSO See funtools(n) for a list of Funtools help pages =cut ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/pod/funsky.pod��������������������������������0000664�0000000�0000000�00000016740�12562436400�0024060�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������=pod =head1 NAME B =head1 SYNOPSIS funsky iname[ext] # RA,Dec (deg) or image pix from stdin funsky iname[ext] [lname] # RA, Dec (deg) or image pix from list funsky iname[ext] [col1] [col2] # named cols:units from stdin funsky iname[ext] [lname] [col1] [col2] # named cols:units from list =head1 OPTIONS -d # always use integer tlmin conversion (as ds9 does) -r # convert x,y to RA,Dec (default: convert RA,Dec to x,y) -o # include offset from the nominal target position (in arcsec) -v # display input values also (default: display output only) -T # output display in rdb format (w/header,tab delimiters) =head1 DESCRIPTION Funsky converts input sky coordinates (RA, Dec) to image coordinates (or vice versa) using the WCS information contained in the specified FITS file. Several calling sequences are supported in order to make it easy to specify coordinate positions in different ways. The first required argument is always the input FITS file (or extension) containing the WCS information in an extension header. Note that the data from this file is not used. By default, the program converts input RA and Dec values to X and Y using this WCS information. If the WCS is associated with a FITS image, then the X,Y values are image values. If the WCS is associated with a binary table, then the X, Y values are physical values. To convert X,Y to RA and Dec, use the B<-r> (reverse) switch. If no other command arguments are supplied, then the input positions are read from the standard input. Each line is assumed to contain a single coordinate position consisting of an RA in degrees (or X in pixels) followed by a Dec in degrees (or Y in pixels). The usual delimiters are supported (spaces, commas, tabs). For example: # read from stdin, default column names and units [sh] funsky snr.ev 22.982695 58.606523 # input RA (hrs), Dec(deg) 510.00 510.00 22.982127 58.607634 # input 512.00 510.50 22.981700 58.614301 # input 513.50 513.50 ^D # end of input If a second argument is supplied, this argument is assumed to be a file containing RA (X) and Dec (Y) positions. The file can either be an ASCII table or a FITS binary table. The order of columns is unimportant, if the table has a column header. In this case, the names of the columns must be one of "RA", "DEC", or "X", "Y" for sky to image and image to sky conversions, respectively. If the table has no header, then once again, RA (X) is assumed to first, followed by DEC (Y). For example: # read from file, default column names and units [sh] cat hd.in RA DEC --------- --------- 22.982695 58.606523 22.982127 58.607634 22.981700 58.614301 [sh] funsky snr.ev hd.in 510.00 510.00 512.00 510.50 513.50 513.50 If three arguments are supplied, then the input positions again are read from the standard input. Each line is assumed to contain a single coordinate position consisting of an RA (or X in pixels) followed by a Dec (or Y in pixels), with the usual delimiters supported. However, the second and third arguments now specify the column names and/or sky units using a colon-delimited syntax: [colname]:[h|d|r] If the colname is omitted, the names default to "RA", "DEC", "X", "Y", "COL1", or "COL2" as above. If the units are omitted, the default is degrees for both RA and Dec. When the -r switch is used (convert from image to sky) the units are applied to the output instead of the input. The following examples will serve to illustrate the options: # read from stdin, specifying column names (def. units: degrees) [sh] cat hd.in MYRA MYDEC --------- --------- 22.982695 58.606523 22.982127 58.607634 22.981700 58.614301 [sh] funsky snr.ev MYRA MYDEC < hd.in 510.00 510.00 512.00 510.50 513.50 513.50 # read from stdin, specifying column names and units [sh] cat dd.in MYRA MYDEC --------- --------- 344.740432 58.606523 344.731900 58.607634 344.725500 58.614301 [sh] funsky snr.ev MYRA:d MYDEC:d < dd.in 510.00 510.00 512.00 510.50 513.50 513.50 # read stdin, convert image to sky, specifying output sky units [sh] cat im.in 510.00 510.00 512.00 510.50 513.50 513.50 [sh] cat im.in | funsky -r snr.ev :d :d 344.740432 58.606523 344.731900 58.607634 344.725500 58.614301 Finally, four command arguments specify both and input file and column names and/or units: [sh] cat dd.in MYRA MYDEC --------- --------- 344.740432 58.606523 344.731900 58.607634 344.725500 58.614301 [sh] funsky snr.ev dd.in MYRA:d MYDEC:d 510.00 510.00 512.00 510.50 513.50 513.50 # read file, convert image to sky, specifying output sky units [sh] cat im.in 510.00 510.00 512.00 510.50 513.50 513.50 [sh] funsky -r snr.ev im.in :d :d 344.740432 58.606523 344.731900 58.607634 344.725500 58.614301 By default, the output of funsky consists only of the converted coordinate position(s), one per output line. This makes parsing in shell scripts easy. Use the B<-v> (verbose) switch to specify that the input coordinates should be pre-pended to each line. For example: [sh] cat dd.in MYRA MYDEC --------- --------- 344.740432 58.606523 344.731900 58.607634 344.725500 58.614301 [sh] funsky snr.ev dd.in MYRA:d MYDEC:d 510.00 510.00 512.00 510.50 513.50 513.50 [sh] funsky -v snr.ev dd.in MYRA:d MYDEC:d 344.740432 58.606523 510.00 510.00 344.731900 58.607634 512.00 510.50 344.725500 58.614301 513.50 513.50 In addition, a full starbase table can be output using the B<-T> (table) switch. This switch can be used with or without the -v switch. If the -T and -v are both specified, then a descriptive header parameters are output before the table (mainly to remind you of the sky units): # output table in non-verbose mode [sh] funsky -T snr.ev dd.in MYRA:d MYDEC:d X Y ------------ ------------ 510.00 510.00 512.00 510.50 513.50 513.50 # output table in verbose mode [sh] funsky -T -v snr.ev dd.in MYRA:d MYDEC:d # IFILE = /Users/eric/data/snr.ev # ICOL1 = MYRA # ICOL2 = MYDEC # IUNITS1 = d # IUNITS2 = d # OCOL1 = X # OCOL2 = Y MYRA MYDEC X Y ------------ ------------ ------------ ------------ 344.740432 58.606523 510.00 510.00 344.731900 58.607634 512.00 510.50 344.725500 58.614301 513.50 513.50 Finally, the B<-d> (ds9) switch mimicks ds9's use of integer TLMIN and TLMAX values for all coordinate transformations. FITS conventions seem to call for use of floating point TLMIN and TLMAX when the data are floats. This convention is followed by funsky but results in a small discrepancy with ds9's converted values for floating point data. We will remedy this conflict in the future, maybe. =head1 SEE ALSO See funtools(n) for a list of Funtools help pages =cut ��������������������������������funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/pod/funtable.pod������������������������������0000664�0000000�0000000�00000022670�12562436400�0024340�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������=pod =head1 NAME B =head1 SYNOPSIS funtable [-a] [-i|-z] [-m] [-s cols] [columns] =head1 OPTIONS -a # append to existing output file as a table extension -i # for image data, only generate X and Y columns -m # for tables, write a separate file for each region -s "col1 ..." # columns on which to sort -z # for image data, output zero-valued pixels =head1 DESCRIPTION B selects rows from the specified FITS Extension (binary table only) of a FITS file, or from a non-FITS raw event file, and writes those rows to a FITS binary table file. It also will create a FITS binary table from an image or a raw array file. The first argument to the program specifies the FITS file, raw event file, or raw array file. If "stdin" is specified, data are read from the standard input. Use Funtools Bracket Notation to specify FITS extensions, and filters. The second argument is the output FITS file. If "stdout" is specified, the FITS binary table is written to the standard output. By default, all columns of the input file are copied to the output file. Selected columns can be output using an optional third argument in the form: "column1 column1 ... columnN" The B program generally is used to select rows from a FITS binary table using Table Filters and/or Spatial Region Filters. For example, you can copy only selected rows (and output only selected columns) by executing in a command such as: [sh] funtable "test.ev[pha==1&&pi==10]" stdout "x y pi pha" | fundisp stdin X Y PHA PI ------- ------- ------- --------- 1 10 1 10 1 10 1 10 1 10 1 10 1 10 1 10 1 10 1 10 1 10 1 10 1 10 1 10 1 10 1 10 1 10 1 10 1 10 1 10 The special column B<$REGION> can be specified to write the region id of each row: [sh $] funtable "test.ev[time-(int)time>=.99&&annulus(0 0 0 10 n=3)]" stdout 'x y time $REGION' | fundisp stdin X Y TIME REGION -------- -------- --------------------- ---------- 5 -6 40.99000000 3 4 -5 59.99000000 2 -1 0 154.99000000 1 -2 1 168.99000000 1 -3 2 183.99000000 2 -4 3 199.99000000 2 -5 4 216.99000000 2 -6 5 234.99000000 3 -7 6 253.99000000 3 Here only rows with the proper fractional time and whose position also is within one of the three annuli are written. Columns can be excluded from display using a minus sign before the column: [sh $] funtable "test.ev[time-(int)time>=.99]" stdout "-time" | fundisp stdin X Y PHA PI DX DY -------- -------- -------- ---------- ----------- ----------- 5 -6 5 -6 5.50 -6.50 4 -5 4 -5 4.50 -5.50 -1 0 -1 0 -1.50 0.50 -2 1 -2 1 -2.50 1.50 -3 2 -3 2 -3.50 2.50 -4 3 -4 3 -4.50 3.50 -5 4 -5 4 -5.50 4.50 -6 5 -6 5 -6.50 5.50 -7 6 -7 6 -7.50 6.50 All columns except the time column are written. In general, the rules for activating and de-activating columns are: =over 4 =item * If only exclude columns are specified, then all columns but the exclude columns will be activated. =item * If only include columns are specified, then only the specified columns are activated. =item * If a mixture of include and exclude columns are specified, then all but the exclude columns will be active; this last case is ambiguous and the rule is arbitrary. =back In addition to specifying columns names explicitly, the special symbols I<+> and I<-> can be used to activate and de-activate I columns. This is useful if you want to activate the $REGION column along with all other columns. According to the rules, the syntax "$REGION" only activates the region column and de-activates the rest. Use "+ $REGION" to activate all columns as well as the region column. Ordinarily, only the selected table is copied to the output file. In a FITS binary table, it sometimes is desirable to copy all of the other FITS extensions to the output file as well. This can be done by appending a '+' sign to the name of the extension in the input file name. For example, the first command below copies only the EVENT table, while the second command copies other extensions as well: [sh] funtable "/proj/rd/data/snr.ev[EVENTS]" events.ev [sh] funtable "/proj/rd/data/snr.ev[EVENTS+]" eventsandmore.ev If the input file is an image or a raw array file, then B will generate a FITS binary table from the pixel values in the image. Note that it is not possible to specify the columns to output (using command-line argument 3). Instead, there are two ways to create such a binary table from an image. By default, a 3-column table is generated, where the columns are "X", "Y", and "VALUE". For each pixel in the image, a single row (event) is generated with the "X" and "Y" columns assigned the dim1 and dim2 values of the image pixel, respectively and the "VALUE" column assigned the value of the pixel. With sort of table, running B on the "VALUE" column will give the same results as running B on the original image. If the B<-i> ("individual" rows) switch is specified, then only the "X" and "Y" columns are generated. In this case, each positive pixel value in the image generates n rows (events), where n is equal to the integerized value of that pixel (plus 0.5, for floating point data). In effect, B<-i> approximately recreates the rows of a table that would have been binned into the input image. (Of course, this is only approximately correct, since the resulting x,y positions are integerized.) If the B<-s [col1 col2 ... coln]> ("sort") switch is specified, the output rows of a binary table will be sorted using the specified columns as sort keys. The sort keys must be scalar columns and also must be part of the output file (i.e. you cannot sort on a column but not include it in the output). This facility uses the B<_sort> program (included with funtools), which must be accessible via your path. For binary tables, the B<-m> ("multiple files") switch will generate a separate file for each region in the filter specification i.e. each file contains only the rows from that region. Rows which pass the filter but are not in any region also are put in a separate file. The separate output file names generated by the B<-m> switch are produced automatically from the root output file to contain the region id of the associated region. (Note that region ids start at 1, so that the file name associated with id 0 contains rows that pass the filter but are not in any given region.) Output file names are generated as follows: =over 4 =item * A $n specification can be used anywhere in the root file name (suitably quoted to protect it from the shell) and will be expanded to be the id number of the associated region. For example: funtable -m input.fits'[cir(512,512,1);cir(520,520,1)...]' 'foo.goo_$n.fits' will generate files named foo.goo_0.fits (for rows not in any region but still passing the filter), foo.goo_1.fits (rows in region id #1, the first region), foo.goo_2.fits (rows in region id #2), etc. Note that single quotes in the output root are required to protect the '$' from the shell. =item * If $n is not specified, then the region id will be placed before the first dot (.) in the filename. Thus: funtable -m input.fits'[cir(512,512,1);cir(520,520,1)...]' foo.evt.fits will generate files named foo0.evt.fits (for rows not in any region but still passing the filter), foo1.evt.fits (rows in region id #1), foo2.evt.fits (rows in region id #2), etc. =item * If no dot is specified in the root output file name, then the region id will be appended to the filename. Thus: funtable -m input.fits'[cir(512,512,1);cir(520,520,1)...]' 'foo_evt' will generate files named foo_evt0 (for rows not in any region but still passing the filter), foo_evt1 (rows in region id #1), foo_evt2 (rows in region id #2), etc. =back The multiple file mechanism provide a simple way to generate individual source data files with a single pass through the data. By default, a new FITS file is created and the binary table is written to the first extension. If the B<-a> (append) switch is specified, the table is appended to an existing FITS file as a BINTABLE extension. Note that the output FITS file must already exist. If the B<-z> ("zero" pixel values) switch is specified and B<-i> is not specified, then pixels having a zero value will be output with their "VALUE" column set to zero. Obviously, this switch does not make sense when individual events are output. =head1 SEE ALSO See funtools(n) for a list of Funtools help pages =cut ������������������������������������������������������������������������funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/pod/funtablerowget.pod������������������������0000664�0000000�0000000�00000006451�12562436400�0025567�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������=pod =head1 NAME B =head1 SYNOPSIS #include void *FunTableRowGet(Fun fun, void *rows, int maxrow, char *plist, int *nrow) =head1 DESCRIPTION The B routine retrieves rows from a Funtools binary table or raw event file, and places the values of columns selected by FunColumnSelect() into an array of user structs. Selected column values are automatically converted to the specified user data type (and to native data format) as necessary. The first argument is the Fun handle associated with this row data. The second B argument is the array of user structs into which the selected columns will be stored. If NULL is passed, the routine will automatically allocate space for this array. (This includes proper allocation of pointers within each struct, if the "@" pointer type is used in the selection of columns. Note that if you pass NULL in the second argument, you should free this space using the standard free() system call when you are finished with the array of rows.) The third B argument specifies the maximum number of rows to be returned. Thus, if B is allocated by the user, it should be at least of size maxrow*sizeof(evstruct). The fourth B argument is a param list string. Currently, the keyword/value pair "mask=transparent" is supported in the plist argument. If this string is passed in the call's plist argument, then all rows are passed back to the user (instead of just rows passing the filter). This is only useful when FunColumnSelect() also is used to specify "$region" as a column to return for each row. In such a case, rows found within a region have a returned region value greater than 0 (corresponding to the region id of the region in which they are located), rows passing the filter but not in a region have region value of -1, and rows not passing any filter have region value of 0. Thus, using "mask=transparent" and the returned region value, a program can process all rows and decide on an action based on whether a given row passed the filter or not. The final argument is a pointer to an int variable that will return the actual number of rows returned. The routine returns a pointer to the array of stored rows, or NULL if there was an error. (This pointer will be the same as the second argument, if the latter is non-NULL). /* get rows -- let routine allocate the row array */ while( (buf = (Ev)FunTableRowGet(fun, NULL, MAXROW, NULL, &got)) ){ /* process all rows */ for(i=0; ienergy = (ev->pi+ev->pha)/2.0; ev->pha = -ev->pha; ev->pi = -ev->pi; } /* write out this batch of rows */ FunTableRowPut(fun2, buf, got, 0, NULL); /* free row data */ if( buf ) free(buf); } As shown above, successive calls to FunTableRowGet() will return the next set of rows from the input file until all rows have been read, i.e., the routine behaves like sequential Unix I/O calls such as fread(). See evmerge example code for a more complete example. Note that FunTableRowGet() also can be called as FunEventsGet(), for backward compatibility. =head1 SEE ALSO See funtools(n) for a list of Funtools help pages =cut �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/pod/funtablerowput.pod������������������������0000664�0000000�0000000�00000013313�12562436400�0025613�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������=pod =head1 NAME B =head1 SYNOPSIS int FunTableRowPut(Fun fun, void *rows, int nev, int idx, char *plist) =head1 DESCRIPTION The B routine writes rows to a FITS binary table, taking its input from an array of user structs that contain column values selected by a previous call to FunColumnSelect(). Selected column values are automatically converted from native data format to FITS data format as necessary. The first argument is the Fun handle associated with this row data. The second B argument is the array of user structs to output. The third B argument specifies the number number of rows to write. The routine will write B records, starting from the location specified by B. The fourth B argument is the index of the first raw input row to write, in the case where rows from the user buffer are being merged with their raw input row counterparts (see below). Note that this B value is has nothing to do with the row buffer specified in argument 1. It merely matches the row being written with its corresponding (hidden) raw row. Thus, if you read a number of rows, process them, and then write them out all at once starting from the first user row, the value of B should be 0: Ev ebuf, ev; /* get rows -- let routine allocate the row array */ while( (ebuf = (Ev)FunTableRowGet(fun, NULL, MAXROW, NULL, &got)) ){ /* process all rows */ for(i=0; i to the value of i: Ev ebuf, ev; /* get rows -- let routine allocate the row array */ while( (ebuf = (Ev)FunTableRowGet(fun, NULL, MAXROW, NULL, &got)) ){ /* process all rows */ for(i=0; i, then the entire corresponding raw input row record will be merged with the output row according to the B specification (see FunColumnSelect() above). A call to write rows can either be done once, after all rows in the input batch have been processed, or it can be done (slightly less efficiently) one row at a time (or anything in between). We do recommend that you write all rows associated with a given batch of input rows before reading new rows. This is B if you are merging the output rows with the raw input rows (since the raw rows are destroyed with each successive call to get new rows). For example: Ev buf, ev; ... /* get rows -- let routine allocate the row array */ while( (buf = (Ev)FunTableRowGet(fun, NULL, MAXROW, NULL, &got)) ){ /* point to the i'th row */ ev = buf + i; .... process } /* write out this batch of rows */ FunTableRowPut(fun2, buf, got, 0, NULL); /* free row data */ if( buf ) free(buf); } or Ev buf, ev; ... /* get rows -- let routine allocate the row array */ while( (buf = (Ev)FunTableRowGet(fun, NULL, MAXROW, NULL, &got)) ){ /* process all rows */ for(i=0; i rows all at once and therefore passes B in argument four, so that merging starts at the first raw input row. In the second case, a check it made on each row to see if it needs to be output. If so, the value of B is passed as the value of the B
variable which points to the current row being processed in the batch of input rows. As shown above, successive calls to FunTableRowPut() will write rows sequentially. When you are finished writing all rows in a table, you should call FunFlush() to write out the FITS binary table padding. However, this is not necessary if you subsequently call FunClose() without doing any other I/O to the FITS file. Note that FunTableRowPut() also can be called as FunEventsPut(), for backward compatibility. =head1 SEE ALSO See funtools(n) for a list of Funtools help pages =cut funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/pod/funtbl.pod000066400000000000000000000104511256243640000240240ustar00rootroot00000000000000=pod =head1 NAME B =head1 SYNOPSIS funtable [-c cols] [-h] [-n table] [-p prog] [-s sep] =head1 DESCRIPTION [NB: This program has been deprecated in favor of the ASCII text processing support in funtools. You can now perform fundisp on funtools ASCII output files (specifying the table using bracket notation) to extract tables and columns.] The B script extracts a specified table (without the header and comments) from a funtools ASCII output file and writes the result to the standard output. The first non-switch argument is the ASCII input file name (i.e. the saved output from funcnts, fundisp, funhist, etc.). If no filename is specified, stdin is read. The -n switch specifies which table (starting from 1) to extract. The default is to extract the first table. The -c switch is a space-delimited list of column numbers to output, e.g. -c "1 3 5" will extract the first three odd-numbered columns. The default is to extract all columns. The -s switch specifies the separator string to put between columns. The default is a single space. The -h switch specifies that column names should be added in a header line before the data is output. Without the switch, no header is prepended. The -p program switch allows you to specify an awk-like program to run instead of the default (which is host-specific and is determined at build time). The -T switch will output the data in rdb format (i.e., with a 2-row header of column names and dashes, and with data columns separated by tabs). The -help switch will print out a message describing program usage. For example, consider the output from the following funcnts command: [sh] funcnts -sr snr.ev "ann 512 512 0 9 n=3" # source # data file: /proj/rd/data/snr.ev # arcsec/pixel: 8 # background # constant value: 0.000000 # column units # area: arcsec**2 # surf_bri: cnts/arcsec**2 # surf_err: cnts/arcsec**2 # summed background-subtracted results upto net_counts error background berror area surf_bri surf_err ---- ------------ --------- ------------ --------- --------- --------- --------- 1 147.000 12.124 0.000 0.000 1600.00 0.092 0.008 2 625.000 25.000 0.000 0.000 6976.00 0.090 0.004 3 1442.000 37.974 0.000 0.000 15936.00 0.090 0.002 # background-subtracted results reg net_counts error background berror area surf_bri surf_err ---- ------------ --------- ------------ --------- --------- --------- --------- 1 147.000 12.124 0.000 0.000 1600.00 0.092 0.008 2 478.000 21.863 0.000 0.000 5376.00 0.089 0.004 3 817.000 28.583 0.000 0.000 8960.00 0.091 0.003 # the following source and background components were used: source_region(s) ---------------- ann 512 512 0 9 n=3 reg counts pixels sumcnts sumpix ---- ------------ --------- ------------ --------- 1 147.000 25 147.000 25 2 478.000 84 625.000 109 3 817.000 140 1442.000 249 There are four tables in this output. To extract the last one, you can execute: [sh] funcnts -s snr.ev "ann 512 512 0 9 n=3" | funtbl -n 4 1 147.000 25 147.000 25 2 478.000 84 625.000 109 3 817.000 140 1442.000 249 Note that the output has been re-formatted so that only a single space separates each column, with no extraneous header or comment information. To extract only columns 1,2, and 4 from the last example (but with a header prepended and tabs between columns), you can execute: [sh] funcnts -s snr.ev "ann 512 512 0 9 n=3" | funtbl -c "1 2 4" -h -n 4 -s "\t" #reg counts sumcnts 1 147.000 147.000 2 478.000 625.000 3 817.000 1442.000 Of course, if the output has previously been saved in a file named foo.out, the same result can be obtained by executing: [sh] funtbl -c "1 2 4" -h -n 4 -s "\t" foo.out #reg counts sumcnts 1 147.000 147.000 2 478.000 625.000 3 817.000 1442.000 =head1 SEE ALSO See funtools(n) for a list of Funtools help pages =cut funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/pod/funtext.pod000066400000000000000000000441351256243640000242350ustar00rootroot00000000000000=pod =head1 NAME B =head1 SYNOPSIS This document contains a summary of the options for processing column-based text files. =head1 DESCRIPTION Funtools will automatically sense and process "standard" column-based text files as if they were FITS binary tables without any change in Funtools syntax. In particular, you can filter text files using the same syntax as FITS binary tables: fundisp foo.txt'[cir 512 512 .1]' fundisp -T foo.txt > foo.rdb funtable foo.txt'[pha=1:10,cir 512 512 10]' foo.fits The first example displays a filtered selection of a text file. The second example converts a text file to an RDB file. The third example converts a filtered selection of a text file to a FITS binary table. Text files can also be used in Funtools image programs. In this case, you must provide binning parameters (as with raw event files), using the bincols keyword specifier: bincols=([xname[:tlmin[:tlmax:[binsiz]]]],[yname[:tlmin[:tlmax[:binsiz]]] For example: funcnts foo'[bincols=(x:1024,y:1024)]' "ann 512 512 0 10 n=10" B Standard text files have the following characteristics: =over 4 =item * Optional comment lines start with # =item * Optional blank lines are considered comments =item * An optional table header consists of the following (in order): =over 4 =item * a single line of alpha-numeric column names =item * an optional line of unit strings containing the same number of cols =item * an optional line of dashes containing the same number of cols =back =item * Data lines follow the optional header and (for the present) consist of the same number of columns as the header. =item * Standard delimiters such as space, tab, comma, semi-colon, and bar. =back Examples: # rdb file foo1 foo2 foo3 foos ---- ---- ---- ---- 1 2.2 3 xxxx 10 20.2 30 yyyy # multiple consecutive whitespace and dashes foo1 foo2 foo3 foos --- ---- ---- ---- 1 2.2 3 xxxx 10 20.2 30 yyyy # comma delims and blank lines foo1,foo2,foo3,foos 1,2.2,3,xxxx 10,20.2,30,yyyy # bar delims with null values foo1|foo2|foo3|foos 1||3|xxxx 10|20.2||yyyy # header-less data 1 2.2 3 xxxx 10 20.2 30 yyyy The default set of token delimiters consists of spaces, tabs, commas, semi-colons, and vertical bars. Several parsers are used simultaneously to analyze a line of text in different ways. One way of analyzing a line is to allow a combination of spaces, tabs, and commas to be squashed into a single delimiter (no null values between consecutive delimiters). Another way is to allow tab, semi-colon, and vertical bar delimiters to support null values, i.e. two consecutive delimiters implies a null value (e.g. RDB file). A successful parser is one which returns a consistent number of columns for all rows, with each column having a consistent data type. More than one parser can be successful. For now, it is assumed that successful parsers all return the same tokens for a given line. (Theoretically, there are pathological cases, which will be taken care of as needed). Bad parsers are discarded on the fly. If the header does not exist, then names "col1", "col2", etc. are assigned to the columns to allow filtering. Furthermore, data types for each column are determined by the data types found in the columns of the first data line, and can be one of the following: string, int, and double. Thus, all of the above examples return the following display: fundisp foo'[foo1>5]' FOO1 FOO2 FOO3 FOOS ---------- --------------------- ---------- ------------ 10 20.20000000 30 yyyy B Comments which precede data rows are converted into header parameters and will be written out as such using funimage or funhead. Two styles of comments are recognized: 1. FITS-style comments have an equal sign "=" between the keyword and value and an optional slash "/" to signify a comment. The strict FITS rules on column positions are not enforced. In addition, strings only need to be quoted if they contain whitespace. For example, the following are valid FITS-style comments: # fits0 = 100 # fits1 = /usr/local/bin # fits2 = "/usr/local/bin /opt/local/bin" # fits3c = /usr/local/bin /opt/local/bin /usr/bin # fits4c = "/usr/local/bin /opt/local/bin" / path dir Note that the fits3c comment is not quoted and therefore its value is the single token "/usr/local/bin" and the comment is "opt/local/bin /usr/bin". This is different from the quoted comment in fits4c. 2. Free-form comments can have an optional colon separator between the keyword and value. In the absence of quote, all tokens after the keyword are part of the value, i.e. no comment is allowed. If a string is quoted, then slash "/" after the string will signify a comment. For example: # com1 /usr/local/bin # com2 "/usr/local/bin /opt/local/bin" # com3 /usr/local/bin /opt/local/bin /usr/bin # com4c "/usr/local/bin /opt/local/bin" / path dir # com11: /usr/local/bin # com12: "/usr/local/bin /opt/local/bin" # com13: /usr/local/bin /opt/local/bin /usr/bin # com14c: "/usr/local/bin /opt/local/bin" / path dir Note that com3 and com13 are not quoted, so the whole string is part of the value, while comz4c and com14c are quoted and have comments following the values. Some text files have column name and data type information in the header. You can specify the format of column information contained in the header using the "hcolfmt=" specification. See below for a detailed description. B Multiple tables are supported in a single file. If an RDB-style file is sensed, then a ^L (vertical tab) will signify end of table. Otherwise, an end of table is sensed when a new header (i.e., all alphanumeric columns) is found. (Note that this heuristic does not work for single column tables where the column type is ASCII and the table that follows also has only one column.) You also can specify characters that signal an end of table condition using the B keyword. See below for details. You can access the nth table (starting from 1) in a multi-table file by enclosing the table number in brackets, as with a FITS extension: fundisp foo'[2]' The above example will display the second table in the file. (Index values start at 1 in oder to maintain logical compatibility with FITS files, where extension numbers also start at 1). B As with ARRAY() and EVENTS() specifiers for raw image arrays and raw event lists respectively, you can use TEXT() on text files to pass key=value options to the parsers. An empty set of keywords is equivalent to not having TEXT() at all, that is: fundisp foo fundisp foo'[TEXT()]' are equivalent. A multi-table index number is placed before the TEXT() specifier as the first token, when indexing into a multi-table: fundisp foo'[2,TEXT(...)]' The filter specification is placed after the TEXT() specifier, separated by a comma, or in an entirely separate bracket: fundisp foo'[TEXT(...),circle 512 512 .1]' fundisp foo'[2,TEXT(...)][circle 512 512 .1]' B The following is a list of keywords that can be used within the TEXT() specifier (the first three are the most important): =over 4 =item * delims="[delims]" Specify token delimiters for this file. Only a single parser having these delimiters will be used to process the file. fundisp foo.fits'[TEXT(delims="!")]' fundisp foo.fits'[TEXT(delims="\t%")]' =item * comchars="[comchars]" Specify comment characters. You must include "\n" to allow blank lines. These comment characters will be used for all standard parsers (unless delims are also specified). fundisp foo.fits'[TEXT(comchars="!\n")]' =item * cols="[name1:type1 ...]" Specify names and data type of columns. This overrides header names and/or data types in the first data row or default names and data types for header-less tables. fundisp foo.fits'[TEXT(cols="x:I,y:I,pha:I,pi:I,time:D,dx:E,dy:e")]' If the column specifier is the only keyword, then the cols= is not required (in analogy with EVENTS()): fundisp foo.fits'[TEXT(x:I,y:I,pha:I,pi:I,time:D,dx:E,dy:e)]' Of course, an index is allowed in this case: fundisp foo.fits'[2,TEXT(x:I,y:I,pha:I,pi:I,time:D,dx:E,dy:e)]' =item * eot="[eot delim]" Specify end of table string specifier for multi-table files. RDB files support ^L. The end of table specifier is a string and the whole string must be found alone on a line to signify EOT. For example: fundisp foo.fits'[TEXT(eot="END")]' will end the table when a line contains "END" is found. Multiple lines are supported, so that: fundisp foo.fits'[TEXT(eot="END\nGAME")]' will end the table when a line contains "END" followed by a line containing "GAME". In the absence of an EOT delimiter, a new table will be sensed when a new header (all alphanumeric columns) is found. =item * null1="[datatype]" Specify data type of a single null value in row 1. Since column data types are determined by the first row, a null value in that row will result in an error and a request to specify names and data types using cols=. If you only have a one null in row 1, you don't need to specify all names and columns. Instead, use null1="type" to specify its data type. =item * alen=[n] Specify size in bytes for ASCII type columns. FITS binary tables only support fixed length ASCII columns, so a size value must be specified. The default is 16 bytes. =item * nullvalues=["true"|"false"] Specify whether to expect null values. Give the parsers a hint as to whether null values should be allowed. The default is to try to determine this from the data. =item * whitespace=["true"|"false"] Specify whether surrounding white space should be kept as part of string tokens. By default surrounding white space is removed from tokens. =item * header=["true"|"false"] Specify whether to require a header. This is needed by tables containing all string columns (and with no row containing dashes), in order to be able to tell whether the first row is a header or part of the data. The default is false, meaning that the first row will be data. If a row dashes are present, the previous row is considered the column name row. =item * units=["true"|"false"] Specify whether to require a units line. Give the parsers a hint as to whether a row specifying units should be allowed. The default is to try to determine this from the data. =item * i2f=["true"|"false"] Specify whether to allow int to float conversions. If a column in row 1 contains an integer value, the data type for that column will be set to int. If a subsequent row contains a float in that same column, an error will be signaled. This flag specifies that, instead of an error, the float should be silently truncated to int. Usually, you will want an error to be signaled, so that you can specify the data type using cols= (or by changing the value of the column in row 1). =item * comeot=["true"|"false"|0|1|2] Specify whether comment signifies end of table. If comeot is 0 or false, then comments do not signify end of table and can be interspersed with data rows. If the value is true or 1 (the default for standard parsers), then non-blank lines (e.g. lines beginning with '#') signify end of table but blanks are allowed between rows. If the value is 2, then all comments, including blank lines, signify end of table. =item * lazyeot=["true"|"false"] Specify whether "lazy" end of table should be permitted (default is true for standard formats, except rdb format where explicit ^L is required between tables). A lazy EOT can occur when a new table starts directly after an old one, with no special EOT delimiter. A check for this EOT condition is begun when a given row contains all string tokens. If, in addition, there is a mismatch between the number of tokens in the previous row and this row, or a mismatch between the number of string tokens in the prev row and this row, a new table is assumed to have been started. For example: ival1 sval3 ----- ----- 1 two 3 four jval1 jval2 tval3 ----- ----- ------ 10 20 thirty 40 50 sixty Here the line "jval1 ..." contains all string tokens. In addition, the number of tokens in this line (3) differs from the number of tokens in the previous line (2). Therefore a new table is assumed to have started. Similarly: ival1 ival2 sval3 ----- ----- ----- 1 2 three 4 5 six jval1 jval2 tval3 ----- ----- ------ 10 20 thirty 40 50 sixty Again, the line "jval1 ..." contains all string tokens. The number of string tokens in the previous row (1) differs from the number of tokens in the current row(3). We therefore assume a new table as been started. This lazy EOT test is not performed if lazyeot is explicitly set to false. =item * hcolfmt=[header column format] Some text files have column name and data type information in the header. For example, VizieR catalogs have headers containing both column names and data types: #Column e_Kmag (F6.3) ?(k_msigcom) K total magnitude uncertainty (4) [ucd=ERROR] #Column Rflg (A3) (rd_flg) Source of JHK default mag (6) [ucd=REFER_CODE] #Column Xflg (I1) [0,2] (gal_contam) Extended source contamination (10) [ucd=CODE_MISC] while Sextractor files have headers containing column names alone: # 1 X_IMAGE Object position along x [pixel] # 2 Y_IMAGE Object position along y [pixel] # 3 ALPHA_J2000 Right ascension of barycenter (J2000) [deg] # 4 DELTA_J2000 Declination of barycenter (J2000) [deg] The hcolfmt specification allows you to describe which header lines contain column name and data type information. It consists of a string defining the format of the column line, using "$col" (or "$name") to specify placement of the column name, "$fmt" to specify placement of the data format, and "$skip" to specify tokens to ignore. You also can specify tokens explicitly (or, for those users familiar with how sscanf works, you can specify scanf skip specifiers using "%*"). For example, the VizieR hcolfmt above might be specified in several ways: Column $col ($fmt) # explicit specification of "Column" string $skip $col ($fmt) # skip one token %*s $col ($fmt) # skip one string (using scanf format) while the Sextractor format might be specified using: $skip $col # skip one token %*d $col # skip one int (using scanf format) You must ensure that the hcolfmt statement only senses actual column definitions, with no false positives or negatives. For example, the first Sextractor specification, "$skip $col", will consider any header line containing two tokens to be a column name specifier, while the second one, "%*d $col", requires an integer to be the first token. In general, it is preferable to specify formats as explicitly as possible. Note that the VizieR-style header info is sensed automatically by the funtools standard VizieR-like parser, using the hcolfmt "Column $col ($fmt)". There is no need for explicit use of hcolfmt in this case. =item * debug=["true"|"false"] Display debugging information during parsing. =back B Environment variables are defined to allow many of these TEXT() values to be set without having to include them in TEXT() every time a file is processed: keyword environment variable ------- -------------------- delims TEXT_DELIMS comchars TEXT_COMCHARS cols TEXT_COLUMNS eot TEXT_EOT null1 TEXT_NULL1 alen TEXT_ALEN bincols TEXT_BINCOLS hcolfmt TEXT_HCOLFMT B As with raw event files, the '+' (copy extensions) specifier is not supported for programs such as funtable. String to int and int to string data conversions are allowed by the text parsers. This is done more by force of circumstance than by conviction: these transitions often happens with VizieR catalogs, which we want to support fully. One consequence of allowing these transitions is that the text parsers can get confused by columns which contain a valid integer in the first row and then switch to a string. Consider the following table: xxx yyy zzz ---- ---- ---- 111 aaa bbb ccc 222 ddd The xxx column has an integer value in row one a string in row two, while the yyy column has the reverse. The parser will erroneously treat the first column as having data type int: fundisp foo.tab XXX YYY ZZZ ---------- ------------ ------------ 111 'aaa' 'bbb' 1667457792 '222' 'ddd' while the second column is processed correctly. This situation can be avoided in any number of ways, all of which force the data type of the first column to be a string. For example, you can edit the file and explicitly quote the first row of the column: xxx yyy zzz ---- ---- ---- "111" aaa bbb ccc 222 ddd [sh] fundisp foo.tab XXX YYY ZZZ ------------ ------------ ------------ '111' 'aaa' 'bbb' 'ccc' '222' 'ddd' You can edit the file and explicitly set the data type of the first column: xxx:3A yyy zzz ------ ---- ---- 111 aaa bbb ccc 222 ddd [sh] fundisp foo.tab XXX YYY ZZZ ------------ ------------ ------------ '111' 'aaa' 'bbb' 'ccc' '222' 'ddd' You also can explicitly set the column names and data types of all columns, without editing the file: [sh] fundisp foo.tab'[TEXT(xxx:3A,yyy:3A,zzz:3a)]' XXX YYY ZZZ ------------ ------------ ------------ '111' 'aaa' 'bbb' 'ccc' '222' 'ddd' The issue of data type transitions (which to allow and which to disallow) is still under discussion. =head1 SEE ALSO See funtools(n) for a list of Funtools help pages =cut funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/pod/funtools.pod000066400000000000000000000131351256243640000244050ustar00rootroot00000000000000=pod =head1 NAME B =head1 SYNOPSIS This document is the Table of Contents for Funtools. =head1 DESCRIPTION Funtools, is a "minimal buy-in" FITS library and utility package developed at the the High Energy Astrophysics Division of SAO. The Funtools library provides simplified access to a wide array of file types: standard astronomical FITS images and binary tables, raw arrays and binary event lists, and even tables of ASCII column data. A sophisticated region filtering library (compatible with ds9) filters images and tables using boolean operations between geometric shapes, support world coordinates, etc. Funtools also supports advanced capabilities such as optimized data searching using index files. The main goal of the Funtools project has been to develop a minimal buy-in FITS library for researchers who are occasional (but serious) coders. In this case, "minimal buy-in" means "easy to learn, easy to use, and easy to re-learn next month". We have tried to achieve this goal by emphasizing two essential capabilities. The first is the ability to develop FITS programs without knowing much about FITS, i.e., without having to deal with the arcane rules for generating a properly formatted FITS file. The second is to support the use of already-familiar C/Unix facilities, especially C structs and Unix stdio. Taken together, these two capabilities should allow researchers to leverage their existing programming expertise while minimizing the need to learn new and complex coding rules. Choose from the following topics: =over 4 =item * Funtools User Programs =over 4 =item * funcalc: Funtools calculator (for binary tables) [funcalc(1)] =item * funcen: find centroid (for binary tables) [funcen(1)] =item * funcnts: count photons in specified regions [funcnts(1)] =item * funcone: cone search on RA, Dec columns [funcone(1)] =item * fundisp: display data in a Funtools data file [fundisp(1)] =item * funhead: display a header in a Funtools file [funhead(1)] =item * funhist: create a 1D histogram of a column [funhist(1)] =item * funimage: create a FITS image from a Funtools data file [funimage(1)] =item * funindex: create an index on a column in a binary table [funindex(1)] =item * funjoin: join two or more FITS binary tables on specified columns [funjoin(1)] =item * funmerge: merge one or more Funtools table files [funmerge(1)] =item * funsky: convert between image and sky coordinates, using WCS info from a FITS header [funsky(1)] =item * funtable: copy selected rows from a Funtools file to a FITS binary table [funtable(1)] =item * funtbl: extract a table from Funtools ASCII output [funtbl(1)] =item * funtools and ds9 image display [funds9(n)] =back =item * Funtools Programming =over 4 =item * Funtools Programming Summary [funlib(3)] =item * Funtools Programming Tutorial [funlib(3)] =item * A Short Digression on Subroutine Order [funlib(3)] =item * Compiling and Linking [funlib(3)] =item * The Funtools Reference Handle [funlib(3)] =item * The Funtools Programming Reference Manual =over 4 =item * FunOpen: open a Funtools file [funopen(3)] =item * FunImageGet: retrieve image data [funimageget(3)] =item * FunImagePut: output image data [funimageput(3)] =item * FunImageRowGet: retrieve image data by row [funimagerowget(3)] =item * FunImageRowPut: output image data by row [funimagerowput(3)] =item * FunTableRowGet: retrieve rows from a table [funtablerowget(3)] =item * FunTableRowPut: output rows to a table [funtablerowput(3)] =item * FunColumnSelect: select columns in a table for access [funcolumnselect(3)] =item * FunColumnActivate: activate columns in a table for read/write [funcolumnactivate(3)] =item * FunColumnLookup: lookup info about the columns in a table [funcolumnlookup(3)] =item * FunInfoGet: get info about an image or table [funinfoget(3)] =item * FunInfoPut: put info about an image or table [funinfoput(3)] =item * FunParamGet: get header param [funparamget(3)] =item * FunParamPut: put header param [funparamput(3)] =item * FunFlush: flush I/O in a Funtools file [funflush(3)] =item * FunClose: close a Funtools file [funclose(3)] =back =item * Funtools Programming Examples [funlib(3)] =over 4 =item * evmerge: merge new columns with existing columns =item * evcols: add column and rows to binary tables =item * imblank: blank out image values below a threshold =back =back =item * Funtools Data Files [funfiles(n)] =over 4 =item * Supported Data Formats =over 4 =item * FITS File and Extensions =item * Non-FITS Raw Event Files =item * Non-FITS Array Files =item * Column-based Text (ASCII) Files =item * Database Views of Tables =back =item * Image Sections and Blocking =item * Binning FITS Binary Tables and Non-FITS Event Files =item * Disk Files and Other Supported File Types =back =item * Funtools Data Filtering =over 4 =item * Table Filtering [funfilters(n)] =item * Fast Table Filtering using Indexes [funidx(n)] =item * Spatial Region Filtering [funregions(n)] =over 4 =item * Region Geometry [reggeometry(n)] =item * Region Algebra [regalgebra(n)] =item * Region Coordinates [regcoords(n)] =item * Region Boundaries [regbounds(n)] =item * Differences Between Funtools and IRAF Regions [regdiff(n)] =back =item * Combining Table and Region Filters [funcombine(n)] =back =item * Miscellaneous =over 4 =item * Funtools Environment Variables [funenv(n)] =item * Funtools ChangeLog =back =back =cut funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/pod/funview.pod000066400000000000000000000327021256243640000242200ustar00rootroot00000000000000=pod =head1 NAME B =head1 SYNOPSIS This document contains a summary of the options for utilizing database-inspired Views of tables. =head1 DESCRIPTION B In database parlance, a B defines a "virtual table", i.e., a description of row and/or column selection filters (but with no permanent storage space allocated). When used in place of a table, a View selects the specified rows and/or columns from one or more real tables. Views enable you to see complicated data tables in a more convenient format. They also can be used as a security mechanism, by restricting user access to specific columns and/or rows. [See: http://www.cs.unibo.it/~ciaccia/COURSES/RESOURCES/SQLTutorial/sqlch5.htm for a good discussion of SQL Views.] Funtools supports an expanded notion of Views for all tabular data (FITS tables, raw binary tables, and ASCII column files). Funtools Views allow you to pre-set values for the filter specification, the columns to activate, and display format (though the latter is for fundisp only). Setting the filter and column activation values provides functionality equivalent to that of a classical database View, while the ability to set the format is similar to classical report writing capabilities. B A Funtools View is a text file containing one or more of the following columns: column description ------ ----------------------------- view name of view file data file name or template filter filter specification columns columns to activate format fundisp format specification All of the attribute columns are optional, including the B name itself. This means that a View can be named or unnamed. Unnamed Views can refer to a specific file or a template of files (obviously if neither the view or the file column is specified, the input View specification will never be used). You can specify any combination of filter, column, and format parameters. (It also is possible to apply file-specific View to other files; see the discussion on B below). Each column has a size limit of 1024 characters. For example, consider the following View file: view file format columns filter ---- ---------------------- ------ ------------ ------- x3 ${HOME}/data/snr.ev I=%4d x y pi pha cir 512 512 .1 x2 ${HOME}/data/snr.ev x y pi pha cir 512 512 .1 x1 ${HOME}/data/snr.ev cir 512 512 .1 x1a ${HOME}/data/snr.ev x y pi pha x0 ${HOME}/data/snr.ev xf I=%4d xc x y pi pha xr cir 512 512 .1 *.ev x y pi pha *.fit x y dx dy cir 400 400 3 *.fits I=%3d x y dx dy cir 400 400 3 This database example is in rdb format, i.e. using tab delimiters and permitting null values. Any valid ASCII table format is acceptable, but if you use a format that does not permit null values, it will be necessary to quote the null strings. The first five entries (x3, x2, x1, x1a, x0) are named entries defining default values specifically for the snr.ev data file. Typically, you would use these Views by specifying View name, and the corresponding file, filter, column, and format values would be used. Note that the x0 View is essentially an alias for the pathname of this file. The next three entries define defaults that can be applied to any file. You typically would use these View names in conjunction with a specific file name (see B below) so that the associated parameter(s) were applied to that file. The last three entry in the database define unnamed Views that pertains to all files ending with the specified templates. In these cases, any View that specifies a file name matching the file template would be processed with the associated parameter attributes. B To use a Funtools View, you simply pre-pend the "v:" prefix to a View name or a file name where an input file name usually is specified. For example: fundisp v:x3 specifies that the View named x3 (with its file name and associated parameters) is processed as the input file to fundisp. Using the example database, above, this is equivalent to: fundisp -f "I=%4d" ${HOME}/data/snr.ev'[cir 512 512 .1]' "x y pi pha" That is, the format is used with fundisp's -f (format) switch, while the filename and extension are composed of the x3 View's filename and region filter. Similarly, executing a command such as: fundisp v:foo.fit will match the unnamed View associated with the template "*.fit". This is equivalent to executing: fundisp foo.fit'[cir 400 400 3]' "x y dx dy" Of course, if you omit the "v:" prefix, then no View processing takes place: fundisp foo.fit # process foo.fit without any View parameters fundisp x3 # error (assuming there is no file named x3) B When a "v:" prefix is recognized, Funtools searches for a View database file in the following order: location description ------------ ------------------------------------ FUN_VIEWFILE environment variable (any file name) ./.funtools.vu hidden file, default name $HOME/.funtools.vu hidden file, default name The first View database file located is used to construct a new filename, as well as an activation column specification and a format specification. The following rules are used: 1. An attempt is made to match the input name (i.e., the part of the input View after the "v:" prefix) against the B column value (if present) of each row in the database. If a match is found, the values of all non-blank columns are saved for later use. Also note that the first match terminates the search: i.e., the order of the database rows matters. 2. If no B match is made, an attempt is made to match the input name against the B column value (if present). Matching is performed on the full pathname of both the input name and the database file name, and on the non-directory (root) part of these files. This means that the root specification: fundisp v:snr.ev will match a row in the database that has a full pathname in the file, allowing you to use a B-matched View without having to specify the full pathname. In this example, the "v:snr.ev" View specification will match the first row (v:x3) in the database: x3 ${HOME}/data/snr.ev I=%4d x y pi pha cir 512 512 .1 even though the row contains a fully qualified pathname as the file value. Once again, values of all non-blank columns are saved, and the first match terminates the search. 3. If neither a B or a B match has been found, then a simple template match is attempted against the B values. Template matching supports a simplified version of file globbing (not a regular expression), with support for a single "*" (all characters), "?" (single character), or "[...]" (range) specification. 4. If no template match was found on the B column, then a simple template match is attempted against the B columns. 5. If no match is found, then the filename (minus the "v:" prefix) is returned. B The matching rules described above stop after the first match, regardless of whether that match provides values for all three parameters (filter, columns, and format). In cases where a B or B match does not provide all three values, it is possible that a template match might do so. With regard to the example View database above, the x1 View provides only a filter, while omitting both the format and columns values. But note that the final rows in the database could provide the values via a template match on the filename. This sort of multiple matching is especially valuable in order to provide "global" values to several Views. Obviously, multiple matching might not be wanted in every case. Therefore, we support both multiple matching and single matching according to the value of the FUN_VIEWMATCH environment variable. If the FUN_VIEWMATCH environment variable exists and if its value begins with "s", then a single match is used and missing parameters are not filled in with subsequent template matches on the file name. That is, matching rules above are followed exactly as explained above. If the value of this environment variable begins with "m" (or does not exist), then multiple matches are used to try to fill in missing parameters. In this case, template matching always takes place and missing values are taken from these template matches. Thus, in the example above, the View specification: fundisp v:x1 will take the file name and filter value from the x1 View: x1 ${HOME}/data/snr.ev cir 512 512 .1 The column value then will be taken from the "*.ev" file template match against the x1 file name: *.ev x y pi pha Note once again that order is important: missing values are taken in the order in which the template matches are processed. B It is possible to apply a named View, or even several Views, to any data file by appending a B immediately after the standard "v:" prefix. A viewlist takes the form: :v1,v2,...vn: where v1, v2, etc. are named Views. The two ":" colon characters surrounding the list are required. Thus, the syntax for applying a viewlist to a file is: v::view1,view2,...viewn:filename Note that the name after the last ":" is assumed to be a file; it is not permissible (or sensible) to use a View name. For example, the View specification: fundisp v::x2:foo applies the x2 View to the file foo (even if there is a View named foo) and (in using our example database) is equivalent to: ./fundisp foo'[cir 512 512 .1] "x y pi pha" The same command can be effected using a list of Views: fundisp v::x1,x1a:foo What happens if a viewlist is used and the file also matches a template? Consider, for example, this View specification: fundisp v::x2:foo.fit Here, the x2 View will supply filter and column values, while the template *.fit can also supply (different) filter and column values. In this case, the explicitly specified Views of the viewlist trump the matched view values. On the other hand, if a file template match can supply a View value that is not supplied by the viewlist, then that value will be taken from the file template match. For example: fundisp v::x2:foo.fits does not explicitly supply a format value, but the file match on *.fits can and does. You can avoid supplying missing values using file template matching by replacing the first ":" with a "-" in a viewlist specification: fundisp v:-x2:foo.fits The use of ":+" to explicitly allow file template matching is also supported, but is the same as the default case. Note that the nuances of viewlist support are subject to change as our experience and understanding grow. B To override values associated with a View, simply supply the override values in the correct place on the command line. Thus, given the example database described above, the command: fundisp v:x3 specifies that the View named x3, along with its file name and associated parameters, be processed as the input file to fundisp in this way: fundisp -f "I=%4d" ${HOME}/data/snr.ev'[cir 512 512 .1]' "x y pi pha" To override one or more of these values, simply specify a new value for the format, filter, or columns. For example, if your input View file contains a filter, then the View will use that filter as an override of the View filter: fundisp v:x3'[cir 400 400 3]' will use the columns and format of the x3 View but not the x3 filter. Further examples are: fundisp v:x3 "x y dx dy" # activate a different set of columns fundisp -f "I=%3d" v:x3 # use a different format statement Note that extension names, extension index values, and other non-filter specifications B override the View filter. Thus: fundisp v:foo.fit[3] will still use the filter associated with the .fit template (see above), since the "3" is an extension index, not a filter. B The following environment variables are used by Funtools Views: =over 4 =item * B The B environment variable specifies the name and location of the View database file. If not present, the files ./.funtools.vu and $HOME/.funtools.vu are searched for, in that order. =item * B The B environment variable specifies whether a single match or multiple match algorithm is used to locate parameter values. If the value of this environment variable begins with "s", then a single match is used and missing parameters are not filled in with subsequent template matches on the file name. If the value begins with "m", then multiple matches are used to try to fill in missing parameters. The default is to use multiple matches. =back B Support for overriding a filter (while not overriding extension names, extension indexes, etc.) requires that we can sense the presence of a filter in a bracket specification. It is unclear yet whether our algorithm is perfect. Go to Funtools Help Index Last updated: August 3, 2007 =cut funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/pod/funvu.pod000066400000000000000000000326731256243640000237070ustar00rootroot00000000000000=pod =head1 NAME B =head1 SYNOPSIS This document contains a summary of the options for utilizing database-inspired Views of tables. =head1 DESCRIPTION B In database parlance, a B defines a "virtual table", i.e., a description of row and/or column selection filters (but with no permanent storage space allocated). When used in place of a table, a View selects the specified rows and/or columns from one or more real tables. Views enable users to see complicated data tables in a more convenient format. They also can be used as a security mechanism, by restricting user access to specific columns and/or rows. [See: http://www.cs.unibo.it/~ciaccia/COURSES/RESOURCES/SQLTutorial/sqlch5.htm for a good discussion of SQL Views.] Funtools supports an expanded notion of Views for all tabular data (FITS tables, raw binary tables, and ASCII column files). Funtools Views allow you to pre-set values for the filter specification, the columns to activate and display format (though the latter is for fundisp only). Setting the filter and column activation values provides functionality equivalent to that of a classical database View, while the ability to set the format is similar to classical report writing capabilities. B A Funtools View consists of one or more of the following attributes: column description ------ ----------------------------- view name of view file data file name or template filter filter specification columns columns to activate format fundisp format specification All of the attribute columns are optional, including the B name itself. This means that a View can be named or unnamed. Unnamed Views can refer to a specific file or a template of files (obviously if neither the view or the file column is specified, the input View specification will never be used). You can specify any combination of filter, column, and format parameters. (It also is possible to apply file-specific View to other files; see the discussion on B below). Each column has a size limit of 1024 characters. For example, consider the following View database: view file format columns filter ---- ---------------------- ------ ------------ ------- x3 ${HOME}/data/snr.ev I=%4d x y pi pha cir 512 512 .1 x2 ${HOME}/data/snr.ev x y pi pha cir 512 512 .1 x1 ${HOME}/data/snr.ev cir 512 512 .1 x1a ${HOME}/data/snr.ev x y pi pha x0 ${HOME}/data/snr.ev xf I=%4d xc x y pi pha xr cir 512 512 .1 *.ev x y pi pha *.fit x y dx dy cir 400 400 3 *.fits I=%3d x y dx dy cir 400 400 3 This database example is in rdb format, i.e. using tab delimiters and permitting null values. Any valid ASCII table format is acceptable, but if you use a format that does not permit null values, it will be necessary to quote the null strings. The first five entries (x3, x2, x1, x1a, x0) are named entries defining default values specifically for the snr.ev data file. Typically, you would use these Views by specifying View name, and the corresponding file, filter, column, and format values would be used. Note that the x0 View is essentially an alias for the pathname of this file. The next three entries define defaults that can be applied to any file. Here, you typically would use these View names in conjunction with a specific file name (see B below) so that the associated parameter(s) were applied to that file. The last three entry in the database define unnamed Views that pertains to all files ending with the specified templates. In these cases, any View that specifies a file name matching the file template would be processed with the associated parameter attributes. B To specify a Funtools View, pre-pend the "v:" prefix to a View name or a file name where an input file name usually is specified. For example: fundisp v:x3 specifies that the View named x3, its file name and associated parameters, be processed as the input file to fundisp. Using the example database, above, this is equivalent to: fundisp -f "I=%4d" ${HOME}/data/snr.ev'[cir 512 512 .1]' "x y pi pha" That is, the format is used with fundisp's -f (format) switch, while the filename and extension are composed of the x3 View's filename and region filter. Similarly, executing a command such as: fundisp v:foo.fit will match the unnamed View associated with the template "*.fit". This is equivalent to executing: fundisp foo.fit'[cir 400 400 3]' "x y dx dy" Of course, if you omit the "v:" prefix, then no View processing takes place: fundisp foo.fit # process foo.fit without any View parameters fundisp x3 # error (assuming there is no file named x3) B When a "v:" prefix is recognized, Funtools searches for a View database file in the following order: location description ------------ ------------------------------------ FUN_VIEWFILE environment variable (any file name) ./.funtools.vu hidden file, default name $HOME/.funtools.vu hidden file, default name The first View database file located is used to construct a new filename, as well as an activation column specification and a format specification. The following rules are used: 1. An attempt is made to match the input name (i.e. the part of the input View after the "v:" prefix) against the B column value (if present) of each row in the database. If a match is found, the values of all non-blank columns are saved for later use. Also note that the first match terminates the search: i.e. the order of the database rows does matter. 2. If no B match is made, an attempt is made to match the input name against the B column value (if present). Matching is performed on the full pathname of both the input name and the database file name, and on the non-directory (root) part of these files. This means that the root specification: fundisp v:snr.ev will match a row in the database that has a full pathname in the file, allowing you to use a B-matched View without having to specify the full pathname. In this example, the "v:snr.ev" View specification will match the first row (v:x3) in the database: x3 ${HOME}/data/snr.ev I=%4d x y pi pha cir 512 512 .1 even though the row contains a fully qualified pathname as the file value. Once again, values of all non-blank columns are saved, and the first match terminates the search. 3. If neither a B or a B match has been found, then a simple template is attempted against the B values. The template matching supports a simplified version of file globbing (not a regular expression), with support for a single "*" (all characters), "?" (single character), or "[...]" (range) specification. 4. If no template match was found on the B column, then a simple template match is attempted against the B columns. 5. If no match is found, then the filename (minus the "v:" prefix) is returned. B The matching rules described above stop after the first match, regardless of whether that match provides values for all three parameters (filter, columns, and format). In cases where a B or B match does not provide all three values, it is possible that a template match might do so. With regard to the example View database above, the x1 View provides only a filter, while omitting both the format and columns values. But note that the final rows in the database could provide the values via a template match on the filename. This sort of multiple matching is especially valuable in order to provide "global" values to several Views. Obviously, multiple matching might not be wanted in every case. Therefore, we support both multiple matching and single matching according to the value of the FUN_VIEWMATCH environment variable. If the FUN_VIEWMATCH environment variable exists and if its value begins with "s", then a single match is used and missing parameters are not filled in with subsequent template matches on the file name. That is, matching rules above are followed exactly as explained above. If the value of this environment variable begins with "m" (or does not exist), then multiple matches are used to try to fill in missing parameters. In this case, template matching always takes place and missing values are taken from these template matches. Thus, in the example above, the View specification: fundisp v:x1 will take the file name and filter value from the x1 View: x1 ${HOME}/data/snr.ev cir 512 512 .1 The column value then will be taken from the "*.ev" file template match against the x1 file name: *.ev x y pi pha Note once again that order is important: missing values are taken in the order in which the template matches are processed. B It is possible to apply a named View, or even several Views, to any data file by appending a B immediately after the standard "v:" prefix. A viewlist takes the form: :v1,v2,...vn: where v1, v2, etc. are named Views. The two ":" colon characters surrounding the list are required. Thus, the syntax for applying a viewlist to a file is: v::view1,view2,...viewn:filename Note that the name after the last ":" is assumed to be a file; it is not permissible (or sensible) to use a View name. For example, the View specification: fundisp v::x2:foo applies the x2 View to the file foo (even if there is a View named foo) and (in using our example database) is equivalent to: ./fundisp foo'[cir 512 512 .1] "x y pi pha" The same command can be effected using a list of Views: fundisp v::x1,x1a:foo What happens if a viewlist is used and the file also matches a template? Consider, for example, this View specification: fundisp v::x2:foo.fit Here, the x2 View will supply filter and column values, while the template *.fit can also supply (different) filter and column values. In this case, the explicitly specified Views of the viewlist trump the matched view values. On the other hand, if a file template match can supply a View value that is not supplied by the viewlist, then that value will be taken from the file template match. For example: fundisp v::x2:foo.fits does not explicitly supply a format value, but the file match on *.fits can and does. You can avoid supplying missing values using file template matching by replacing the first ":" with a "-" in a viewlist specification: fundisp v:-x2:foo.fits The use of ":+" to explicitly allow file template matching is also supported, but is the same as the default case. Note that the nuances of viewlist support are subject to change as our experience and understanding grows. B To override values associated with a View, simply supply the override values in the correct place on the command line. For example, given the example database described above, the command: fundisp v:x3 specifies that the View named x3, along with its file name and associated parameters, be processed as the input file to fundisp in this way: fundisp -f "I=%4d" ${HOME}/data/snr.ev'[cir 512 512 .1]' "x y pi pha" To override one or more of these values, simply specify a new value for the format, filter, or columns. For example, if your input View file contains a filter, then the View will use that filter as an override of the View filter: fundisp v:x3'[cir 400 400 3]' will use the columns and format of the x3 View but not the x3 filter. Further examples are: fundisp v:x3 "x y dx dy" # activate a different set of columns fundisp -f "I=%3d" v:x3 # use a different format statement Note that extension names, extension index values, and other non-filter specifications B override the View filter. Thus: fundisp v:foo.fit[3] will still use the filter associated with the .fit template (see above), since the "3" is an extension index, not a filter. B The following environment variables are used by Funtools Views: =over 4 =item * B The B environment variable specifies the name and location of the View database file. If not present, the files ./.funtools.vu and $HOME/.funtools.vu are searched for, in that order. =item * B The B environment variable specifies whether a single match or multiple match algorithm is used to locate parameter values. If the value of this environment variable begins with "s", then a single match is used and missing parameters are not filled in with subsequent template matches on the file name. If the value begins with "m", then multiple matches are used to try to fill in missing parameters. The default is to use multiple matches. =back B Support for overriding a filter (while not overriding extension names, extension indexes, etc.) requires that we can sense the presence of a filter in a bracket specification. It is unclear yet whether our algorithm is perfect. Go to Funtools Help Index Last updated: January 3, 2006 =cut funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/pod/regalgebra.pod000066400000000000000000000246351256243640000246360ustar00rootroot00000000000000=pod =head1 NAME B =head1 SYNOPSIS This document describes the boolean arithmetic defined for region expressions. =head1 DESCRIPTION When defining a region, several shapes can be combined using boolean operations. The boolean operators are (in order of precedence): Symbol Operator Associativity ------ -------- ------------- ! not right to left & and left to right ^ exclusive or left to right | inclusive or left to right For example, to create a mask consisting of a large circle with a smaller box removed, one can use the B and B operators: CIRCLE(11,11,15) & !BOX(11,11,3,6) and the resulting mask is: 1234567890123456789012345678901234567890 ---------------------------------------- 1:1111111111111111111111.................. 2:1111111111111111111111.................. 3:11111111111111111111111................. 4:111111111111111111111111................ 5:111111111111111111111111................ 6:1111111111111111111111111............... 7:1111111111111111111111111............... 8:1111111111111111111111111............... 9:111111111...1111111111111............... 10:111111111...1111111111111............... 11:111111111...1111111111111............... 12:111111111...1111111111111............... 13:111111111...1111111111111............... 14:111111111...1111111111111............... 15:1111111111111111111111111............... 16:1111111111111111111111111............... 17:111111111111111111111111................ 18:111111111111111111111111................ 19:11111111111111111111111................. 20:1111111111111111111111.................. 21:1111111111111111111111.................. 22:111111111111111111111................... 23:..11111111111111111..................... 24:...111111111111111...................... 25:.....11111111111........................ 26:........................................ 27:........................................ 28:........................................ 29:........................................ 30:........................................ 31:........................................ 32:........................................ 33:........................................ 34:........................................ 35:........................................ 36:........................................ 37:........................................ 38:........................................ 39:........................................ 40:........................................ A three-quarter circle can be defined as: CIRCLE(20,20,10) & !PIE(20,20,270,360) and looks as follows: 1234567890123456789012345678901234567890 ---------------------------------------- 1:........................................ 2:........................................ 3:........................................ 4:........................................ 5:........................................ 6:........................................ 7:........................................ 8:........................................ 9:........................................ 10:........................................ 11:...............111111111................ 12:..............11111111111............... 13:............111111111111111............. 14:............111111111111111............. 15:...........11111111111111111............ 16:..........1111111111111111111........... 17:..........1111111111111111111........... 18:..........1111111111111111111........... 19:..........1111111111111111111........... 20:..........1111111111111111111........... 21:..........1111111111.................... 22:..........1111111111.................... 23:..........1111111111.................... 24:..........1111111111.................... 25:...........111111111.................... 26:............11111111.................... 27:............11111111.................... 28:..............111111.................... 29:...............11111.................... 30:........................................ 31:........................................ 32:........................................ 33:........................................ 34:........................................ 35:........................................ 36:........................................ 37:........................................ 38:........................................ 39:........................................ 40:........................................ Two non-intersecting ellipses can be made into the same region: ELL(20,20,10,20,90) | ELL(1,1,20,10,0) and looks as follows: 1234567890123456789012345678901234567890 ---------------------------------------- 1:11111111111111111111.................... 2:11111111111111111111.................... 3:11111111111111111111.................... 4:11111111111111111111.................... 5:1111111111111111111..................... 6:111111111111111111...................... 7:1111111111111111........................ 8:111111111111111......................... 9:111111111111............................ 10:111111111............................... 11:...........11111111111111111............ 12:........111111111111111111111111........ 13:.....11111111111111111111111111111...... 14:....11111111111111111111111111111111.... 15:..11111111111111111111111111111111111... 16:.1111111111111111111111111111111111111.. 17:111111111111111111111111111111111111111. 18:111111111111111111111111111111111111111. 19:111111111111111111111111111111111111111. 20:111111111111111111111111111111111111111. 21:111111111111111111111111111111111111111. 22:111111111111111111111111111111111111111. 23:111111111111111111111111111111111111111. 24:.1111111111111111111111111111111111111.. 25:..11111111111111111111111111111111111... 26:...11111111111111111111111111111111..... 27:.....11111111111111111111111111111...... 28:.......111111111111111111111111......... 29:...........11111111111111111............ 30:........................................ 31:........................................ 32:........................................ 33:........................................ 34:........................................ 35:........................................ 36:........................................ 37:........................................ 38:........................................ 39:........................................ 40:........................................ You can use several boolean operations in a single region expression, to create arbitrarily complex regions. With the important exception below, you can apply the operators in any order, using parentheses if necessary to override the natural precedences of the operators. NB: Using a panda shape is always much more efficient than explicitly specifying "pie & annulus", due to the ability of panda to place a limit on the number of pixels checked in the pie shape. If you are going to specify the intersection of pie and annulus, use panda instead. As described in "help regreometry", the B slice goes to the edge of the field. To limit its scope, B usually is is combined with other shapes, such as circles and annuli, using boolean operations. In this context, it is worth noting that that there is a difference between B<-PIE> and B<&!PIE>. The former is a global exclude of all pixels in the B slice, while the latter is a local excludes of pixels affecting only the region(s) with which the B is combined. For example, the following region uses B<&!PIE> as a local exclude of a single circle. Two other circles are also defined and are unaffected by the local exclude: CIRCLE(1,8,1) CIRCLE(8,8,7)&!PIE(8,8,60,120)&!PIE(8,8,240,300) CIRCLE(15,8,2) 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 - - - - - - - - - - - - - - - 15: . . . . . . . . . . . . . . . 14: . . . . 2 2 2 2 2 2 2 . . . . 13: . . . 2 2 2 2 2 2 2 2 2 . . . 12: . . 2 2 2 2 2 2 2 2 2 2 2 . . 11: . . 2 2 2 2 2 2 2 2 2 2 2 . . 10: . . . . 2 2 2 2 2 2 2 . . . . 9: . . . . . . 2 2 2 . . . . 3 3 8: 1 . . . . . . . . . . . . 3 3 7: . . . . . . 2 2 2 . . . . 3 3 6: . . . . 2 2 2 2 2 2 2 . . . . 5: . . 2 2 2 2 2 2 2 2 2 2 2 . . 4: . . 2 2 2 2 2 2 2 2 2 2 2 . . 3: . . . 2 2 2 2 2 2 2 2 2 . . . 2: . . . . 2 2 2 2 2 2 2 . . . . 1: . . . . . . . . . . . . . . . Note that the two other regions are not affected by the B<&!PIE>, which only affects the circle with which it is combined. On the other hand, a B<-PIE> is an global exclude that does affect other regions with which it overlaps: CIRCLE(1,8,1) CIRCLE(8,8,7) -PIE(8,8,60,120) -PIE(8,8,240,300) CIRCLE(15,8,2) 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 - - - - - - - - - - - - - - - 15: . . . . . . . . . . . . . . . 14: . . . . 2 2 2 2 2 2 2 . . . . 13: . . . 2 2 2 2 2 2 2 2 2 . . . 12: . . 2 2 2 2 2 2 2 2 2 2 2 . . 11: . . 2 2 2 2 2 2 2 2 2 2 2 . . 10: . . . . 2 2 2 2 2 2 2 . . . . 9: . . . . . . 2 2 2 . . . . . . 8: . . . . . . . . . . . . . . . 7: . . . . . . 2 2 2 . . . . . . 6: . . . . 2 2 2 2 2 2 2 . . . . 5: . . 2 2 2 2 2 2 2 2 2 2 2 . . 4: . . 2 2 2 2 2 2 2 2 2 2 2 . . 3: . . . 2 2 2 2 2 2 2 2 2 . . . 2: . . . . 2 2 2 2 2 2 2 . . . . 1: . . . . . . . . . . . . . . . The two smaller circles are entirely contained within the two exclude B slices and therefore are excluded from the region. =head1 SEE ALSO See funtools(n) for a list of Funtools help pages =cut funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/pod/regbounds.pod000066400000000000000000000134331256243640000245250ustar00rootroot00000000000000=pod =head1 NAME B =head1 SYNOPSIS Describes how spatial region boundaries are handled. =head1 DESCRIPTION The golden rule for spatial region filtering was first enunciated by Leon VanSpeybroeck in 1986: Each photon will be counted once, and no photon will be counted more than once. This means that we must be careful about boundary conditions. For example, if a circle is contained in an annulus such that the inner radius of the annulus is the same as the radius of the circle, then photons on that boundary must always be assigned to one or the other region. That is, the number of photons in both regions must equal the sum of the number of photons in each region taken separately. With this in mind, the rules for determining whether a boundary image pixel or table row are assigned to a region are defined below. B For image filtering, pixels whose center is inside the boundary are included. This also applies non-radially-symmetric shapes. When a pixel center is exactly on the boundary, the pixel assignment rule is: =over 4 =item * the outer boundary of a symmetric shape does not include such pixels =item * the inner boundary of a symmetric shape (annulus) includes such pixels =back In this way, an annulus with radius from 0 to 1, centered exactly on a pixel, includes the pixel on which it is centered, but none of its neighbors. These rules ensure that when defining concentric shapes, no pixels are omitted between concentric regions and no pixels are claimed by two regions. When applied to small symmetric shapes, the shape is less likely to be skewed, as would happen with non-radially-symmetric rules. These rules differ from the rules for box-like shapes, which are more likely to be positioned adjacent to one another. B For image filtering, pixels whose center is inside the boundary are included. This also applies radially-symmetric shapes. When a pixel center is exactly on the boundary of a non-radially symmetric region, the pixel is included in the right or upper region, but not the left or lower region. This ensures that geometrically adjoining regions touch but don't overlap. B When filtering table rows, the boundary rules are the same as for images, except that the calculation is not done on the center of a pixel, (since table rows, especially X-ray events rows, often have discrete, floating point positions) but are calculated exactly. That is, an row is inside the boundary without regard to its integerized pixel value. For rows that are exactly on a region boundary, the above rules are applied to ensure that all rows are counted once and no row is counted more than once. Because row boundaries are calculated differently from image boundaries, certain programs will give different results when filtering the same region file. In particular, fundisp/funtable (which utilize analytic row filtering) perform differently from funcnts (which performs image filtering, even on tables). B You will sometimes notice a discrepancy between running funcnts on an binary table file and running fundisp on the same file with the same filter. For example, consider the following: fundisp test1.fits"[box(4219,3887,6,6,0)]" | wc 8893 320148 3752846 Since fundisp has a 2-line header, there are actually 8891 photons that pass the filter. But then run funtable and select only the rows that pass this filter, placing them in a new file: ./funtable test1.fits"[box(4219,3887,6,6,0)]" test2.fits Now run funcnts using the original filter on the derived file: ./funcnts test2.fits "physical; box(4219,3887,6,6,0)" [... lot of processed output ...] # the following source and background components were used: source region(s) ---------------- physical; box(4219,3887,6,6,0) reg counts pixels ---- ------------ --------- 1 7847.000 36 There are 1044 rows (events) that pass the row filter in fundisp (or funtable) but fail to make it through funcnts. Why? The reason can be traced to how analytic row filtering (fundisp, funtable) differs from integerized pixel filtering(funcnts, funimage). Consider the region: box(4219,3887,6,6,0) Analytically (i.e., using row filtering), positions will pass this filter successfully if: 4216 <= x <= 4222 3884 <= y <= 3890 For example, photons with position values of x=4216.4 or y=3884.08 will pass. Integerized image filtering is different in that the pixels that will pass this filter have centers at: x = 4217, 4218, 4219, 4220, 4221, 4222 y = 3885, 3886, 3887, 3888, 3889, 3890 Note that there are 6 pixels in each direction, as specified by the region. That means that positions will pass the filter successfully if: 4217 <= (int)x <= 4222 3885 <= (int)y <= 3890 Photons with position values of x=4216.4 or y=3884.08 will NOT pass. Note that the position values are integerized, in effect, binned into image values. This means that x=4222.4 will pass this filter, but not the analytic filter above. We do this to maintain the design goal that either all counts in a pixel are included in an integerized filter, or else none are included. [It could be argued that the correct photon limits for floating point row data really should be: 4216.5 <= x <= 4222.5 3884.5 <= y <= 3890.5 since each pixel extends for .5 on either side of the center. We chose to the maintain integerized algorithm for all image-style filtering so that funcnts would give the exact same results regardless of whether a table or a derived non-blocked binned image is used.] =head1 SEE ALSO See funtools(n) for a list of Funtools help pages =cut funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/pod/regcoords.pod000066400000000000000000000162661256243640000245330ustar00rootroot00000000000000=pod =head1 NAME B =head1 SYNOPSIS This document describes the specification of coordinate systems, and the interpretation of coordinate values, for spatial region filtering. =head1 DESCRIPTION B The default coordinate system for regions is PHYSICAL, which means that region position and size values are taken from the original data. (Note that this is a change from the original IRAF/PROS implementation, in which the IMAGE coordinate system was the default.) PHYSICAL coordinates always refer to pixel positions on the original image (using IRAF LTM and LTV keywords). With PHYSICAL coordinates, if a set of coordinates specifies the position of an object in an original FITS file, the same coordinates will specify the same object in any FITS derived from the original. Physical coordinates are invariant with blocking of FITS files or taking sections of images, even when a blocked section is written to a new file. Thus, although a value in pixels refers, by default, to the PHYSICAL coordinate system, you may specify that position values refer to the image coordinate system using the B or B properties commands: global coordsys image circle 512 512 100 The B command changes the coordinate system for all regions that follow, while the B command changes the coordinate system only for the region immediately following: local coordsys image circle 512 512 100 circle 1024 1024 200 This changes the coordinate system only for the region that follows. In the above example, the second region uses the global coordinate system (PHYSICAL by default). B If World Coordinate System information is contained in the data file being filtered, it also is possible to define regions using a sky coordinate system. Supported systems include: name description ---- ----------- PHYSICAL pixel coords of original file using LTM/LTV IMAGE pixel coords of current file FK4, B1950 sky coordinate systems FK5, J2000 sky coordinate systems GALACTIC sky coordinate systems ECLIPTIC sky coordinate systems ICRS currently same as J2000 LINEAR linear wcs as defined in file In addition, two mosaic coordinate systems have been defined that utilize the (evolving) IRAF mosaic keywords: name description ---- ----------- AMPLIFIER mosaic coords of original file using ATM/ATV DETECTOR mosaic coords of original file using DTM/DTV Again, to use one of these coordinate systems, the B or B properties commands are used: global coordsys galactic B In addition to pixels, positional values in a WCS-enabled region can be specified using sexagesimal or degrees format: position arguments description ------------------ ----------- [num] context-dependent (see below) [num]d degrees [num]r radians [num]p physical pixels [num]i image pixels [num]:[num]:[num] hms for 'odd' position arguments [num]:[num]:[num] dms for 'even' position arguments [num]h[num]m[num]s explicit hms [num]d[num]m[num]s explicit dms If ':' is used as sexagesimal separator, the value is considered to be specifying hours/minutes/seconds if it is the first argument of a positional pair, and degrees/minutes/seconds for the second argument of a pair (except for galactic coordinates, which always use degrees): argument description ----------- ----------- 10:20:30.0 10 hours, 20 minutes, 30 seconds for 1st positional argument 10 degrees, 20 minutes, 30 seconds for 2nd positional argument 10h20m30.0 10 hours, 20 minutes, 30 seconds 10d20m30.0 10 degrees, 20 minutes, 30 seconds 10.20d 10.2 degrees Similarly, the units of size values are defined by the formating character(s) attached to a number: size arguments description -------------- ----------- [num] context-dependent (see below) [num]" arc seconds [num]' arc minutes [num]d degrees [num]r radians [num]p physical pixels [num]i image pixels For example: argument description ----------- ----------- 10 ten pixels 10' ten minutes of arc 10" ten seconds of arc 10d ten degrees 10p ten pixels 0.5r half of a radian An example of using sky coordinate systems follows: global coordsys B1950 -box 175.54d 20.01156d 10' 10' local coordsys J2000 pie 179.57d 22.4d 0 360 n=4 && annulus 179.57d 22.4d 3' 24' n=5 At the FK4 1950 coordinates 175.54d RA, 20.01156d DEC exclude a 10 minute by 10 minute box. Then at the FK5 2000 coordinates 179.57d RA 22.4d DEC draw a radial profile regions pattern with 4 quadrants and 5 annuli ranging from 3 minutes to 24 minutes in diameter. In this example, the default coordinate system is overridden by the commands in the regions spec. B When a "pure number" (i.e. one without a format directive such as 'd' for 'degrees') is specified as a position or size, its interpretation depends on the context defined by the 'coordsys' keyword. In general, the rule is: All pure numbers have implied units corresponding to the current coordinate system. If no coordinate system is explicitly specified, the default system is implicitly assumed to be PHYSICAL. In practice this means that for IMAGE and PHYSICAL systems, pure numbers are pixels. Otherwise, for all systems other than LINEAR, pure numbers are degrees. For LINEAR systems, pure numbers are in the units of the linear system. This rule covers both positions and sizes. As a corollary, when a sky-formatted number is used with the IMAGE or PHYSICAL coordinate system (which includes the default case of no coordsys being specified), the formatted number is assumed to be in the units of the WCS contained in the current file. If no sky WCS is specified, an error results. Examples: circle(512,512,10) ellipse 202.44382d 47.181656d 0.01d 0.02d In the absence of a specified coordinate system, the circle uses the default PHYSICAL units of pixels, while the ellipse explicitly uses degrees, presumably to go with the WCS in the current file. global coordsys=fk5 global color=green font="system 10 normal" circle 202.44382 47.181656 0.01 circle 202.44382 47.181656 10p ellipse(512p,512p,10p,15p,20) Here, the circles use the FK5 units of degrees (except for the explicit use of pixels in the second radius), while the ellipse explicitly specifies pixels. The ellipse angle is in degrees. Note that Chandra data format appears to use "coordsys=physical" implicitly. Therefore, for most Chandra applications, valid regions can be generated safely by asking ds9 to save/display regions in pixels using the PHYSICAL coordsys. =head1 SEE ALSO See funtools(n) for a list of Funtools help pages =cut funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/pod/regdiff.pod000066400000000000000000000035131256243640000241410ustar00rootroot00000000000000=pod =head1 NAME B =head1 SYNOPSIS Describes the differences between Funtools/ds9 regions and the old IRAF/PROS regions. =head1 DESCRIPTION We have tried to make Funtools regions compatible with their predecessor, IRAF/PROS regions. For simple regions and simple boolean algebra between regions, there should be no difference between the two implementations. The following is a list of differences and incompatibilities between the two: =over 4 =item * If a pixel is covered by two different regions expressions, Funtools assigns the mask value of the B region that contains that pixel. That is, successive regions B overwrite previous regions in the mask, as was the case with the original PROS regions. This means that one must define overlapping regions in the reverse order in which they were defined in PROS. If region N is fully contained within region M, then N should be defined B M, or else it will be "covered up" by the latter. This change is necessitated by the use of optimized filter compilation, i.e., Funtools only tests individual regions until a proper match is made. =item * The B region has replaced the old PROS syntax in which a B accelerator was combined with an B accelerator using B. That is, ANNULUS(20,20,0,15,n=4) & PIE(20,20,0,360,n=3) has been replaced by: PANDA(20,20,0,360,3,0,15,4) The PROS syntax was inconsistent with the meaning of the B operator. =item * The meaning of pure numbers (i.e., without format specifiers) in regions has been clarified, as has the syntax for specifying coordinate systems. See the general discussion on Spatial Region Filtering for more information. =back =head1 SEE ALSO See funtools(n) for a list of Funtools help pages =cut funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/pod/reggeometry.pod000066400000000000000000001317771256243640000251020ustar00rootroot00000000000000=pod =head1 NAME B =head1 SYNOPSIS This document describes the geometry of regions available for spatial filtering in IRAF/PROS analysis. =head1 DESCRIPTION B Several geometric shapes are used to describe regions. The valid shapes are: shape: arguments: ----- ---------------------------------------- ANNULUS xcenter ycenter inner_radius outer_radius BOX xcenter ycenter xwidth yheight (angle) CIRCLE xcenter ycenter radius ELLIPSE xcenter ycenter xwidth yheight (angle) FIELD none LINE x1 y1 x2 y2 PIE xcenter ycenter angle1 angle2 POINT x1 y1 POLYGON x1 y1 x2 y2 ... xn yn All arguments are real values; integer values are automatically converted to real where necessary. All angles are in degrees and specify angles that run counter-clockwise from the positive y-axis. Shapes can be specified using "command" syntax: [shape] arg1 arg2 ... or using "routine" syntax: [shape](arg1, arg2, ...) or by any combination of the these. (Of course, the parentheses must balance and there cannot be more commas than necessary.) The shape keywords are case-insensitive. Furthermore, any shape can be specified by a three-character unique abbreviation. For example, one can specify three circular regions as: "foo.fits[CIRCLE 512 512 50;CIR(128 128, 10);cir(650,650,20)]" (Quotes generally are required to protect the region descriptor from being processed by the Unix shell.) The B shape specifies annuli, centered at xcenter, ycenter, with inner and outer radii (r1, r2). For example, ANNULUS 25 25 5 10 specifies an annulus centered at 25.0 25.0 with an inner radius of 5.0 and an outer radius of 10. Assuming (as will be done for all examples in this document, unless otherwise noted) this shape is used in a mask of size 40x40, it will look like this: 1234567890123456789012345678901234567890 ---------------------------------------- 40:........................................ 39:........................................ 38:........................................ 37:........................................ 36:........................................ 35:........................................ 34:....................111111111........... 33:...................11111111111.......... 32:.................111111111111111........ 31:.................111111111111111........ 30:................11111111111111111....... 29:...............1111111.....1111111...... 28:...............111111.......111111...... 27:...............11111.........11111...... 26:...............11111.........11111...... 25:...............11111.........11111...... 24:...............11111.........11111...... 23:...............11111.........11111...... 22:...............111111.......111111...... 21:...............1111111.....1111111...... 20:................11111111111111111....... 19:.................111111111111111........ 18:.................111111111111111........ 17:...................11111111111.......... 16:....................111111111........... 15:........................................ 14:........................................ 13:........................................ 12:........................................ 11:........................................ 10:........................................ 9:........................................ 8:........................................ 7:........................................ 6:........................................ 5:........................................ 4:........................................ 3:........................................ 2:........................................ 1:........................................ The B shape specifies an orthogonally oriented box, centered at xcenter, ycenter, of size xwidth, yheight. It requires four arguments and accepts an optional fifth argument to specify a rotation angle. When the rotation angle is specified (in degrees), the box is rotated by an angle that runs counter-clockwise from the positive y-axis. The B shape specifies a rotated box, centered at xcenter, ycenter, of size xwidth, yheight. The box is rotated by an angle specified in degrees that runs counter-clockwise from the positive y-axis. If the angle argument is omitted, it defaults to 0. The B shape specifies a circle, centered at xcenter, ycenter, of radius r. It requires three arguments. The B shape specifies an ellipse, centered at xcenter, ycenter, with y-axis width a and the y-axis length b defined such that: x**2/a**2 + y**2/b**2 = 1 Note that a can be less than, equal to, or greater than b. The ellipse is rotated the specified number of degrees. The rotation is done according to astronomical convention, counter-clockwise from the positive y-axis. An ellipse defined by: ELLIPSE 20 20 5 10 45 will look like this: 1234567890123456789012345678901234567890 ---------------------------------------- 40:........................................ 39:........................................ 38:........................................ 37:........................................ 36:........................................ 35:........................................ 34:........................................ 33:........................................ 32:........................................ 31:........................................ 30:........................................ 29:........................................ 28:........................................ 27:............111111...................... 26:............11111111.................... 25:............111111111................... 24:............11111111111................. 23:............111111111111................ 22:............111111111111................ 21:.............111111111111............... 20:.............1111111111111.............. 19:..............111111111111.............. 18:...............111111111111............. 17:...............111111111111............. 16:................11111111111............. 15:..................111111111............. 14:...................11111111............. 13:.....................111111............. 12:........................................ 11:........................................ 10:........................................ 9:........................................ 8:........................................ 7:........................................ 6:........................................ 5:........................................ 4:........................................ 3:........................................ 2:........................................ 1:........................................ The B shape specifies the entire field as a region. It is not usually specified explicitly, but is used implicitly in the case where no regions are specified, that is, in cases where either a null string or some abbreviation of the string "none" is input. B takes no arguments. The B shape specifies an angular wedge of the entire field, centered at xcenter, ycenter. The wedge runs between the two specified angles. The angles are given in degrees, running counter-clockwise from the positive x-axis. For example, PIE 20 20 90 180 defines a region from 90 degrees to 180 degrees, i.e., quadrant 2 of the Cartesian plane. The display of such a region looks like this: 1234567890123456789012345678901234567890 ---------------------------------------- 40:11111111111111111111.................... 39:11111111111111111111.................... 38:11111111111111111111.................... 37:11111111111111111111.................... 36:11111111111111111111.................... 35:11111111111111111111.................... 34:11111111111111111111.................... 33:11111111111111111111.................... 32:11111111111111111111.................... 31:11111111111111111111.................... 30:11111111111111111111.................... 29:11111111111111111111.................... 28:11111111111111111111.................... 27:11111111111111111111.................... 26:11111111111111111111.................... 25:11111111111111111111.................... 24:11111111111111111111.................... 23:11111111111111111111.................... 22:11111111111111111111.................... 21:11111111111111111111.................... 20:........................................ 19:........................................ 18:........................................ 17:........................................ 16:........................................ 15:........................................ 14:........................................ 13:........................................ 12:........................................ 11:........................................ 10:........................................ 9:........................................ 8:........................................ 7:........................................ 6:........................................ 5:........................................ 4:........................................ 3:........................................ 2:........................................ 1:........................................ The pie slice specified is always a counter-clockwise sweep between the angles, starting at the first angle and ending at the second. Thus: PIE 10 15 30 60 describes a 30 degree sweep from 2 o'clock to 1 o'clock, while: PIE 10 15 60 30 describes a 330 degree counter-clockwise sweep from 1 o'clock to 2 o'clock passing through 12 o'clock (0 degrees). Note in both of these examples that the center of the slice can be anywhere on the plane. The second mask looks like this: 1234567890123456789012345678901234567890 ---------------------------------------- 40:111111111111111111111111................ 39:11111111111111111111111................. 38:11111111111111111111111................. 37:1111111111111111111111.................. 36:1111111111111111111111.................. 35:111111111111111111111................... 34:11111111111111111111.................... 33:11111111111111111111.................... 32:1111111111111111111....................1 31:1111111111111111111..................111 30:111111111111111111.................11111 29:111111111111111111................111111 28:11111111111111111...............11111111 27:1111111111111111..............1111111111 26:1111111111111111.............11111111111 25:111111111111111............1111111111111 24:111111111111111..........111111111111111 23:11111111111111.........11111111111111111 22:11111111111111........111111111111111111 21:1111111111111.......11111111111111111111 20:111111111111......1111111111111111111111 19:111111111111....111111111111111111111111 18:11111111111....1111111111111111111111111 17:11111111111..111111111111111111111111111 16:1111111111.11111111111111111111111111111 15:1111111111111111111111111111111111111111 14:1111111111111111111111111111111111111111 13:1111111111111111111111111111111111111111 12:1111111111111111111111111111111111111111 11:1111111111111111111111111111111111111111 10:1111111111111111111111111111111111111111 9:1111111111111111111111111111111111111111 8:1111111111111111111111111111111111111111 7:1111111111111111111111111111111111111111 6:1111111111111111111111111111111111111111 5:1111111111111111111111111111111111111111 4:1111111111111111111111111111111111111111 3:1111111111111111111111111111111111111111 2:1111111111111111111111111111111111111111 1:1111111111111111111111111111111111111111 The pie slice goes to the edge of the field. To limit its scope, pie usually is is combined with other shapes, such as circles and annuli, using boolean operations. (See below and in "help regalgebra"). Pie Performance Notes: Pie region processing time is proportional to the size of the image, and not the size of the region. This is because the pie shape is the only infinite length shape, and we essentially must check all y rows for inclusion (unlike other regions, where the y limits can be calculated beforehand). Thus, pie can run very slowly on large images. In particular, it will run MUCH more slowly than the panda shape in image-based region operations (such as funcnts). We recommend use of panda over pie where ever possible. If you must use pie, always try to put it last in a boolean && expression. The reason for this is that the filter code is optimized to exit as soon as the result is know. Since pie is the slowest region, it is better to avoid executing it if another region can decide the result. Consider, for example, the difference in time required to process a Chandra ACIS file when a pie and circle are combined in two different orders: time ./funcnts nacis.fits "circle 4096 4096 100 && pie 4096 4096 10 78" 2.87u 0.38s 0:35.08 9.2% time ./funcnts nacis.fits "pie 4096 4096 10 78 && circle 4096 4096 100 " 89.73u 0.36s 1:03.50 141.8% Black-magic performance note: Panda region processing uses a B pie region instead of the normal pie region when combining its annulus and pie shapes. This B shape differs from the normal pie in that it utilizes the y limits from the previous region with which it is combined. In a panda shape, which is a series of annuli combined with pies, the processing time is thus reduced to that of the annuli. You can use the qtpie shape instead of pie in cases where you are combining pie with another shape using the && operator. This will cause the pie limits to be set using limits from the other shape, and will speed up the processing considerably. For example, the above execution of funcnts can be improved considerably using this technique: time ./funcnts nacis.fits "circle 4096 4096 100 && qtpie 4096 4096 10 78" 4.66u 0.33s 0:05.87 85.0% We emphasize that this is a quasi-documented feature and might change in the future. The qtpie shape is not recognized by ds9 or other programs. The B shape allows single pixels in a line between (x1,y1) and (x2,y2) to be included or excluded. For example: LINE (5,6, 24,25) displays as: 1234567890123456789012345678901234567890 ---------------------------------------- 40:........................................ 39:........................................ 38:........................................ 37:........................................ 36:........................................ 35:........................................ 34:........................................ 33:........................................ 32:........................................ 31:........................................ 30:........................................ 29:........................................ 28:........................................ 27:........................................ 26:........................................ 25:.......................1................ 24:......................1................. 23:.....................1.................. 22:....................1................... 21:...................1.................... 20:..................1..................... 19:.................1...................... 18:................1....................... 17:...............1........................ 16:..............1......................... 15:.............1.......................... 14:............1........................... 13:...........1............................ 12:..........1............................. 11:.........1.............................. 10:........1............................... 9:.......1................................ 8:......1................................. 7:.....1.................................. 6:....1................................... 5:........................................ 4:........................................ 3:........................................ 2:........................................ 1:........................................ The B shape allows single pixels to be included or excluded. Although the (x,y) values are real numbers, they are truncated to integer and the corresponding pixel is included or excluded, as specified. Several points can be put in one region declaration; unlike the original IRAF implementation, each now is given a different region mask value. This makes it easier, for example, for funcnts to determine the number of photons in the individual pixels. For example, POINT (5,6, 10,11, 20,20, 35,30) will give the different region mask values to all four points, as shown below: 1234567890123456789012345678901234567890 ---------------------------------------- 40:........................................ 39:........................................ 38:........................................ 37:........................................ 36:........................................ 35:........................................ 34:........................................ 33:........................................ 32:........................................ 31:........................................ 30:..................................4..... 29:........................................ 28:........................................ 27:........................................ 26:........................................ 25:........................................ 24:........................................ 23:........................................ 22:........................................ 21:........................................ 20:...................3.................... 19:........................................ 18:........................................ 17:........................................ 16:........................................ 15:........................................ 14:........................................ 13:........................................ 12:........................................ 11:.........2.............................. 10:........................................ 9:........................................ 8:........................................ 7:........................................ 6:....1................................... 5:........................................ 4:........................................ 3:........................................ 2:........................................ 1:........................................ The B shape specifies a polygon with vertices (x1, y1) ... (xn, yn). The polygon is closed automatically: one should not specify the last vertex to be the same as the first. Any number of vertices are allowed. For example, the following polygon defines a right triangle as shown below: POLYGON (10,10, 10,30, 30,30) looks like this: 1234567890123456789012345678901234567890 ---------------------------------------- 40:........................................ 39:........................................ 38:........................................ 37:........................................ 36:........................................ 35:........................................ 34:........................................ 33:........................................ 32:........................................ 31:........................................ 30:..........11111111111111111111.......... 29:..........1111111111111111111........... 28:..........111111111111111111............ 27:..........11111111111111111............. 26:..........1111111111111111.............. 25:..........111111111111111............... 24:..........11111111111111................ 23:..........1111111111111................. 22:..........111111111111.................. 21:..........11111111111................... 20:..........1111111111.................... 19:..........111111111..................... 18:..........11111111...................... 17:..........1111111....................... 16:..........111111........................ 15:..........11111......................... 14:..........1111.......................... 13:..........111........................... 12:..........11............................ 11:..........1............................. 10:........................................ 9:........................................ 8:........................................ 7:........................................ 6:........................................ 5:........................................ 4:........................................ 3:........................................ 2:........................................ 1:........................................ Note that polygons can get twisted upon themselves if edge lines cross. Thus: POL (10,10, 20,20, 20,10, 10,20) will produce an area which is two triangles, like butterfly wings, as shown below: 1234567890123456789012345678901234567890 ---------------------------------------- 40:........................................ 39:........................................ 38:........................................ 37:........................................ 36:........................................ 35:........................................ 34:........................................ 33:........................................ 32:........................................ 31:........................................ 30:........................................ 29:........................................ 28:........................................ 27:........................................ 26:........................................ 25:........................................ 24:........................................ 23:........................................ 22:........................................ 21:........................................ 20:........................................ 19:..........1........1.................... 18:..........11......11.................... 17:..........111....111.................... 16:..........1111..1111.................... 15:..........1111111111.................... 14:..........1111..1111.................... 13:..........111....111.................... 12:..........11......11.................... 11:..........1........1.................... 10:........................................ 9:........................................ 8:........................................ 7:........................................ 6:........................................ 5:........................................ 4:........................................ 3:........................................ 2:........................................ 1:........................................ The following are combinations of pie with different shapes (called "panda" for "Pie AND Annulus") allow for easy specification of radial sections: shape: arguments: ----- --------- PANDA xcen ycen ang1 ang2 nang irad orad nrad # circular CPANDA xcen ycen ang1 ang2 nang irad orad nrad # circular BPANDA xcen ycen ang1 ang2 nang xwlo yhlo xwhi yhhi nrad (ang) # box EPANDA xcen ycen ang1 ang2 nang xwlo yhlo xwhi yhhi nrad (ang) # ellipse The B (B

ies B Bnnuli) shape can be used to create combinations of pie and annuli markers. It is analogous to a Cartesian product on those shapes, i.e., the result is several shapes generated by performing a boolean AND between pies and annuli. Thus, the panda and cpanda specify combinations of annulus and circle with pie, respectively and give identical results. The bpanda combines box and pie, while epanda combines ellipse and pie. Consider the example shown below: PANDA(20,20, 0,360,3, 0,15,4) Here, 3 pie slices centered at 20, 20 are combined with 4 annuli, also centered at 20, 20. The result is a mask with 12 regions (displayed in base 16 to save characters): 1234567890123456789012345678901234567890 ---------------------------------------- 40:........................................ 39:........................................ 38:........................................ 37:........................................ 36:........................................ 35:........................................ 34:..............44444444444............... 33:............444444444444444............. 32:...........88444444444444444............ 31:.........888844443333344444444.......... 30:........88888833333333333444444......... 29:........88888733333333333344444......... 28:.......8888877733333333333344444........ 27:......888887777332222233333344444....... 26:......888877777622222222333334444....... 25:.....88887777766622222222333334444...... 24:.....88887777666622222222233334444...... 23:.....88887777666651111222233334444...... 22:.....88877776666551111122223333444...... 21:.....88877776666555111122223333444...... 20:.....888777766665559999aaaabbbbccc...... 19:.....888777766665559999aaaabbbbccc...... 18:.....888777766665599999aaaabbbbccc...... 17:.....88887777666659999aaaabbbbcccc...... 16:.....888877776666aaaaaaaaabbbbcccc...... 15:.....888877777666aaaaaaaabbbbbcccc...... 14:......8888777776aaaaaaaabbbbbcccc....... 13:......888887777bbaaaaabbbbbbccccc....... 12:.......88888777bbbbbbbbbbbbccccc........ 11:........888887bbbbbbbbbbbbccccc......... 10:........888888bbbbbbbbbbbcccccc......... 9:.........8888ccccbbbbbcccccccc.......... 8:...........88ccccccccccccccc............ 7:............ccccccccccccccc............. 6:..............ccccccccccc............... 5:........................................ 4:........................................ 3:........................................ 2:........................................ 1:........................................ Several regions with different mask values can be combined in the same mask. This supports comparing data from the different regions. (For information on how to combine different shapes into a single region, see "help regalgebra".) For example, consider the following set of regions: ANNULUS 25 25 5 10 ELLIPSE 20 20 5 10 315 BOX 15 15 5 10 The resulting mask will look as follows: 1234567890123456789012345678901234567890 ---------------------------------------- 40:........................................ 39:........................................ 38:........................................ 37:........................................ 36:........................................ 35:........................................ 34:....................111111111........... 33:...................11111111111.......... 32:.................111111111111111........ 31:.................111111111111111........ 30:................11111111111111111....... 29:...............1111111.....1111111...... 28:...............111111.......111111...... 27:...............11111.222222..11111...... 26:...............111112222222..11111...... 25:...............111112222222..11111...... 24:...............111112222222..11111...... 23:...............111112222222..11111...... 22:...............111111222222.111111...... 21:..............211111112222.1111111...... 20:............322211111111111111111....... 19:............32222111111111111111........ 18:............22222111111111111111........ 17:............222222211111111111.......... 16:............22222222111111111........... 15:............222222222................... 14:............22222222.................... 13:............222222...................... 12:............33333....................... 11:............33333....................... 10:........................................ 9:........................................ 8:........................................ 7:........................................ 6:........................................ 5:........................................ 4:........................................ 3:........................................ 2:........................................ 1:........................................ Note that when a pixel is in 2 or more regions, it is arbitrarily assigned to a one of the regions in question (often based on how a give C compiler optimizes boolean expressions). B Two types of \fBaccelerators, to simplify region specification, are provided as natural extensions to the ways shapes are described. These are: extended lists of parameters, specifying multiple regions, valid for annulus, box, circle, ellipse, pie, and points; and B, valid for annulus, box, circle, ellipse, and pie (not point). In both cases, one specification is used to define several different regions, that is, to define shapes with different mask values in the region mask. The following regions accept B syntax: shape arguments ----- ------------------------------------------ ANNULUS xcenter ycenter radius1 radius2 ... radiusn ANNULUS xcenter ycenter inner_radius outer_radius n=[number] BOX xcenter ycenter xw1 yh1 xw2 yh2 ... xwn yhn (angle) BOX xcenter ycenter xwlo yhlo xwhi yhhi n=[number] (angle) CIRCLE xcenter ycenter r1 r2 ... rn # same as annulus CIRCLE xcenter ycenter rinner router n=[number] # same as annulus ELLIPSE xcenter ycenter xw1 yh1 xw2 yh2 ... xwn yhn (angle) ELLIPSE xcenter ycenter xwlo yhlo xwhi yhhi n=[number] (angle) PIE xcenter ycenter angle1 angle2 (angle3) (angle4) (angle5) ... PIE xcenter ycenter angle1 angle2 (n=[number]) POINT x1 y1 x2 y2 ... xn yn Note that the circle accelerators are simply aliases for the annulus accelerators. For example, several annuli at the same center can be specified in one region expression by specifying more than two radii. If B radii are specified, then B-1 annuli result, with the outer radius of each preceding annulus being the inner radius of the succeeding annulus. Each annulus is considered a separate region, and is given a separate mask value. For example, ANNULUS 20 20 0 2 5 10 15 20 specifies five different annuli centered at 20 20, and is equivalent to: ANNULUS 20.0 20.0 0 2 ANNULUS 20.0 20.0 2 5 ANNULUS 20.0 20.0 5 10 ANNULUS 20.0 20.0 10 15 ANNULUS 20.0 20.0 15 20 The mask is shown below: 1234567890123456789012345678901234567890 ---------------------------------------- 40:........................................ 39:.............5555555555555.............. 38:...........55555555555555555............ 37:.........555555555555555555555.......... 36:........55555555555555555555555......... 35:......555555555555555555555555555....... 34:.....55555555544444444444555555555...... 33:....5555555544444444444444455555555..... 32:....5555555444444444444444445555555..... 31:...555555444444444444444444444555555.... 30:..55555544444444444444444444444555555... 29:..55555544444443333333334444444555555... 28:.5555554444444333333333334444444555555.. 27:.5555544444433333333333333344444455555.. 26:555555444444333333333333333444444555555. 25:555554444443333333333333333344444455555. 24:555554444433333332222233333334444455555. 23:555554444433333322222223333334444455555. 22:555554444433333222222222333334444455555. 21:555554444433333222111222333334444455555. 20:555554444433333222111222333334444455555. 19:555554444433333222111222333334444455555. 18:555554444433333222222222333334444455555. 17:555554444433333322222223333334444455555. 16:555554444433333332222233333334444455555. 15:555554444443333333333333333344444455555. 14:555555444444333333333333333444444555555. 13:.5555544444433333333333333344444455555.. 12:.5555554444444333333333334444444555555.. 11:..55555544444443333333334444444555555... 10:..55555544444444444444444444444555555... 9:...555555444444444444444444444555555.... 8:....5555555444444444444444445555555..... 7:....5555555544444444444444455555555..... 6:.....55555555544444444444555555555...... 5:......555555555555555555555555555....... 4:........55555555555555555555555......... 3:.........555555555555555555555.......... 2:...........55555555555555555............ 1:.............5555555555555.............. For boxes and ellipses, if an odd number of arguments is specified, then the last argument is assumed to be an angle. Otherwise, the angle is assumed to be zero. For example: ellipse 20 20 3 5 6 10 9 15 12 20 45 specifies an 3 ellipses at a 45 degree angle: 1234567890123456789012345678901234567890 ---------------------------------------- 40:........................................ 39:........................................ 38:........................................ 37:........................................ 36:........33333333........................ 35:......333333333333...................... 34:.....3333333333333333................... 33:....333333333333333333.................. 32:....33333332222233333333................ 31:...3333332222222222333333............... 30:...33333222222222222233333.............. 29:...333332222222222222223333............. 28:...3333222222211112222223333............ 27:...33332222211111111222223333........... 26:...333322222111111111122223333.......... 25:...3333222211111111111122223333......... 24:....3332222111111..1111122223333........ 23:....333322211111.....11112222333........ 22:....33332222111.......11112223333....... 21:.....33322221111.......11122223333...... 20:.....33332221111.......11112223333...... 19:.....33332222111.......11112222333...... 18:......33332221111.......11122223333..... 17:.......33322221111.....111112223333..... 16:.......3333222211111..1111112222333..... 15:........3333222211111111111122223333.... 14:.........333322221111111111222223333.... 13:..........33332222211111111222223333.... 12:...........3333222222111122222223333.... 11:............333322222222222222233333.... 10:.............33333222222222222233333.... 9:..............3333332222222222333333.... 8:...............33333333222223333333..... 7:.................333333333333333333..... 6:..................3333333333333333...... 5:.....................333333333333....... 4:.......................33333333......... 3:........................................ 2:........................................ 1:........................................ Note in the above example that the lower limit is not part of the region for boxes, circles, and ellipses. This makes circles and annuli equivalent, i.e.: circle 20 20 5 10 15 20 annulus 20 20 5 10 15 20 both give the following region mask: 1234567890123456789012345678901234567890 ---------------------------------------- 40:........................................ 39:.............3333333333333.............. 38:...........33333333333333333............ 37:.........333333333333333333333.......... 36:........33333333333333333333333......... 35:......333333333333333333333333333....... 34:.....33333333322222222222333333333...... 33:....3333333322222222222222233333333..... 32:....3333333222222222222222223333333..... 31:...333333222222222222222222222333333.... 30:..33333322222222222222222222222333333... 29:..33333322222221111111112222222333333... 28:.3333332222222111111111112222222333333.. 27:.3333322222211111111111111122222233333.. 26:333333222222111111111111111222222333333. 25:333332222221111111111111111122222233333. 24:33333222221111111.....11111112222233333. 23:3333322222111111.......1111112222233333. 22:333332222211111.........111112222233333. 21:333332222211111.........111112222233333. 20:333332222211111.........111112222233333. 19:333332222211111.........111112222233333. 18:333332222211111.........111112222233333. 17:3333322222111111.......1111112222233333. 16:33333222221111111.....11111112222233333. 15:333332222221111111111111111122222233333. 14:333333222222111111111111111222222333333. 13:.3333322222211111111111111122222233333.. 12:.3333332222222111111111112222222333333.. 11:..33333322222221111111112222222333333... 10:..33333322222222222222222222222333333... 9:...333333222222222222222222222333333.... 8:....3333333222222222222222223333333..... 7:....3333333322222222222222233333333..... 6:.....33333333322222222222333333333...... 5:......333333333333333333333333333....... 4:........33333333333333333333333......... 3:.........333333333333333333333.......... 2:...........33333333333333333............ 1:.............3333333333333.............. As a final example, specifying several angles in one pie slice expression is equivalent to specifying several separate slices with the same center. As with the annulus, if B angles are specified, then B-1 slices result, with the ending angle of each preceding slice being the starting angle of the succeeding slice. Each slice is considered a separate region, and is given a separate mask value. For example, PIE 12 12 315 45 115 270 specifies three regions as shown below: 1234567890123456789012345678901234567890 ---------------------------------------- 40:2222222222222222222222222222222222222222 39:2222222222222222222222222222222222222221 38:2222222222222222222222222222222222222211 37:2222222222222222222222222222222222222111 36:2222222222222222222222222222222222221111 35:3222222222222222222222222222222222211111 34:3222222222222222222222222222222222111111 33:3322222222222222222222222222222221111111 32:3322222222222222222222222222222211111111 31:3332222222222222222222222222222111111111 30:3332222222222222222222222222221111111111 29:3333222222222222222222222222211111111111 28:3333222222222222222222222222111111111111 27:3333322222222222222222222221111111111111 26:3333322222222222222222222211111111111111 25:3333322222222222222222222111111111111111 24:3333332222222222222222221111111111111111 23:3333332222222222222222211111111111111111 22:3333333222222222222222111111111111111111 21:3333333222222222222221111111111111111111 20:3333333322222222222211111111111111111111 19:3333333322222222222111111111111111111111 18:3333333332222222221111111111111111111111 17:3333333332222222211111111111111111111111 16:3333333333222222111111111111111111111111 15:3333333333222221111111111111111111111111 14:3333333333322211111111111111111111111111 13:3333333333322111111111111111111111111111 12:33333333333.1111111111111111111111111111 11:3333333333331111111111111111111111111111 10:333333333333.111111111111111111111111111 9:333333333333..11111111111111111111111111 8:333333333333...1111111111111111111111111 7:333333333333....111111111111111111111111 6:333333333333.....11111111111111111111111 5:333333333333......1111111111111111111111 4:333333333333.......111111111111111111111 3:333333333333........11111111111111111111 2:333333333333.........1111111111111111111 1:333333333333..........111111111111111111 The annulus, box, circle, ellipse, and pie shapes also accept an B syntax for specifying multiple regions. The Bsyntax interprets the previous (shape-dependent) arguments as lower and upper limits for the region and creates n shapes with evenly spaced boundaries. For example, if B is specified in an annulus, the two immediately preceding radii (B and B) are divided into B annuli, such that the inner radius of the first is B and the outer radius of the last is B. For example, ANNULUS 20 20 5 20 n=3 is equivalent to: ANNULUS 20 20 5 10 15 20 If this syntax is used with an ellipse or box, then the two preceding pairs of values are taken to be lower and upper limits for a set of ellipses or boxes. A circle uses the two preceding arguments for upper and lower radii. For pie, the two preceding angles are divided into n wedges such that the starting angle of the first is the lower bound and the ending angle of the last is the upper bound. In all cases, the B syntax allows any single alphabetic character before the "=", i.e, i=3, z=3, etc. are all equivalent. Also note that for boxes and ellipses, the optional angle argument is always specified after the B syntax. For example: ellipse 20 20 4 6 16 24 n=3 45 specifies 3 elliptical regions at an angle of 45 degrees: 1234567890123456789012345678901234567890 ---------------------------------------- 40:........33333333........................ 39:.....33333333333333..................... 38:....33333333333333333................... 37:...33333333333333333333................. 36:..33333333333333333333333............... 35:.3333333333222223333333333.............. 34:3333333322222222222233333333............ 33:33333332222222222222223333333........... 32:333333222222222222222222333333.......... 31:3333322222222222222222222333333......... 30:33333222222222111122222222333333........ 29:333332222222111111112222222333333....... 28:3333222222211111111111222222333333...... 27:3333222222111111111111112222233333...... 26:33332222221111111111111112222233333..... 25:33332222211111111.111111112222233333.... 24:333322222111111......111111222223333.... 23:333322222111111.......111112222233333... 22:33333222221111.........11111222223333... 21:333332222211111.........11112222233333.. 20:.33332222211111.........11111222223333.. 19:.33333222221111.........111112222233333. 18:..33332222211111.........11112222233333. 17:..333332222211111.......111111222233333. 16:...333322222111111......111111222223333. 15:...333332222211111111.111111112222233333 14:....333332222211111111111111122222233333 13:.....33333222221111111111111122222233333 12:.....33333322222211111111111222222233333 11:......3333332222222111111112222222333333 10:.......333333222222221111222222222333333 9:........33333322222222222222222222333333 8:.........333333222222222222222222333333. 7:..........33333332222222222222223333333. 6:...........3333333322222222222233333333. 5:.............3333333333222223333333333.. 4:..............33333333333333333333333... 3:................33333333333333333333.... 2:..................33333333333333333..... 1:....................33333333333333...... Both the variable argument syntax and the B syntax must occur alone in a region descriptor (aside from the optional angle for boxes and ellipses). They cannot be combined. Thus, it is not valid to precede or follow an B accelerator with more angles or radii, as in this example: # INVALID -- one too many angles before a=5 ... # and no angles are allowed after a=5 PIE 12 12 10 25 50 a=5 85 135 Instead, use three separate specifications, such as: PIE 12 12 10 25 PIE 12 12 25 50 a=5 PIE 12 12 85 135 The original (IRAF) implementation of region filtering permitted this looser syntax, but we found it caused more confusion than it was worth and therefore removed it. NB: Accelerators may be combined with other shapes in a boolean expression in any order. (This is a change starting with funtools v1.1.1. Prior to this release, the accelerator shape had to be specified last). The actual region mask id values returned depend on the order in which the shapes are specified, although the total number of pixels or rows that pass the filter will be consistent. For this reason, use of accelerators in boolean expressions is discouraged in programs such as funcnts, where region mask id values are used to count events or image pixels. [All region masks displayed in this document were generated using the B routine and the undocumented "mask=all" argument (with spaced removed using sed ): fundisp "funtools/funtest/test40.fits[ANNULUS 25 25 5 10]" mask=all |\ sed 's/ //g' Note that you must supply an image of the appropriate size -- in this case, a FITS image of dimension 40x40 is used.] =head1 SEE ALSO See funtools(n) for a list of Funtools help pages =cut funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/programs.html000066400000000000000000004225501256243640000237730ustar00rootroot00000000000000 Funtools Programs

Funtools Programs

Summary


funcalc [-n] [-a argstr] [-e expr] [-f file] [-l link] [-p prog] [-u] <iname> [oname [columns]]

funcen [-i] [-n iter] [-t tol] [-v lev] <iname> <region>

funcnts [switches] <source_file> [source_region] [bkgd_file] [bkgd_region|bkgd_cnts]

funcone [-n] [-x|-X|-j|-J] [[-l|-L] list] [-r ra_col] [-d dec_col]  <iname> <oname> <ra[hdr]> <dec[hdr]> <radius[dr'"]> [columns]

fundisp [-f format] [-l] [-n] [-T] <iname> [columns|bitpix=n]

funhead [-a] [-l] [-s] [-t] [-L] <iname> [oname ename]

funhist [-n|-w|-T] <iname> [column] [[lo_edge:hi_edge:]bins] 

funimage [-a] [-l] [-p x|y] <iname> <oname>  [bitpix=n]

funindex <iname> <key> [oname]

funjoin [switches] <ifile1> <ifile2> ... <ifilen> <ofile> 

funmerge <iname1> <iname2> ... <oname>

funsky [switches] <iname1> [<lname2> <col1> <col2>]

funtable [-a] [-i|-z] [-m] [-s cols] <iname> <oname> [columns]

funtbl [-c cols] [-h] [-n table] [-p prog] [-s sep] [-T] <iname>

funcalc - Funtools calculator (for binary tables)

funcalc [-n] [-a argstr] [-e expr] [-f file] [-l link] [-p prog] <iname> [oname [columns]]

  -a argstr    # user arguments to pass to the compiled program
  -e expr      # funcalc expression
  -f file      # file containing funcalc expression
  -l libs      # libs to add to link command  
  -n           # output generated code instead of compiling and executing
  -p prog      # generate named program, no execution
  -u           # die if any variable is undeclared (don't auto-declare)

funcalc is a calculator program that allows arbitrary expressions to be constructed, compiled, and executed on columns in a Funtools table (FITS binary table or raw event file). It works by integrating user-supplied expression(s) into a template C program, then compiling and executing the program. funcalc expressions are C statements, although some important simplifications (such as automatic declaration of variables) are supported.

funcalc expressions can be specified in three ways: on the command line using the -e [expression] switch, in a file using the -f [file] switch, or from stdin (if neither -e nor -f is specified). Of course a file containing funcalc expressions can be read from stdin.

Each invocation of funcalc requires an input Funtools table file to be specified as the first command line argument. The output Funtools table file is the second optional argument. It is needed only if an output FITS file is being created (i.e., in cases where the funcalc expression only prints values, no output file is needed). If input and output file are both specified, a third optional argument can specify the list of columns to activate (using FunColumnActivate()). Note that funcalc determines whether or not to generate code for writing an output file based on the presence or absence of an output file argument.

A funcalc expression executes on each row of a table and consists of one or more C statements that operate on the columns of that row (possibly using temporary variables). Within an expression, reference is made to a column of the current row using the C struct syntax cur->[colname], e.g. cur->x, cur->pha, etc. Local scalar variables can be defined using C declarations at very the beginning of the expression, or else they can be defined automatically by funcalc (to be of type double). Thus, for example, a swap of columns x and y in a table can be performed using either of the following equivalent funcalc expressions:

  double temp;
  temp = cur->x;
  cur->x = cur->y;
  cur->y = temp;
or:
  temp = cur->x;
  cur->x = cur->y;
  cur->y = temp;
When this expression is executed using a command such as:
  funcalc -f swap.expr itest.ev otest.ev
the resulting file will have values of the x and y columns swapped.

By default, the data type of the variable for a column is the same as the data type of the column as stored in the file. This can be changed by appending ":[dtype]" to the first reference to that column. In the example above, to force x and y to be output as doubles, specify the type 'D' explicitly:

  temp = cur->x:D;
  cur->x = cur->y:D;
  cur->y = temp;
Data type specifiers follow standard FITS table syntax for defining columns using TFORM:
  • A: ASCII characters
  • B: unsigned 8-bit char
  • I: signed 16-bit int
  • U: unsigned 16-bit int (not standard FITS)
  • J: signed 32-bit int
  • V: unsigned 32-bit int (not standard FITS)
  • E: 32-bit float
  • D: 64-bit float
  • X: bits (treated as an array of chars)
Note that only the first reference to a column should contain the explicit data type specifier.

Of course, it is important to handle the data type of the columns correctly. One of the most frequent cause of error in funcalc programming is the implicit use of the wrong data type for a column in expression. For example, the calculation:

  dx = (cur->x - cur->y)/(cur->x + cur->y);
usually needs to be performed using floating point arithmetic. In cases where the x and y columns are integers, this can be done by reading the columns as doubles using an explicit type specification:
  dx = (cur->x:D - cur->y:D)/(cur->x + cur->y);
Alternatively, it can be done using C type-casting in the expression:
  dx = ((double)cur->x - (double)cur->y)/((double)cur->x + (double)cur->y);

In addition to accessing columns in the current row, reference also can be made to the previous row using prev->[colname], and to the next row using next->[colname]. Note that if prev->[colname] is specified in the funcalc expression, the very first row is not processed. If next->[colname] is specified in the funcalc expression, the very last row is not processed. In this way, prev and next are guaranteed always to point to valid rows. For example, to print out the values of the current x column and the previous y column, use the C fprintf function in a funcalc expression:

  fprintf(stdout, "%d %d\n", cur->x, prev->y);

New columns can be specified using the same cur->[colname] syntax by appending the column type (and optional tlmin/tlmax/binsiz specifiers), separated by colons. For example, cur->avg:D will define a new column of type double. Type specifiers are the same those used above to specify new data types for existing columns.

For example, to create and output a new column that is the average value of the x and y columns, a new "avg" column can be defined:

  cur->avg:D = (cur->x + cur->y)/2.0
Note that the final ';' is not required for single-line expressions.

As with FITS TFORM data type specification, the column data type specifier can be preceded by a numeric count to define an array, e.g., "10I" means a vector of 10 short ints, "2E" means two single precision floats, etc. A new column only needs to be defined once in a funcalc expression, after which it can be used without re-specifying the type. This includes reference to elements of a column array:

  cur->avg[0]:2D = (cur->x + cur->y)/2.0;
  cur->avg[1] = (cur->x - cur->y)/2.0;

The 'X' (bits) data type is treated as a char array of dimension (numeric_count/8), i.e., 16X is processed as a 2-byte char array. Each 8-bit array element is accessed separately:

  cur->stat[0]:16X  = 1;
  cur->stat[1]      = 2;
Here, a 16-bit column is created with the MSB is set to 1 and the LSB set to 2.

By default, all processed rows are written to the specified output file. If you want to skip writing certain rows, simply execute the C "continue" statement at the end of the funcalc expression, since the writing of the row is performed immediately after the expression is executed. For example, to skip writing rows whose average is the same as the current x value:

  cur->avg[0]:2D = (cur->x + cur->y)/2.0;
  cur->avg[1] = (cur->x - cur->y)/2.0;
  if( cur->avg[0] == cur->x )
    continue;

If no output file argument is specified on the funcalc command line, no output file is opened and no rows are written. This is useful in expressions that simply print output results instead of generating a new file:

  fpv = (cur->av3:D-cur->av1:D)/(cur->av1+cur->av2:D+cur->av3);
  fbv =  cur->av2/(cur->av1+cur->av2+cur->av3);
  fpu = ((double)cur->au3-cur->au1)/((double)cur->au1+cur->au2+cur->au3);
  fbu =  cur->au2/(double)(cur->au1+cur->au2+cur->au3);
  fprintf(stdout, "%f\t%f\t%f\t%f\n", fpv, fbv, fpu, fbu);
In the above example, we use both explicit type specification (for "av" columns) and type casting (for "au" columns) to ensure that all operations are performed in double precision.

When an output file is specified, the selected input table is processed and output rows are copied to the output file. Note that the output file can be specified as "stdout" in order to write the output rows to the standard output. If the output file argument is passed, an optional third argument also can be passed to specify which columns to process.

In a FITS binary table, it sometimes is desirable to copy all of the other FITS extensions to the output file as well. This can be done by appending a '+' sign to the name of the extension in the input file name. See funtable for a related example.

funcalc works by integrating the user-specified expression into a template C program called tabcalc.c. The completed program then is compiled and executed. Variable declarations that begin the funcalc expression are placed in the local declaration section of the template main program. All other lines are placed in the template main program's inner processing loop. Other details of program generation are handled automatically. For example, column specifiers are analyzed to build a C struct for processing rows, which is passed to FunColumnSelect() and used in FunTableRowGet(). If an unknown variable is used in the expression, resulting in a compilation error, the program build is retried after defining the unknown variable to be of type double.

Normally, funcalc expression code is added to funcalc row processing loop. It is possible to add code to other parts of the program by placing this code inside special directives of the form:

  [directive name]
    ... code goes here ...
  end
The directives are:
  • global add code and declarations in global space, before the main routine.
  • local add declarations (and code) just after the local declarations in main
  • before add code just before entering the main row processing loop
  • after add code just after exiting the main row processing loop
Thus, the following funcalc expression will declare global variables and make subroutine calls just before and just after the main processing loop:
  global
    double v1, v2;
    double init(void);
    double finish(double v);
  end
  before
    v1  = init();
  end
  ... process rows, with calculations using v1 ...
  after
    v2 = finish(v1);
    if( v2 < 0.0 ){
      fprintf(stderr, "processing failed %g -> %g\n", v1, v2);
      exit(1);
    }
  end
Routines such as init() and finish() above are passed to the generated program for linking using the -l [link directives ...] switch. The string specified by this switch will be added to the link line used to build the program (before the funtools library). For example, assuming that init() and finish() are in the library libmysubs.a in the /opt/special/lib directory, use:
  funcalc  -l "-L/opt/special/lib -lmysubs" ...

User arguments can be passed to a compiled funcalc program using a string argument to the "-a" switch. The string should contain all of the user arguments. For example, to pass the integers 1 and 2, use:

  funcalc -a "1 2" ...
The arguments are stored in an internal array and are accessed as strings via the ARGV(n) macro. For example, consider the following expression:
  local
    int pmin, pmax;
  end

  before
    pmin=atoi(ARGV(0));
    pmax=atoi(ARGV(1));
  end

  if( (cur->pha >= pmin) && (cur->pha <= pmax) )
    fprintf(stderr, "%d %d %d\n", cur->x, cur->y, cur->pha);
This expression will print out x, y, and pha values for all rows in which the pha value is between the two user-input values:
  funcalc -a '1 12' -f foo snr.ev'[cir 512 512 .1]'
  512 512 6
  512 512 8
  512 512 5
  512 512 5
  512 512 8

  funcalc -a '5 6' -f foo snr.ev'[cir 512 512 .1]'
  512 512 6
  512 512 5
  512 512 5

Note that it is the user's responsibility to ensure that the correct number of arguments are passed. The ARGV(n) macro returns a NULL if a requested argument is outside the limits of the actual number of args, usually resulting in a SEGV if processed blindly. To check the argument count, use the ARGC macro:

  local
    long int seed=1;
    double limit=0.8;
  end

  before
    if( ARGC >= 1 ) seed = atol(ARGV(0));
    if( ARGC >= 2 ) limit = atof(ARGV(1));
    srand48(seed);
  end

  if ( drand48() > limit ) continue;

The macro WRITE_ROW expands to the FunTableRowPut() call that writes the current row. It can be used to write the row more than once. In addition, the macro NROW expands to the row number currently being processed. Use of these two macros is shown in the following example:

  if( cur->pha:I == cur->pi:I ) continue;
  a = cur->pha;
  cur->pha = cur->pi;
  cur->pi = a;
  cur->AVG:E  = (cur->pha+cur->pi)/2.0;
  cur->NR:I = NROW;
  if( NROW < 10 ) WRITE_ROW;

If the -p [prog] switch is specified, the expression is not executed. Rather, the generated executable is saved with the specified program name for later use.

If the -n switch is specified, the expression is not executed. Rather, the generated code is written to stdout. This is especially useful if you want to generate a skeleton file and add your own code, or if you need to check compilation errors. Note that the comment at the start of the output gives the compiler command needed to build the program on that platform. (The command can change from platform to platform because of the use of different libraries, compiler switches, etc.)

As mentioned previously, funcalc will declare a scalar variable automatically (as a double) if that variable has been used but not declared. This facility is implemented using a sed script named funcalc.sed, which processes the compiler output to sense an undeclared variable error. This script has been seeded with the appropriate error information for gcc, and for cc on Solaris, DecAlpha, and SGI platforms. If you find that automatic declaration of scalars is not working on your platform, check this sed script; it might be necessary to add to or edit some of the error messages it senses.

In order to keep the lexical analysis of funcalc expressions (reasonably) simple, we chose to accept some limitations on how accurately C comments, spaces, and new-lines are placed in the generated program. In particular, comments associated with local variables declared at the beginning of an expression (i.e., not in a local...end block) will usually end up in the inner loop, not with the local declarations:

  /* this comment will end up in the wrong place (i.e, inner loop) */
  double a; /* also in wrong place */
  /* this will be in the the right place (inner loop) */
  if( cur->x:D == cur->y:D ) continue; /* also in right place */
  a = cur->x;
  cur->x = cur->y;
  cur->y = a;
  cur->avg:E  = (cur->x+cur->y)/2.0;
Similarly, spaces and new-lines sometimes are omitted or added in a seemingly arbitrary manner. Of course, none of these stylistic blemishes affect the correctness of the generated code.

Because funcalc must analyze the user expression using the data file(s) passed on the command line, the input file(s) must be opened and read twice: once during program generation and once during execution. As a result, it is not possible to use stdin for the input file: funcalc cannot be used as a filter. We will consider removing this restriction at a later time.

Along with C comments, funcalc expressions can have one-line internal comments that are not passed on to the generated C program. These internal comment start with the # character and continue up to the new-line:

  double a; # this is not passed to the generated C file
  # nor is this
  a = cur->x;
  cur->x = cur->y;
  cur->y = a;
  /* this comment is passed to the C file */
  cur->avg:E  = (cur->x+cur->y)/2.0;

As previously mentioned, input columns normally are identified by their being used within the inner event loop. There are rare cases where you might want to read a column and process it outside the main loop. For example, qsort might use a column in its sort comparison routine that is not processed inside the inner loop (and therefore not implicitly specified as a column to be read). To ensure that such a column is read by the event loop, use the explicit keyword. The arguments to this keyword specify columns that should be read into the input record structure even though they are not mentioned in the inner loop. For example:

  explicit pi pha
will ensure that the pi and pha columns are read for each row, even if they are not processed in the inner event loop. The explicit statement can be placed anywhere.

Finally, note that funcalc currently works on expressions involving FITS binary tables and raw event files. We will consider adding support for image expressions at a later point, if there is demand for such support from the community.

funcen - find centroid (for binary tables)

funcen [-i] [-n iter] [-t tol] [-v lev] <iname> <region>

  -i            # use image filtering (default: event filtering)
  -n iter       # max number of iterations (default: 0)
  -t tol        # pixel tolerance distance (default: 1.0)
  -v [0,1,2,3]  # output verbosity level (default: 0)

funcen iteratively calculates the centroid position within one or more regions of a Funtools table (FITS binary table or raw event file). Starting with an input table, an initial region specification, and an iteration count, the program calculates the average x and y position within the region and then uses this new position as the region center for the next iteration. Iteration terminates when the maximum number of iterations is reached or when the input tolerance distance is met for that region. A count of events in the final region is then output, along with the pixel position value (and, where available, WCS position).

The first argument to the program specifies the Funtools table file to process. Since the file must be read repeatedly, a value of "stdin" is not permitted when the number of iterations is non-zero. Use Funtools Bracket Notation to specify FITS extensions and filters.

The second required argument is the initial region descriptor. Multiple regions are permitted. However, compound regions (accelerators, variable argument regions and regions connected via boolean algebra) are not permitted. Points and polygons also are illegal. These restrictions might be lifted in a future version, if warranted.

The -n (iteration number) switch specifies the maximum number of iterations to perform. The default is 0, which means that the program will simply count and display the number of events in the initial region(s). Note that when iterations is 0, the data can be input via stdin.

The -t (tolerance) switch specifies a floating point tolerance value. If the distance between the current centroid position value and the last position values is less than this value, iteration terminates. The default value is 1 pixel.

The -v (verbosity) switch specifies the verbosity level of the output. The default is 0, which results in a single line of output for each input region consisting of the following values:

  counts x y [ra dec coordsys]
The last 3 WCS values are output if WCS information is available in the data file header. Thus, for example:
  [sh] funcen -n 0 snr.ev "cir 505 508 5"
  915 505.00 508.00 345.284038 58.870920 j2000

  [sh] funcen -n 3 snr.ev "cir 505 508 5"
  1120 504.43 509.65 345.286480 58.874587 j2000
The first example simply counts the number of events in the initial region. The second example iterates the centroid calculation three times to determine a final "best" position.

Higher levels of verbosity obviously imply more verbose output. At level 1, the output essentially contains the same information as level 0, but with keyword formatting: [sh] funcen -v 1 -n 3 snr.ev "cir 505 508 5" event_file: snr.ev initial_region: cir 505 508 5 tolerance: 1.0000 iterations: 1 events: 1120 x,y(physical): 504.43 509.65 ra,dec(j2000): 345.286480 58.874587 final_region1: cir 504.43 509.65 5 Level 2 outputs results from intermediate calculations as well.

Ordinarily, region filtering is performed using analytic (event) filtering, i.e. that same style of filtering as is performed by fundisp and funtable. Use the -i switch to specify image filtering, i.e. the same style filtering as is performed by funcnts. Thus, you can perform a quick calculation of counts in regions, using either the analytic or image filtering method, by specifying the -n 0 and optional -i switches. These two method often give different results because of how boundary events are processed:

  [sh] funcen  snr.ev "cir 505 508 5"
  915 505.00 508.00 345.284038 58.870920 j2000

  [sh] funcen -i snr.ev "cir 505 508 5"
  798 505.00 508.00 345.284038 58.870920 j2000
See Region Boundaries for more information about how boundaries are calculated using these two methods.

funcnts - count photons in specified regions, with bkgd subtraction

funcnts  [switches] <source_file> [source_region] [bkgd_file] [bkgd_region|bkgd_value]

  -e "source_exposure[;bkgd_exposure]"
                # source (bkgd) FITS exposure image using matching files
  -w "source_exposure[;bkgd_exposure]"
                # source (bkgd) FITS exposure image using WCS transform
  -t "source_timecorr[;bkgd_timecorr]"
                # source (bkgd) time correction value or header parameter name
  -g            # output using nice g format
  -G            # output using %.14g format (maximum precision)
  -i "[column;]int1;int2..." # column-based intervals
  -m            # match individual source and bkgd regions
  -p            # output in pixels, even if wcs is present
  -r            # output inner/outer radii (and angles) for annuli (and pandas)
  -s            # output summed values
  -v "scol[;bcol]" # src and bkgd value columns for tables
  -T            # output in starbase/rdb format
  -z            # output regions with zero area

funcnts counts photons in the specified source regions and reports the results for each region. Regions are specified using the Spatial Region Filtering mechanism. Photons are also counted in the specified bkgd regions applied to the same data file or a different data file. (Alternatively, a constant background value in counts/pixel**2 can be specified.) The bkgd regions are either paired one-to-one with source regions or pooled and normalized by area, and then subtracted from the source counts in each region. Displayed results include the bkgd-subtracted counts in each region, as well as the error on the counts, the area in each region, and the surface brightness (cnts/area**2) calculated for each region.

The first argument to the program specifies the FITS input image, array, or raw event file to process. If "stdin" is specified, data are read from the standard input. Use Funtools Bracket Notation to specify FITS extensions, image sections, and filters.

The optional second argument is the source region descriptor. If no region is specified, the entire field is used.

The background arguments can take one of two forms, depending on whether a separate background file is specified. If the source file is to be used for background as well, the third argument can be either the background region, or a constant value denoting background cnts/pixel. Alternatively, the third argument can be a background data file, in which case the fourth argument is the background region. If no third argument is specified, a constant value of 0 is used (i.e., no background).

In summary, the following command arguments are valid:

  [sh] funcnts sfile                        # counts in source file
  [sh] funcnts sfile sregion                # counts in source region
  [sh] funcnts sfile sregion bregion        # bkgd reg. is from source file
  [sh] funcnts sfile sregion bvalue         # bkgd reg. is constant
  [sh] funcnts sfile sregion bfile bregion  # bkgd reg. is from separate file

NB: unlike other Funtools programs, source and background regions are specified as separate arguments on the command line, rather than being placed inside brackets as part of the source and background filenames. This is because regions in funcnts are not simply used as data filters, but also are used to calculate areas, exposure, etc. If you put the source region inside the brackets (i.e. use it simply as a filter) rather than specifying it as argument two, the program still will only count photons that pass the region filter. However, the area calculation will be performed on the whole field, since field() is the default source region. This rarely is the desired behavior. On the other hand, with FITS binary tables, it often is useful to put a column filter in the filename brackets, so that only events matching the column filter are counted inside the region.

For example, to extract the counts within a radius of 22 pixels from the center of the FITS binary table snr.ev and subtract the background determined from the same image within an annulus of radii 50-100 pixels:

  [sh] funcnts snr.ev "circle(502,512,22)" "annulus(502,512,50,100)"
  # source
  #   data file:        snr.ev
  #   degrees/pix:      0.00222222
  # background
  #   data file:        snr.ev
  # column units
  #   area:             arcsec**2
  #   surf_bri:         cnts/arcsec**2
  #   surf_err:         cnts/arcsec**2

  # background-subtracted results
   reg   net_counts     error   background    berror      area  surf_bri  surf_err
  ---- ------------ --------- ------------ --------- --------- --------- ---------
     1     3826.403    66.465      555.597     5.972  96831.98     0.040     0.001
  

  # the following source and background components were used:
  source region(s)
  ----------------
  circle(502,512,22)
  
   reg       counts    pixels
  ---- ------------ ---------
     1     4382.000      1513
  
  background region(s)
  --------------------
  annulus(502,512,50,100)
  
   reg       counts    pixels
  ---- ------------ ---------
  all      8656.000     23572
The area units for the output columns labeled "area", "surf_bri" (surface brightness) and "surf_err" will be given either in arc-seconds (if appropriate WCS information is in the data file header(s)) or in pixels. If the data file has WCS info, but you do not want arc-second units, use the -p switch to force output in pixels. Also, regions having zero area are not normally included in the primary (background-subtracted) table, but are included in the secondary source and bkgd tables. If you want these regions to be included in the primary table, use the -z switch.

Note that a simple sed command will extract the background-subtracted results for further analysis:

  [sh] cat funcnts.sed
  1,/---- .*/d
  /^$/,$d

  [sh] sed -f funcnts.sed funcnts.out
  1     3826.403    66.465      555.597     5.972  96831.98     0.040     0.001

If separate source and background files are specified, funcnts will attempt to normalize the the background area so that the background pixel size is the same as the source pixel size. This normalization can only take place if the appropriate WCS information is contained in both files (e.g. degrees/pixel values in CDELT). If either file does not contain the requisite size information, the normalization is not performed. In this case, it is the user's responsibility to ensure that the pixel sizes are the same for the two files.

Normally, if more than one background region is specified, funcnts will combine them all into a single region and use this background region to produce the background-subtracted results for each source region. The -m (match multiple backgrounds) switch tells funcnts to make a one to one correspondence between background and source regions, instead of using a single combined background region. For example, the default case is to combine 2 background regions into a single region and then apply that region to each of the source regions:

  [sh] funcnts snr.ev "annulus(502,512,0,22,n=2)" "annulus(502,512,50,100,n=2)"
  # source
  #   data file:        snr.ev
  #   degrees/pix:      0.00222222
  # background
  #   data file:        snr.ev
  # column units
  #   area:             arcsec**2
  #   surf_bri:         cnts/arcsec**2
  #   surf_err:         cnts/arcsec**2
  
  # background-subtracted results
   reg   net_counts     error   background    berror      area  surf_bri  surf_err
  ---- ------------ --------- ------------ --------- --------- --------- ---------
     1     3101.029    56.922      136.971     1.472  23872.00     0.130     0.002
     2      725.375    34.121      418.625     4.500  72959.99     0.010     0.000
  
  
  # the following source and background components were used:
  source region(s)
  ----------------
  annulus(502,512,0,22,n=2)
  
   reg       counts    pixels
  ---- ------------ ---------
     1     3238.000       373
     2     1144.000      1140
  
  background region(s)
  --------------------
  annulus(502,512,50,100,n=2)
  
   reg       counts    pixels
  ---- ------------ ---------
  all      8656.000     23572
Note that the basic region filter rule "each photon is counted once and no photon is counted more than once" still applies when using The -m to match background regions. That is, if two background regions overlap, the overlapping pixels will be counted in only one of them. In a worst-case scenario, if two background regions are the same region, the first will get all the counts and area and the second will get none.

Using the -m switch causes funcnts to use each of the two background regions independently with each of the two source regions:

  [sh] funcnts -m snr.ev "annulus(502,512,0,22,n=2)" "ann(502,512,50,100,n=2)"
  # source
  #   data file:        snr.ev
  #   degrees/pix:      0.00222222
  # background
  #   data file:        snr.ev
  # column units
  #   area:             arcsec**2
  #   surf_bri:         cnts/arcsec**2
  #   surf_err:         cnts/arcsec**2
  
  # background-subtracted results
   reg   net_counts     error   background    berror      area  surf_bri  surf_err
  ---- ------------ --------- ------------ --------- --------- --------- ---------
     1     3087.015    56.954      150.985     2.395  23872.00     0.129     0.002
     2      755.959    34.295      388.041     5.672  72959.99     0.010     0.000
  
  
  # the following source and background components were used:
  source region(s)
  ----------------
  annulus(502,512,0,22,n=2)
  
   reg       counts    pixels
  ---- ------------ ---------
     1     3238.000       373
     2     1144.000      1140
  
  background region(s)
  --------------------
  ann(502,512,50,100,n=2)
  
   reg       counts    pixels
  ---- ------------ ---------
     1     3975.000      9820
     2     4681.000     13752

Note that most floating point quantities are displayed using "f" format. You can change this to "g" format using the -g switch. This can be useful when the counts in each pixel is very small or very large. If you want maximum precision and don't care about the columns lining up nicely, use -G, which outputs all floating values as %.14g.

When counting photons using the annulus and panda (pie and annuli) shapes, it often is useful to have access to the radii (and panda angles) for each separate region. The -r switch will add radii and angle columns to the output table:

  [sh] funcnts -r snr.ev "annulus(502,512,0,22,n=2)" "ann(502,512,50,100,n=2)"
  # source
  #   data file:        snr.ev
  #   degrees/pix:      0.00222222
  # background
  #   data file:        snr.ev
  # column units
  #   area:             arcsec**2
  #   surf_bri:         cnts/arcsec**2
  #   surf_err:         cnts/arcsec**2
  #   radii:            arcsecs
  #   angles:           degrees
  
  # background-subtracted results
   reg   net_counts     error   background    berror      area  surf_bri  surf_err   radius1   radius2    angle1    angle2
  ---- ------------ --------- ------------ --------- --------- --------- --------- --------- --------- --------- ---------
     1     3101.029    56.922      136.971     1.472  23872.00     0.130     0.002      0.00     88.00        NA        NA
     2      725.375    34.121      418.625     4.500  72959.99     0.010     0.000     88.00    176.00        NA        NA
  
  
  # the following source and background components were used:
  source region(s)
  ----------------
  annulus(502,512,0,22,n=2)
  
   reg       counts    pixels
  ---- ------------ ---------
     1     3238.000       373
     2     1144.000      1140
  
  background region(s)
  --------------------
  ann(502,512,50,100,n=2)
  
   reg       counts    pixels
  ---- ------------ ---------
  all      8656.000     23572

Radii are given in units of pixels or arc-seconds (depending on the presence of WCS info), while the angle values (when present) are in degrees. These columns can be used to plot radial profiles. For example, the script funcnts.plot in the funtools distribution) will plot a radial profile using gnuplot (version 3.7 or above). A simplified version of this script is shown below:

  #!/bin/sh
  
  if [ x"$1" = xgnuplot ]; then
    if [ x`which gnuplot 2>/dev/null` = x ]; then
      echo "ERROR: gnuplot not available"
      exit 1
    fi
    awk '
    BEGIN{HEADER=1; DATA=0; FILES=""; XLABEL="unknown"; YLABEL="unknown"}
    HEADER==1{
      if( $1 == "#" && $2 == "data" && $3 == "file:" ){
        if( FILES != "" ) FILES = FILES ","
        FILES = FILES $4
      }
      else if( $1 == "#" && $2 == "radii:" ){
        XLABEL = $3
      }
      else if( $1 == "#" && $2 == "surf_bri:" ){
        YLABEL = $3
      }
      else if( $1 == "----" ){
        printf "set nokey; set title \"funcnts(%s)\"\n", FILES
        printf "set xlabel \" radius(%s)\"\n", XLABEL
        printf "set ylabel \"surf_bri(%s)\"\n", YLABEL
        print  "plot \"-\" using 3:4:6:7:8 with boxerrorbars"
        HEADER = 0
        DATA = 1
        next
      }
    }
    DATA==1{
      if( NF == 12 ){
        print $9, $10, ($9+$10)/2, $7, $8, $7-$8, $7+$8, $10-$9
      }
      else{
        exit
      }
    }
    ' | gnuplot -persist - 1>/dev/null 2>&1
  
  elif [ x"$1" = xds9 ]; then
    awk '
    BEGIN{HEADER=1; DATA=0; XLABEL="unknown"; YLABEL="unknown"}
    HEADER==1{
      if( $1 == "#" && $2 == "data" && $3 == "file:" ){
        if( FILES != "" ) FILES = FILES ","
        FILES = FILES $4
      }
      else if( $1 == "#" && $2 == "radii:" ){
        XLABEL = $3
      }
      else if( $1 == "#" && $2 == "surf_bri:" ){
        YLABEL = $3
      }
      else if( $1 == "----" ){
        printf "funcnts(%s) radius(%s) surf_bri(%s) 3\n", FILES, XLABEL, YLABEL
        HEADER = 0
        DATA = 1
        next
      }
    }
    DATA==1{
      if( NF == 12 ){
        print $9, $7, $8
      }
      else{
        exit
      }
    }
    '
  else
    echo "funcnts -r ... | funcnts.plot [ds9|gnuplot]"
    exit 1
  fi
Thus, to run funcnts and plot the results using gnuplot (version 3.7 or above), use:
  funcnts -r snr.ev "annulus(502,512,0,50,n=5)" ...  | funcnts.plot gnuplot

The -s (sum) switch causes funcnts to produce an additional table of summed (integrated) background subtracted values, along with the default table of individual values:

  [sh] funcnts -s snr.ev "annulus(502,512,0,50,n=5)" "annulus(502,512,50,100)"
  # source
  #   data file:        snr.ev
  #   degrees/pix:      0.00222222
  # background
  #   data file:        snr.ev
  # column units
  #   area:             arcsec**2
  #   surf_bri:         cnts/arcsec**2
  #   surf_err:         cnts/arcsec**2
  
  # summed background-subtracted results
  upto   net_counts     error   background    berror      area  surf_bri  surf_err
  ---- ------------ --------- ------------ --------- --------- --------- ---------
     1     2880.999    54.722      112.001     1.204  19520.00     0.148     0.003
     2     3776.817    65.254      457.183     4.914  79679.98     0.047     0.001
     3     4025.492    71.972     1031.508    11.087 179775.96     0.022     0.000
     4     4185.149    80.109     1840.851    19.786 320831.94     0.013     0.000
     5     4415.540    90.790     2873.460    30.885 500799.90     0.009     0.000
  
  
  # background-subtracted results
   reg       counts     error   background    berror      area  surf_bri  surf_err
  ---- ------------ --------- ------------ --------- --------- --------- ---------
     1     2880.999    54.722      112.001     1.204  19520.00     0.148     0.003
     2      895.818    35.423      345.182     3.710  60159.99     0.015     0.001
     3      248.675    29.345      574.325     6.173 100095.98     0.002     0.000
     4      159.657    32.321      809.343     8.699 141055.97     0.001     0.000
     5      230.390    37.231     1032.610    11.099 179967.96     0.001     0.000
  
  
  # the following source and background components were used:
  source region(s)
  ----------------
  annulus(502,512,0,50,n=5)
  
   reg       counts    pixels      sumcnts    sumpix
  ---- ------------ --------- ------------ ---------
     1     2993.000       305     2993.000       305
     2     1241.000       940     4234.000      1245
     3      823.000      1564     5057.000      2809
     4      969.000      2204     6026.000      5013
     5     1263.000      2812     7289.000      7825
  
  background region(s)
  --------------------
  annulus(502,512,50,100)
  
   reg       counts    pixels
  ---- ------------ ---------
  all      8656.000     23572

The -t and -e switches can be used to apply timing and exposure corrections, respectively, to the data. Please note that these corrections are meant to be used qualitatively, since application of more accurate correction factors is a complex and mission-dependent effort. The algorithm for applying these simple corrections is as follows:

  C =  Raw Counts in Source Region
  Ac=  Area of Source Region
  Tc=  Exposure time for Source Data
  Ec=  Average exposure in Source Region, from exposure map

  B=   Raw Counts in Background Region
  Ab=  Area of Background Region
  Tb=  (Exposure) time for Background Data
  Eb=  Average exposure in Background Region, from exposure map
Then, Net Counts in Source region is
  Net=  C - B * (Ac*Tc*Ec)/(Ab*Tb*Eb)
with the standard propagation of errors for the Error on Net. The net rate would then be
  Net Rate = Net/(Ac*Tc*Ec)
The average exposure in each region is calculated by summing up the pixel values in the exposure map for the given region and then dividing by the number of pixels in that region. Exposure maps often are generated at a block factor > 1 (e.g., block 4 means that each exposure pixel contains 4x4 pixels at full resolution) and funcnts will deal with the blocking automatically. Using the -e switch, you can supply both source and background exposure files (separated by ";"), if you have separate source and background data files. If you do not supply a background exposure file to go with a separate background data file, funcnts assumes that exposure already has been applied to the background data file. In addition, it assumes that the error on the pixels in the background data file is zero.

NB: The -e switch assumes that the exposure map overlays the image file exactly, except for the block factor. Each pixel in the image is scaled by the block factor to access the corresponding pixel in the exposure map. If your exposure map does not line up exactly with the image, do not use the -e exposure correction. In this case, it still is possible to perform exposure correction if both the image and the exposure map have valid WCS information: use the -w switch so that the transformation from image pixel to exposure pixel uses the WCS information. That is, each pixel in the image region will be transformed first from image coordinates to sky coordinates, then from sky coordinates to exposure coordinates. Please note that using -w can increase the time required to process the exposure correction considerably.

A time correction can be applied to both source and background data using the -t switch. The value for the correction can either be a numeric constant or the name of a header parameter in the source (or background) file:

  [sh] funcnts -t 23.4 ...            # number for source
  [sh] funcnts -t "LIVETIME;23.4" ... # param for source, numeric for bkgd
When a time correction is specified, it is applied to the net counts as well (see algorithm above), so that the units of surface brightness become cnts/area**2/sec.

The -i (interval) switch is used to run funcnts on multiple column-based intervals with only a single pass through the data. It is equivalent to running funcnts several times with a different column filter added to the source and background data each time. For each interval, the full funcnts output is generated, with a linefeed character (^L) inserted between each run. In addition, the output for each interval will contain the interval specification in its header. Intervals are very useful for generating X-ray hardness ratios efficiently. Of course, they are only supported when the input data are contained in a table.

Two formats are supported for interval specification. The most general format is semi-colon-delimited list of filters to be used as intervals:

  funcnts -i "pha=1:5;pha=6:10;pha=11:15" snr.ev "circle(502,512,22)" ...
Conceptually, this will be equivalent to running funcnts three times:
  funcnts snr.ev'[pha=1:5]' "circle(502,512,22)"
  funcnts snr.ev'[pha=6:10]' "circle(502,512,22)"
  funcnts snr.ev'[pha=11:15]' "circle(502,512,22)"
However, using the -i switch will require only one pass through the data.

Note that complex filters can be used to specify intervals:

  funcnts -i "pha=1:5&&pi=4;pha=6:10&&pi=5;pha=11:15&&pi=6" snr.ev ...
The program simply runs the data through each filter in turn and generates three funcnts outputs, separated by the line-feed character.

In fact, although the intent is to support intervals for hardness ratios, the specified filters do not have to be intervals at all. Nor does one "interval" filter have to be related to another. For example:

  funcnts -i "pha=1:5;pi=6:10;energy=11:15" snr.ev "circle(502,512,22)" ...
is equivalent to running funcnts three times with unrelated filter specifications.

A second interval format is supported for the simple case in which a single column is used to specify multiple homogeneous intervals for that column. In this format, a column name is specified first, followed by intervals:

  funcnts -i "pha;1:5;6:10;11:15" snr.ev "circle(502,512,22)" ...
This is equivalent to the first example, but requires less typing. The funcnts program will simply prepend "pha=" before each of the specified intervals. (Note that this format does not contain the "=" character in the column argument.)

Ordinarily, when funcnts is run on a FITS binary table (or a raw event table), one integral count is accumulated for each row (event) contained within a given region. The -v "scol[;bcol]" (value column) switch will accumulate counts using the value from the specified column for the given event. If only a single column is specified, it is used for both the source and background regions. Two separate columns, separated by a semi-colon, can be specified for source and background. The special token '$none' can be used to specify that a value column is to be used for one but not the other. For example, 'pha;$none' will use the pha column for the source but use integral counts for the background, while '$none;pha' will do the converse. If the value column is of type logical, then the value used will be 1 for T and 0 for F. Value columns are used, for example, to integrate probabilities instead of integral counts.

If the -T (rdb table) switch is used, the output will conform to starbase/rdb data base format: tabs will be inserted between columns rather than spaces and line-feed will be inserted between tables.

Finally, note that funcnts is an image program, even though it can be run directly on FITS binary tables. This means that image filtering is applied to the rows in order to ensure that the same results are obtained regardless of whether a table or the equivalent binned image is used. Because of this, however, the number of counts found using funcnts can differ from the number of events found using row-filter programs such as fundisp or funtable For more information about these difference, see the discussion of Region Boundaries.

funcone - cone search of a binary table containing RA, Dec columns

funcone <switches>  <iname> <oname> <ra[hdr]> <dec[hdr]> <radius[dr'"]> [columns]

  -d deccol:[hdr]  # Dec column name, units (def: DEC:d)
  -j               # join columns from list file
  -J               # join columns from list file, output all rows
  -l listfile      # read centers and radii from a list
  -L listfile      # read centers and radii from a list, output list rows
  -n               # don't use cone limits as a filter
  -r  racol:[hdr]  # RA column name, units (def: RA:h)
  -x               # append RA_CEN, DEC_CEN, RAD_CEN, CONE_KEY cols
  -X               # append RA_CEN, DEC_CEN, RAD_CEN, CONE_KEY cols, output all rows

Funcone performs a cone search on the RA and Dec columns of a FITS binary table. The distance from the center RA, Dec position to the RA, Dec in each row in the table is calculated. Rows whose distance is less than the specified radius are output.

The first argument to the program specifies the FITS file, raw event file, or raw array file. If "stdin" is specified, data are read from the standard input. Use Funtools Bracket Notation to specify FITS extensions, and filters. The second argument is the output FITS file. If "stdout" is specified, the FITS binary table is written to the standard output.

The third and fourth required arguments are the RA and Dec center position. By default, RA is specified in hours while Dec is specified in degrees. You can change the units of either of these by appending the character "d" (degrees), "h" (hours) or "r" (radians). Sexagesimal notation is supported, with colons or spaces separating hms and dms. (When using spaces, please ensure that the entire string is quoted.)

The fifth required argument is the radius of the cone search. By default, the radius value is given in degrees. The units can be changed by appending the character "d" (degrees), "r" (radians), "'" (arc minutes) or '"' (arc seconds).

By default, all columns of the input file are copied to the output file. Selected columns can be output using an optional sixth argument in the form:

  "column1 column1 ... columnN"
A seventh argument allows you to output selected columns from the list file when -j switch is used. Note that the RA and Dec columns used in the cone calculation must not be de-selected.

Also by default, the RA and Dec column names are named "RA" and "Dec", and are given in units of hours and degrees respectively. You can change both the name and the units using the -r [RA] and/or -d [Dec] switches. Once again, one of "h", "d", or "r" is appended to the column name to specify units but in this case, there must be a colon ":" between the name and the unit specification.

If the -l [listfile] switch is used, then one or more of the center RA, center Dec, and radius can be taken from a list file (which can be a FITS table or an ASCII column text file). In this case, the third (center RA), fourth (center Dec), and fifth (radius) command line arguments can either be a column name in the list file (if that parameter varies) or else a numeric value (if that parameter is static). When a column name is specified for the RA, Dec, or radius, you can append a colon followed by "h", "d", or "r" to specify units (also ' and " for radius). The cone search algorithm is run once for each row in the list, taking RA, Dec, and radius values from the specified columns or from static numeric values specified on the command line.

When using a list, all valid rows from each iteration are written to a single output file. Use the -x switch to help delineate which line of the list file was used to produce the given output row(s). This switch causes the values for the center RA, Dec, radius, and row number to be appended to the output file, in columns called RA_CEN, DEC_CEN, RAD_CEN and CONE_KEY, respectively. Alternatively, the -j (join) switch will append all columns from the list row to the output row (essentially a join of the list row and input row), along with the CONE_KEY row number. These two switches are mutually exclusive.

The -X and -J switches write out the same data as their lower case counterparts for each row satisfying a cone search. In addition, these switches also write out rows from the event file that do not satisfy any cone search. In such cases, that CONE_KEY column will be given a value of -1 and the center and list position information will be set to zero for the given row. Thus, all rows of the input event file are guaranteed to be output, with rows satisfying at least one cone search having additional search information.

The -L switch acts similarly to the -l switch in that it takes centers from a list file. However, it also implicitly sets the -j switch, so that output rows are the join of the input event row and the center position row. In addition, this switch also writes out all center position rows for which no event satisfies the cone search criteria of that row. The CONE_KEY column will be given a value of -2 for center rows that were not close to any data row and the event columns will be zeroed out for such rows. In this way, all centers rows are guaranteed to be output at least once.

If any of "all row" switches (-X, -J, or -L) are specified, then a new column named JSTAT is added to the output table. The positive values in this column indicate the center position row number (starting from 1) in the list file that this data row successful matched in a cone search. A value of -1 means that the data row did not match any center position. A value of -2 means that the center position was not matched by any data row.

Given a center position and radius, the cone search algorithm calculates limit parameters for a box enclosing the specified cone, and only tests rows whose positions values lie within those limits. For small files, the overhead associated with this cone limit filtering can cause the program to run more slowly than if all events were tested. You can turn off cone limit filtering using the -n switch to see if this speeds up the processing (especially useful when processing a large list of positions).

For example, the default cone search uses columns "RA" and "Dec" in hours and degrees (respectively) and RA position in hours, Dec and radius in degrees:

  funone in.fits out.fits 23.45 34.56 0.01
To specify the RA position in degrees:
  funcone in.fits out.fits 23.45d 34.56 0.01
To get RA and Dec from a list but use a static value for radius (and also write identifying info for each row in the list):
  funcone -x -l list.txt in.fits out.fits MYRA MYDec 0.01
User specified columns in degrees, RA position in hours (sexagesimal notation), Dec position in degrees (sexagesimal notation) and radius in arc minutes:
  funcone -r myRa:d -d myDec in.fits out.fits 12:30:15.5 30:12 15'

fundisp - display data in a Funtools data file

fundisp  [-f format] [-l] [-n] [-T] <iname> [columns|bitpix=n]

  -f      # format string for display
  -l      # display image as a list containing the columns X, Y, VAL
  -n      # don't output header
  -F [c]  # use specified character as column separator (def: space)
  -T      # output in rdb/starbase format (tab separators) 

fundisp displays the data in the specified FITS Extension and/or Image Section of a FITS file, or in a Section of a non-FITS array or raw event file.

The first argument to the program specifies the FITS input image, array, or raw event file to display. If "stdin" is specified, data are read from the standard input. Use Funtools Bracket Notation to specify FITS extensions, image sections, and filters.

If the data being displayed are columns (either in a FITS binary table or a raw event file), the individual rows are listed. Filters can be added using bracket notation. Thus:

  [sh] fundisp "test.ev[time-(int)time>.15]"
         X       Y     PHA        PI             TIME         DX         DY
   ------- ------- ------- --------- ---------------- ---------- ----------
        10       8      10         8          17.1600       8.50      10.50
         9       9       9         9          17.1600       9.50       9.50
        10       9      10         9          18.1600       9.50      10.50
        10       9      10         9          18.1700       9.50      10.50
         8      10       8        10          17.1600      10.50       8.50
         9      10       9        10          18.1600      10.50       9.50
         9      10       9        10          18.1700      10.50       9.50
        10      10      10        10          19.1600      10.50      10.50
        10      10      10        10          19.1700      10.50      10.50
        10      10      10        10          19.1800      10.50      10.50
[NB: The FITS binary table test file test.ev, as well as the FITS image test.fits, are contained in the funtools funtest directory.]

When a table is being displayed using fundisp, a second optional argument can be used to specify the columns to display. For example:

  [sh] fundisp "test.ev[time-(int)time>=.99]" "x y time"
          X        Y                  TIME
   -------- -------- ---------------------
          5       -6           40.99000000
          4       -5           59.99000000
         -1        0          154.99000000
         -2        1          168.99000000
         -3        2          183.99000000
         -4        3          199.99000000
         -5        4          216.99000000
         -6        5          234.99000000
         -7        6          253.99000000

The special column $REGION can be specified to display the region id of each row:

  [sh $] fundisp "test.ev[time-(int)time>=.99&&annulus(0 0 0 10 n=3)]" 'x y time $REGION'
          X        Y                  TIME     REGION
   -------- -------- --------------------- ----------
          5       -6           40.99000000          3
          4       -5           59.99000000          2
         -1        0          154.99000000          1
         -2        1          168.99000000          1
         -3        2          183.99000000          2
         -4        3          199.99000000          2
         -5        4          216.99000000          2
         -6        5          234.99000000          3
         -7        6          253.99000000          3

Here only rows with the proper fractional time and whose position also is within one of the three annuli are displayed.

Columns can be excluded from display using a minus sign before the column:

  [sh $] fundisp "test.ev[time-(int)time>=.99]" "-time"
          X        Y      PHA         PI          DX          DY
   -------- -------- -------- ---------- ----------- -----------
          5       -6        5         -6        5.50       -6.50
          4       -5        4         -5        4.50       -5.50
         -1        0       -1          0       -1.50        0.50
         -2        1       -2          1       -2.50        1.50
         -3        2       -3          2       -3.50        2.50
         -4        3       -4          3       -4.50        3.50
         -5        4       -5          4       -5.50        4.50
         -6        5       -6          5       -6.50        5.50
         -7        6       -7          6       -7.50        6.50
All columns except the time column are displayed.

The special column $N can be specified to display the ordinal value of each row. Thus, continuing the previous example:

  fundisp "test.ev[time-(int)time>=.99]" '-time $n'
         X        Y      PHA         PI          DX          DY          N
   ------- -------- -------- ---------- ----------- ----------- ----------
         5       -6        5         -6        5.50       -6.50        337
         4       -5        4         -5        4.50       -5.50        356
        -1        0       -1          0       -1.50        0.50        451
        -2        1       -2          1       -2.50        1.50        465
        -3        2       -3          2       -3.50        2.50        480
        -4        3       -4          3       -4.50        3.50        496
        -5        4       -5          4       -5.50        4.50        513
        -6        5       -6          5       -6.50        5.50        531
        -7        6       -7          6       -7.50        6.50        550
Note that the column specification is enclosed in single quotes to protect '$n' from begin expanded by the shell.

In general, the rules for activating and de-activating columns are:

  • If only exclude columns are specified, then all columns but the exclude columns will be activated.
  • If only include columns are specified, then only the specified columns are activated.
  • If a mixture of include and exclude columns are specified, then all but the exclude columns will be active; this last case is ambiguous and the rule is arbitrary.
In addition to specifying columns names explicitly, the special symbols + and - can be used to activate and de-activate all columns. This is useful if you want to activate the $REGION column along with all other columns. According to the rules, the syntax "$REGION" only activates the region column and de-activates the rest. Use "+ $REGION" to activate all columns as well as the region column.

If the data being displayed are image data (either in a FITS primary image, a FITS image extension, or an array file), an mxn pixel display is produced, where m and n are the dimensions of the image. By default, pixel values are displayed using the same data type as in the file. However, for integer data where the BSCALE and BZERO header parameters are present, the data is displayed as floats. In either case, the display data type can be overridden using an optional second argument of the form:

  bitpix=n
where n is 8,16,32,-32,-64, for unsigned char, short, int, float and double, respectively.

Of course, running fundisp on anything but the smallest image usually results in a display whose size makes it unreadable. Therefore, one can uses bracket notation (see below) to apply section and/or blocking to the image before generating a display. For example:

  [sh] fundisp "test.fits[2:6,2:7]" bitpix=-32
                     2          3          4          5          6
            ---------- ---------- ---------- ---------- ----------
         2:       3.00       4.00       5.00       6.00       7.00
         3:       4.00       5.00       6.00       7.00       8.00
         4:       5.00       6.00       7.00       8.00       9.00
         5:       6.00       7.00       8.00       9.00      10.00
         6:       7.00       8.00       9.00      10.00      11.00
         7:       8.00       9.00      10.00      11.00      12.00

Note that is is possible to display a FITS binary table as an image simply by passing the table through funimage first:

  [sh] ./funimage test.ev stdout | fundisp "stdin[2:6,2:7]" bitpix=8
                  2       3       4       5       6
            ------- ------- ------- ------- -------
         2:       3       4       5       6       7
         3:       4       5       6       7       8
         4:       5       6       7       8       9
         5:       6       7       8       9      10
         6:       7       8       9      10      11
         7:       8       9      10      11      12
If the -l (list) switch is used, then an image is displayed as a list containing the columns: X, Y, VAL. For example:
  fundisp -l "test1.fits[2:6,2:7]" bitpix=-32
            X          Y         VAL
   ---------- ---------- -----------
            2          2        6.00
            3          2        1.00
            4          2        1.00
            5          2        1.00
            6          2        1.00
            2          3        1.00
            3          3        5.00
            4          3        1.00
            5          3        1.00
            6          3        1.00
            2          4        1.00
            3          4        1.00
            4          4        4.00
            5          4        1.00
            6          4        1.00
            2          5        1.00
            3          5        1.00
            4          5        1.00
            5          5        3.00
            6          5        1.00
            2          6        1.00
            3          6        1.00
            4          6        1.00
            5          6        1.00
            6          6        2.00
            2          7        1.00
            3          7        1.00
            4          7        1.00
            5          7        1.00
            6          7        1.00

If the -n (nohead) switch is used, then no header is output for tables. This is useful, for example, when fundisp output is being directed into gnuplot.

The fundisp program uses a default set of display formats:

  datatype      TFORM   format
  --------      -----   --------
  double        D       "%21.8f"
  float         E       "%11.2f"
  int           J       "%10d"
  short         I       "%8d"
  byte          B       "%6d"
  string        A       "%12.12s"
  bits          X       "%8x"
  logical       L       "%1x"
Thus, the default display of 1 double and 2 shorts gives:
  [sh] fundisp snr.ev "time x y"
  
                    TIME        X        Y
   --------------------- -------- --------
       79494546.56818075      546      201
       79488769.94469175      548      201
       ...
You can change the display format for individual columns or for all columns of a given data types by means of the -f switch. The format string that accompanies -f is a space-delimited list of keyword=format values. The keyword values can either be column names (in which case the associated format pertains only to that column) or FITS table TFORM specifiers (in which case the format pertains to all columns having that data type). For example, you can change the double and short formats for all columns like this:
  [sh] fundisp -f "D=%22.11f I=%3d" snr.ev "time x y"
  
                    TIME   X   Y
  ---------------------- --- ---
    79494546.56818075478 546 201
    79488769.94469174743 548 201
    ...

Alternatively, you can change the format of the time and x columns like this:

  [sh] fundisp -f "time=%22.11f x=%3d" snr.ev "time x y"
  
                    TIME   X        Y
  ---------------------- --- --------
    79494546.56818075478 546      201
    79488769.94469174743 548      201
    ...
Note that there is a potential conflict if a column has the same name as one of the TFORM specifiers. In the examples above, the the "X" column in the table has the same name as the X (bit) datatype. To resolve this conflict, the format string is processed such that TFORM datatype specifiers are checked for first, using a case-sensitive comparison. If the specified format value is not an upper case TFORM value, then a case-insensitive check is made on the column name. This means that, in the examples above, "X=%3d" will refer to the X (bit) datatype, while "x=%3d" will refer to the X column:
  [sh] fundisp -f "X=%3d" snr.ev "x y"
  
         X        Y
  -------- --------
       546      201
       548      201
       ...
  
  [sh] fundisp -f "x=%3d" snr.ev "x y"
  
    X        Y
  --- --------
  546      201
  548      201
  ...
As a rule, therefore, it is best always to specify the column name in lower case and TFORM data types in upper case.

The -f [format] will change the format for a single execution of fundisp. You also can use the FUN_FORMAT envronment variable to change the format for all invocations of fundisp. The format of this environment variable's value is identical to that used with the -f switch. This global value can be overridden in individual cases by use of the -f [format] switch.

Caveats: Please also note that it is the user's responsibility to match the format specifier to the column data type correctly. Also note that, in order to maintain visual alignment between names and columns, the column name will be truncated (on the left) if the format width is less than the length of the name. However, truncation is not performed if the output is in RDB format (using the -T switch).

[An older-style format string is supported but deprecated. It consists of space-delimited C format statements for all data types, specified in the following order:

 double float int short byte string bit.
This order of the list is based on the assumption that people generally will want to change the float formats.

If "-" is entered instead of a format statement for a given data type, the default format is used. Also, the format string can be terminated without specifying all formats, and defaults will be used for the rest of the list. Note that you must supply a minimum field width, i.e., "%6d" and "%-6d" are legal, "%d" is not legal. By using -f [format], you can change the double and short formats like this:

  [sh] fundisp -f "22.11f - - 3d" snr.ev "time x y"
  
                     TIME   X   Y
   ---------------------- --- ---
     79494546.56818075478 546 201
     79488769.94469174743 548 201
     ...
NB: This format is deprecated and will be removed in a future release.]

The -F[c] switch can be used to specify a (single-character) column separator (where the default is a space). Note that column formatting will almost certainly also add spaces to pad individual columns to the required width. These can be removed with a program such as sed, at the cost of generating unaligned columns. For example:

fundisp -F',' snr.ev'[cir 512 512 .1]'
       X,       Y,     PHA,      PI,                 TIME,      DX,      DY
--------,--------,--------,--------,---------------------,--------,--------
     512,     512,       6,       7,    79493997.45854475,     578,     574
     512,     512,       8,       9,    79494575.58943175,     579,     573
     512,     512,       5,       6,    79493631.03866175,     578,     575
     512,     512,       5,       5,    79493290.86521725,     578,     575
     512,     512,       8,       9,    79493432.00990875,     579,     573

fundisp -F',' snr.ev'[cir 512 512 .1]' | sed 's/ *, */,/g'
       X,Y,PHA,PI,TIME,DX,DY
--------,--------,--------,--------,---------------------,--------,--------
     512,512,6,7,79493997.45854475,578,574
     512,512,8,9,79494575.58943175,579,573
     512,512,5,6,79493631.03866175,578,575
     512,512,5,5,79493290.86521725,578,575
     512,512,8,9,79493432.00990875,579,573

fundisp -f "x=%3d y=%3d pi=%1d pha=%1d time=%20.11f dx=%3d dy=%3d" -F',' snr.ev'[cir 512 512 .1]' | sed 's/ *, */,/g'
  X,Y,A,I,TIME,DX,DY
---,---,-,-,--------------------,---,---
512,512,6,7,79493997.45854474604,578,574
512,512,8,9,79494575.58943174779,579,573
512,512,5,6,79493631.03866174817,578,575
512,512,5,5,79493290.86521725357,578,575
512,512,8,9,79493432.00990875065,579,573

If the -T (rdb table) switch is used, the output will conform to starbase/rdb data base format: tabs will be inserted between columns rather than spaces. This format is not available when displaying image pixels (except in conjunction with the -l switch).

Finally, note that fundisp can be used to create column filters from the auxiliary tables in a FITS file. For example, the following shell code will generate a good-time interval (GTI) filter for X-ray data files that contain a standard GTI extension:

  #!/bin/sh
  sed '1,/---- .*/d
  /^$/,$d' | awk 'tot>0{printf "||"};{printf "time="$1":"$2; tot++}' 
If this script is placed in a file called "mkgti", it can be used in a command such as:
  fundisp foo.fits"[GTI]" | mkgti > gti.filter
The resulting filter file can then be used in various funtools programs:
  funcnts foo.fits"[@gti.filter]" ...
to process only the events in the good-time intervals.

funhead - display a header in a Funtools file

funhead  [-a] [-s] [-t] [-L] <iname> [oname ename]

  -a    # display all extension headers
  -s    # display 79 chars instead of 80 before the new-line
  -t    # prepend data type char to each line of output
  -L    # output in rdb/starbase list format

funhead displays the FITS header parameters in the specified FITS Extension.

The first argument to the program specifies the Funtools input file to display. If "stdin" is specified, data are read from the standard input. Funtools Bracket Notation is used to specify particular FITS extension to process. Normally, the full 80 characters of each header card is output, followed by a new-line.

If the -a switch is specified, the header from each FITS extensions in the file is displayed. Note, however, that the -a switch does not work with FITS files input via stdin. We hope to remove this restriction in a future release.

If the -s switch is specified, only 79 characters are output before the new-line. This helps the display on 80 character terminals.

If the -t switch is specified, the data type of the parameter is output as a one character prefix, followed by 77 characters of the param. The parameter data types are defined as: FUN_PAR_UNKNOWN ('u'), FUN_PAR_COMMENT ('c'), FUN_PAR_LOGICAL ('l'), FUN_PAR_INTEGER ('i'), FUN_PAR_STRING ('s'), FUN_PAR_REAL ('r'), FUN_PAR_COMPLEX ('x').

If the -L (rdb table) switch is used, the output will conform to starbase/rdb data base list format.

For example to display the EVENTS extension (binary table):

  [sh] funhead "foo.fits[EVENTS]"
  XTENSION= 'BINTABLE'            /  FITS 3D BINARY TABLE                      
  BITPIX  =                    8  /  Binary data                               
  NAXIS   =                    2  /  Table is a matrix                         
  NAXIS1  =                   20  /  Width of table in bytes                   
  NAXIS2  =                30760  /  Number of entries in table                
  PCOUNT  =                    0  /  Random parameter count                    
  GCOUNT  =                    1  /  Group count                               
  TFIELDS =                    7  /  Number of fields in each row              
  EXTNAME = 'EVENTS  '            /  Table name                                
  EXTVER  =                    1  /  Version number of table                   
  TFORM1  = '1I      '            /  Data type for field                       
  TTYPE1  = 'X       '            /  Label for field                           
  TUNIT1  = '        '            /  Physical units for field                  
  TFORM2  = '1I      '            /  Data type for field                       
    etc. ...
  END                                                                          

To display the third header:

  [sh] funhead "foo.fits[3]"
  XTENSION= 'BINTABLE'            /  FITS 3D BINARY TABLE                      
  BITPIX  =                    8  /  Binary data                               
  NAXIS   =                    2  /  Table is a matrix                         
  NAXIS1  =                   32  /  Width of table in bytes                   
  NAXIS2  =                   40  /  Number of entries in table                
  PCOUNT  =                    0  /  Random parameter count                    
  GCOUNT  =                    1  /  Group count                               
  TFIELDS =                    7  /  Number of fields in each row              
  EXTNAME = 'TGR     '            /  Table name                                
  EXTVER  =                    1  /  Version number of table                   
  TFORM1  = '1D      '            /  Data type for field                       
    etc. ...
  END                                                                          

To display the primary header (i.e., extension 0):

  sh> funhead "coma.fits[0]"
  SIMPLE  =                    T /STANDARD FITS FORMAT                         
  BITPIX  =                   16 /2-BYTE TWOS-COMPL INTEGER                    
  NAXIS   =                    2 /NUMBER OF AXES                               
  NAXIS1  =                  800 /                                             
  NAXIS2  =                  800 /                                             
  DATATYPE= 'INTEGER*2'          /SHORT INTEGER                                
  END                                                                          

The funhead program also can edit (i.e. add, delete, or modify) or display individual headers parameters. Edit mode is signalled by the presence of two additional command-line arguments: output file and edit command file, in that order. Edit mode acts as a filter: the output file will contain the entire input FITS file, including other extensions. The edit command file can be "stdin", in which case edit command are read from the standard input.

The edit command file contains parameter comments (having '#' in the first column) and delete and assignment(modify or add) operations. A delete operation is specified by preceding the parameter name with a minus sign "-". A display operation (very useful in interactive sessions, i.e., where the edit commands are taken from stdin) is specified by preceding the parameter name with a question mark "?". In either case, a parameter value need not be specified. An assignment operation is specified in the same two ways that a parameter is specified in a text header (but without the comment character that precedes header params), i.e.:

  • FITS-style comments have an equal sign "=" between the keyword and value and an optional slash "/" to signify a comment. The strict FITS rules on column positions are not enforced.
  • Free-form comments can have an optional colon separator between the keyword and value. In the absence of quote, all tokens after the keyword are part of the value, i.e. no comment is allowed.

For example, the following interactive session checks for the existence of parameters, adds new parameters, modifies them, and modifies and deletes existing parameters:

  sh$ ./funhead snr.ev foo.fits -
  # look for FOO1
  ? FOO1
  WARNING: FOO1 not found
  # add new foo1
  FOO1 = 100
  # add foo2
  FOO2 = 200
  # reset foo1 to a different value
  FOO1 -1
  # delete foo2
  -FOO2
  # change existing value
  EXTVER 2
  ? XS-SORT
  XS-SORT = 'EOF     '            /  type of event sort
  # delete existing value
  -XS-SORT
  # exit
  ^D

See Column-based Text Files for more information about header parameter format.

funhist - create a 1D histogram of a column (from a FITS binary table or raw event file) or an image

funhist  [-n|-w|-T] <iname> [column] [[lo:hi:]bins]

  -n    # normalize bin value by the width of each bin
  -w    # specify bin width instead of number of bins in arg3
  -T    # output in rdb/starbase format (tab separators)

funhist creates a one-dimensional histogram from the specified columns of a FITS Extension binary table of a FITS file (or from a non-FITS raw event file), or from a FITS image or array, and writes that histogram as an ASCII table. Alternatively, the program can perform a 1D projection of one of the image axes.

The first argument to the program is required, and specifies the Funtools file: FITS table or image, raw event file, or array. If "stdin" is specified, data are read from the standard input. Use Funtools Bracket Notation to specify FITS extensions, and filters.

For a table, the second argument also is required. It specifies the column to use in generating the histogram. If the data file is of type image (or array), the column is optional: if "x" (or "X"), "y" (or "Y") is specified, then a projection is performed over the x (dim1) or y (dim2) axes, respectively. (That is, this projection will give the same results as a histogram performed on a table containing the equivalent x,y event rows.) If no column name is specified or "xy" (or "XY") is specified for the image, then a histogram is performed on the values contained in the image pixels.

The argument that follows is optional and specifies the number of bins to use in creating the histogram and, if desired, the range of bin values. For image and table histograms, the range should specify the min and max data values. For image histograms on the x and y axes, the range should specify the min and max image bin values. If this argument is omitted, the number of output bins for a table is calculated either from the TLMIN/TLMAX headers values (if these exist in the table FITS header for the specified column) or by going through the data to calculate the min and max value. For an image, the number of output bins is calculated either from the DATAMIN/DATAMAX header values, or by going through the data to calculate min and max value. (Note that this latter calculation might fail if the image cannot be fit in memory.) If the data are floating point (table or image) and the number of bins is not specified, an arbitrary default of 128 is used.

For binary table processing, the -w (bin width) switch can be used to specify the width of each bin rather than the number of bins. Thus:

  funhist test.ev pha 1:100:5
means that 5 bins of width 20 are used in the histogram, while:
  funhist -w test.ev pha 1:100:5
means that 20 bins of width 5 are used in the histogram.

The data are divvied up into the specified number of bins and the resulting 1D histogram (or projection) is output in ASCII table format. For a table, the output displays the low_edge (inclusive) and hi_edge (exclusive) values for the data. For example, a 15-row table containing a "pha" column whose values range from -7.5 to 7.5 can be processed thus:

  [sh] funhist test.ev pha
  # data file:        /home/eric/data/test.ev
  # column:           pha
  # min,max,bins:     -7.5 7.5 15
  
     bin     value               lo_edge               hi_edge
  ------ --------- --------------------- ---------------------
       1        22           -7.50000000           -6.50000000
       2        21           -6.50000000           -5.50000000
       3        20           -5.50000000           -4.50000000
       4        19           -4.50000000           -3.50000000
       5        18           -3.50000000           -2.50000000
       6        17           -2.50000000           -1.50000000
       7        16           -1.50000000           -0.50000000
       8        30           -0.50000000            0.50000000
       9        16            0.50000000            1.50000000
      10        17            1.50000000            2.50000000
      11        18            2.50000000            3.50000000
      12        19            3.50000000            4.50000000
      13        20            4.50000000            5.50000000
      14        21            5.50000000            6.50000000
      15        22            6.50000000            7.50000000
  
  [sh] funhist test.ev pha 1:6
  # data file:          /home/eric/data/test.ev
  # column:             pha
  # min,max,bins:       0.5 6.5 6
  
     bin     value               lo_edge               hi_edge
  ------ --------- --------------------- ---------------------
       1        16            0.50000000            1.50000000
       2        17            1.50000000            2.50000000
       3        18            2.50000000            3.50000000
       4        19            3.50000000            4.50000000
       5        20            4.50000000            5.50000000
       6        21            5.50000000            6.50000000
  
  [sh] funhist test.ev pha 1:6:3
  # data file:          /home/eric/data/test.ev
  # column:             pha
  # min,max,bins:       0.5 6.5 3
  
     bin     value               lo_edge               hi_edge
  ------ --------- --------------------- ---------------------
       1        33            0.50000000            2.50000000
       2        37            2.50000000            4.50000000
       3        41            4.50000000            6.50000000

For a table histogram, the -n(normalize) switch can be used to normalize the bin value by the width of the bin (i.e., hi_edge-lo_edge):

  [sh] funhist -n test.ev pha 1:6:3 
  # data file:          test.ev
  # column:             pha
  # min,max,bins:       0.5 6.5 3
  # width normalization (val/(hi_edge-lo_edge)) is applied
  
     bin                 value               lo_edge               hi_edge
  ------ --------------------- --------------------- ---------------------
       1           16.50000000            0.50000000            2.50000000
       2            6.16666667            2.50000000            4.50000000
       3            4.10000000            4.50000000            6.50000000
This could used, for example, to produce a light curve with values having units of counts/second instead of counts.

For an image histogram, the output displays the low and high image values (both inclusive) used to generate the histogram. For example, in the following example, 184 pixels had a value of 1, 31 had a value of 2, while only 2 had a value of 3,4,5,6, or 7:

  [sh] funhist test.fits
  # data file:           /home/eric/data/test.fits
  # min,max,bins:        1 7 7
  
     bin                 value                lo_val                hi_val
  ------ --------------------- --------------------- ---------------------
       1          184.00000000            1.00000000            1.00000000
       2           31.00000000            2.00000000            2.00000000
       3            2.00000000            3.00000000            3.00000000
       4            2.00000000            4.00000000            4.00000000
       5            2.00000000            5.00000000            5.00000000
       6            2.00000000            6.00000000            6.00000000
       7            2.00000000            7.00000000            7.00000000

For the axis projection of an image, the output displays the low and high image bins (both inclusive) used to generate the projection. For example, in the following example, 21 counts had their X bin value of 2, etc.:

  [sh] funhist test.fits x 2:7
  # data file:            /home/eric/data/test.fits
  # column:               X
  # min,max,bins: 2 7 6
   
     bin                 value                lo_bin                hi_bin
  ------ --------------------- --------------------- ---------------------
       1           21.00000000            2.00000000            2.00000000
       2           20.00000000            3.00000000            3.00000000
       3           19.00000000            4.00000000            4.00000000
       4           18.00000000            5.00000000            5.00000000
       5           17.00000000            6.00000000            6.00000000
       6           16.00000000            7.00000000            7.00000000
  
  [sh] funhist test.fits x 2:7:2
  # data file:            /home/eric/data/test.fits
  # column:               X
  # min,max,bins: 2 7 2
   
     bin                 value                lo_bin                hi_bin
  ------ --------------------- --------------------- ---------------------
       1           60.00000000            2.00000000            4.00000000
       2           51.00000000            5.00000000            7.00000000

You can use gnuplot or other plotting programs to graph the results, using a script such as:

  #!/bin/sh
  sed -e '1,/---- .*/d
  /^$/,$d' | \
  awk '\
  BEGIN{print "set nokey; set title \"funhist\"; set xlabel \"bin\"; set ylabel \"counts\"; plot \"-\" with boxes"}   \
  {print $3, $2, $4-$3}'        | \
  gnuplot -persist - 1>/dev/null 2>&1
Similar plot commands are supplied in the script funhist.plot:
  funhist test.ev pha ...  | funhist.plot gnuplot

funimage - create a FITS image from a Funtools data file

funimage [-a] <iname> <oname> [bitpix=n]
funimage [-l] <iname> <oname> <xcol:xdims> <ycol:ydims> <vcol> [bitpix=n]
funimage [-p x|y] <iname> <oname> [bitpix=n]

  -a       # append to existing output file as an image extension
  -l       # input is a list file containing xcol, ycol, value
  -p [x|y] # project along x or y axis to create a 1D image

funimage creates a primary FITS image from the specified FITS Extension and/or Image Section of a FITS file, or from an Image Section of a non-FITS array, or from a raw event file.

The first argument to the program specifies the FITS input image, array, or raw event file to process. If "stdin" is specified, data are read from the standard input. Use Funtools Bracket Notation to specify FITS extensions, image sections, and filters. The second argument is the output FITS file. If "stdout" is specified, the FITS image is written to the standard output. By default, the output pixel values are of the same data type as those of the input file (or type "int" when binning a table), but this can be overridden using an optional third argument of the form:

  bitpix=n
where n is 8,16,32,-32,-64, for unsigned char, short, int, float and double, respectively.

If the input data are of type image, the appropriate section is extracted and blocked (based on how the Image Section is specified), and the result is written to the FITS primary image. When an integer image containing the BSCALE and BZERO keywords is converted to float, the pixel values are scaled and the scaling keywords are deleted from the output header. When converting integer scaled data to integer (possibly of a different size), the pixels are not scaled and the scaling keywords are retained.

If the input data is a binary table or raw event file, these are binned into an image, from which a section is extracted and blocked, and written to a primary FITS image. In this case, it is necessary to specify the two columns that will be used in the 2D binning. This can be done on the command line using the bincols=(x,y) keyword:

  funcnts "foo.ev[EVENTS,bincols=(detx,dety)]"
The full form of the bincols= specifier is:
  bincols=([xname[:tlmin[:tlmax:[binsiz]]]],[yname[:tlmin[:tlmax[:binsiz]]]])
where the tlmin, tlmax, and binsiz specifiers determine the image binning dimensions:
  dim = (tlmax - tlmin)/binsiz     (floating point data)
  dim = (tlmax - tlmin)/binsiz + 1 (integer data)
Using this syntax, it is possible to bin any two columns of a binary table at any bin size. Note that the tlmin, tlmax, and binsiz specifiers can be omitted if TLMIN, TLMAX, and TDBIN header parameters (respectively) are present in the FITS binary table header for the column in question. Note also that if only one parameter is specified, it is assumed to be tlmax, and tlmin defaults to 1. If two parameters are specified, they are assumed to be tlmin and tlmax. See Binning FITS Binary Tables and Non-FITS Event Files for more information about binning parameters.

By default, a new 2D FITS image file is created and the image is written to the primary HDU. If the -a (append) switch is specified, the image is appended to an existing FITS file as an IMAGE extension. (If the output file does not exist, the switch is effectively ignored and the image is written to the primary HDU.) This can be useful in a shell programming environment when processing multiple FITS images that you want to combine into a single final FITS file.

funimage also can take input from a table containing columns of x, y, and value (e.g., the output from fundisp -l which displays each image x and y and the number of counts at that position.) When the -l (list) switch is used, the input file is taken to be a FITS or ASCII table containing (at least) three columns that specify the x and y image coordinates and the value of that image pixel. In this case, funimage requires four extra arguments: xcolumn:xdims, ycolumn:ydims, vcolumn and bitpix=n. The x and y col:dim information takes the form:

  name:dim               # values range from 1 to dim
  name:min:max           # values range from min to max
  name:min:max:binsiz    # dimensions scaled by binsize
In particular, the min value should be used whenever the minimum coordinate value is something other than one. For example:
 
  funimage -l foo.lst foo.fits xcol:0:512 ycol:0:512 value bitpix=-32

The list feature also can be used to read unnamed columns from standard input: simply replace the column name with a null string. Note that the dimension information is still required:

  funimage -l stdin foo.fits "":0:512 "":0:512 "" bitpix=-32
  240 250 1
  255 256 2
  ...
  ^D

The list feature provides a simple way to generate a blank image. If you pass a Column-based Text File to funimage in which the text header contains the required image information, then funimage will correctly make a blank image. For example, consider the following text file (called foo.txt):

  x:I:1:10  y:I:1:10
  ------    ------
  0         0
This text file defines two columns, x and y, each of data type 32-bit int and image dimension 10. The command:
  funimage foo.txt foo.fits bitpix=8
will create an empty FITS image called foo.fits containing a 10x10 image of unsigned char:
  fundisp foo.fits
           1      2      3      4      5      6      7      8      9     10
      ------ ------ ------ ------ ------ ------ ------ ------ ------ ------
  10:      0      0      0      0      0      0      0      0      0      0
   9:      0      0      0      0      0      0      0      0      0      0
   8:      0      0      0      0      0      0      0      0      0      0
   7:      0      0      0      0      0      0      0      0      0      0
   6:      0      0      0      0      0      0      0      0      0      0
   5:      0      0      0      0      0      0      0      0      0      0
   4:      0      0      0      0      0      0      0      0      0      0
   3:      0      0      0      0      0      0      0      0      0      0
   2:      0      0      0      0      0      0      0      0      0      0
   1:      1      0      0      0      0      0      0      0      0      0

Note that the text file must contain at least one row of data. However, in the present example, event position 0,0 is outside the limits of the image and will be ignored. (You can, of course, use real x,y values to seed the image with data.)

Furthermore, you can use the TEXT filter specification to obviate the need for an input text file altogether. The following command will create the same 10x10 char image without an actual input file:

  funimage stdin'[TEXT(x:I:10,y:I:10)]' foo.fits bitpix=8 < /dev/null
or
  funimage /dev/null'[TEXT(x:I:10,y:I:10)]' foo.fits bitpix=8

You also can use either of these methods to generate a region mask simply by appending a region inside the filter brackets and specfying mask=all along with the bitpix. For example, the following command will generate a 10x10 char mask using 3 regions:

  funimage stdin'[TEXT(x:I:10,y:I:10),cir(5,5,4),point(10,1),-cir(5,5,2)]' \
  foo.fits bitpix=8,mask=all < /dev/null
The resulting mask looks like this:
  fundisp foo.fits
           1      2      3      4      5      6      7      8      9     10
      ------ ------ ------ ------ ------ ------ ------ ------ ------ ------
  10:      0      0      0      0      0      0      0      0      0      0
   9:      0      0      0      0      0      0      0      0      0      0
   8:      0      0      1      1      1      1      1      0      0      0
   7:      0      1      1      1      1      1      1      1      0      0
   6:      0      1      1      0      0      0      1      1      0      0
   5:      0      1      1      0      0      0      1      1      0      0
   4:      0      1      1      0      0      0      1      1      0      0
   3:      0      1      1      1      1      1      1      1      0      0
   2:      0      0      1      1      1      1      1      0      0      0
   1:      0      0      0      0      0      0      0      0      0      2

You can use funimage to create 1D image projections along the x or y axis using the -p [x|y] switch. This capability works for both images and tables. For example consider a FITS table named ev.fits containing the following rows:

         X        Y
  -------- --------
         1        1
         1        2
         1        3
         1        4
         1        5
         2        2
         2        3
         2        4
         2        5
         3        3
         3        4
         3        5
         4        4
         4        5
         5        5

A corresponding 5x5 image, called dim2.fits, would therefore contain:
              1          2          3          4          5
     ---------- ---------- ---------- ---------- ----------
  5:          1          1          1          1          1
  4:          1          1          1          1          0
  3:          1          1          1          0          0
  2:          1          1          0          0          0
  1:          1          0          0          0          0
A projection along the y axis can be performed on either the table or the image:
  funimage -p y ev.fits stdout | fundisp stdin
              1          2          3          4          5
     ---------- ---------- ---------- ---------- ----------
  1:          1          2          3          4          5

  funimage -p y dim2.fits stdout | fundisp stdin
              1          2          3          4          5
     ---------- ---------- ---------- ---------- ----------
  1:          1          2          3          4          5

Furthermore, you can create a 1D image projection along any column of a table by using the bincols=[column] filter specification and specifying a single column. For example, the following command projects the same 1D image along the y axis of a table as use of the -p y switch:

  funimage ev.fits'[bincols=y]' stdout | fundisp stdin 
              1          2          3          4          5
     ---------- ---------- ---------- ---------- ----------
  1:          1          2          3          4          5

Examples:

Create a FITS image from a FITS binary table:

  [sh] funimage test.ev test.fits

Display the FITS image generated from a blocked section of FITS binary table:

  [sh]  funimage "test.ev[2:8,3:7,2]" stdout | fundisp stdin
                    1         2         3
            --------- --------- ---------
         1:        20        28        36
         2:        28        36        44

funindex - create an index for a column of a FITS binary table

funindex <switches>  <iname> <key> [oname]

  NB: these options are not compatible with Funtools processing. Please
  use the defaults instead.
  -c        # compress output using gzip"
  -a        # ASCII output, ignore -c (default: FITS table)"
  -f        # FITS table output (default: FITS table)"
  -l        # long output, i.e. with key value(s) (default: long)"
  -s        # short output, i.e. no key value(s) (default: long)"

The funindex script creates an index for the specified column (key) by running funtable -s (sort) and then saving the column value and the record number for each sorted row. This index will be used automatically by funtools filtering of that column, provided the index file's modification date is later than that of the data file.

The first required argument is the name of the FITS binary table to index. Please note that text files cannot be indexed at this time. The second required argument is the column (key) name to index. While multiple keys can be specified in principle, the funtools index processing assume a single key and will not recognize files containing multiple keys.

By default, the output index file name is [root]_[key].idx, where [root] is the root of the input file. Funtools looks for this specific file name when deciding whether to use an index for faster filtering. Therefore, the optional third argument (output file name) should not be used for funtools processing.

For example, to create an index on column Y for a given FITS file, use:

  funindex foo.fits Y
This will generate an index named foo_y.idx, which will be used by funtools for filters involving the Y column.

funjoin - join two or more FITS binary tables on specified columns

funjoin [switches] <ifile1> <ifile2> ... <ifilen> <ofile> 

  -a  cols             # columns to activate in all files
  -a1 cols ... an cols # columns to activate in each file
  -b  'c1:bvl,c2:bv2'  # blank values for common columns in all files
  -bn 'c1:bv1,c2:bv2'  # blank values for columns in specific files
  -j  col              # column to join in all files
  -j1 col ... jn col   # column to join in each file
  -m min               # min matches to output a row
  -M max               # max matches to output a row
  -s                   # add 'jfiles' status column
  -S col               # add col as status column
  -t tol               # tolerance for joining numeric cols [2 files only]
funjoin joins rows from two or more (up to 32) FITS Binary Table files, based on the values of specified join columns in each file. NB: the join columns must have an index file associated with it. These files are generated using the funindex program.

The first argument to the program specifies the first input FITS table or raw event file. If "stdin" is specified, data are read from the standard input. Subsequent arguments specify additional event files and tables to join. The last argument is the output FITS file.

NB: Do not use Funtools Bracket Notation to specify FITS extensions and row filters when running funjoin or you will get wrong results. Rows are accessed and joined using the index files directly, and this bypasses all filtering.

The join columns are specified using the -j col switch (which specifies a column name to use for all files) or with -j1 col1, -j2 col2, ... -jn coln switches (which specify a column name to use for each file). A join column must be specified for each file. If both -j col and -jn coln are specified for a given file, then the latter is used. Join columns must either be of type string or type numeric; it is illegal to mix numeric and string columns in a given join. For example, to join three files using the same key column for each file, use:

  funjoin -j key in1.fits in2.fits in3.fits out.fits
A different key can be specified for the third file in this way:
  funjoin -j key -j3 otherkey in1.fits in2.fits in3.fits out.fits

The -a "cols" switch (and -a1 "col1", -a2 "cols2" counterparts) can be used to specify columns to activate (i.e. write to the output file) for each input file. By default, all columns are output.

If two or more columns from separate files have the same name, the second (and subsequent) columns are renamed to have an underscore and a numeric value appended.

The -m min and -M max switches specify the minimum and maximum number of joins required to write out a row. The default minimum is 0 joins (i.e. all rows are written out) and the default maximum is 63 (the maximum number of possible joins with a limit of 32 input files). For example, to write out only those rows in which exactly two files have columns that match (i.e. one join):

  funjoin -j key -m 1 -M 1 in1.fits in2.fits in3.fits ... out.fits

A given row can have the requisite number of joins without all of the files being joined (e.g. three files are being joined but only two have a given join key value). In this case, all of the columns of the non-joined file are written out, by default, using blanks (zeros or NULLs). The -b c1:bv1,c2:bv2 and -b1 'c1:bv1,c2:bv2' -b2 'c1:bv1,c2:bv2' ... switches can be used to set the blank value for columns common to all files and/or columns in a specified file, respectively. Each blank value string contains a comma-separated list of column:blank_val specifiers. For floating point values (single or double), a case-insensitive string value of "nan" means that the IEEE NaN (not-a-number) should be used. Thus, for example:

  funjoin -b "AKEY:???" -b1 "A:-1" -b3 "G:NaN,E:-1,F:-100" ...
means that a non-joined AKEY column in any file will contain the string "???", the non-joined A column of file 1 will contain a value of -1, the non-joined G column of file 3 will contain IEEE NaNs, while the non-joined E and F columns of the same file will contain values -1 and -100, respectively. Of course, where common and specific blank values are specified for the same column, the specific blank value is used.

To distinguish which files are non-blank components of a given row, the -s (status) switch can be used to add a bitmask column named "JFILES" to the output file. In this column, a bit is set for each non-blank file composing the given row, with bit 0 corresponds to the first file, bit 1 to the second file, and so on. The file names themselves are stored in the FITS header as parameters named JFILE1, JFILE2, etc. The -S col switch allows you to change the name of the status column from the default "JFILES".

A join between rows is the Cartesian product of all rows in one file having a given join column value with all rows in a second file having the same value for its join column and so on. Thus, if file1 has 2 rows with join column value 100, file2 has 3 rows with the same value, and file3 has 4 rows, then the join results in 2*3*4=24 rows being output.

The join algorithm directly processes the index file associated with the join column of each file. The smallest value of all the current columns is selected as a base, and this value is used to join equal-valued columns in the other files. In this way, the index files are traversed exactly once.

The -t tol switch specifies a tolerance value for numeric columns. At present, a tolerance value can join only two files at a time. (A completely different algorithm is required to join more than two files using a tolerance, somethng we might consider implementing in the future.)

The following example shows many of the features of funjoin. The input files t1.fits, t2.fits, and t3.fits contain the following columns:

  [sh] fundisp t1.fits
        AKEY    KEY      A      B 
 ----------- ------ ------ ------
         aaa      0      0      1
         bbb      1      3      4
         ccc      2      6      7
         ddd      3      9     10
         eee      4     12     13
         fff      5     15     16
         ggg      6     18     19
         hhh      7     21     22

fundisp t2.fits
        AKEY    KEY      C      D 
 ----------- ------ ------ ------
         iii      8     24     25
         ggg      6     18     19
         eee      4     12     13
         ccc      2      6      7
         aaa      0      0      1

fundisp t3.fits
        AKEY    KEY        E        F           G
------------ ------ -------- -------- -----------
         ggg      6       18       19      100.10
         jjj      9       27       28      200.20
         aaa      0        0        1      300.30
         ddd      3        9       10      400.40

Given these input files, the following funjoin command:


  funjoin -s -a1 "-B" -a2 "-D" -a3 "-E" -b \
  "AKEY:???" -b1 "AKEY:XXX,A:255" -b3 "G:NaN,E:-1,F:-100" \
  -j key t1.fits t2.fits t3.fits foo.fits
will join the files on the KEY column, outputting all columns except B (in t1.fits), D (in t2.fits) and E (in t3.fits), and setting blank values for AKEY (globally, but overridden for t1.fits) and A (in file 1) and G, E, and F (in file 3). A JFILES column will be output to flag which files were used in each row:

        AKEY    KEY      A       AKEY_2  KEY_2      C       AKEY_3  KEY_3        F           G   JFILES
  ------------ ------ ------ ------------ ------ ------ ------------ ------ -------- ----------- --------
         aaa      0      0          aaa      0      0          aaa      0        1      300.30        7
         bbb      1      3          ???      0      0          ???      0     -100         nan        1
         ccc      2      6          ccc      2      6          ???      0     -100         nan        3
         ddd      3      9          ???      0      0          ddd      3       10      400.40        5
         eee      4     12          eee      4     12          ???      0     -100         nan        3
         fff      5     15          ???      0      0          ???      0     -100         nan        1
         ggg      6     18          ggg      6     18          ggg      6       19      100.10        7
         hhh      7     21          ???      0      0          ???      0     -100         nan        1
         XXX      0    255          iii      8     24          ???      0     -100         nan        2
         XXX      0    255          ???      0      0          jjj      9       28      200.20        4

funmerge - merge one or more Funtools table files

funmerge  [-w|-x] -f [colname] <iname1> <iname2>  ... <oname>

  -f    # output a column specifying file from which this event came
  -w    # adjust position values using WCS info
  -x    # adjust position values using WCS info and save old values

funmerge merges FITS data from one or more FITS Binary Table files or raw event files.

The first argument to the program specifies the first input FITS table or raw event file. If "stdin" is specified, data are read from the standard input. Use Funtools Bracket Notation to specify FITS extensions and row filters. Subsequent arguments specify additional event files and tables to merge. (NB: Stdin cannot not be used for any of these additional input file arguments.) The last argument is the output FITS file. The columns in each input table must be identical.

If an input file begins with the '@' character, it is processed as an include file, i.e., as a text file containing event file names (as well as blank lines and/or comment lines starting with the '#' sign). If standard input is specified as an include file ('@stdin'), then file names are read from the standard input until EOF (^D). Event files and include files can be mixed on a command line.

Rows from each table are written sequentially to the output file. If the switch -f [colname] is specified on the command line, an additional column is added to each row containing the number of the file from which that row was taken (starting from one). In this case, the corresponding file names are stored in the header parameters having the prefix FUNFIL, i.e., FUNFIL01, FUNFIL02, etc.

Using the -w switch (or -x switch as described below), funmerge also can adjust the position column values using the WCS information in each file. (By position columns, we mean the columns that the table is binned on, i.e., those columns defined by the bincols= switch, or (X,Y) by default.) To perform WCS alignment, the WCS of the first file is taken as the base WCS. Each position in subsequent files is adjusted by first converting it to the sky coordinate in its own WCS coordinate system, then by converting this sky position to the sky position of the base WCS, and finally converting back to a pixel position in the base system. Note that in order to perform WCS alignment, the appropriate WCS and TLMIN/TLMAX keywords must already exist in each FITS file.

When performing WCS alignment, you can save the original positions in the output file by using the -x (for "xtra") switch instead of the -w switch (i.e., using this switch also implies using -w) The old positions are saved in columns having the same name as the original positional columns, with the added prefix "OLD_".

Examples:

Merge two tables, and preserve the originating file number for each row in the column called "FILE" (along with the corresponding file name in the header):

  [sh] funmerge -f "FILE" test.ev test2.ev merge.ev

Merge two tables with WCS alignment, saving the old position values in 2 additional columns:

  [sh] funmerge -x test.ev test2.ev merge.ev

This program only works on raw event files and binary tables. We have not yet implemented image and array merging.

funsky - convert between image and sky coordinates

  funsky iname[ext]               # RA,Dec (deg) or image pix from stdin
  funsky iname[ext] [lname]       # RA, Dec (deg) or image pix from list
  funsky iname[ext] [col1] [col2]         # named cols:units from stdin
  funsky iname[ext] [lname] [col1] [col2] # named cols:units from list

  -d        # always use integer tlmin conversion (as ds9 does)
  -r        # convert x,y to RA,Dec (default: convert RA,Dec to x,y)
  -o        # include offset from the nominal target position (in arcsec)
  -v        # display input values also (default: display output only)
  -T        # output display in rdb format (w/header,tab delimiters)

Funsky converts input sky coordinates (RA, Dec) to image coordinates (or vice versa) using the WCS information contained in the specified FITS file. Several calling sequences are supported in order to make it easy to specify coordinate positions in different ways.

The first required argument is always the input FITS file (or extension) containing the WCS information in an extension header. Note that the data from this file is not used. By default, the program converts input RA and Dec values to X and Y using this WCS information. If the WCS is associated with a FITS image, then the X,Y values are image values. If the WCS is associated with a binary table, then the X, Y values are physical values. To convert X,Y to RA and Dec, use the -r (reverse) switch.

If no other command arguments are supplied, then the input positions are read from the standard input. Each line is assumed to contain a single coordinate position consisting of an RA in degrees (or X in pixels) followed by a Dec in degrees (or Y in pixels). The usual delimiters are supported (spaces, commas, tabs). For example:

 # read from stdin, default column names and units
 [sh] funsky snr.ev
 22.982695    58.606523   # input RA (hrs), Dec(deg)
    510.00       510.00
 22.982127    58.607634   # input
    512.00       510.50
 22.981700    58.614301   # input
    513.50       513.50
 ^D                       # end of input

If a second argument is supplied, this argument is assumed to be a file containing RA (X) and Dec (Y) positions. The file can either be an ASCII table or a FITS binary table. The order of columns is unimportant, if the table has a column header. In this case, the names of the columns must be one of "RA", "DEC", or "X", "Y" for sky to image and image to sky conversions, respectively. If the table has no header, then once again, RA (X) is assumed to first, followed by DEC (Y). For example:

  # read from file, default column names and units
  [sh] cat hd.in
         RA          DEC
  ---------    ---------
  22.982695    58.606523
  22.982127    58.607634
  22.981700    58.614301

  [sh] funsky snr.ev hd.in
        510.00       510.00
        512.00       510.50
        513.50       513.50

If three arguments are supplied, then the input positions again are read from the standard input. Each line is assumed to contain a single coordinate position consisting of an RA (or X in pixels) followed by a Dec (or Y in pixels), with the usual delimiters supported. However, the second and third arguments now specify the column names and/or sky units using a colon-delimited syntax:

  [colname]:[h|d|r]
If the colname is omitted, the names default to "RA", "DEC", "X", "Y", "COL1", or "COL2" as above. If the units are omitted, the default is degrees for both RA and Dec. When the -r switch is used (convert from image to sky) the units are applied to the output instead of the input. The following examples will serve to illustrate the options:
  # read from stdin, specifying column names (def. units: degrees)
  [sh] cat hd.in
       MYRA        MYDEC
  ---------    ---------
  22.982695    58.606523
  22.982127    58.607634
  22.981700    58.614301

  [sh] funsky snr.ev MYRA MYDEC < hd.in
        510.00       510.00
        512.00       510.50
        513.50       513.50

  # read from stdin, specifying column names and units
  [sh] cat dd.in
       MYRA        MYDEC
  ---------    ---------
  344.740432    58.606523
  344.731900    58.607634
  344.725500    58.614301

  [sh] funsky snr.ev MYRA:d MYDEC:d < dd.in
        510.00       510.00
        512.00       510.50
        513.50       513.50

  # read stdin, convert image to sky, specifying output sky units
  [sh] cat im.in
        510.00       510.00
        512.00       510.50
        513.50       513.50

  [sh] cat im.in | funsky -r snr.ev :d :d
  344.740432    58.606523
  344.731900    58.607634
  344.725500    58.614301

Finally, four command arguments specify both and input file and column names and/or units:

  [sh] cat dd.in
       MYRA        MYDEC
  ---------    ---------
  344.740432    58.606523
  344.731900    58.607634
  344.725500    58.614301

  [sh] funsky snr.ev dd.in MYRA:d MYDEC:d
        510.00       510.00
        512.00       510.50
        513.50       513.50

  # read file, convert image to sky, specifying output sky units
  [sh] cat im.in
        510.00       510.00
        512.00       510.50
        513.50       513.50

  [sh] funsky -r snr.ev im.in :d :d
    344.740432    58.606523
    344.731900    58.607634
    344.725500    58.614301

By default, the output of funsky consists only of the converted coordinate position(s), one per output line. This makes parsing in shell scripts easy. Use the -v (verbose) switch to specify that the input coordinates should be pre-pended to each line. For example:

  [sh] cat dd.in
       MYRA        MYDEC
  ---------    ---------
  344.740432    58.606523
  344.731900    58.607634
  344.725500    58.614301

  [sh] funsky snr.ev dd.in MYRA:d MYDEC:d
        510.00       510.00
        512.00       510.50
        513.50       513.50

  [sh] funsky -v snr.ev dd.in MYRA:d MYDEC:d
    344.740432    58.606523       510.00       510.00
    344.731900    58.607634       512.00       510.50
    344.725500    58.614301       513.50       513.50

In addition, a full starbase table can be output using the -T (table) switch. This switch can be used with or without the -v switch. If the -T and -v are both specified, then a descriptive header parameters are output before the table (mainly to remind you of the sky units):

  # output table in non-verbose mode
  [sh] funsky -T snr.ev dd.in MYRA:d MYDEC:d
             X               Y
  ------------    ------------
        510.00          510.00
        512.00          510.50
        513.50          513.50
  
  # output table in verbose mode
  [sh] funsky -T -v snr.ev dd.in MYRA:d MYDEC:d
  # IFILE = /Users/eric/data/snr.ev
  # ICOL1 = MYRA
  # ICOL2 = MYDEC
  # IUNITS1 = d
  # IUNITS2 = d
  # OCOL1 = X
  # OCOL2 = Y
  
          MYRA           MYDEC               X               Y
  ------------    ------------    ------------    ------------
    344.740432       58.606523          510.00          510.00
    344.731900       58.607634          512.00          510.50
    344.725500       58.614301          513.50          513.50

Finally, the -d (ds9) switch mimicks ds9's use of integer TLMIN and TLMAX values for all coordinate transformations. FITS conventions seem to call for use of floating point TLMIN and TLMAX when the data are floats. This convention is followed by funsky but results in a small discrepancy with ds9's converted values for floating point data. We will remedy this conflict in the future, maybe.

funtable - copy selected rows from a Funtools file to a FITS binary table

funtable [-a] [-i|-z] [-m] [-s cols] <iname> <oname> [columns]

  -a    # append to existing output file as a table extension
  -i    # for image data, only generate X and Y columns
  -m    # for tables, write a separate file for each region
  -s "col1 ..." # columns on which to sort
  -z    # for image data, output zero-valued pixels

funtable selects rows from the specified FITS Extension (binary table only) of a FITS file, or from a non-FITS raw event file, and writes those rows to a FITS binary table file. It also will create a FITS binary table from an image or a raw array file.

The first argument to the program specifies the FITS file, raw event file, or raw array file. If "stdin" is specified, data are read from the standard input. Use Funtools Bracket Notation to specify FITS extensions, and filters. The second argument is the output FITS file. If "stdout" is specified, the FITS binary table is written to the standard output. By default, all columns of the input file are copied to the output file. Selected columns can be output using an optional third argument in the form:

  "column1 column1 ... columnN"

The funtable program generally is used to select rows from a FITS binary table using Table Filters and/or Spatial Region Filters. For example, you can copy only selected rows (and output only selected columns) by executing in a command such as:

  [sh] funtable "test.ev[pha==1&&pi==10]" stdout "x y pi pha" | fundisp stdin
         X       Y     PHA        PI
   ------- ------- ------- ---------
         1      10       1        10
         1      10       1        10
         1      10       1        10
         1      10       1        10
         1      10       1        10
         1      10       1        10
         1      10       1        10
         1      10       1        10
         1      10       1        10
         1      10       1        10

The special column $REGION can be specified to write the region id of each row:

  [sh $] funtable "test.ev[time-(int)time>=.99&&annulus(0 0 0 10 n=3)]" stdout 'x y time $REGION' | fundisp stdin
          X        Y                  TIME     REGION
   -------- -------- --------------------- ----------
          5       -6           40.99000000          3
          4       -5           59.99000000          2
         -1        0          154.99000000          1
         -2        1          168.99000000          1
         -3        2          183.99000000          2
         -4        3          199.99000000          2
         -5        4          216.99000000          2
         -6        5          234.99000000          3
         -7        6          253.99000000          3

Here only rows with the proper fractional time and whose position also is within one of the three annuli are written.

Columns can be excluded from display using a minus sign before the column:

  [sh $] funtable "test.ev[time-(int)time>=.99]" stdout "-time" | fundisp stdin
          X        Y      PHA         PI          DX          DY
   -------- -------- -------- ---------- ----------- -----------
          5       -6        5         -6        5.50       -6.50
          4       -5        4         -5        4.50       -5.50
         -1        0       -1          0       -1.50        0.50
         -2        1       -2          1       -2.50        1.50
         -3        2       -3          2       -3.50        2.50
         -4        3       -4          3       -4.50        3.50
         -5        4       -5          4       -5.50        4.50
         -6        5       -6          5       -6.50        5.50
         -7        6       -7          6       -7.50        6.50
All columns except the time column are written.

In general, the rules for activating and de-activating columns are:

  • If only exclude columns are specified, then all columns but the exclude columns will be activated.
  • If only include columns are specified, then only the specified columns are activated.
  • If a mixture of include and exclude columns are specified, then all but the exclude columns will be active; this last case is ambiguous and the rule is arbitrary.
In addition to specifying columns names explicitly, the special symbols + and - can be used to activate and de-activate all columns. This is useful if you want to activate the $REGION column along with all other columns. According to the rules, the syntax "$REGION" only activates the region column and de-activates the rest. Use "+ $REGION" to activate all columns as well as the region column.

Ordinarily, only the selected table is copied to the output file. In a FITS binary table, it sometimes is desirable to copy all of the other FITS extensions to the output file as well. This can be done by appending a '+' sign to the name of the extension in the input file name. For example, the first command below copies only the EVENT table, while the second command copies other extensions as well:

  [sh] funtable "/proj/rd/data/snr.ev[EVENTS]" events.ev
  [sh] funtable "/proj/rd/data/snr.ev[EVENTS+]" eventsandmore.ev

If the input file is an image or a raw array file, then funtable will generate a FITS binary table from the pixel values in the image. Note that it is not possible to specify the columns to output (using command-line argument 3). Instead, there are two ways to create such a binary table from an image. By default, a 3-column table is generated, where the columns are "X", "Y", and "VALUE". For each pixel in the image, a single row (event) is generated with the "X" and "Y" columns assigned the dim1 and dim2 values of the image pixel, respectively and the "VALUE" column assigned the value of the pixel. With sort of table, running funhist on the "VALUE" column will give the same results as running funhist on the original image.

If the -i ("individual" rows) switch is specified, then only the "X" and "Y" columns are generated. In this case, each positive pixel value in the image generates n rows (events), where n is equal to the integerized value of that pixel (plus 0.5, for floating point data). In effect, -i approximately recreates the rows of a table that would have been binned into the input image. (Of course, this is only approximately correct, since the resulting x,y positions are integerized.)

If the -s [col1 col2 ... coln] ("sort") switch is specified, the output rows of a binary table will be sorted using the specified columns as sort keys. The sort keys must be scalar columns and also must be part of the output file (i.e. you cannot sort on a column but not include it in the output). This facility uses the _sort program (included with funtools), which must be accessible via your path.

For binary tables, the -m ("multiple files") switch will generate a separate file for each region in the filter specification i.e. each file contains only the rows from that region. Rows which pass the filter but are not in any region also are put in a separate file.

The separate output file names generated by the -m switch are produced automatically from the root output file to contain the region id of the associated region. (Note that region ids start at 1, so that the file name associated with id 0 contains rows that pass the filter but are not in any given region.) Output file names are generated as follows:

  • A $n specification can be used anywhere in the root file name (suitably quoted to protect it from the shell) and will be expanded to be the id number of the associated region. For example:
      funtable -m input.fits'[cir(512,512,1);cir(520,520,1)...]' 'foo.goo_$n.fits'
    
    will generate files named foo.goo_0.fits (for rows not in any region but still passing the filter), foo.goo_1.fits (rows in region id #1, the first region), foo.goo_2.fits (rows in region id #2), etc. Note that single quotes in the output root are required to protect the '$' from the shell.
  • If $n is not specified, then the region id will be placed before the first dot (.) in the filename. Thus:
      funtable -m input.fits'[cir(512,512,1);cir(520,520,1)...]' foo.evt.fits
    
    will generate files named foo0.evt.fits (for rows not in any region but still passing the filter), foo1.evt.fits (rows in region id #1), foo2.evt.fits (rows in region id #2), etc.
  • If no dot is specified in the root output file name, then the region id will be appended to the filename. Thus:
      funtable -m input.fits'[cir(512,512,1);cir(520,520,1)...]' 'foo_evt'
    
    will generate files named foo_evt0 (for rows not in any region but still passing the filter), foo_evt1 (rows in region id #1), foo_evt2 (rows in region id #2), etc.
The multiple file mechanism provide a simple way to generate individual source data files with a single pass through the data.

By default, a new FITS file is created and the binary table is written to the first extension. If the -a (append) switch is specified, the table is appended to an existing FITS file as a BINTABLE extension. Note that the output FITS file must already exist.

If the -z ("zero" pixel values) switch is specified and -i is not specified, then pixels having a zero value will be output with their "VALUE" column set to zero. Obviously, this switch does not make sense when individual events are output.

funtbl - extract a table from Funtools ASCII output

funtable [-c cols] [-h] [-n table] [-p prog] [-s sep] <iname>

[NB: This program has been deprecated in favor of the ASCII text processing support in funtools. You can now perform fundisp on funtools ASCII output files (specifying the table using bracket notation) to extract tables and columns.] The funtbl script extracts a specified table (without the header and comments) from a funtools ASCII output file and writes the result to the standard output. The first non-switch argument is the ASCII input file name (i.e. the saved output from funcnts, fundisp, funhist, etc.). If no filename is specified, stdin is read. The -n switch specifies which table (starting from 1) to extract. The default is to extract the first table. The -c switch is a space-delimited list of column numbers to output, e.g. -c "1 3 5" will extract the first three odd-numbered columns. The default is to extract all columns. The -s switch specifies the separator string to put between columns. The default is a single space. The -h switch specifies that column names should be added in a header line before the data is output. Without the switch, no header is prepended. The -p program switch allows you to specify an awk-like program to run instead of the default (which is host-specific and is determined at build time). The -T switch will output the data in rdb format (i.e., with a 2-row header of column names and dashes, and with data columns separated by tabs). The -help switch will print out a message describing program usage.

For example, consider the output from the following funcnts command:

  [sh] funcnts -sr snr.ev "ann 512 512 0 9 n=3"
  # source
  #   data file:        /proj/rd/data/snr.ev
  #   arcsec/pixel:     8
  # background
  #   constant value:   0.000000
  # column units
  #   area:             arcsec**2
  #   surf_bri:         cnts/arcsec**2
  #   surf_err:         cnts/arcsec**2
  
  # summed background-subtracted results
  upto   net_counts     error   background    berror      area  surf_bri  surf_err
  ---- ------------ --------- ------------ --------- --------- --------- ---------
     1      147.000    12.124        0.000     0.000   1600.00     0.092     0.008
     2      625.000    25.000        0.000     0.000   6976.00     0.090     0.004
     3     1442.000    37.974        0.000     0.000  15936.00     0.090     0.002
  
  
  # background-subtracted results
   reg   net_counts     error   background    berror      area  surf_bri  surf_err
  ---- ------------ --------- ------------ --------- --------- --------- ---------
     1      147.000    12.124        0.000     0.000   1600.00     0.092     0.008
     2      478.000    21.863        0.000     0.000   5376.00     0.089     0.004
     3      817.000    28.583        0.000     0.000   8960.00     0.091     0.003
  
  
  # the following source and background components were used:
  source_region(s)
  ----------------
  ann 512 512 0 9 n=3
  
   reg       counts    pixels      sumcnts    sumpix
  ---- ------------ --------- ------------ ---------
     1      147.000        25      147.000        25
     2      478.000        84      625.000       109
     3      817.000       140     1442.000       249

There are four tables in this output. To extract the last one, you can execute:

  [sh] funcnts -s snr.ev "ann 512 512 0 9 n=3" | funtbl -n 4
  1 147.000 25 147.000 25
  2 478.000 84 625.000 109
  3 817.000 140 1442.000 249
Note that the output has been re-formatted so that only a single space separates each column, with no extraneous header or comment information.

To extract only columns 1,2, and 4 from the last example (but with a header prepended and tabs between columns), you can execute:

  [sh] funcnts -s snr.ev "ann 512 512 0 9 n=3" | funtbl -c "1 2 4" -h -n 4 -s "\t"
  #reg    counts  sumcnts
  1       147.000 147.000
  2       478.000 625.000
  3       817.000 1442.000

Of course, if the output has previously been saved in a file named foo.out, the same result can be obtained by executing:

  [sh] funtbl -c "1 2 4" -h -n 4 -s "\t" foo.out
  #reg    counts  sumcnts
  1       147.000 147.000
  2       478.000 625.000
  3       817.000 1442.000

Go to Funtools Help Index

Last updated: April 1, 2007
funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/regalgebra.html000066400000000000000000000256611256243640000242360ustar00rootroot00000000000000 Region Algebra

RegAlgebra: Boolean Algebra on Spatial Regions

Summary

This document describes the boolean arithmetic defined for region expressions.

Description

When defining a region, several shapes can be combined using boolean operations. The boolean operators are (in order of precedence):

  Symbol        Operator                Associativity
  ------        --------                -------------
  !             not                     right to left
  &             and                     left to right
  ^             exclusive or            left to right
  |             inclusive or            left to right

For example, to create a mask consisting of a large circle with a smaller box removed, one can use the and and not operators:
  CIRCLE(11,11,15) & !BOX(11,11,3,6)
and the resulting mask is:
         1234567890123456789012345678901234567890
         ----------------------------------------
       1:1111111111111111111111..................
       2:1111111111111111111111..................
       3:11111111111111111111111.................
       4:111111111111111111111111................
       5:111111111111111111111111................
       6:1111111111111111111111111...............
       7:1111111111111111111111111...............
       8:1111111111111111111111111...............
       9:111111111...1111111111111...............
      10:111111111...1111111111111...............
      11:111111111...1111111111111...............
      12:111111111...1111111111111...............
      13:111111111...1111111111111...............
      14:111111111...1111111111111...............
      15:1111111111111111111111111...............
      16:1111111111111111111111111...............
      17:111111111111111111111111................
      18:111111111111111111111111................
      19:11111111111111111111111.................
      20:1111111111111111111111..................
      21:1111111111111111111111..................
      22:111111111111111111111...................
      23:..11111111111111111.....................
      24:...111111111111111......................
      25:.....11111111111........................
      26:........................................
      27:........................................
      28:........................................
      29:........................................
      30:........................................
      31:........................................
      32:........................................
      33:........................................
      34:........................................
      35:........................................
      36:........................................
      37:........................................
      38:........................................
      39:........................................
      40:........................................
A three-quarter circle can be defined as:
  CIRCLE(20,20,10) & !PIE(20,20,270,360)
and looks as follows:

         1234567890123456789012345678901234567890
         ----------------------------------------
       1:........................................
       2:........................................
       3:........................................
       4:........................................
       5:........................................
       6:........................................
       7:........................................
       8:........................................
       9:........................................
      10:........................................
      11:...............111111111................
      12:..............11111111111...............
      13:............111111111111111.............
      14:............111111111111111.............
      15:...........11111111111111111............
      16:..........1111111111111111111...........
      17:..........1111111111111111111...........
      18:..........1111111111111111111...........
      19:..........1111111111111111111...........
      20:..........1111111111111111111...........
      21:..........1111111111....................
      22:..........1111111111....................
      23:..........1111111111....................
      24:..........1111111111....................
      25:...........111111111....................
      26:............11111111....................
      27:............11111111....................
      28:..............111111....................
      29:...............11111....................
      30:........................................
      31:........................................
      32:........................................
      33:........................................
      34:........................................
      35:........................................
      36:........................................
      37:........................................
      38:........................................
      39:........................................
      40:........................................
Two non-intersecting ellipses can be made into the same region:
  ELL(20,20,10,20,90) | ELL(1,1,20,10,0)
and looks as follows:
         1234567890123456789012345678901234567890
         ----------------------------------------
       1:11111111111111111111....................
       2:11111111111111111111....................
       3:11111111111111111111....................
       4:11111111111111111111....................
       5:1111111111111111111.....................
       6:111111111111111111......................
       7:1111111111111111........................
       8:111111111111111.........................
       9:111111111111............................
      10:111111111...............................
      11:...........11111111111111111............
      12:........111111111111111111111111........
      13:.....11111111111111111111111111111......
      14:....11111111111111111111111111111111....
      15:..11111111111111111111111111111111111...
      16:.1111111111111111111111111111111111111..
      17:111111111111111111111111111111111111111.
      18:111111111111111111111111111111111111111.
      19:111111111111111111111111111111111111111.
      20:111111111111111111111111111111111111111.
      21:111111111111111111111111111111111111111.
      22:111111111111111111111111111111111111111.
      23:111111111111111111111111111111111111111.
      24:.1111111111111111111111111111111111111..
      25:..11111111111111111111111111111111111...
      26:...11111111111111111111111111111111.....
      27:.....11111111111111111111111111111......
      28:.......111111111111111111111111.........
      29:...........11111111111111111............
      30:........................................
      31:........................................
      32:........................................
      33:........................................
      34:........................................
      35:........................................
      36:........................................
      37:........................................
      38:........................................
      39:........................................
      40:........................................
You can use several boolean operations in a single region expression, to create arbitrarily complex regions. With the important exception below, you can apply the operators in any order, using parentheses if necessary to override the natural precedences of the operators.

NB: Using a panda shape is always much more efficient than explicitly specifying "pie & annulus", due to the ability of panda to place a limit on the number of pixels checked in the pie shape. If you are going to specify the intersection of pie and annulus, use panda instead.

As described in "help regreometry", the PIE slice goes to the edge of the field. To limit its scope, PIE usually is is combined with other shapes, such as circles and annuli, using boolean operations. In this context, it is worth noting that that there is a difference between -PIE and &!PIE. The former is a global exclude of all pixels in the PIE slice, while the latter is a local excludes of pixels affecting only the region(s) with which the PIE is combined. For example, the following region uses &!PIE as a local exclude of a single circle. Two other circles are also defined and are unaffected by the local exclude:


        CIRCLE(1,8,1)
        CIRCLE(8,8,7)&!PIE(8,8,60,120)&!PIE(8,8,240,300)
        CIRCLE(15,8,2)

          1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
          - - - - - - - - - - - - - - -
      15: . . . . . . . . . . . . . . .
      14: . . . . 2 2 2 2 2 2 2 . . . .
      13: . . . 2 2 2 2 2 2 2 2 2 . . .
      12: . . 2 2 2 2 2 2 2 2 2 2 2 . .
      11: . . 2 2 2 2 2 2 2 2 2 2 2 . .
      10: . . . . 2 2 2 2 2 2 2 . . . .
       9: . . . . . . 2 2 2 . . . . 3 3
       8: 1 . . . . . . . . . . . . 3 3
       7: . . . . . . 2 2 2 . . . . 3 3
       6: . . . . 2 2 2 2 2 2 2 . . . .
       5: . . 2 2 2 2 2 2 2 2 2 2 2 . .
       4: . . 2 2 2 2 2 2 2 2 2 2 2 . .
       3: . . . 2 2 2 2 2 2 2 2 2 . . .
       2: . . . . 2 2 2 2 2 2 2 . . . .
       1: . . . . . . . . . . . . . . .

Note that the two other regions are not affected by the &!PIE, which only affects the circle with which it is combined.

On the other hand, a -PIE is an global exclude that does affect other regions with which it overlaps:


        CIRCLE(1,8,1)
        CIRCLE(8,8,7)
        -PIE(8,8,60,120)
        -PIE(8,8,240,300)
        CIRCLE(15,8,2)

          1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
          - - - - - - - - - - - - - - -
      15: . . . . . . . . . . . . . . .
      14: . . . . 2 2 2 2 2 2 2 . . . .
      13: . . . 2 2 2 2 2 2 2 2 2 . . .
      12: . . 2 2 2 2 2 2 2 2 2 2 2 . .
      11: . . 2 2 2 2 2 2 2 2 2 2 2 . .
      10: . . . . 2 2 2 2 2 2 2 . . . .
       9: . . . . . . 2 2 2 . . . . . .
       8: . . . . . . . . . . . . . . .
       7: . . . . . . 2 2 2 . . . . . .
       6: . . . . 2 2 2 2 2 2 2 . . . .
       5: . . 2 2 2 2 2 2 2 2 2 2 2 . .
       4: . . 2 2 2 2 2 2 2 2 2 2 2 . .
       3: . . . 2 2 2 2 2 2 2 2 2 . . .
       2: . . . . 2 2 2 2 2 2 2 . . . .
       1: . . . . . . . . . . . . . . .

The two smaller circles are entirely contained within the two exclude PIE slices and therefore are excluded from the region.

Go to Funtools Help Index

Last updated: November 17, 2005
funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/regbounds.html000066400000000000000000000144141256243640000241250ustar00rootroot00000000000000 Spatial Region Boundaries

RegBounds: Region Boundaries

Summary

Describes how spatial region boundaries are handled.

Description

The golden rule for spatial region filtering was first enunciated by Leon VanSpeybroeck in 1986:

Each photon will be counted once, and no photon will be counted more than once.

This means that we must be careful about boundary conditions. For example, if a circle is contained in an annulus such that the inner radius of the annulus is the same as the radius of the circle, then photons on that boundary must always be assigned to one or the other region. That is, the number of photons in both regions must equal the sum of the number of photons in each region taken separately. With this in mind, the rules for determining whether a boundary image pixel or table row are assigned to a region are defined below.

Image boundaries : radially-symmetric shapes (circle, annuli, ellipse)

For image filtering, pixels whose center is inside the boundary are included. This also applies non-radially-symmetric shapes. When a pixel center is exactly on the boundary, the pixel assignment rule is:
  • the outer boundary of a symmetric shape does not include such pixels
  • the inner boundary of a symmetric shape (annulus) includes such pixels
In this way, an annulus with radius from 0 to 1, centered exactly on a pixel, includes the pixel on which it is centered, but none of its neighbors. These rules ensure that when defining concentric shapes, no pixels are omitted between concentric regions and no pixels are claimed by two regions. When applied to small symmetric shapes, the shape is less likely to be skewed, as would happen with non-radially-symmetric rules. These rules differ from the rules for box-like shapes, which are more likely to be positioned adjacent to one another.

Image Boundaries: non-radially symmetric shapes (polygons, boxes)

For image filtering, pixels whose center is inside the boundary are included. This also applies radially-symmetric shapes. When a pixel center is exactly on the boundary of a non-radially symmetric region, the pixel is included in the right or upper region, but not the left or lower region. This ensures that geometrically adjoining regions touch but don't overlap.

Row Boundaries are Analytic

When filtering table rows, the boundary rules are the same as for images, except that the calculation is not done on the center of a pixel, (since table rows, especially X-ray events rows, often have discrete, floating point positions) but are calculated exactly. That is, an row is inside the boundary without regard to its integerized pixel value. For rows that are exactly on a region boundary, the above rules are applied to ensure that all rows are counted once and no row is counted more than once.

Because row boundaries are calculated differently from image boundaries, certain programs will give different results when filtering the same region file. In particular, fundisp/funtable (which utilize analytic row filtering) perform differently from funcnts (which performs image filtering, even on tables).

Image Boundaries vs. Row Boundaries: Practical Considerations

You will sometimes notice a discrepancy between running funcnts on an binary table file and running fundisp on the same file with the same filter. For example, consider the following:

  fundisp test1.fits"[box(4219,3887,6,6,0)]" | wc
  8893  320148 3752846
Since fundisp has a 2-line header, there are actually 8891 photons that pass the filter. But then run funtable and select only the rows that pass this filter, placing them in a new file:
  ./funtable test1.fits"[box(4219,3887,6,6,0)]" test2.fits
Now run funcnts using the original filter on the derived file:
  ./funcnts test2.fits "physical; box(4219,3887,6,6,0)"

  [... lot of processed output ...]

  # the following source and background components were used:
  source region(s)
  ----------------
  physical; box(4219,3887,6,6,0)
 
   reg       counts    pixels
  ---- ------------ ---------
     1     7847.000        36
There are 1044 rows (events) that pass the row filter in fundisp (or funtable) but fail to make it through funcnts. Why?

The reason can be traced to how analytic row filtering (fundisp, funtable) differs from integerized pixel filtering(funcnts, funimage). Consider the region:

  box(4219,3887,6,6,0)
Analytically (i.e., using row filtering), positions will pass this filter successfully if:
  4216 <= x <= 4222
  3884 <= y <= 3890
For example, photons with position values of x=4216.4 or y=3884.08 will pass.

Integerized image filtering is different in that the pixels that will pass this filter have centers at:

  x = 4217, 4218, 4219, 4220, 4221, 4222
  y = 3885, 3886, 3887, 3888, 3889, 3890
Note that there are 6 pixels in each direction, as specified by the region. That means that positions will pass the filter successfully if:
  4217 <= (int)x <= 4222
  3885 <= (int)y <= 3890
Photons with position values of x=4216.4 or y=3884.08 will NOT pass.

Note that the position values are integerized, in effect, binned into image values. This means that x=4222.4 will pass this filter, but not the analytic filter above. We do this to maintain the design goal that either all counts in a pixel are included in an integerized filter, or else none are included.

[It could be argued that the correct photon limits for floating point row data really should be:

  4216.5 <= x <= 4222.5
  3884.5 <= y <= 3890.5
since each pixel extends for .5 on either side of the center. We chose to the maintain integerized algorithm for all image-style filtering so that funcnts would give the exact same results regardless of whether a table or a derived non-blocked binned image is used.]

Go to Funtools Help Index

Last updated: November 16, 2005
funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/regcoords.html000066400000000000000000000173731256243640000241330ustar00rootroot00000000000000 Spatial Region Coordinates

RegCoords: Spatial Region Coordinates

Summary

This document describes the specification of coordinate systems, and the interpretation of coordinate values, for spatial region filtering.

Pixel coordinate systems

The default coordinate system for regions is PHYSICAL, which means that region position and size values are taken from the original data. (Note that this is a change from the original IRAF/PROS implementation, in which the IMAGE coordinate system was the default.) PHYSICAL coordinates always refer to pixel positions on the original image (using IRAF LTM and LTV keywords). With PHYSICAL coordinates, if a set of coordinates specifies the position of an object in an original FITS file, the same coordinates will specify the same object in any FITS derived from the original. Physical coordinates are invariant with blocking of FITS files or taking sections of images, even when a blocked section is written to a new file.

Thus, although a value in pixels refers, by default, to the PHYSICAL coordinate system, you may specify that position values refer to the image coordinate system using the global or local properties commands:

  global coordsys image
  circle 512 512 100
The global command changes the coordinate system for all regions that follow, while the local command changes the coordinate system only for the region immediately following:
  local coordsys image
  circle 512 512 100
  circle 1024 1024 200
This changes the coordinate system only for the region that follows. In the above example, the second region uses the global coordinate system (PHYSICAL by default).

World Coordinate Systems

If World Coordinate System information is contained in the data file being filtered, it also is possible to define regions using a sky coordinate system. Supported systems include:
  name                  description
  ----                  -----------
  PHYSICAL              pixel coords of original file using LTM/LTV
  IMAGE                 pixel coords of current file
  FK4, B1950            sky coordinate systems
  FK5, J2000            sky coordinate systems
  GALACTIC              sky coordinate systems
  ECLIPTIC              sky coordinate systems
  ICRS                  currently same as J2000
  LINEAR                linear wcs as defined in file
In addition, two mosaic coordinate systems have been defined that utilize the (evolving) IRAF mosaic keywords:
  name                  description
  ----                  -----------
  AMPLIFIER             mosaic coords of original file using ATM/ATV
  DETECTOR              mosaic coords of original file using DTM/DTV
Again, to use one of these coordinate systems, the global or local properties commands are used:
  global coordsys galactic

WCS Positions and Sizes

In addition to pixels, positional values in a WCS-enabled region can be specified using sexagesimal or degrees format:
  position arguments    description
  ------------------    -----------
  [num]                 context-dependent (see below)
  [num]d                degrees
  [num]r                radians
  [num]p                physical pixels
  [num]i                image pixels
  [num]:[num]:[num]     hms for 'odd' position arguments
  [num]:[num]:[num]     dms for 'even' position arguments
  [num]h[num]m[num]s    explicit hms
  [num]d[num]m[num]s    explicit dms
If ':' is used as sexagesimal separator, the value is considered to be specifying hours/minutes/seconds if it is the first argument of a positional pair, and degrees/minutes/seconds for the second argument of a pair (except for galactic coordinates, which always use degrees):
  argument      description
  -----------   -----------
  10:20:30.0    10 hours, 20 minutes, 30 seconds for 1st positional argument
                10 degrees, 20 minutes, 30 seconds for 2nd positional argument
  10h20m30.0    10 hours, 20 minutes, 30 seconds
  10d20m30.0    10 degrees, 20 minutes, 30 seconds
  10.20d        10.2 degrees
Similarly, the units of size values are defined by the formating character(s) attached to a number:
  size arguments        description
  --------------        -----------
  [num]                 context-dependent (see below)
  [num]"                arc seconds
  [num]'                arc minutes
  [num]d                degrees
  [num]r                radians
  [num]p                physical pixels
  [num]i                image pixels
For example:
  argument      description
  -----------   -----------
  10            ten pixels
  10'           ten minutes of arc
  10"           ten seconds of arc
  10d           ten degrees
  10p           ten pixels
  0.5r          half of a radian

An example of using sky coordinate systems follows:

  global coordsys B1950
  -box 175.54d 20.01156d 10' 10'
  local coordsys J2000
  pie 179.57d 22.4d 0 360 n=4 && annulus 179.57d 22.4d 3' 24' n=5
At the FK4 1950 coordinates 175.54d RA, 20.01156d DEC exclude a 10 minute by 10 minute box. Then at the FK5 2000 coordinates 179.57d RA 22.4d DEC draw a radial profile regions pattern with 4 quadrants and 5 annuli ranging from 3 minutes to 24 minutes in diameter. In this example, the default coordinate system is overridden by the commands in the regions spec.

NB: The Meaning of Pure Numbers Are Context Sensitive

When a "pure number" (i.e. one without a format directive such as 'd' for 'degrees') is specified as a position or size, its interpretation depends on the context defined by the 'coordsys' keyword. In general, the rule is:

All pure numbers have implied units corresponding to the current coordinate system.

If no coordinate system is explicitly specified, the default system is implicitly assumed to be PHYSICAL. In practice this means that for IMAGE and PHYSICAL systems, pure numbers are pixels. Otherwise, for all systems other than LINEAR, pure numbers are degrees. For LINEAR systems, pure numbers are in the units of the linear system. This rule covers both positions and sizes.

As a corollary, when a sky-formatted number is used with the IMAGE or PHYSICAL coordinate system (which includes the default case of no coordsys being specified), the formatted number is assumed to be in the units of the WCS contained in the current file. If no sky WCS is specified, an error results.

Examples:

  circle(512,512,10)
  ellipse 202.44382d 47.181656d 0.01d 0.02d

In the absence of a specified coordinate system, the circle uses the default PHYSICAL units of pixels, while the ellipse explicitly uses degrees, presumably to go with the WCS in the current file.

 global coordsys=fk5 
 global color=green font="system 10 normal"
 circle 202.44382 47.181656 0.01
 circle 202.44382 47.181656 10p
 ellipse(512p,512p,10p,15p,20)

Here, the circles use the FK5 units of degrees (except for the explicit use of pixels in the second radius), while the ellipse explicitly specifies pixels. The ellipse angle is in degrees.

Note that Chandra data format appears to use "coordsys=physical" implicitly. Therefore, for most Chandra applications, valid regions can be generated safely by asking ds9 to save/display regions in pixels using the PHYSICAL coordsys.

Go to Funtools Help Index

Last updated: November 17, 2005
funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/regdiff.html000066400000000000000000000044101256243640000235360ustar00rootroot00000000000000 Differences Between Funtools and IRAF Regions

RegDiff:Differences Between Funtools and IRAF Regions

Summary

Describes the differences between Funtools/ds9 regions and the old IRAF/PROS regions.

Description

We have tried to make Funtools regions compatible with their predecessor, IRAF/PROS regions. For simple regions and simple boolean algebra between regions, there should be no difference between the two implementations. The following is a list of differences and incompatibilities between the two:

  • If a pixel is covered by two different regions expressions, Funtools assigns the mask value of the first region that contains that pixel. That is, successive regions do not overwrite previous regions in the mask, as was the case with the original PROS regions. This means that one must define overlapping regions in the reverse order in which they were defined in PROS. If region N is fully contained within region M, then N should be defined before M, or else it will be "covered up" by the latter. This change is necessitated by the use of optimized filter compilation, i.e., Funtools only tests individual regions until a proper match is made.

  • The PANDA region has replaced the old PROS syntax in which a PIE accelerator was combined with an ANNULUS accelerator using AND. That is,
      ANNULUS(20,20,0,15,n=4) & PIE(20,20,0,360,n=3)
    
    has been replaced by:
      PANDA(20,20,0,360,3,0,15,4)
    
    The PROS syntax was inconsistent with the meaning of the AND operator.

  • The meaning of pure numbers (i.e., without format specifiers) in regions has been clarified, as has the syntax for specifying coordinate systems. See the general discussion on Spatial Region Filtering for more information.

Go to Funtools Help Index

Last updated: November 16, 2005
funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/reggeometry.html000066400000000000000000001342241256243640000244700ustar00rootroot00000000000000 Region Geometry

RegGeometry: Geometric Shapes in Spatial Region Filtering

Summary

This document describes the geometry of regions available for spatial filtering in IRAF/PROS analysis.

Geometric shapes

Several geometric shapes are used to describe regions. The valid shapes are:

  shape:        arguments:
  -----         ----------------------------------------
  ANNULUS       xcenter ycenter inner_radius outer_radius
  BOX           xcenter ycenter xwidth yheight (angle)
  CIRCLE        xcenter ycenter radius
  ELLIPSE       xcenter ycenter xwidth yheight (angle)
  FIELD         none
  LINE          x1 y1 x2 y2
  PIE           xcenter ycenter angle1 angle2
  POINT         x1 y1
  POLYGON       x1 y1 x2 y2 ... xn yn
All arguments are real values; integer values are automatically converted to real where necessary. All angles are in degrees and specify angles that run counter-clockwise from the positive y-axis.

Shapes can be specified using "command" syntax:

  [shape] arg1 arg2 ...
or using "routine" syntax:
  [shape](arg1, arg2, ...)
or by any combination of the these. (Of course, the parentheses must balance and there cannot be more commas than necessary.) The shape keywords are case-insensitive. Furthermore, any shape can be specified by a three-character unique abbreviation. For example, one can specify three circular regions as:
  "foo.fits[CIRCLE 512 512 50;CIR(128 128, 10);cir(650,650,20)]"
(Quotes generally are required to protect the region descriptor from being processed by the Unix shell.)

The annulus shape specifies annuli, centered at xcenter, ycenter, with inner and outer radii (r1, r2). For example,

  ANNULUS 25 25 5 10
specifies an annulus centered at 25.0 25.0 with an inner radius of 5.0 and an outer radius of 10. Assuming (as will be done for all examples in this document, unless otherwise noted) this shape is used in a mask of size 40x40, it will look like this:
	1234567890123456789012345678901234567890
	----------------------------------------
	40:........................................
	39:........................................
	38:........................................
	37:........................................
	36:........................................
	35:........................................
	34:....................111111111...........
	33:...................11111111111..........
	32:.................111111111111111........
	31:.................111111111111111........
	30:................11111111111111111.......
	29:...............1111111.....1111111......
	28:...............111111.......111111......
	27:...............11111.........11111......
	26:...............11111.........11111......
	25:...............11111.........11111......
	24:...............11111.........11111......
	23:...............11111.........11111......
	22:...............111111.......111111......
	21:...............1111111.....1111111......
	20:................11111111111111111.......
	19:.................111111111111111........
	18:.................111111111111111........
	17:...................11111111111..........
	16:....................111111111...........
	15:........................................
	14:........................................
	13:........................................
	12:........................................
	11:........................................
	10:........................................
	9:........................................
	8:........................................
	7:........................................
	6:........................................
	5:........................................
	4:........................................
	3:........................................
	2:........................................
	1:........................................

The box shape specifies an orthogonally oriented box, centered at xcenter, ycenter, of size xwidth, yheight. It requires four arguments and accepts an optional fifth argument to specify a rotation angle. When the rotation angle is specified (in degrees), the box is rotated by an angle that runs counter-clockwise from the positive y-axis.

The box shape specifies a rotated box, centered at xcenter, ycenter, of size xwidth, yheight. The box is rotated by an angle specified in degrees that runs counter-clockwise from the positive y-axis. If the angle argument is omitted, it defaults to 0.


The circle shape specifies a circle, centered at xcenter, ycenter, of radius r. It requires three arguments.


The ellipse shape specifies an ellipse, centered at xcenter, ycenter, with y-axis width a and the y-axis length b defined such that:

  x**2/a**2 + y**2/b**2 = 1
Note that a can be less than, equal to, or greater than b. The ellipse is rotated the specified number of degrees. The rotation is done according to astronomical convention, counter-clockwise from the positive y-axis. An ellipse defined by:
  ELLIPSE 20 20 5 10 45
will look like this:
         1234567890123456789012345678901234567890
         ----------------------------------------
      40:........................................
      39:........................................
      38:........................................
      37:........................................
      36:........................................
      35:........................................
      34:........................................
      33:........................................
      32:........................................
      31:........................................
      30:........................................
      29:........................................
      28:........................................
      27:............111111......................
      26:............11111111....................
      25:............111111111...................
      24:............11111111111.................
      23:............111111111111................
      22:............111111111111................
      21:.............111111111111...............
      20:.............1111111111111..............
      19:..............111111111111..............
      18:...............111111111111.............
      17:...............111111111111.............
      16:................11111111111.............
      15:..................111111111.............
      14:...................11111111.............
      13:.....................111111.............
      12:........................................
      11:........................................
      10:........................................
       9:........................................
       8:........................................
       7:........................................
       6:........................................
       5:........................................
       4:........................................
       3:........................................
       2:........................................
       1:........................................

The field shape specifies the entire field as a region. It is not usually specified explicitly, but is used implicitly in the case where no regions are specified, that is, in cases where either a null string or some abbreviation of the string "none" is input. Field takes no arguments.


The pie shape specifies an angular wedge of the entire field, centered at xcenter, ycenter. The wedge runs between the two specified angles. The angles are given in degrees, running counter-clockwise from the positive x-axis. For example,

  PIE 20 20 90 180
defines a region from 90 degrees to 180 degrees, i.e., quadrant 2 of the Cartesian plane. The display of such a region looks like this:
	1234567890123456789012345678901234567890
	----------------------------------------
	40:11111111111111111111....................
	39:11111111111111111111....................
	38:11111111111111111111....................
	37:11111111111111111111....................
	36:11111111111111111111....................
	35:11111111111111111111....................
	34:11111111111111111111....................
	33:11111111111111111111....................
	32:11111111111111111111....................
	31:11111111111111111111....................
	30:11111111111111111111....................
	29:11111111111111111111....................
	28:11111111111111111111....................
	27:11111111111111111111....................
	26:11111111111111111111....................
	25:11111111111111111111....................
	24:11111111111111111111....................
	23:11111111111111111111....................
	22:11111111111111111111....................
	21:11111111111111111111....................
	20:........................................
	19:........................................
	18:........................................
	17:........................................
	16:........................................
	15:........................................
	14:........................................
	13:........................................
	12:........................................
	11:........................................
	10:........................................
	9:........................................
	8:........................................
	7:........................................
	6:........................................
	5:........................................
	4:........................................
	3:........................................
	2:........................................
	1:........................................
The pie slice specified is always a counter-clockwise sweep between the angles, starting at the first angle and ending at the second. Thus:
  PIE 10 15 30 60
describes a 30 degree sweep from 2 o'clock to 1 o'clock, while:
  PIE 10 15 60 30
describes a 330 degree counter-clockwise sweep from 1 o'clock to 2 o'clock passing through 12 o'clock (0 degrees). Note in both of these examples that the center of the slice can be anywhere on the plane. The second mask looks like this:
	1234567890123456789012345678901234567890
	----------------------------------------
	40:111111111111111111111111................
	39:11111111111111111111111.................
	38:11111111111111111111111.................
	37:1111111111111111111111..................
	36:1111111111111111111111..................
	35:111111111111111111111...................
	34:11111111111111111111....................
	33:11111111111111111111....................
	32:1111111111111111111....................1
	31:1111111111111111111..................111
	30:111111111111111111.................11111
	29:111111111111111111................111111
	28:11111111111111111...............11111111
	27:1111111111111111..............1111111111
	26:1111111111111111.............11111111111
	25:111111111111111............1111111111111
	24:111111111111111..........111111111111111
	23:11111111111111.........11111111111111111
	22:11111111111111........111111111111111111
	21:1111111111111.......11111111111111111111
	20:111111111111......1111111111111111111111
	19:111111111111....111111111111111111111111
	18:11111111111....1111111111111111111111111
	17:11111111111..111111111111111111111111111
	16:1111111111.11111111111111111111111111111
	15:1111111111111111111111111111111111111111
	14:1111111111111111111111111111111111111111
	13:1111111111111111111111111111111111111111
	12:1111111111111111111111111111111111111111
	11:1111111111111111111111111111111111111111
	10:1111111111111111111111111111111111111111
	9:1111111111111111111111111111111111111111
	8:1111111111111111111111111111111111111111
	7:1111111111111111111111111111111111111111
	6:1111111111111111111111111111111111111111
	5:1111111111111111111111111111111111111111
	4:1111111111111111111111111111111111111111
	3:1111111111111111111111111111111111111111
	2:1111111111111111111111111111111111111111
	1:1111111111111111111111111111111111111111
The pie slice goes to the edge of the field. To limit its scope, pie usually is is combined with other shapes, such as circles and annuli, using boolean operations. (See below and in "help regalgebra").

Pie Performance Notes:

Pie region processing time is proportional to the size of the image, and not the size of the region. This is because the pie shape is the only infinite length shape, and we essentially must check all y rows for inclusion (unlike other regions, where the y limits can be calculated beforehand). Thus, pie can run very slowly on large images. In particular, it will run MUCH more slowly than the panda shape in image-based region operations (such as funcnts). We recommend use of panda over pie where ever possible.

If you must use pie, always try to put it last in a boolean && expression. The reason for this is that the filter code is optimized to exit as soon as the result is know. Since pie is the slowest region, it is better to avoid executing it if another region can decide the result. Consider, for example, the difference in time required to process a Chandra ACIS file when a pie and circle are combined in two different orders:

  time ./funcnts nacis.fits "circle 4096 4096 100 && pie 4096 4096 10 78"
2.87u 0.38s 0:35.08 9.2%

  time ./funcnts nacis.fits "pie 4096 4096 10 78 && circle 4096 4096 100 "
89.73u 0.36s 1:03.50 141.8%

Black-magic performance note:

Panda region processing uses a quick test pie region instead of the normal pie region when combining its annulus and pie shapes. This qtpie shape differs from the normal pie in that it utilizes the y limits from the previous region with which it is combined. In a panda shape, which is a series of annuli combined with pies, the processing time is thus reduced to that of the annuli.

You can use the qtpie shape instead of pie in cases where you are combining pie with another shape using the && operator. This will cause the pie limits to be set using limits from the other shape, and will speed up the processing considerably. For example, the above execution of funcnts can be improved considerably using this technique:

  time ./funcnts nacis.fits "circle 4096 4096 100 && qtpie 4096 4096 10 78"
4.66u 0.33s 0:05.87 85.0%

We emphasize that this is a quasi-documented feature and might change in the future. The qtpie shape is not recognized by ds9 or other programs.


The line shape allows single pixels in a line between (x1,y1) and (x2,y2) to be included or excluded. For example:

  LINE (5,6, 24,25)
displays as:
         1234567890123456789012345678901234567890
         ----------------------------------------
      40:........................................
      39:........................................
      38:........................................
      37:........................................
      36:........................................
      35:........................................
      34:........................................
      33:........................................
      32:........................................
      31:........................................
      30:........................................
      29:........................................
      28:........................................
      27:........................................
      26:........................................
      25:.......................1................
      24:......................1.................
      23:.....................1..................
      22:....................1...................
      21:...................1....................
      20:..................1.....................
      19:.................1......................
      18:................1.......................
      17:...............1........................
      16:..............1.........................
      15:.............1..........................
      14:............1...........................
      13:...........1............................
      12:..........1.............................
      11:.........1..............................
      10:........1...............................
       9:.......1................................
       8:......1.................................
       7:.....1..................................
       6:....1...................................
       5:........................................
       4:........................................
       3:........................................
       2:........................................
       1:........................................

The point shape allows single pixels to be included or excluded. Although the (x,y) values are real numbers, they are truncated to integer and the corresponding pixel is included or excluded, as specified.

Several points can be put in one region declaration; unlike the original IRAF implementation, each now is given a different region mask value. This makes it easier, for example, for funcnts to determine the number of photons in the individual pixels. For example,

  POINT (5,6,  10,11,  20,20,  35,30)
will give the different region mask values to all four points, as shown below:
         1234567890123456789012345678901234567890
         ----------------------------------------
      40:........................................
      39:........................................
      38:........................................
      37:........................................
      36:........................................
      35:........................................
      34:........................................
      33:........................................
      32:........................................
      31:........................................
      30:..................................4.....
      29:........................................
      28:........................................
      27:........................................
      26:........................................
      25:........................................
      24:........................................
      23:........................................
      22:........................................
      21:........................................
      20:...................3....................
      19:........................................
      18:........................................
      17:........................................
      16:........................................
      15:........................................
      14:........................................
      13:........................................
      12:........................................
      11:.........2..............................
      10:........................................
       9:........................................
       8:........................................
       7:........................................
       6:....1...................................
       5:........................................
       4:........................................
       3:........................................
       2:........................................
       1:........................................

The polygon shape specifies a polygon with vertices (x1, y1) ... (xn, yn). The polygon is closed automatically: one should not specify the last vertex to be the same as the first. Any number of vertices are allowed. For example, the following polygon defines a right triangle as shown below:

  POLYGON (10,10,  10,30,  30,30)
looks like this:
         1234567890123456789012345678901234567890
         ----------------------------------------
      40:........................................
      39:........................................
      38:........................................
      37:........................................
      36:........................................
      35:........................................
      34:........................................
      33:........................................
      32:........................................
      31:........................................
      30:..........11111111111111111111..........
      29:..........1111111111111111111...........
      28:..........111111111111111111............
      27:..........11111111111111111.............
      26:..........1111111111111111..............
      25:..........111111111111111...............
      24:..........11111111111111................
      23:..........1111111111111.................
      22:..........111111111111..................
      21:..........11111111111...................
      20:..........1111111111....................
      19:..........111111111.....................
      18:..........11111111......................
      17:..........1111111.......................
      16:..........111111........................
      15:..........11111.........................
      14:..........1111..........................
      13:..........111...........................
      12:..........11............................
      11:..........1.............................
      10:........................................
       9:........................................
       8:........................................
       7:........................................
       6:........................................
       5:........................................
       4:........................................
       3:........................................
       2:........................................
       1:........................................
Note that polygons can get twisted upon themselves if edge lines cross. Thus:
  POL (10,10,  20,20,  20,10,  10,20)
will produce an area which is two triangles, like butterfly wings, as shown below:
         1234567890123456789012345678901234567890
         ----------------------------------------
      40:........................................
      39:........................................
      38:........................................
      37:........................................
      36:........................................
      35:........................................
      34:........................................
      33:........................................
      32:........................................
      31:........................................
      30:........................................
      29:........................................
      28:........................................
      27:........................................
      26:........................................
      25:........................................
      24:........................................
      23:........................................
      22:........................................
      21:........................................
      20:........................................
      19:..........1........1....................
      18:..........11......11....................
      17:..........111....111....................
      16:..........1111..1111....................
      15:..........1111111111....................
      14:..........1111..1111....................
      13:..........111....111....................
      12:..........11......11....................
      11:..........1........1....................
      10:........................................
       9:........................................
       8:........................................
       7:........................................
       6:........................................
       5:........................................
       4:........................................
       3:........................................
       2:........................................
       1:........................................

The following are combinations of pie with different shapes (called "panda" for "Pie AND Annulus") allow for easy specification of radial sections:

  shape:   arguments:
  -----    ---------
  PANDA    xcen ycen ang1 ang2 nang irad orad nrad   # circular
  CPANDA   xcen ycen ang1 ang2 nang irad orad nrad   # circular
  BPANDA   xcen ycen ang1 ang2 nang xwlo yhlo xwhi yhhi nrad (ang) # box
  EPANDA   xcen ycen ang1 ang2 nang xwlo yhlo xwhi yhhi nrad (ang) # ellipse
The panda (Pies AND Annuli) shape can be used to create combinations of pie and annuli markers. It is analogous to a Cartesian product on those shapes, i.e., the result is several shapes generated by performing a boolean AND between pies and annuli. Thus, the panda and cpanda specify combinations of annulus and circle with pie, respectively and give identical results. The bpanda combines box and pie, while epanda combines ellipse and pie.

Consider the example shown below:

  PANDA(20,20, 0,360,3, 0,15,4)
Here, 3 pie slices centered at 20, 20 are combined with 4 annuli, also centered at 20, 20. The result is a mask with 12 regions (displayed in base 16 to save characters):
	1234567890123456789012345678901234567890
	----------------------------------------
	40:........................................
	39:........................................
	38:........................................
	37:........................................
	36:........................................
	35:........................................
	34:..............44444444444...............
	33:............444444444444444.............
	32:...........88444444444444444............
	31:.........888844443333344444444..........
	30:........88888833333333333444444.........
	29:........88888733333333333344444.........
	28:.......8888877733333333333344444........
	27:......888887777332222233333344444.......
	26:......888877777622222222333334444.......
	25:.....88887777766622222222333334444......
	24:.....88887777666622222222233334444......
	23:.....88887777666651111222233334444......
	22:.....88877776666551111122223333444......
	21:.....88877776666555111122223333444......
	20:.....888777766665559999aaaabbbbccc......
	19:.....888777766665559999aaaabbbbccc......
	18:.....888777766665599999aaaabbbbccc......
	17:.....88887777666659999aaaabbbbcccc......
	16:.....888877776666aaaaaaaaabbbbcccc......
	15:.....888877777666aaaaaaaabbbbbcccc......
	14:......8888777776aaaaaaaabbbbbcccc.......
	13:......888887777bbaaaaabbbbbbccccc.......
	12:.......88888777bbbbbbbbbbbbccccc........
	11:........888887bbbbbbbbbbbbccccc.........
	10:........888888bbbbbbbbbbbcccccc.........
	9:.........8888ccccbbbbbcccccccc..........
	8:...........88ccccccccccccccc............
	7:............ccccccccccccccc.............
	6:..............ccccccccccc...............
	5:........................................
	4:........................................
	3:........................................
	2:........................................
	1:........................................

Several regions with different mask values can be combined in the same mask. This supports comparing data from the different regions. (For information on how to combine different shapes into a single region, see "help regalgebra".) For example, consider the following set of regions:

  ANNULUS 25 25 5 10
  ELLIPSE 20 20 5 10 315 
  BOX 15 15 5 10
The resulting mask will look as follows:
         1234567890123456789012345678901234567890
         ----------------------------------------
      40:........................................
      39:........................................
      38:........................................
      37:........................................
      36:........................................
      35:........................................
      34:....................111111111...........
      33:...................11111111111..........
      32:.................111111111111111........
      31:.................111111111111111........
      30:................11111111111111111.......
      29:...............1111111.....1111111......
      28:...............111111.......111111......
      27:...............11111.222222..11111......
      26:...............111112222222..11111......
      25:...............111112222222..11111......
      24:...............111112222222..11111......
      23:...............111112222222..11111......
      22:...............111111222222.111111......
      21:..............211111112222.1111111......
      20:............322211111111111111111.......
      19:............32222111111111111111........
      18:............22222111111111111111........
      17:............222222211111111111..........
      16:............22222222111111111...........
      15:............222222222...................
      14:............22222222....................
      13:............222222......................
      12:............33333.......................
      11:............33333.......................
      10:........................................
       9:........................................
       8:........................................
       7:........................................
       6:........................................
       5:........................................
       4:........................................
       3:........................................
       2:........................................
       1:........................................
Note that when a pixel is in 2 or more regions, it is arbitrarily assigned to a one of the regions in question (often based on how a give C compiler optimizes boolean expressions).

Region accelerators

Two types of \fBaccelerators, to simplify region specification, are provided as natural extensions to the ways shapes are described. These are: extended lists of parameters, specifying multiple regions, valid for annulus, box, circle, ellipse, pie, and points; and n=, valid for annulus, box, circle, ellipse, and pie (not point). In both cases, one specification is used to define several different regions, that is, to define shapes with different mask values in the region mask.

The following regions accept accelerator syntax:

  shape      arguments
  -----      ------------------------------------------
  ANNULUS    xcenter ycenter radius1 radius2 ... radiusn
  ANNULUS    xcenter ycenter inner_radius outer_radius n=[number]
  BOX        xcenter ycenter xw1 yh1 xw2 yh2 ... xwn yhn (angle)
  BOX        xcenter ycenter xwlo yhlo xwhi yhhi n=[number] (angle)
  CIRCLE     xcenter ycenter r1 r2 ... rn              # same as annulus
  CIRCLE     xcenter ycenter rinner router n=[number]  # same as annulus
  ELLIPSE    xcenter ycenter xw1 yh1 xw2 yh2 ... xwn yhn (angle)
  ELLIPSE    xcenter ycenter xwlo yhlo xwhi yhhi n=[number] (angle)
  PIE        xcenter ycenter angle1 angle2 (angle3) (angle4) (angle5) ...
  PIE        xcenter ycenter angle1 angle2 (n=[number])
  POINT      x1 y1 x2 y2 ... xn yn
Note that the circle accelerators are simply aliases for the annulus accelerators.

For example, several annuli at the same center can be specified in one region expression by specifying more than two radii. If N radii are specified, then N-1 annuli result, with the outer radius of each preceding annulus being the inner radius of the succeeding annulus. Each annulus is considered a separate region, and is given a separate mask value. For example,

  ANNULUS 20 20 0 2 5 10 15 20 
specifies five different annuli centered at 20 20, and is equivalent to:
  ANNULUS 20.0 20.0  0  2
  ANNULUS 20.0 20.0  2  5
  ANNULUS 20.0 20.0  5 10
  ANNULUS 20.0 20.0 10 15
  ANNULUS 20.0 20.0 15 20
The mask is shown below:
         1234567890123456789012345678901234567890
         ----------------------------------------
      40:........................................
      39:.............5555555555555..............
      38:...........55555555555555555............
      37:.........555555555555555555555..........
      36:........55555555555555555555555.........
      35:......555555555555555555555555555.......
      34:.....55555555544444444444555555555......
      33:....5555555544444444444444455555555.....
      32:....5555555444444444444444445555555.....
      31:...555555444444444444444444444555555....
      30:..55555544444444444444444444444555555...
      29:..55555544444443333333334444444555555...
      28:.5555554444444333333333334444444555555..
      27:.5555544444433333333333333344444455555..
      26:555555444444333333333333333444444555555.
      25:555554444443333333333333333344444455555.
      24:555554444433333332222233333334444455555.
      23:555554444433333322222223333334444455555.
      22:555554444433333222222222333334444455555.
      21:555554444433333222111222333334444455555.
      20:555554444433333222111222333334444455555.
      19:555554444433333222111222333334444455555.
      18:555554444433333222222222333334444455555.
      17:555554444433333322222223333334444455555.
      16:555554444433333332222233333334444455555.
      15:555554444443333333333333333344444455555.
      14:555555444444333333333333333444444555555.
      13:.5555544444433333333333333344444455555..
      12:.5555554444444333333333334444444555555..
      11:..55555544444443333333334444444555555...
      10:..55555544444444444444444444444555555...
       9:...555555444444444444444444444555555....
       8:....5555555444444444444444445555555.....
       7:....5555555544444444444444455555555.....
       6:.....55555555544444444444555555555......
       5:......555555555555555555555555555.......
       4:........55555555555555555555555.........
       3:.........555555555555555555555..........
       2:...........55555555555555555............
       1:.............5555555555555..............

For boxes and ellipses, if an odd number of arguments is specified, then the last argument is assumed to be an angle. Otherwise, the angle is assumed to be zero. For example:

  ellipse 20 20 3 5 6 10 9 15 12 20 45
specifies an 3 ellipses at a 45 degree angle:
	1234567890123456789012345678901234567890
	----------------------------------------
	40:........................................
	39:........................................
	38:........................................
	37:........................................
	36:........33333333........................
	35:......333333333333......................
	34:.....3333333333333333...................
	33:....333333333333333333..................
	32:....33333332222233333333................
	31:...3333332222222222333333...............
	30:...33333222222222222233333..............
	29:...333332222222222222223333.............
	28:...3333222222211112222223333............
	27:...33332222211111111222223333...........
	26:...333322222111111111122223333..........
	25:...3333222211111111111122223333.........
	24:....3332222111111..1111122223333........
	23:....333322211111.....11112222333........
	22:....33332222111.......11112223333.......
	21:.....33322221111.......11122223333......
	20:.....33332221111.......11112223333......
	19:.....33332222111.......11112222333......
	18:......33332221111.......11122223333.....
	17:.......33322221111.....111112223333.....
	16:.......3333222211111..1111112222333.....
	15:........3333222211111111111122223333....
	14:.........333322221111111111222223333....
	13:..........33332222211111111222223333....
	12:...........3333222222111122222223333....
	11:............333322222222222222233333....
	10:.............33333222222222222233333....
	9:..............3333332222222222333333....
	8:...............33333333222223333333.....
	7:.................333333333333333333.....
	6:..................3333333333333333......
	5:.....................333333333333.......
	4:.......................33333333.........
	3:........................................
	2:........................................
	1:........................................
Note in the above example that the lower limit is not part of the region for boxes, circles, and ellipses. This makes circles and annuli equivalent, i.e.:
  circle  20 20 5 10 15 20
  annulus 20 20 5 10 15 20
both give the following region mask:
        1234567890123456789012345678901234567890
        ----------------------------------------
        40:........................................
        39:.............3333333333333..............
        38:...........33333333333333333............
        37:.........333333333333333333333..........
        36:........33333333333333333333333.........
        35:......333333333333333333333333333.......
        34:.....33333333322222222222333333333......
        33:....3333333322222222222222233333333.....
        32:....3333333222222222222222223333333.....
        31:...333333222222222222222222222333333....
        30:..33333322222222222222222222222333333...
        29:..33333322222221111111112222222333333...
        28:.3333332222222111111111112222222333333..
        27:.3333322222211111111111111122222233333..
        26:333333222222111111111111111222222333333.
        25:333332222221111111111111111122222233333.
        24:33333222221111111.....11111112222233333.
        23:3333322222111111.......1111112222233333.
        22:333332222211111.........111112222233333.
        21:333332222211111.........111112222233333.
        20:333332222211111.........111112222233333.
        19:333332222211111.........111112222233333.
        18:333332222211111.........111112222233333.
        17:3333322222111111.......1111112222233333.
        16:33333222221111111.....11111112222233333.
        15:333332222221111111111111111122222233333.
        14:333333222222111111111111111222222333333.
        13:.3333322222211111111111111122222233333..
        12:.3333332222222111111111112222222333333..
        11:..33333322222221111111112222222333333...
        10:..33333322222222222222222222222333333...
        9:...333333222222222222222222222333333....
        8:....3333333222222222222222223333333.....
        7:....3333333322222222222222233333333.....
        6:.....33333333322222222222333333333......
        5:......333333333333333333333333333.......
        4:........33333333333333333333333.........
        3:.........333333333333333333333..........
        2:...........33333333333333333............
        1:.............3333333333333..............

As a final example, specifying several angles in one pie slice expression is equivalent to specifying several separate slices with the same center. As with the annulus, if N angles are specified, then N-1 slices result, with the ending angle of each preceding slice being the starting angle of the succeeding slice. Each slice is considered a separate region, and is given a separate mask value. For example,

  PIE 12 12 315 45 115 270 
specifies three regions as shown below:
	1234567890123456789012345678901234567890
	----------------------------------------
	40:2222222222222222222222222222222222222222
	39:2222222222222222222222222222222222222221
	38:2222222222222222222222222222222222222211
	37:2222222222222222222222222222222222222111
	36:2222222222222222222222222222222222221111
	35:3222222222222222222222222222222222211111
	34:3222222222222222222222222222222222111111
	33:3322222222222222222222222222222221111111
	32:3322222222222222222222222222222211111111
	31:3332222222222222222222222222222111111111
	30:3332222222222222222222222222221111111111
	29:3333222222222222222222222222211111111111
	28:3333222222222222222222222222111111111111
	27:3333322222222222222222222221111111111111
	26:3333322222222222222222222211111111111111
	25:3333322222222222222222222111111111111111
	24:3333332222222222222222221111111111111111
	23:3333332222222222222222211111111111111111
	22:3333333222222222222222111111111111111111
	21:3333333222222222222221111111111111111111
	20:3333333322222222222211111111111111111111
	19:3333333322222222222111111111111111111111
	18:3333333332222222221111111111111111111111
	17:3333333332222222211111111111111111111111
	16:3333333333222222111111111111111111111111
	15:3333333333222221111111111111111111111111
	14:3333333333322211111111111111111111111111
	13:3333333333322111111111111111111111111111
	12:33333333333.1111111111111111111111111111
	11:3333333333331111111111111111111111111111
	10:333333333333.111111111111111111111111111
	9:333333333333..11111111111111111111111111
	8:333333333333...1111111111111111111111111
	7:333333333333....111111111111111111111111
	6:333333333333.....11111111111111111111111
	5:333333333333......1111111111111111111111
	4:333333333333.......111111111111111111111
	3:333333333333........11111111111111111111
	2:333333333333.........1111111111111111111
	1:333333333333..........111111111111111111

The annulus, box, circle, ellipse, and pie shapes also accept an n=[int] syntax for specifying multiple regions. The n=[int]syntax interprets the previous (shape-dependent) arguments as lower and upper limits for the region and creates n shapes with evenly spaced boundaries. For example, if n=[int] is specified in an annulus, the two immediately preceding radii (rn and rm) are divided into int annuli, such that the inner radius of the first is rn and the outer radius of the last is rm. For example,

  ANNULUS 20 20 5 20 n=3
is equivalent to:
  ANNULUS 20 20 5 10 15 20 
If this syntax is used with an ellipse or box, then the two preceding pairs of values are taken to be lower and upper limits for a set of ellipses or boxes. A circle uses the two preceding arguments for upper and lower radii. For pie, the two preceding angles are divided into n wedges such that the starting angle of the first is the lower bound and the ending angle of the last is the upper bound. In all cases, the n=[int] syntax allows any single alphabetic character before the "=", i.e, i=3, z=3, etc. are all equivalent.

Also note that for boxes and ellipses, the optional angle argument is always specified after the n=[int] syntax. For example:

  ellipse 20 20 4 6 16 24 n=3 45
specifies 3 elliptical regions at an angle of 45 degrees:

  1234567890123456789012345678901234567890
  ----------------------------------------
  40:........33333333........................
  39:.....33333333333333.....................
  38:....33333333333333333...................
  37:...33333333333333333333.................
  36:..33333333333333333333333...............
  35:.3333333333222223333333333..............
  34:3333333322222222222233333333............
  33:33333332222222222222223333333...........
  32:333333222222222222222222333333..........
  31:3333322222222222222222222333333.........
  30:33333222222222111122222222333333........
  29:333332222222111111112222222333333.......
  28:3333222222211111111111222222333333......
  27:3333222222111111111111112222233333......
  26:33332222221111111111111112222233333.....
  25:33332222211111111.111111112222233333....
  24:333322222111111......111111222223333....
  23:333322222111111.......111112222233333...
  22:33333222221111.........11111222223333...
  21:333332222211111.........11112222233333..
  20:.33332222211111.........11111222223333..
  19:.33333222221111.........111112222233333.
  18:..33332222211111.........11112222233333.
  17:..333332222211111.......111111222233333.
  16:...333322222111111......111111222223333.
  15:...333332222211111111.111111112222233333
  14:....333332222211111111111111122222233333
  13:.....33333222221111111111111122222233333
  12:.....33333322222211111111111222222233333
  11:......3333332222222111111112222222333333
  10:.......333333222222221111222222222333333
  9:........33333322222222222222222222333333
  8:.........333333222222222222222222333333.
  7:..........33333332222222222222223333333.
  6:...........3333333322222222222233333333.
  5:.............3333333333222223333333333..
  4:..............33333333333333333333333...
  3:................33333333333333333333....
  2:..................33333333333333333.....
  1:....................33333333333333......

Both the variable argument syntax and the n=[int] syntax must occur alone in a region descriptor (aside from the optional angle for boxes and ellipses). They cannot be combined. Thus, it is not valid to precede or follow an n=[int] accelerator with more angles or radii, as in this example:

  # INVALID -- one too many angles before a=5 ...
  # and no angles are allowed after a=5
  PIE 12 12 10 25 50 a=5 85 135
Instead, use three separate specifications, such as:
  PIE 12 12 10 25
  PIE 12 12 25 50 a=5
  PIE 12 12 85 135
The original (IRAF) implementation of region filtering permitted this looser syntax, but we found it caused more confusion than it was worth and therefore removed it.

NB: Accelerators may be combined with other shapes in a boolean expression in any order. (This is a change starting with funtools v1.1.1. Prior to this release, the accelerator shape had to be specified last). The actual region mask id values returned depend on the order in which the shapes are specified, although the total number of pixels or rows that pass the filter will be consistent. For this reason, use of accelerators in boolean expressions is discouraged in programs such as funcnts, where region mask id values are used to count events or image pixels.

[All region masks displayed in this document were generated using the fundisp routine and the undocumented "mask=all" argument (with spaced removed using sed ):

  fundisp "funtools/funtest/test40.fits[ANNULUS 25 25 5 10]" mask=all |\
  sed 's/ //g'
Note that you must supply an image of the appropriate size -- in this case, a FITS image of dimension 40x40 is used.]

Go to Funtools Help Index

Last updated: March 12, 2007
funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/regions.html000066400000000000000000000470111256243640000236020ustar00rootroot00000000000000 Spatial Region Filtering

Regions: Spatial Region Filtering

Summary

This document contains a summary of the user interface for spatial region filtering images and tables.

Description

Spatial region filtering allows a program to select regions of an image or rows of a table (e.g., X-ray events) to process using simple geometric shapes and boolean combinations of shapes. When an image is filtered, only pixels found within these shapes are processed. When a table is filtered, only rows found within these shapes are processed.

Spatial region filtering for images and tables is accomplished by means of region specifications. A region specification consists of one or more region expressions, which are geometric shapes,combined according to the rules of boolean algebra. Region specifications also can contain comments and local/global processing directives.

Typically, region specifications are specified using bracket notation appended to the filename of the data being processed:

  foo.fits[circle(512,512,100)]
It is also possible to put region specification inside a file and then pass the filename in bracket notation:
  foo.fits[@my.reg]

When region filters are passed in bracket notation in this manner, the filtering is set up automatically when the file is opened and all processing occurs through the filter. Programs also can use the filter library API to open filters explicitly.

Region Expressions

More specifically, region specifications consist of one or more lines containing:
  # comment until end of line
  global   keyword=value keyword=value  ... # set global value(s)
  # include the following file in the region descriptor
  @file
  # use the FITS image as a mask (cannot be used with other regions)
  @fitsimage
  # each region expression contains shapes separated by operators
  [region_expression1], [region_expression2], ...
  [region_expression], [region_expression], ...

A single region expression consists of:

  # parens and commas are optional, as is the + sign
  [+-]shape(num , num , ...) OP1 shape num num num OP2 shape ...

e.g.:

  ([+-]shape(num , num , ...) && shape num  num || shape(num, num)
  # a comment can come after a region -- reserved for local properties
  [+-]shape(num , num , ...)  # local properties go here, e.g. color=red

Thus, a region descriptor consists of one or more region expressions or regions, separated by comas, new-lines, or semi-colons. Each region consists of one or more geometric shapes combined using standard boolean operation. Several types of shapes are supported, including:

  shape:        arguments:
  -----         ----------------------------------------
  ANNULUS       xcenter ycenter inner_radius outer_radius
  BOX           xcenter ycenter xwidth yheight (angle)
  CIRCLE        xcenter ycenter radius
  ELLIPSE       xcenter ycenter xwidth yheight (angle)
  FIELD         none
  LINE          x1 y1 x2 y2
  PIE           xcenter ycenter angle1 angle2
  POINT         x1 y1
  POLYGON       x1 y1 x2 y2 ... xn yn

In addition, the following regions accept accelerator syntax:

  shape      arguments
  -----      ------------------------------------------
  ANNULUS    xcenter ycenter radius1 radius2 ... radiusn
  ANNULUS    xcenter ycenter inner_radius outer_radius n=[number]
  BOX        xcenter ycenter xw1 yh1 xw2 yh2 ... xwn yhn (angle)
  BOX        xcenter ycenter xwlo yhlo xwhi yhhi n=[number] (angle)
  CIRCLE     xcenter ycenter r1 r2 ... rn              # same as annulus
  CIRCLE     xcenter ycenter rinner router n=[number]  # same as annulus
  ELLIPSE    xcenter ycenter xw1 yh1 xw2 yh2 ... xwn yhn (angle)
  ELLIPSE    xcenter ycenter xwlo yhlo xwhi yhhi n=[number] (angle)
  PIE        xcenter ycenter angle1 angle2 (angle3) (angle4) (angle5) ...
  PIE        xcenter ycenter angle1 angle2 (n=[number])
  POINT      x1 y1 x2 y2 ... xn yn
Note that the circle accelerators are simply aliases for the annulus accelerators. See region geometry for more information about accelerators.

Finally, the following are combinations of pie with different shapes (called "panda" for "Pie AND Annulus") allow for easy specification of radial sections:

  shape:  arguments:
  -----   ---------
  PANDA   xcen ycen ang1 ang2 nang irad orad nrad   # circular
  CPANDA  xcen ycen ang1 ang2 nang irad orad nrad   # circular
  BPANDA  xcen ycen ang1 ang2 nang xwlo yhlo xwhi yhhi nrad (ang) # box
  EPANDA  xcen ycen ang1 ang2 nang xwlo yhlo xwhi yhhi nrad (ang) # ellipse
The panda and cpanda specify combinations of annulus and circle with pie, respectively and give identical results. The bpanda combines box and pie, while epanda combines ellipse and pie. See region geometry for more information about pandas.

The following "shapes" are ignored by funtools (generated by ds9):

  shape:        arguments:
  -----         ---------
  PROJECTION    x1 y1 x2 y2 width    # NB: ignored by funtools
  RULER         x1 y1 x2 y2          # NB: ignored by funtools
  TEXT          x y                  # NB: ignored by funtools
  GRID                               # NB: ignored by funtools
  TILE                               # NB: ignored by funtools
  COMPASS                            # NB: ignored by funtools

All arguments to regions are real values; integer values are automatically converted to real where necessary. All angles are in degrees and run from the positive image x-axis to the positive image y-axis. If a rotation angle is part of the associated WCS header, that angle is added implicitly as well.

Note that 3-letter abbreviations are supported for all shapes, so that you can specify "circle" or "cir".

Columns Used in Region Filtering

By default, the x,y values in a region expression refer to the two "image binning" columns, i.e. the columns that would be used to bin the data into an image. For images, these are just the 2 dimensions of the image. For tables, these usually default to x and y but can be changed as required. For example, in Funtools, new binning columns are specified using a bincols=(col1,col2) statement within the bracket string on the command line.

Alternate columns for region filtering can be specified by the syntax:

  (col1,col2)=region(...)
e.g.:
  (X,Y)=annulus(x,y,ri,ro)
  (PHA,PI)=circle(x,y,r)
  (DX,DY)=ellipse(x,y,a,b[,angle])

Region Algebra

(See also Region Algebra for more complete information.)

Region shapes can be combined together using Boolean operators:

  Symbol        Operation       Use
  --------      ---------       -----------------------------------
  !             not             Exclude this shape from this region
  & or &&       and             Include only the overlap of these shapes
  | or ||       inclusive or    Include all of both shapes
  ^             exclusive or    Include both shapes except their overlap
Note that the !region syntax must be combined with another region in order that we be able to assign a region id properly. That is,
  !circle(512,512,10)
is not a legal region because there is no valid region id to work with. To get the full field without a circle, combine the above with field(), as in:
  field() && !circle(512,512,10)

Region Separators Also Are Operators

As mentioned previously, multiple region expressions can be specified in a region descriptor, separated by commas, new-lines, or semi-colons. When such a separator is used, the boolean OR operator is automatically generated in its place but, unlike explicit use of the OR operator, the region ID is incremented (starting from 1).

For example, the two shapes specified in this example are given the same region value:

  foo.fits[circle(512,512,10)||circle(400,400,20)]
On the other hand, the two shapes defined in the following example are given different region values:
  foo.fits[circle(512,512,10),circle(400,400,20)]

Of course these two examples will both mask the same table rows or pixels. However, in programs that distinguish region id's (such as funcnts ), they will act differently. The explicit OR operator will result in one region expression consisting of two shapes having the same region id and funcnts will report a single region. The comma operator will cause funcnts to report two region expressions, each with one shape, in its output.

In general, commas are used to separate region expressions entered in bracket notation on the command line:

  # regions are added to the filename in bracket notation
  foo.fits[circle(512,512,100),circle(400,400,20)]
New-lines are used to separate region expressions in a file:
  # regions usually are separated by new-lines in a file
  # use @filename to include this file on the command line
  circle(512,512,100)
  circle(400,400,20)
Semi-colons are provided for backward compatibility with the original IRAF/PROS implementation and can be used in either case.

If a pixel is covered by two different regions expressions, it is given the mask value of the first region that contains that pixel. That is, successive regions do not overwrite previous regions in the mask, as was the case with the original PROS regions. In this way, an individual pixel is covered by one and only one region. This means that one must sometimes be careful about the order in which regions are defined. If region N is fully contained within region M, then N should be defined before M, or else it will be "covered up" by the latter.

Region Exclusion

Shapes also can be globally excluded from all the region specifiers in a region descriptor by using a minus sign before a region:

  operator      arguments:
  --------      -----------
  -             Globally exclude the region expression following '-' sign
                from ALL regions specified in this file
The global exclude region can be used by itself; in such a case, field() is implied.

A global exclude differs from the local exclude (i.e. a shape prefixed by the logical not "!" symbol) in that global excludes are logically performed last, so that no region will contain pixels from a globally excluded shape. A local exclude is used in a boolean expression with an include shape, and only excludes pixels from that include shape. Global excludes cannot be used in boolean expressions.

Include Files

The @filename directive specifies an include file containing region expressions. This file is processed as part of the overall region descriptor:

  foo.fits[circle(512,512,10),@foo]
A filter include file simply includes text without changing the state of the filter. It therefore can be used in expression. That is, if the file foo1 contains "pi==1" and foo2 contains "pha==2" then the following expressions are equivalent:
  "[@foo1&&@foo2]"   is equivalent to   "[pi==1&&pha==2]"
  "[pha==1||@foo2]"  is equivalent to   "[pi==1||pha==2]"
  "[@foo1,@foo2]"    is equivalent to   "[pi==1,pha==2]"
Be careful that you specify evaluation order properly using parenthesis, especially if the include file contains multiple filter statements. For example, consider a file containing two regions such as:
  circle 512 512 10
  circle 520 520 10
If you want to include only events (or pixels) that are in these regions and have a pi value of 4, then the correct syntax is:
    pi==4&&(@foo)
since this is equivalent to:
    pi==4 && (circle 512 512 10 || circle 520 520 10)
If you leave out the parenthesis, you are filtering this statement:
    pi==4 && circle 512 512 10 || circle 520 520 10)
which is equivalent to:
    (pi==4 && circle 512 512 10) || circle 520 520 10)
The latter syntax only applies the pi test to the first region.

For image-style filtering, the @filename can specify an 8-bit or 16-bit FITS image. In this case, the pixel values in the mask image are used as the region mask. The valid pixels in the mask must have positive values. Zero values are excluded from the mask and negative values are not allowed. Moreover, the region id value is taken as the image pixel value and the total number of regions is taken to be the highest pixel value. The dimensions of the image mask must be less than or equal to the image dimensions of the data. The mask will be replicated as needed to match the size of the image. (Thus, best results are obtained when the data dimensions are an even multiple of the mask dimensions.)

An image mask can be used in any image filtering operation, regardless of whether the data is of type image or table. For example, the funcnts ) program performs image filtering on images or tables, and so FITS image masks are valid input for either type of data in this program.. An image mask cannot be used in a program such as fundisp ) when the input data is a table, because fundisp displays rows of a table and processes these rows using event-style filtering.

Global and Local Properties of Regions

The ds9 image display program describes a host of properties such as color, font, fix/free state, etc. Such properties can be specified globally (for all regions) or locally (for an individual region). The global keyword specifies properties and qualifiers for all regions, while local properties are specified in comments on the same line as the region:

  global color=red
  circle(10,10,2)
  circle(20,20,3) # color=blue
  circle(30,30,4)
The first and third circles will be red, which the second circle will be blue. Note that funtools currently ignores region properties, as they are used in display only.

Coordinate Systems

For each region, it is important to specify the coordinate system used to interpret the region, i.e., to set the context in which position and size values are interpreted. For this purpose, the following keywords are recognized:
  name                  description
  ----                  ------------------------------------------
  PHYSICAL              pixel coords of original file using LTM/LTV
  IMAGE                 pixel coords of current file
  FK4, B1950            sky coordinate systems
  FK5, J2000            sky coordinate systems
  GALACTIC              sky coordinate systems
  ECLIPTIC              sky coordinate systems
  ICRS                  currently same as J2000
  LINEAR                linear wcs as defined in file
  AMPLIFIER             mosaic coords of original file using ATM/ATV
  DETECTOR              mosaic coords of original file using DTM/DTV

Specifying Positions, Sizes, and Angles

The arguments to region shapes can be floats or integers describing positions and sizes. They can be specified as pure numbers or using explicit formatting directives:
  position arguments    description
  ------------------    ------------------------------
  [num]                 context-dependent (see below)
  [num]d                degrees
  [num]r                radians
  [num]p                physical pixels
  [num]i                image pixels
  [num]:[num]:[num]     hms for 'odd' position arguments
  [num]:[num]:[num]     dms for 'even' position arguments
  [num]h[num]m[num]s    explicit hms
  [num]d[num]m[num]s    explicit dms

  size arguments        description
  --------------        -----------
  [num]                 context-dependent (see below)
  [num]"                arc seconds
  [num]'                arc minutes
  [num]d                degrees
  [num]r                radians
  [num]p                physical pixels
  [num]i                image pixels
When a "pure number" (i.e. one without a format directive such as 'd' for 'degrees') is specified, its interpretation depends on the context defined by the 'coordsys' keyword. In general, the rule is:

All pure numbers have implied units corresponding to the current coordinate system.

If no such system is explicitly specified, the default system is implicitly assumed to be PHYSICAL.

In practice this means that for IMAGE and PHYSICAL systems, pure numbers are pixels. Otherwise, for all systems other than linear, pure numbers are degrees. For LINEAR systems, pure numbers are in the units of the linear system. This rule covers both positions and sizes.

The input values to each shape can be specified in several coordinate systems including:

  name                  description
  ----                  ----------------------------
  IMAGE                 pixel coords of current file
  LINEAR                linear wcs as defined in file
  FK4, B1950            various sky coordinate systems
  FK5, J2000
  GALACTIC
  ECLIPTIC
  ICRS
  PHYSICAL              pixel coords of original file using LTM/LTV
  AMPLIFIER             mosaic coords of original file using ATM/ATV
  DETECTOR              mosaic coords of original file using DTM/DTV

If no coordinate system is specified, PHYSICAL is assumed. PHYSICAL or a World Coordinate System such as J2000 is preferred and most general. The coordinate system specifier should appear at the beginning of the region description, on a separate line (in a file), or followed by a new-line or semicolon; e.g.,

  global coordsys physical
  circle 6500 9320 200
The use of celestial input units automatically implies WORLD coordinates of the reference image. Thus, if the world coordinate system of the reference image is J2000, then
  circle 10:10:0 20:22:0 3'
is equivalent to:
  circle 10:10:0 20:22:0 3' # j2000
Note that by using units as described above, you may mix coordinate systems within a region specifier; e.g.,
  circle 6500 9320 3' # physical

Note that, for regions which accept a rotation angle:

ellipse (x, y, r1, r2, angle)
box(x, y, w, h, angle)
the angle is relative to the specified coordinate system. In particular, if the region is specified in WCS coordinates, the angle is related to the WCS system, not x/y image coordinate axis. For WCS systems with no rotation, this obviously is not an issue. However, some images do define an implicit rotation (e.g., by using a non-zero CROTA value in the WCS parameters) and for these images, the angle will be relative to the WCS axes. In such case, a region specification such as:
fk4;ellipse(22:59:43.985, +58:45:26.92,320", 160", 30)
will not, in general, be the same region specified as:
physical;ellipse(465, 578, 40, 20, 30)
even when positions and sizes match. The angle is relative to WCS axes in the first case, and relative to physical x,y axes in the second.

More detailed descriptions are available for: Region Geometry, Region Algebra, Region Coordinates, and Region Boundaries.

Go to Funtools Help Index

Last updated: November 17, 2005
funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/sman/000077500000000000000000000000001256243640000222015ustar00rootroot00000000000000funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/sman/fun4.index000066400000000000000000025161161256243640000241220ustar00rootroot00000000000000¬&VM§iæ)$,.4€9—=ÃAExGoK¢M@OOÉOá\Åc=oÖxÏ‚—ûšyƒ¦$¦û§Ì¬‡²¶J»Ã1ÄÌúÛ^äöè ë\îÜñ¡ó’óÞ š¡)$$œ¼)$,.4€9—=ÃAExGoK¢M@O¥OÉOá\Åc=oÖxÏ‚—ûšyƒ¦$¦û§Ì¬‡²¶J»ÄÌúÛ^äöè ë\îÜñ¡ó’‚T’,z'çÿyþz@^7T:VÑz¿¡Ozé{]{ú|5{Û|‹Dº¶TÊ–~瀷ʤê†ê”Þ Ø€‚ôò}ƒƒ5ƒPÖƒ\Á$ceƒsƒ«†Ì†Ø…¹†À|φñ‡'+g+§,ó.•/G010Ž0ÿ1‚22“3%3Ä+â5"6-6~7…7á8A8X, Š*424=4H4S4^::u:±;;Ó;ù<94u9$9/9:9E9u>V>Ù9Œ@@JA=ƒB DÎAaAlEûFLFWŠ»FûŠâHWHnH—KSÜkGXKÔLBLMLö1YMpK—¤WNŽNÂÆ{M¯¸OAM5NÍO\nÓŸ”OîsŸŽvm¦ß¦í˜\˜Õ;w˜á˜íœ0Wîm>Wûaß™#X"X/X<XIŠ­XVXrX£xç™sð>²X°œ\Ñüh›‘Ýš2š`»0<Z'@}‚ÈÌ€òUšƒOëOöPšñP^\Ï\è\ÿ] ]>PƒQ&RH„{U[YZ[E[Ú^,aH—.›(›4bÌd⹟y9›Ãq1YVwwž‚=x‡y‹y£yó|ăh›Ïòp¹0˜Q§—>š'¾›Û¦.¦9¦R¦]þžÐ Œ¥¥S¥¦¬œ‹Ë-ªÌ«²6®˜œ÷T9Yd´;´pTGTUaݸ5¸ß ¶¼‘½Ø‹ãÄ Ä;ÄeÅÙÅäÆ ˨XËßËêËõÌïÐÒÓÞÖ‹åÛ•Ü;ÜS©™ÞÔèè!è9åç 犱¬îæîÿï&ïDëïOë·ëüñ¹ñÄïÏðYYŒð‘ðÝðè¢@ñ†ó äWcVV.V=VLV[VjŸýuPòÚ7\wžÛ=*žç›M¬55øŸHª¼F+ Ö¡”¢t£ii¥^i-¥wi<¥ÍZßZ¬Z¹ZÆ3¡Š¨A€<Ûh\JÈw©Ñìéø~¦yäXcyS¦”‚¹†!멦 ŒåMdù¶^±©o,DÁ«å]µ,·|úRúµ.ÇÁy`mN[ƒµXrÜ]¿ÄWm^`жõ§W`JæÅï¯îož\\Ìœ{TŽÌ–¦Ìsã”à$]Ü-¬¬‘¢«˜&Þ3y–ärs³§ñ¨m¨¯¨ÿ©Tœ©c©¾GÈÁy×,þ-«”º-¬¬)>­´-p-¬S¬o¬{-Σ~—+²àR¬ü­Èò뮌ºl¨Ö¯oòøÏãòÛ·¯Ç°‡z3œ—å㜳6‰m~.ö±WœÐ¼&xu·œ/VüËœݱ»œêyîñPí~õ³t²úð®Ï¯³Î³ì´eGÍØÔÔ=/~´´´Í´èµu†¢’AΜ/èlçµû2_.z¹ŒÄAaþç]óÏÕ)Ö²±Ç³ø‹!>äa`ø^ˆ¶é«9· Ýfî·;Þq±Ž6˜9”‘œ·©íd·õ¸¸@¸L0KÑ#é_¸“¸êÑ¢¹bÑ^LÏy¹ë¹÷º»Qýè—_q´â¶|?»)»O?˾Z¼«´ ¼Ò½Lªæ½y.£Ãnã½ ½ý¾$Z ¾ÆÚ‘î£Ò£á¿|Hå¿À‡À4Á0Ť$¤jWtÃ%ëÜ¡ ¡@ì0“Ë„Èmn•Té •i•~Ì«•“’ Êeq‘N™ã×én½,1W—¹1<¯@iæ‘Ð¥d8—_W'™·Å™ÅÍ”¿^£ÅþÇOljǵ™Å`Y’VЃ3¯í»ÌgÔz]im _ÖÌã}|}ó+ý^Ä´aÚxÍ=ÍYU·µ§äÎ%ΪζÏÏ¥ÐLÒ,Ò<ÐÆ^ÒÑàÒnÒ±€ é¼Ó GK¬›¡vuÚ&±.ÓéËŒ®ÞÖKÛK¹Ö¦â>À$§ý^﨨&ÙcÙÙ©b¾¨PÚ”¯Û m¡Œ]ÜyÜÔ£oÜàÞÈ®mß·ÐàD4በáµóDáÞâ ââNÚib/ãç#Ór¬ä-è‹Ó‘íé2@€,·è“Må óQî ÉQîXý¸ N ¯{]I_bC8F<å0êz²Ó,=މƒçDÓ:™Ó`Øç¢çå²Þ‰>P5™ñ3ƒðqMçIÕ]²`æÇ÷èÔ„YzËzÚÔv®úêPÇjUv&oàï 3ßë(ëDëPݾò5kñω¼œïƒéë„먕°wÖ–ëÂ2Þ¸X¨¢¸e{1¨»âvì¡ìø²†ýQq[ÈÝU¨å5œ¿ñ—Ú¨òD^ñÞñø´{‡3œi{Îî%H%ŠG“fZg ÉöFŠY _ñ6\Ú”Ð@ <~ŒÚð·Y»‰äeññ]êñRÌñ^WTlƒêl¸öêyð‚jéÑBò·[ òÃòÏs’-ó^ló^–ãÉ~!‹3®YÙó8ó^Û=TÏQAQPój_U¥¼bNÞùˆ ¹…ï…þuLX‹g—„eeʤ0ÜóÃÓVj°GϱÃLÉV±à5âç©ÊD¦ZúϿԗ©å|SªªHÇ£Ó¾Qƒ0…#ªcxe”ÿo0ê2BaÈRêAy®¥Ù`œÉÈÍ#1Á±~áø¬¬`:ån€aã`ãoã~ããœã«ãº¼`Í0dXëB¤3H®4Íu9ùt;ä‚L2lCÖ;ØoW6ÓHŸËº`gò‡ í:º®Í‚€Mß´Ù_ôJ”L­Lºß.†Ißja߉§ Ž¸Î–ÙfB&§Öäd·Â ¿ÚÔ¥æí½…ÍÜØ¿A¥†]J®Ù'ê¢ÃʇŒ‘ó…tAÅ€{ix+ÂÞ¬àåÕaŒ /0t3Ï|¶Iïêðg›–A}~I`hUfÐgÓ®[©ŽÉU—U¦‰Á~ƃ‘*—ÖäÎÂg‹ÎÏÎܤºÎùQÄt SÏ"0³šBÚÚÐ8ª¤«ÏMêýWFÏlϘBéЋz‹‹ÏôbÐ º|ÍI —ªô- ‰˜ÙÄa;QÔ-5 Æ«HÜÂÐ…« ž jšíHÛM3ü¡‚¦Dá@Ï«»«×«óCÀ€qU<¾¨ß³ßÁìe =e6’ÎßùßÏ“Ž‚ÖóvÈn Áò$Ð<žÃW…“¢Ûw630}Yf!e«KnU-C¢Îî“à‚cÇ.Á»Ίsd€ƒÑ‹œžóÑQï1Œ¥a-LŸaS0d)‚Q–oÇŸ-[ ‡V‰»[aÀÑlÑyqÝцæJ¦v¦…`ÒzZwR—oÒ•daÆÇ½É¼îÒÙo¦Ä‹E¿ˆvKßHË-½“&e&ƒÄƒÒƒàƒî®C{„ É3ˆûŸo6¦¼Þì‚]ÁVÁs¸­gEÓê³Ósðòñ«SELvoOo]pÅ_›ÆíVÄ}v8vH¨ 4$æ :€2Pok€Ñ€à‹Á»5®R5N…M…ÓeÌ8Œë¦héèÌGí÷»ï¼ ¼9¼F¼S½ q‘§ÕŽ»zm-Õ­Å¥»¬r}àçUu½¬½<-&Ì…¼ºmå±HÊÂf/k”f=æ¾Õ ¡ÚÉØ7%heØŸTÂÕåÄ‚Vóœʲâ¤iKª×‚rW“4–‚ŽQµ4ô‚¬UÓõrNfx¯™SaŸ¬â×tí{MvX1äi°2žÔ0Ôm{¿n‡6õàDk¥ÔŠGŽ+F™ ŠÕV¡`Š6›æ âÛ.¡ ¢ÑÒ¢%ÏÓÂj¢¼·äë“·5-5oÁ5«5¸5Å5ëãB5Ò£‹£˜¤Œc/æe…œŸ‹Ò˜wfÎRTÿ”.OáÐ\AÒOL‘ý–/ÑÃÕHÕcæßÕ€Ö™:¼.Z…ºóˆªÒ‡¥èþƒhÂiݘÕæeáêiu²LËTc6ÜsfÐ-2½ã½ðÕùJ SŒ…Å…Ó…ác"†”à›õß<½“`KÆf³X7Æjedhh-Ë>hL7 €hÓ–í–þ7Y<½H¢g¼^àPÚïž6iÖÑ׿ü¥*¥7äŸä­ä»°“iûäèq¢jÛk+ù×ä’e’v¾ ê\=JNØ’½ÚàB¨¾?20%Ç?ž¥R9k¶Ù7Éçó©ѲŒ;¨3=99º¥jK6ÊëfÆŠÉ`ÁE§c§qš©E+7ìÙöhlëœ||UK¥ƒ«U«w;À¢_ÙD¿L«È˜¥Ã{B6U…¯Šlønâ0R+ï¨yƒ·„=¨‡x2…r¡­¡Ì[ñ°8–¡é†³Ú†fá¾¹¬ï2xÙÊÑ­'uo­SÚ¥MJfïêá¿ gS­DÙMcZì­ÔÏ/­á¿\ ® tƒšÆ³’â“I„ÃØl¤¿%IPŸ:>TâË[¿2ó¶и¶ ¿Z8r8²¸¹>¸rÊK^@!¾y\%ìÉd’à8SXÎs5¢2ì_h;èc1 ¼þ†ä>ÉÓ ì#>:)G)f)tDF)£)±)¿ì>)Ú)è)ö½**ÉŽ* *.*<sIcõdïuCoÕ*J*X*f*tagÝdGdT{#dsdŽbd·Yç«­:-ž¿?ñjâZ2o¹É7f«…êÒ¿˜*Ž¢Ñ*œ*ª¿³…7Ú³dÕ¹n®£Ê%>'âhJ)).*‚*þ+7·%Ížàͬóß—+O®í¯‡+[ÈbÓ+›¯&¯3~:Q1ìKÙo¾ü¨ÈìXå¢>HLÇY3n·Ñ1ÎvnÅ­4í­ª,8,sÄ#n÷-C-Û-ç*¸M–.Ú/!/-¯ .$.C.b/š.n00eècÒ½ÒË0X0‚*Æ0™ˆˆˆ»ˆî0ó¾Ò‡f1j|¦1µ1ù*Ô0¥çÖ1v‰\*â2Ò2ó2*ð‰i‰v4 4O ›l¹}s‰ò‚í-_©Læo¬Òâ„À@Á ¿¥ÔÊ¡÷¾à´F½»íW-^í…€Ž“4Š4¶4Â4Ü4è55ß Â]í’ÂÈíŸ@6éÉæÌ77¬88)85Ž<8LAÙµ8æ8ò8þ,žAsÜ,"eW/¦ÙçÍe’©™§xŸé*8¼Ä3tàûŸÒLßZC_9¡9í<:!:<:¥:Ë; ; ;,áE;í<ôpü£#1suz¢9P9iŠt£=Í>uê¯ӯþ9€@UŠ @q°j`uE@ÃB|˜BÛ†@ø¿ÌÌVÙÛ¬¾i¶ÓÛ÷7te½ÜA™BUBpBœBBøCC, ï þCGÜ.à CSî3C~CŠC–=·¢ÃÝ2CÐCÜCøDD(×FìæDŽDš­‘«}áÎ颿fþµêhZÝúÈy¾îfjÊvJC8ci¡EÃ-}EïNYÁÞgpKÔL–ÜFFq6 Ù~uÍAw} ±pâÆîÆAƒG#»Ì1I=e…[ÖÞÀM¬× À\t–}×(èDG™GŬ_GÑE‚ETÜ^ŠÇŠîbï–`EÏYÉHbE`|!§KGpYElGÝÛØÇQ¥¯QÁýæ9²^a°½è,°Ù²ˆjÌÝÒœ¤î®°ç_k9kH?ÕϤʲ¶¿¶ÍÖ »iªS~^ýŽMÄÉb sXcàRëÊñ©×ËØÙS‡+í¦·Œüw¸[±OÓjL”߯©/9×ÇT¾BZBÏZ>Ëš·Q_+üã#èðAåVÞ_¶c¹Oñê2²Î½X?Ëk›Àúðó¾j<3{ëeú`°.æÏ>,ijV³eÂå2Â˳ÃZ„öÀÊÀÚ³€áSáb̸áqာ½ÀêÚïEÜœ"M mñ——îcÈ¢Ôó,s„Ø“,B·O’ò€ï}÷¶Ûwgãæ:”†ƒ¼sÿAó+r‡Àˆ•ldQâˆs=æíØ0ãp›ͺŽ£޹ÊŒL,›a«v…˜ù¡»Q~†QWÅïÚ_+¢O,©éÉ©òÆ0‡á‰ ‰‰-ï÷ä9ØäF²m³Áí@³³I¸Ij³ ¦ÒO»º³IÉoÞBª ,×A]¡š>ðLë “\iÂ>!ªUèºèÇ8»v¦ky°õç»l2䛳<°<Ü<é<ö===`ÆÆÛå|³¾‡ÐXo"Õ½N0,å5ä’‹WÔ!éÙð)):)Í™/VîLÖJ]+ p$+*p1pîp>p«”›ÍºësY}’‡µ<Œl”ðdBÆÜ…ÇÔD|«ä‘BO(DX±µÜp¸ëìwÊȱ5|ГØ¡³£P›”&»˜ܲÃ1~dp[t·Q·a·q/éI¶&7ùØö¾LcG´.¼pcV„Kú++ÒËÐÝ"ÁË™f<Í N殈#é{AÒÒ]äÉ}¢™ŽÒᛦ¦;­H6u¡- ÅTšO¥¨TªØº7œµŒ+qL–P¡rr/Ø,-šrr"ÔÝ)UªS6ÌŽuátüt]tjÍ÷µf/`P« ¦/oïÇ[ÊDØä¤õž$Mÿª®6[ÛÈaËÅ%®°œ=R°å";´T³Ú p}jb?£ðÀº™ÿÈØÈóˆ3¸¼š G/ÓÏÈ.£4æ(Y™²z²œ²ªÖj]ÍJÿY¨|`|nH†Á5ÎfÃæuómì‘¥è¥ø“l»ßÐX.0Å‹­š­¶t¼­`z“ºžºÀSåK×kæu&uCÈ?ÆÆ@ñ‘;8vhˆCðœFÂ×zÄ›¬ŽÏ©…‚››\ŽåŽù !ò¢Gy/×ÁdG¥ Û]Vç²É‚H„J|Þ;GyD‹?œ?«/‹¾–À}²kÄØ;‡Bدua:gˆSu WÓ›ƪðÃÎ1}E‘[¤Cî™ðÐîQ†qZ4µZQu3u¤ˆc‹öÂ)SS¬2ÿÂ:Ëz/RÝC„+FÒõHGÐu|ìÇ{§(lµPŽ£´ÀÛ¹PÁÄ«ĺ ]´ôµ!µKšá|ŒoŒ€ªp­~l#PûÄ×SÈœÂôèuXÝd§Þ ÛÄæ/õÚXEµ§=µ•@TŸêpi§J±Ç•µŽo>})}7L"ÂK³-~VA8Ö+1ц5½g©4RˆR£šlŠÔ·3ÖìrŽŠX·B³;wBºÐržwuw‚`óÝçµ›-O’™”añ–ÕkhIžµ¨t“çñݪæUÁaš“|©RR_ØJ¢Œ\3Ö|Le«˜Ã>•òF¯›ŸaÄp;Šg«Oƒž‡ ¶rÆ[wšÔx@Ãkšý„’„­³°X½ct?ô€fÑɬ£`•¼•Ñž–•æ•û› ™KSq\ó4ÎɺYG|—©©cÑÖWHÛèço˜ÆŽ¯`xXÆ#:×E¢PwPÎîCQñRRSS àÒz„€¢:ãóçPS»T ÐÝUµUÓUìSØV¥>Ðú“<S÷ç}W ™§¿ËY'W¹WâXZ_T,Yq[P[\[hZkZ”Z [åZÓ‡÷[9—í\PTr\…>¾\‘\´ŠTò•¨x’T]z‘¼Fë]•^Ðë^`_:ê"‰‘__ÊË›`.ÀÑ“‰Õ`ôn—f‘a¿3D¯à† âõÞPlÇÞnÞ}ތޛު޹b]b”b²ì­.‡b×bã:øl׿j° °×ñ~¸ì»cÅdd›dí¹{>›@€~òìØUßb!UøVq<Vgehèkˆ›zn\?#?N?[?h3T?u?‚?›‡© –moy›”o’o»Ûbÿ”ˆ´˜´¦7Dç®é9kàzõf¢çÉq%ÄõÅqgrÂtwÕÅ5:ªtÉtÕtáltuu²vÌÉÚIÌ*°Y—ʪ*ÅAw¤ElSw*w6wOw[3dzLwôxx x&ª9.—5>Dmp9[‹“™¼¿w™ÊÓÙ9Ç9é::#:):c:fD¡DÃDôDýEE)E,XPXrX£X¬X²X×XÚaa)aZacaiaÅaÈk0kRk„kŽk”kÃkÆx+xMxx‰xxÄxÇ||8|i|r|x|²|µˆ+ˆMˆˆ‰ˆˆ·ˆºŽhŽŠŽºŽÂŽÈŽóŽö—¨—Ê—ü˜˜ ˜L˜O¤A¤c¤“¤›¤¡¤Í¤ÐªÖªø«*«4«:«V«Y¬ó­­P­c­i­„­‡¶¶'¶`¶q¶w¶‘¶”ºrº”ºÍºÞºäºý»ÒÒ3ÒeÒoÒuÒÒ“×cׅ׺×Ç×Í×ì×ïáBádá™á¦á¬áÍáÐçTçvç®ç¾çÄçÜçßì›ì½ìõíí í#í&ñ@ñbñ–ñ¢ñ¨ñÎñÑýoý‘ýÅýÑý×ýÿþ¾àJM÷JSYtwà7DJfi$$&$[$h$n$Š$,,1,a,i,o,–,™4t4–4Î4Þ4ä4÷4ú:Ê:ì;$;4;:;M;PC9C[CC›C¡CÑCÔHfHˆH¸HÀHÆHîHñO›O½OíOõOûP#P&ZZ8ZjZtZzZ™Zœvov‘vÅvÑv×vþw„f„ˆ„¸„À„Æ„÷„ú’´èôúŽŽ ¥“¥µ¥æ¥ï¥õ¦#¦&½ñ¾¾E¾O¾U¾v¾yÆ/ÆQƂƋƑƼƿؖظØìØøØþÙ.Ù1à†à¨àÛàæàìá á êê<êoêzê€ê§êªô†ô¨ôÙôâôèõõ"ø”ø¶øëøøøþù9ù<O# SWISH format: 2.4.5# Swish-e format: 2.4.5 fun4.index C/²î2011-04-14 17:40:58 EDT format=1.2;   (.0123456789:_abcdefghijklmnopqrstuvwxyz  ('0123456789:_abcdefghijklmnopqrstuvwxyz'0123456789:_abcdefghijklmnopqrstuvwxyzƒ‚  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~‚‚o swishdefaultd swishreccount*d swishrank*d swishfilenum*d swishdbfile&d swishdocpathd swishtitleFd swishdocsize d swishlastmodified d desc d sec d swishtitle d manpage d digestd descFd secFd manpageFd digestFd refentrytitle d refentrytitleFd manvolnum d manvolnumFd refpurpose d refpurposeFd _/ª%Š ²N’@¢+Œ‘#˜k„K”VˆM–4‰?g …:¯†c‡_†>„x‘Wˆp3W‹'Œaˆ/Ž9†zˆj‘(³T–gªªg‹  L‹2Ž+„:¨I 0óÞ0.0 (00.00 ê²0.000 Ç0.000000 ¶0.001  0.002 ) 0.00222222­Ø0.003 q0.004 ‹0.008 0.009 ¯0.01 êÂ0.010 '0.013 ?0.015 O0.01d ™0.022 ‰0.02d ¹0.040 É0.047 Ý0.089 !v0.090 !†0.091 !˜0.092 !¨0.1 (R0.129 %ë0.130 &0.148 &,0.30s 1Ô0.33s 3O0.36s 4ã0.37s 5Q0.38s 5¥0.5 (b0.50 ë& 0.50000000 ùs0.5r ëX0.8 (~010 )D017 )\020 )â03; 0367d01b1eb56995c68ad7c25d32f9da Ö(040 *0:;#0:05.87âÚ0:24.76–0:35.08 ù0bIX0b1000 Ä0b1111 Ç0x8ÛK–0x89 D0xf Dâ1÷Â1.0 01.00ØÜ1.0000 ú 1.00000000 yˆ1.1 0/1.2.3 Ór1.204 Ó¬1.4.5 Ø¡1.472 Û€1.50ÙÍ 1.50000000 Ë11.55u áÔ1.67u çð10;310.0áX10.00ž­10.2áh10.20dÏÓ10.50 x100 1 100.10 0› 100095.98 =^100:â2100:109 aÁ1024âB 1024x1024 r1031.508ß1032.610·–1044âª109 1š10: 1¬10:10:0qh 10:20:30.0 š€10:50é—10d 2F 10d20m30.0 §10e 2^ 10h20m30.0çp10i 2n10p 2š10thñ¸10x10 11=B11.00 xo11.087 qÚ11.099 qü11.2f x—111 1ö112.001 Ë1120æ61140ç1144.000 õ 115 211: 2"11:15 Åå12={12.00 M12.124 Ú12.12s 12.3ëù12.63s ½120 2†(1234567890123456789012345678901234567890 E 1241.000 Ÿ1245ðç1263.000 '128 2°12: 2Ê 12:30:15.5€€13=ã13.07s[º13.7øê135 3)136.971­Ä13752–É13: 3;14‡s=ý140 3_141.8 4ó 141055.97›‹1428¯1442.000 ¤â147.000 ׂ14: 3ó15?ê150.985 31513 ] 154.99000000 «]1564 ™159.657 ds15936.00T¼15: 4o15p 5116@W 16.00000000 IÈ 16.50000000 °u160 4Ã1600.00„ô 1667457792 ,˜ 168.99000000Û16: 4Ó16x 5ƒ17‰PA 17.00000000 ¢17.1600÷175.54dN176.00¾179.57dñ¤ 179775.96 %v 179967.96ìÆ18HÜ 18.00000000ÛD18.1600 È‚18.1700 Ì)180 5a 183.99000000a—184 5s 184.00000000 1840.851 ;ò19I 19.00000000¨19.1600 y}19.1700 Žø19.1800 ™~19.786 Eï1950IZ119520.00 v+1986:Ñš 199.99000000—1:I&1:03.50–Ù1:10^F1:100:5 ¢)1:19.80¡î1:5 61:6 6=1:6:3½Ä1bKú1dL 1eLt1iL†1jL¬1st Hí1x=ZN?2ü¾2.0 =í2.00Ô{ 2.00000000 9:2.1 >%2.2 >52.395 OD2.4 >K2.5 >[2.50Ôã 2.50000000 ¦c2.87u2ó20Ih20.0àÍ 20.00000000 •ò 20.01156d»BÁÿ20.11f ¢;20.2àç 20.20000000 ó200 >k200.20d¤2000á2003á2007á/200xâÐ201 >‹2011á? 202.44382í̱ 202.44382d c‰20:22:0¨m21Jˆ 21.00000000 6Ô21.863 6†21.8f ç 216.99000000ò22J¬22.11fæ22.4dôY 22.981700¹_ 22.982127 qb 22.982695 Ÿè2204ìJ222 BØ 22:59:43.985Ü-23.4ðü23.45ï"23.45dÑà230.390Ê4 œÇ 234.99000000 ’j2348ñP23572 %–23872.00 Vu24Jú240 C248.675 þž249 C. 24a592d8bf1de84a0278973a0b6bffdd r¢25K(25.0ü{25.000 ö/250G† C@ 253.99000000 EÅ255 Ch256 C‚27Kh270 C¢28Kx28.583 `ß2809 Ê2812 Ú2873.460 «2880 }2880.999œ29.345 åŒ2993.000 CÜ2:ŠK¦2:4 DP2:6 D`2:7 Dt2:7:2 {2:8 D 2bN}2dN2eNÇ2iN×2i2 JF2i2: 8–2i: JV2jNñ2nd K†2pO;363.0 Fî3.00 ³9 3.00000000ú3.50 ´Ô 3.50000000 nR3.7 G3.710‰m30LÄ30.885 V-300 G(300.30 $è305 G<30760 —3087.015130:12 ‡31M 31.00000000¾3101.029 Õ´315 GN32M(32.321é‡320 Gb320148ÆN R¼ 320831.94·ö3238.000 ]32:®} Gr33Mõ330 GÛ337 Gë34.121 Š34.295 m34.56 CÊ 344.725500 EÔ 344.731900W« 344.740432 5@345.182 … 345.284038 ý’ 345.286480 ¶35N35.423ô$356 H36N360 H­ 36daa9bc67c8b9bf76b30d1e889fd2f7 ±337N/37.231 kœ37.974 ¥ 373 HÕ3752846 5²3776.817k>3826.403 G388.041 ª§3884 æl3884.08ñ¤3884.5 ú3885 æ|3886 æŽ3887 æž3888 æ¸3889 æÈ3890 æØ3890.5Ê‚3975.000ùþ3999.48õ¦3:NO 3:4:6:7:8 dƒ3:7 Hý3dO§ 3d53b106edc02421ded7c946db987f78R“3rd ]474.0 Jì4.00 I 4.00000000 ×Z 4.10000000 :Ê4.50 J®4.500  4.50000000 'Ô4.66u ·4.914 -ò40O 40.99000000 ¿f400 Jü400.40 â^4000 d>4000.47 }4025.492áá4096 mY40x40 Æ·41O+418.625òt4185.149 I–42.36u Àï42.60u ȶ4216 ެ4216.4 14216.5 C4217 ޼4218 ŽÎ4219 ŽÞ4220 4221 4222 (4222.4 4222.5 ­4234.000 ¥D 42a20fe48d394fa0d9b5a5ff19fd0021ý±4382.000 M»44OK4415.540 BÈ 44686640ae2327ea61ae72128f916671 Z45O[451 K 457.183 Hñ465 O4681.000[Ú 47.181656 q¨ 47.181656dk.478.000 à480 Ow 48e8534542b197c8b3b70c778d9d86cc¢ˆ496 OÃ4:Oy 4aec34e9222832066c4d05d9aa07e91d áä 4c6db9fddd8ac83bec7884e558a0f1b4 ,~4dPi4jP‡4th cç4x4 dA5à5.0 X~5.00“‡ 5.00000000 ³ 5.50”× 5.50000000 üJ5.672 Çþ5.972 Ö5.x Y50Oå50000ˆ¨50000.0‘: 500799.90 C5013žM502 XŽ504.43„505 XÜ505.00 O‡5057.000 Cº508 Xö508.00öè509.65 Ó¾ 51.00000000 ñè510.00›³510.50g511 Y"512 Y^512.00 ü512p£513 [¸513.50OÌ520 [ä531 \|5376.00 FÞ54.722 É546 \¸548 \Ô550 \ð555.597¨å56.922 IO56.954 JŒ573 ]574 ]Ã574.325 šá575 ]ñ5757665:5792352f<578 ^5579 ^‹ 58.606523I¯ 58.607634)• M 58.614301 òp 58.870920  ä 58.874587 ò580 _+581 _A 58:45:26.92}Ÿ 59.990000003Ï5:P; 5e06fa0caa9ab977bec42fb409ece14d ° 5e5a600ff111fa37718789912f20cf23 Om 5e633a3aca58c05045ba152dcc276f47üq5mb gt5th_F i5x5 jô6Ù6.00 g\ 6.00000000 |9 6.16666667 Rù6.173 '.6.5 a¥6.50 hx 6.50000000 Î/6.x aÑ60P— 60.00000000 •60159.99 ý‚6026.000ÍY625.000¸P 63Pµ64PÅ65.254 C€650 cw6500 ¡t66.465ið 660f237aeb0d1f8858ba54f973dc5084Ýr 674a8881522e4c8b8c9d3f8498903d3b þ6976.00 q–6:QK6:10 ·þ6:42.89ÝR6:8 dQ 6bcc18716f3239e8f3797a4579159df4 ¬6dT'6th qx7 -7.00 ‹ 7.00000000 CP7.5 fÛ7.50 Ï 7.50000000 ¨A7.9 fñ7.x”> g 70d700b958da3900f03042704e1d1a16 k71.972Ðg725.375 Pc7289.000i…72959.99 ý¨755.959 µ77Sœ770 h®78S¬7825 DÊ7847.000 â79S 790043ce5ac48ea7c151662276a0e207ñ¶79487708.71298325·†79488017.99730176%79488203.01561825 ¤ú79488631.09462625ZA79488769.94469174743 Ÿ–79488769.94469175 Ü79488780.60006675 à·79492685.94014275 v79493290.86521725 1n79493290.86521725357 à§79493432.00990875Zs79493432.00990875065–ù79493631.03866174817í79493631.03866175 (79493719.00160225 `Ï79493997.45854474604 ë79493997.45854475 ›79494332.45355175}79494546.56818075“²79494546.56818075478Ó79494562.35474326 nÄ79494575.58943174779 !79494575.58943175 ”79679.98ú2798 j•7:SÕ7:28.63 J 7b21e227ac6a42b780d0f23e9a8fa292¨Ã7pTæ8 8.00&Ë8.50(Ú8.699îÍ80T=80.109·v800 oY8037025:8070128 ù_809.343ú¯817.000 ,823.000‰È84T\85Tn85.0w¥8656.000 4R 8733e0d4130466d4951aa2af4436b387¼ü88.00­ž8891889389.73u .895.818 ë8960.00 7­8:T€8dUj 8d5ce92208f4f4fc963d98500dfd093c Î[8xUš9 [9.00 ˜9.2 vY9.50 º90TÌ90.790 µ^915 v‰9320 1ä93e963ebb8819471fe0cd4ab14c6f4c H940 w79473025 ¡†9473025:9492240Za9492240 ¹96831.98 Ip969.000O( 96e4661c09c6774ac40eba44ad9728b4 çæ9820 aá98cf90baf564850c0ce8e145e907309ÕO99U 9986d9b24db7d30c3068bdf27110aa43 9:U9eUª 9f440598e0a91c6d4018063e2fe74f4bö7: .:0:512 6M:1428 á:16x ò`:2d |:3UŠ:binsizè’:dU¾:size Cî:skip H]:tlmax 5l:tlmax: ÓÒ:tlmin 5à:v1n ˜ƒ:vv ™‚_ S_sort Å¡a ca1\ba2\ya3\ a668d775f8ba9feab686710d3da6bc78 x§ a6b4242773c1ec68bb818bbbbb3fa6d8Za:]¯a:255 w'aaa S ab^Aabbr 4abbrevi ôm abbreviation: ìabil ßabl S7 ablerowgetñàaboutèabov "•absenc Ú¸absent Úüac^Sacceler *Ãacceptuäaccessv accessed: Æõ accompanidd accomplish€baccord­øaccount k:accumuÔÓaccumul›Kaccur `achiev ×:aci TÆ acknowledgˆÈüact TÖaction²tactiv øactual÷dad^gadd Tü add3d37d6340ef15ca2b186e4a87134c 3addi ,âaddit {Qaddr ,òaddress Sadher  úadjac §Badjoin ¢[adjust Â’advancÙýaev U¯aevrec  aevstruct ¤Òaffect Üafter¼again ÖagainstÕakey Oakey: Á¾akey:xxxí.akey_2 õakey_3 alen Vmalgebra #µalgoV™ bõ algorithm 8alia dšalias0 align0ìall Valli k¹alloc˜Qallotšžallowš®almostì2alon malone: q,alongÞLalphaàÛ alpha_j2000 þ^alphabet Æu alphanumeruÐalreadi .also nalternæËalthough]Üalway Rambigu¨Íamount£Üamplifi ²an_:analog˜ÎanalysiÏ6 analysis:¥› Sanalyt™Wanalyz™}anc ZP ancillari 2zand Z`and:fw Šang bÙang1 ‹ang2 ‹9angl ‹iangle1ȯangle2ÈØangle3Éangle4Éangle5É1angle:ÉIangles: p{angular®þani cann dannuli|êannulus Icanoth ¸danticip Èanyth êîanywherç(api dÂappear mappendÐappend:ŠpappliœkapplicmŒappropriÈEapproximapril¦° arbitrariÔP arbitrarili «'arc e¨arcan Û arcsec Íare eäare:XareaX‰area: ç€arg k™arg1Y/arg2YHarg3YYargcYgargnY•argstrÓáarguY¥argument±n arguments:îíargvYÅaris[,arithmet M›around ¡array $) array.filˆ˜array:Oarrayofjasc1as: e2 asc2fits.c: .ascens Odasciiu)asid²A˜Ùask kÉassign ðÓassoÆ„associ õ associativ 1assumkrassumpt hžastror«astronom $— astronomi ù astrophysatgWat2p[Êat2p4 lat2p4: Æ—at2p: †at: k©atb latb20²datb20:é©ate latm l/atofÑhatoiÑxatolÑŠatp[ÿ l]atp9ÑXatp9: Ðattach}¯attempt®“attent™attribut Hßatv l§auhÀau1 kÙau2 këau3 kýaugust õ\autoÚŸautomat p‹automatipoautomatically: Å‘ auxiliaridtavhÐav1 lKav1:d Zav2 lsav2:d ­av3 l•av3:d avail 3ãaveragçÊavg lóavg:Ýêavg:d JœavoidÊawk m/axe maxi m¥axis1 ‚°axis2 ‚Äbb1]×b1950jæb2]íb20 O4b3]ýb6^ b6b46c363dc1068ad1257cb7efc963cf¹ b:^!backOt background Hbackwardbad q<balanc ¶Âbar q¦barycent áîbaseZbasicÚÝbasis: batchß_ bb091d8854ccdc1797592ea45ba6e80cm"bbb q¸bcolfPbehà be8340953f3e9f5685f6678d4b7bd8080âbe: rbearqzbecaus 6 becomóMbeenq¦befor_ beforehandعbegin‘begun%›behalfñÐbehav)^behavior ÁÒbeliev À—belowjbelow: ÛHber rberror ibestvábetterO¬betweenü8bfile big u<bigen½0 bigendian 7™biliti ¢Kbin ulbinariIbincolJÕbindkbins:î±binsiz±cbintabl 07bit vîbitmask…ÓbitpixÛÔbitwis=bkgd˜‘ bkgd_exposur O\ bkgd_fileÛM bkgd_region„¬ bkgd_timecorr Ë bkgd_valu æìblackS/blank[Vble x=blemish ¥Àblimit !ºblinkŽ’block­ blue Pbno'book­°booleanòˆboolop F both¯_bound–Yboundari 2Š boundaries: Ú"box xò boxerrorbar bpandaXãbracket›‹bracket:ñê brackets: $Kbreak ŠïbregionK†bright úbscalewbuf z~buffer ¡®build 8ìbuilt :¤but {? butterfli ÂVbuy |­bvalu*Œbyo by: %bye Mbynars: hP bynars:1428 ‘Äbypass 2ïbyteínbzeroäGc“c1:bv1 ø`c1:bvl øóc2:bv26z c53ab038566f310f7689ea4d08579d60 M±c857ea8c2616ea648fa720e637f6d84 µücal ƒŸcalcul OÊ calculation: ‚call ýcalliˆŠcame «can ƒ¯cannot ·capabl card !âcare " cartesian‘Ͳæcase "fcase:¬Œcast $+cat ˆ7catalog %Ðcaus $[caveats: :Úcbuf &~ccsfccc ˆ_cdeltÖÍcelestiëÆcenter µncentral·¶centroid¤~certainë™cess Dò cfa3241d92a0cddd6f2950fd6bdc640cïBchandralÀchangx? changelog¨³char Vchar:ycharactÒ3 character 2Þcharacteristics: ÊñcheckÌchipx¨¡choosЇchoseЩchosen °×ciacciaiµciat `®cir Š+circl ¼Jcircular xÊcircumst “OclaimîÝclarifi r classic MÛclear 0clear: ¬clock _©clockwisiÃclose bCcnts „ûcode •Jcode:») code_misc jcol Œcol1 •úcol2 –6col:dimšÓcol_act—”col_ibuf 5\col_ptrñÀcol_read £% col_replacem !Òcol_writŠücoln —ÉcolnamÑðcolonïLcolorïžcolormap cols2ðì cols:unit _Ñcolumnücolumn1 equival ¶ equivalent:ýNeric~cerron Aerror Qerror: ¢eso3¿especi Otessenti 4ƒetc.:–éevwÊev.fit:Ñevalu Hevcol Ý evcols.c:Ùíevcols: c÷even—íeven: )¡event )± event_file: ®eventrec¨ events.ev ê events.fil' events.fit7events: ü events_bigendian í events_bincol ¤º events_bitpix _s events_endian Ô6 events_vcol »¨eventsandmore.evr{eventu *³ever˜qeveri ,fevmerg õ evmerge.c: 6–evmerge: ÚìevnextâÊ evnext.c:Óµevolv ‚}evread™« evread.c: ‚1evrec4pevstructè¬exact ½exam¡jexampl ârexample:yJ examples: C¸exceed›kexceptÕexcludÆüexclude: MËexclusÇnexecut éexecute: qê executing: wÉexist U¼exit¢RexpandóÇexpectsexperi%ãexpertisƒ•explainN'explicitÒ explicitly:Œ–exposur…óexpr£¹express ˆå expression: =~ expressions: Vext4¦exten ¥Žextend¾2extens¾Z extension: Ô extensions:  ÌexternÁÙextnam÷2extra ¦Ð extra_lib Æ…extract '©extran >extver 7f f03efdbe8ed213426d085ebced5d9a22Ö³ f0c43d781d86443f8e63f208466b1cab | f55f023c147c3a17eb558863852de9da–f6.3 8† f6ddd0952239f2e3a078fc0388797621 7f:xMvvfacil ]factÓYfactor©œfailÔ failur0falsÔ‹familiar ªfastÕfasterÖ_favor[ê fbacceler¦(fbu5@fbv5Rfearë8featur ªfed5tfeedë¢feq5†ferent n´few5˜fff5Öfix™fie6“field•fields:‡fifth™»fil6«file ëfile1·Æfile2:æ·Þfile3¸file:¸fileinfo n¢filen¹filenam ù filename: wfill ßfilter …filter:\q filter_cc ;Âfilter_express_*filter_expression1 Mifilter_expression2 My filter_extra¶filter_idx_activ |Ofilter_idx_debug Ìu filter_keep ‚ filter_ptyp€ filter_tmpdir &XfinalÂUfinal_region1: d“find =find:Ã!finishÏófirstä{first: §Rfit7 fits0í>fits1íNfits2í^fits3cwkfits4cw} fits_bincol y¢ fits_binkeyÖw fits_bitpix ,¨ fits_extnam½ fits_extnum“Ÿ fits_vcol \fitshead ÕÈfitsiíàfitsimagð¡five Âfix:¹fk46Ãfk56çflag Qfli:íflictdTfloat‹ flush®»fmt:ûfollowf§ following: 'follows: C font 4Wfoo?†foo.arr Äafoo.cEfoo.ev )¢ foo.evt.fit 6Äfoo.fit Ö2foo.goo_ çp foo.goo_0.fit Üd foo.goo_1.fit\ l… foo.goo_2.fitwKfoo.lst ûfoo.out zfoo.rdb àfoo.tab —foo.txt º foo0.evt.fit ×Jfoo1 3q foo1.evt.fit ×foo1.fitéÏfoo2 3§ foo2.evt.fitüfoo2.fit ¥Tfoo3 3Ùfoo_evt¹?foo_evt0 Ütfoo_evt1 Ü„foo_evt2 Ü” foo_y.idxZforAfor: 5Aforc 5µform 5çform:Rformat s¾format:Içformats: ¸L formatting:™›former xfoundlAfour 71fourth :êfprintfÝŒfpuKÖfpvKèfractionÝúfragmenti•frame .¿fread =£free Jffreed @jfrequentѨfrom K°from:Y…ftpQ=full g”fulli -%funQufun2 gî fun_bincol Dº fun_bitpix  fun_blankòd fun_bscalr‹ fun_bzero·!fun_col êH fun_columnwµfun_dim1Ÿfun_dim2¯fun_dlen¬¾ fun_doblank »¸fun_dpadÀXfun_dtypæ fun_endian¯ýfun_filt Õfun_fnam 3Ó fun_format ñDfun_gio þÄfun_headùÀfun_ifun Øq fun_ifun0+Ÿfun_max1 "fun_max2 "" fun_maxbufs”™ fun_maxrow­fun_min1 Hmfun_min2 H}fun_ncolkNfun_nrowÃY fun_offset Å fun_opÝÖ fun_overflowÜÕ fun_par_com ÊÉfun_par_complexá fun_par_integ È fun_par_log ýÀ fun_par_rž¿ fun_par_str fun_par_unknownéï fun_primari kfun_primaryhead(¼fun_raw 0Y fun_rawbuf™1 fun_rawparam Qfun_rawsÝbfun_rows C’fun_scal  fun_sect_bitpix ŸLfun_sect_blockVI fun_sect_btypp fun_sect_dim1 ×â fun_sect_dim2 Ø! fun_sect_dtyp Š fun_sect_x0 ; fun_sect_x1 K fun_sect_y0 [ fun_sect_y1 kfun_skip èfun_typ :º fun_viewfil½P fun_viewmatch C¢ fun_viewnamñfun_wcß5fun_wcs0 Dfun_ymax q˜funcalc ?» funcalc.s •Êfuncalc:Ï&funcenó funcen: VfunclosÃÇy… funclose: ¬0funcntôm funcnts.outˆß funcnts.plotÓ funcnts.s „0funcnts:¬œfuncolõŠfuncolum JÞfuncolumnactiváñfuncolumnactivate: r$funcolumnlookup „Îfuncolumnlookup: ªa funcolumns „ funcolumnselect™ßfuncolumnselect: òJfuncolumnselectarr ¾ funcombin  funcombine: „Bfunconõšfuncone: _cfunction qLfundisp³fundisp:[nfunds9Ùfunds9:èÂfunenv Çfunenv: ³% funeventsget08 funeventsputð±funfilSfunfil01ô´funfil02ôÄ funfiles: ñ funfilt 0¯ funfilters: EqfunflushöA funflush:¤£funhead Nfunhead: šñfunhist =œ funhist.ploti¥ funhist.plot:·¦funhist: dŠfunidxNtfunidx: â2funimag å funimage: 2Ù funimageget¥¹ funimageget:¨1 funimageputàx funimageput:˜funimagerowget©efunimagerowget: DÚfunimagerowputçCfunimagerowput: ô}funindex g% funindex:V funinfoget 0Ë funinfoget: < funinfoput ‘Ô funinfoput: ð[funjoin*ðfunjoin:Ofunlibkfunlib: ÅÁfunmerg H* funmerge:ƒfunon 4 funopen ­Æfunopen: r¬ funparamget 'j funparamget:Ø funparamgetb » funparamgetd Ô funparamgeti œ funparamput pá funparamput: NQ funparamputb Na funparamputd NŽ funparamputi N¯funref˜funref: z funregionèÖfunski—¤funsky: þìfunt h`funtabl \ funtable: ffuntablerowget bÚfuntablerowget:Þífuntablerowput ¥Ðfuntablerowput: 1Bfuntask1ñ0funtask2ñ@funtblš~funtbl: šfuntesto5funtexty9funtext: ®Îfuntool 8 funtools.ds9²˜ funtools.hwÅ funtools: Îufunview ¸µfunview: …further —å furthermore’futur lÃgÃg:nan wG gal_contam 4€galactßÍgame ´*gather OgbxßgccËMV—gcount ¥®generægeneral =Ëgenerat >lgeometr ÷geometriäS ±=gerror PµgetVÝgggWÇgioWãgive ÚFgiven ¯gives: dÒgleXÿglob êÞglobal okgnuplot Nðgoxÿgoal útgoeZNgoldenéygood ü°gotZ~grammer E…graph‘grate-greatSgreater D(greenZ!grep Jgrid œgroup››gtyMgti[~gti.filt âguarante þ4gui[œgzip -h had\<halfé I/hand J<handlûghappen ÆËhappi Fhard Khhardwir !æhas\¥have KÑhcolfmt NÐhd.in É®hdroUhdup ojhead ˆÕheaderʪheader:s¢ Âheart 6_help henc <here & heterogen&ßheurist æ\hextÒhhhx­hiz hi_binÞhi_edgîIhi_val.® qÊhidden #íhidim ÎKhighWõhigher Chighest |ohint[< histogramh¼historiÞ<hms—holdå¤holder ÀYhomeåÌhomogen ú1hopeæXhostç«hourçÓhow—Âhowev Ãhrc®Xhrc.nepr âhref#hrs°Mhttp:&«huge.fitÕhundræ­hyphen”ÇiMi.eYi.e.:Õii1™[xïi2f[i:y]ibuf™Eicol1š¥icol2šµicr¶4É­idzzidea¡’ident $úidentifi ™idxÊ] idx_activ D° idx_debug ¨' idx_or_sort ¥idxal ¬Vidxand 5œidxeq: Nzidxmerg÷Tidxor °Çieee¦žifzîif:ž5ÊKifiÊ’ifil¬Îifile1Uñifile2UÿifilenV;ifun®`ignor ìiiiÍ5ilarÓilleg 5"illumin¹Oillustræmim.fitt–im.in ¢kimagÕÀ image.fit ¼:image:вimblank å imblank.c: (%imblank:íÉaimmedi ýô implement‘žimpli–qimplicit¤Bimport ú important: qimprov ÒimumÝ|in€in.fitž{in1.fit üin2.fit®0in3.fit ”in:ÍiinamÞ$iname1 [Èiname2 [ÖincludØinclude: yh including: ýØinclusTincompat1f inconsistÝêincreas þü increment¡þindÍindeßQindef qindepend Ú¨index ƒindex:Ѳindic Žindividu 8¯inetßainfinit 3Ãinfoßinfor ¿informÆ×informa Ûp information: ÈingÍ inherit„`inità(initi -»initial_region:ß½inner ] inner_radius %ûinnov _›input k¬ input.fit çÀinput:âºinsensit I°insert Éinsid €Åinspir 6¶instal N7instead+ÛintÍÈint1âàint:âîinteg ƒ_integer DZintegr3intensõintentinteract interfac Ó intermediy.internÁ interpretˆ¸ intersect ˜A interspersTöintervç intervals:»îintoâþ introduct ¶intuitœinvalid›invari Á3invoc  invok  involv nioˆ÷iparëipar1 Airadò¨irafòÄirix64 E2is‰is:Ъisfiú$isoÑ(issu Îit“–iter c iterations: þNitest.evwitiÑHitself„Œiunits1 Åiunits2 Õival1 ý`ival2F ýrjAj1z'j2z:j2000¢j3zJj:zZjfileÃijfile1±Cjfile2±SjhkÖOjjjÖŸjn–þjoin Ä‘jstat·just à×jval1Vojval2V…kÖ k_msigcom ŸØkarapet: ¿V karapet:1428 keep '>kept (EkeyÛkkey_2ûGkey_3ûWkeyword iœkeyword:ǘ keywords:`kind 8xknow dâlîlabel‘Jlack ïlapà_larg)*larger½last)nlate* laterùÐlatterѸlazi*¬lazyeot 8dldlàolearn ×least ÿleav`lectbúledà‰leftcÃlegal +Ylengthä)leond–lesseÆletà™letter LlevàÍlevel ¦…leverag ,Òlexic ±#lfuntool 2élibàó libfuntools.aØÉ libmysubs.a šlibrari¶” library.html Oºlieá lift}light ÂÁlike}ëlimit Û¤line~‡line: á°linear –linefe ˜lines: šplinkðlinux å>list€¢list.txt "2list: Ælistfil Á©lists: ©Ílittl ÉlivetimÍIlm—rlmysubÔlnameþ5lnslž™lo—Œlo:hi: Eþlo_bin 4nlo_edg D~lo_való•load ªlocal æ local...end »ðlocat ˆlodim: %²logáxlog2¡‚logic $°long¢’longer älook¢·lookup ò.loop£;loop: e%looser zlotá­lowá½low_edgÌ¡lower ¢¨lsbâ\lsocket gltmâlltvâ‹m „m:nß­machinLmachine:…à machine:port Íßmacro 7òmacro:–!made Pmagãmagic _Smagnitud ámain Ümaintain /¹major r4make ¤makefil maliz €µmalloc "Bmani zmanipul Ëmanner /ÿmanual nlmapãmark àmask ìmask: ¬Šmatch ³emath ÿmath.hr›matic ´ômationˆïmatrix¸õmatterÁñmaxãTmaximum,¸maxrow G‚mayãÁmb—¬mean &ªmean_pha 1meant »Èmechané¹memori(„ment )lmention]Tments: 26menu )„mere *&merg *6merge.ev ©merge: kJmessag Q&metätmethodkWO8methods: ’might 4Àmileag ÅÕmimickUzminäëmind KXminim yminimumÜõmink Knminus õminut ‚-minutes: åmiracl j miscellan{vmismatch —Ómiss O4mission`‘mixå8mixturójmkgti I„mode yªmode1 ¿€mode2 ¿žmode: ¿¬modif Àymodifi åÄmonth ò”more |Ímoreov (Umosaic(.most ~Zmove ~¾msbæHmuch ¦ multi dmultipl…multipliôImust ¨smutualÃÓmxnçÃmy.regò>mycol «õmydec °çmydec:d Cþmyra ÁAmyra:dd2n!n.fit rnn:—œna™ nacis.fitì nactiv kŽname Üàname1 Ï name1:type1 ¿Äname2 Ýname: ëname:dim ê name:min:max Mname:min:max:binsizY÷nanéwnang àInarg à™nate àÇnativ ,*natur /naxi áInaxis1 ËKnaxis2 ˉnb:èÜ necessari Ínecessit Vneed ó¯negat M‹neither çDnetê net_count ¨nevê#neveròTnewê9newevý'newliýÛnext øwnf™ngame4£ 9*nice •nized: no™'noheadf—nokey mþnomicç• ’=nomin ’\nonì none ^norínormalŒünotí6nota notatÙ6 notation: þ®note note:Únotes: ñ4noth !ÖnoticÚ³notion Ìnowðsnpha 'Znr:i )nrad 0{nrow 1˜nthðÏnuanc ¼null Anull1 ò¤nullvalu _ÁnumñnumberÖÝnumber: ÷numer õÆ numeric_countÉÉo$¨object3éobserv È6obtain JÔobviat ¥4obvious Uˆoccasion >occur rDocol1 Ágocol2 Áwoctal ÔHoddóeoderÛ[ofœkof:ó¥offóùoffer (Žoffscl -Eoffset .Ðoffset1 õloffset2 õzoffset: õˆofiläÝoften ¡ ofunæäoldõÃold_ ßolder‘ŽomitIIon¦¢onamN7oncõûoneö—ongoOonliP"only: ;2op©oop1øÊop2øÚopena±operc opera  operators: ¶Òoptù½optim •(optionº optional: Œoptions:€or©or:ùéoradn%ordersˆorder: ˆ‰orders: ¶²ordinxÏordinari ú ordinarili ÈForgú7orient &šorigin 6morthogonñÈosf1w[otest.ev 6other ½òotherkey %†otherwis ‚Öourú×ousúÿoutûout.fit ð—outerãé outer_radiusáoutput ròoutsid …OoverŠÂoveralÐ9overflowž]overhead þ†overlap  overlaps:Œtoverlay (overrid /Ï overridden Ÿ¬overwrité¹ownûÈp%$packag[¬padý^pageÀhpairÂpaný£panda¯parallel Á—paramÈ0paramet ¸É parameters: ô›parenΨ parenthes á) parenthesi daparlanc ^parsÄËparser |“partÄÛpart:Ð) particularæhpassņpastÆÀpathÆÐpathnam†²patholog øãpattern ÕÜpc®Fpcount^îpcsýËpendà>peopl Eßperýÿpercent¹uperformµ perman CpermissÆäpermit _persist EpertainϹpevþpevrec Ȥ pevstruct ,ÂphaþFpha:i“4phasî}pho‹photonÏgphysi 9\physic´œpi®hpi:iìÖpi:jìüpie›pipeßxôÔpipe: Êpixnpix2wc ¥jpix:öþpixel öœpixel:ý»pixels: Uxplace dplace: Er placement Íplatform£ìplay @plepleas 4plete 9plist `plist: +Iplot <plus pmax Êpmin  poff %"point ðpointer N pointers:°' Õpolpolygon·1pool %Ûpopul 8‰port &>pos5posit OÓpossibilities:‘àpossibld¸ postscript ßpotenti°Bpractic) pre]prec 8Hpreced d¹precis f predecessor «çprefer zJprefix z½prefx£¡prepar ¼"prepend $presenc Ì…present ̵preserv Íïpresum ÉÆprev 8kprevi¦lprevious5êprimari òprinciplû/print¹ªprintf ¯prior¹òproprobaàÿprobabl IproblemÙprocess©Þ processed: úNproduc añproduct àiprofil kZprog >³program œÿprogram: åprogramm % programs: ,proj >ÎprojectßÜpropag ®òproper °/propertiž×proport™!propos ±qpros ?protectÓprovid Ë­ provisional: $pure \6purpos”`put4qpoe õ qsort 4qtpie|¤quadrant Ì]qualifi K¹qualit 3quantiti Øaquarter :quasiàhqueriô~questionyõquick †quot ‹quotes: ×r%ˆr1° r2°-r512Ô 0?r512.400 C r512.400:2880ñØr512lÛ ra°]ra:h 52ra_cen½`racol: ªqrad_cen eradial ÿradian Gradii Âradii: #Ÿradius &radius1 ”°radius2 ”Ðradiusn •Úrandom rang @} rangelist: ˜rapid þ$rare CVrate Cnrather §ëratio ·raw¡ rawx:j:100Θ rawx:j:1:100 F˜rayrc°ðrd±rd_flgÜårdbKre±*reach Rread QZreadabl ÜDreadi `real RÌrealli Jôrearrangï2reasonU6reciprocú÷recnam vrecog /recogn {! recognized:´„ recommend æú reconfigur½@recopi record ‰record: ®ârecords:©Îrecreat÷Dredµredhat 2redirect]Ìreduc írefËrefer (e refer_cod€:regá regalgebraÚ! regalgebra: òregard ©Ý regardless[Úregbound ªë regbounds:¦Hregcoord ­ regcoords: >regdiff„$regdiff:differ )ò reggeometri _ò reggeometry: «wregion Ï’region: òøregion_expressá2region_expression1 Zregion_expression2 jregions:|º regreometri —{regular¹/relat EBreleasNÈremainû remaind ákremedi rememb ©remind Bôremov Mírenam OTreorder„ºrepeatÑÂreplacùHreplace:iàreplicúBreport (repres 'Àrequest œ×requir B required: §*requisit ãresearch `¾reserv”xreset4resid4ðresolutÓÛresolvÐwresourc Îrespect respond ±respons ÂÙrest erestorì"restrict—7resultï¾retriVÍretriev,Q yreturn ÈÆ returned: 5revers(frflg vÞri±^ridden Ì;rightçJrinner ùŸrm³Ñrn³áro³ÿronmentÏãrootÞrotaÞÝrotat —£routerÃAroutinÔroutine: Q#row²row:ßrows:\rstart ürstopmHrule írule: ͯruler Îrules: 8¦runrw´s&Rs100.150 ²És1024ëÉsafe„Ôsame†Òsao $saoimagžmsat Dsatisfi E[saveˆÿsbufŒ„scalar ðkscale (¦scanf (üscenario ×Êscientif «scol“dscope ¡–script ˆsearch¨ùsearch: È”sec!second U secondari ²¹ sect_bitpixæ»section „ sectioninfo .˜ sections:«îsecurµµðÁsed!see!Vsee:šÅseedšãseek›seekabl _‹seem›+seg#¹segment «Gsegv›{select ðsemant Ë!semiœ# semicolon Ƨsenssensiblú¿sensitïi^¾sentWsep#Ésepar{† separately:}ÇsequencßÄsequentiäªseri¿serialseriouswservBHž=serverì¶session¦Œset#×setenv:H lsetup˜æseventh Åsever ü sexagesim ó, sextractor ósfile *sgi%ƒsh´)shape YNshape: qàshare d\shell1"shm:¬¬shortøúshortcut .ˆshouldo/show¬ÞshownúSsibl°Rside°bsign°Šsignal wásignifiúsignificù®silentèòsillißqsim%«similarÓH similarly:[Nsimplèsimpli üØsimplic%csimplif%ssimplifi F¨simultan üdsin%»sinc±µsingléåsion²¨situat 5Âsix%Ósixth 2ÿsixti 3size¶ sizeof pskeleton ¥skew»<skip»`sky&#slashRwslaveSsliceŠ€slight{>slowÃ1slowerKìslowest *slowliMÇsmall smaller˜þsmallest€Jsnr.ev ¶soµHsoa(Rsoa:Õ/socket]%softwar 0Osolari êXsomeÛTsomethëésomethng bÊsometim ª·soonÛ®sophist sortÝsort:}×sourc‘ðsource_exposur ¸¤ source_fil 8¡ source_region  source_timecorr ÓdspaceÐéspatial Ûspatial_region_expressòspeakéspecÝÂspec:éspecfi 8¶specié2specialǰspecif 9specifiÈÙ specifica çÔspecification: Àÿ specified:ë¶ specifier:íspectrum Á‡speedéJspeedup ,ˆsprintf‰ÿsql(® sqlch5.htm PU sqltutori squash 4Bsr¶&srand48`¡src(ìsregionò*sscanf5Æstanòstand d£standard -Wstarbas BÒstart e=statò2state fstated: nÔ statement ^É statement: yxstatic ¾status  status:4j ¬Fstderr „Vstdevt …9stdin x±stdout Åýstill £5stopå ôŽstorag ‚cstore Ãæstrcmp ÜÀstrict þnstring ÿ:strong struct 3 structofarray ±structurŠ structure:‚è50stsci Óœstyle óLstylist g subdirectori“wsubjectëÙ subroutin Ksubsequ ö?subtract Q3succeed¬success“Âsuch÷Êsuffix Øsuitabl ÄIsum*sumcnt ++summari c™sumpix Ÿ~sun*bsup*|suppli CàsupportŸ supported: ´:suppos EKsureüsurf_bri¥ surf_bri:*Âsurf_err( surf_err:ÉÙsurfac —‹surround 'surveyKvsval3 swap ú swap.expr ¨Ssway: ˆsweep &jswitch 6äswitch:›ósymbolö¾symmetrÌÆ Íÿsynopsi ¬¢syntax %ôsyntax: ‘‹systemÞ¥system:uÀsystems:¡Þt(|t1.fitÒñt2.fit¨Wt3.fit O­ta¶Vtab+'tabl Qxtable: ±tables: tabular ktailor Pwtain V]take Wétakenzstarget •task \tb¶ntbuf cStc¶€tcsh g„tdbinTtdc+¯ technique: ñøtell rÂtemp v=templat ô« temporari âten+¿ter,tere vyterm vtermin çtest v½test.evœÀ ù·test.fit ]S test1.fit ]test2.evd„ test2.fitóµ test40.fit D˜text w[ text_alenƒ(ë’ text_bincol 2Z text_column^„ text_comchar ÀI text_delim 0ktext_eot _â text_hcolfmt %ä text_null15 tfieldßítform á~tform1 yÔtform2 ztform3 ztform4 z.tform5 z>tform6 zNtform7 z^tform: zntgr,¨th·than …kthat †…that:w3the,ñtheirŒ¦them Œ<them:­themselvîethen Œ†theoret FÎthereÒthereforôätheseŽ these:+C )4they thing¤think¤ third¤íthirti ¼this Sthis:¤³thoseÎÈthough (ØthousandßOthread}KthreeÜ= thresholdâêthrough ‹Îthus –Ÿthus:íðtieIŸtile ›+time ›Atime2 ¡Ztime:d H·times: UÝtion žøtitl Ÿ4tlmax Eÿtlmax1 ©tlmax2 ©tlmax6 ©­tlmax7 ©½tlmin Gûtlmin1 Ítlmin2 ÍŸtlmin6 Í¿tlmin7 ÍÏtmpIÕtmpdir ýPto·`to:Jtogeth ‹¶tokenç€tolJ©tolerëÖ tolerance:…³ton_åJÅtooKTtool ·Htopic ètopics:(útotKdtotal %Ltouch 'ötracecútradit 88transfer f transformÓëtransitý8transpar dtraversÙ²treat}c treatment yÄtriK˜trianglß#true Ç truecolor z‚trumpâÀtruncat ²Ûttype1†:ttype2†Rttype3†bttype4†rttype5†‚ttype6†’ttype7†¢tunitrktunit1 turn Õqtutori V=tval3àVtwice:È5twist æLtwoL0two: ܲtwos ÜÐty_array ±aty_ev‘~ty_imagà?ty_tablv–‰™type ètype1ó*type2ó8type:óFtypedef üttypes: £—typicôu)lu:¶6ucdNueÂøultim rumnR unaffect viunalignÖ½unambiguÙ&unari…ã uncertainti ç4unclear -«uncommonô¦ uncompressÐWundeclarÓFunder–1 underscorå¼ understand ¸<undocu Üunexpect 2junfortun çunimport k~uniqu±+unit F,units:äiunix Fæunknownܵunless Ëunlik½Öunlimit ûunnamÐÉ unparallel Cunrelé"unsign’¶untilòDupÃupdat update:KÜupdated: v­upoRíupon VU upos:4096ñúupper Pupto dªusñusag ’KuseS?use: ’„used: åìuser “_using: 5usrYÅusual 1Ñutil0dv)˜v1᪷Dv2œv4.x°Ë ¿Žv:¼v::view1 fËv::x1 šÁ v::x2:foo # v::x2:foo.fit $v:eM· v:foo.fitü$v:snr.ev D¨v:x1 å^v:x3 ånval\val:val |_valid Çivalid:ë(valuèvaluabl I?value: E¥values: ’ä vanspeybroeck õ¸varargù«vari %variabl û" variable: ¨cvariat_various ;Ôvcol&vcolumn Û”vector êxventionÄverbosÓveriR"versa Eðversion r!vertex„vertic¢€„@via]‚viationõ–vicenviewnAview25view:5viewlist”Bviews:»Lvirtual KJvisual %ÂvizierSS ¼void— vposœS vpos:49152 â"vvÄ¡vv1^Tvv1:vv2 ¸,vv2^dvv:^tw)ëwantúRwarning: ðÃwas_,way_îway: zways:Ö‡wcÄÅwcs`±wcs.h yšwcs2pixÈwcstool òÐweÄÕwedgŸÚ Ïwelcom qˆwell Nwell:ˆwere ¿what *ýwhen +qwhenev¤2where Gwhere:¹…whether 'whid which |Àwhile ‚while: white Š whitespac _whod"wholeÉqwhom /ïwhoseÌÃwide 7‹widthŒ!width:¡Îwill 9lwindowõë windowsnt ¥~wing =nwish >èwith ?-within =without±work näworkstat ×rworldMá worldcoorÄ­worstN¸worthNàwouldi writabl \Œwrite S_ write_row Jwritten ΜwrongVwww.cs.unibo.it©W www.gzip.org $www.harvard.edu Ài www.tbray.org d1x*šx0Ããx0:x1èx1Ã÷x1a^4x1a:foo "x2Ä> x2:foo.fit¬þx3Äyx:ĵx:1024 ´Xx:d^Öx:e:4 ¹x:i_x:i:10 ¹x:i:1:10ñðx:j:1024 •x_imag ¦ÀxcÆdxcen Ûxcenter I xcol ܤ xcol:0:512é© xcol:xdim ¬" xcolumn:xdim ê¢xdim2™›Znxds9 âxfÆtxflg ñØxgnuplotZQxlabelnûxnÆ”xnam îxnameµÏ @çxpak^xpix ?xpos 4xrƵxsÆÅxtension Éæxtra 12xw1lêxw2mxwhi <“xwidthjÅxwlo ?•xwnm,xxxmfxxx:3a %:xxxx E‚xyÈxy0:xy1 zy-y0:y1¤y»Üy1Æy2Æ9y:1024 Dy:dfcy:e:4 Èry:if{y:i:10 Óúy:i:1:10 ‰ùy:i:2:11¦|y:j:1024^”y_imag 4°ycen\ycent <ycolxÁ ycol:0:5125d ycol:ydim»Î ycolumn:ydim {yetpWyh1p}yh2p™yheightäÂyhhi®aã.yhloä„yhnqŠylabel )ynÈynamKyour¹yourJVypixN¢ypouªyyyvÃyyy:3a¦8yyyi”«z/èzeroÓizlibùœzoom zzz{"zzz:3aò ‡`!ƒl¦‡a0Y„w$©' J6.Ir¯‚v„xLL \xD*2.&ˆª‚6*V^Œ¤‚Y' 0†A7"b ƒG‚>r5r  §‚JY„u¤‚s-L±‚4¤ˆ„0‰w@£‚M.¤‚w} 1±‚±‚'±¤K ‚h £o‚¥„!}0­5  @©+ qj‚ "¨y 5,W-£‚ (¦mG‚d#=±‘d¢ƒjƒx¤ƒ/‚E ¤&Œ' ‚T£hC¦U‚A.7±…´I{0¥…†ƒ ƒm¦œt0Y„w$©…. J6.Ir¯œ„xLL \xD*2.&ˆª“K*V^Œ¤ˆ+Y' 0’u7"b p‚>r5r  §aY„u¤†xs-L±…¤Ÿ]„0‰w@£….¤ŠB} 1±…±…F±ƒ[¤Š7 ‚h £†'‚¥’p!}0­‡  @©‡3 qj‚ "¨ˆj 5,W-£†+ (¦‰ G‚d#=±«O¢Žsƒx¤‹/‚E ¤–YŒ' ‚T£†mhC¦ˆl‚A.7± ´ƒf{0¥™+†ƒ‰x(„X®‡j)Nƒse&0d …u¦1‚{% '…g%+%'-X !j3?]†- ¤…f8o ‚5=OW…‡ F¦‚$I‚I6­„>S/A> Y/! Iƒ!‚Sdn!#8 =)±‚# ƒyMm4.+''±„&±ˆ (~1R„eF2"¬y4#.+*! " £ „w ¢9V±†\±‚X¥„> E£‚ "¥&£ZX±…K´„g0¥i? ‚B © K ªv‚{ ¥[ 5$±‚-¢‚hƒ ¥mR"  ‚m‚;BG‡"‚A $c ]‚r|c‚"L;  # ƒ ?K?&t ¦ˆƒb  ‚  „v#ƒ8UJ"5j®y  «M ?e ¢Wƒ¥ƒ!I‰ Y 8±•±… ±™)±‰!±‘±†±ˆN±Œ7±‚&±Š,±„)±ˆ±‹±„b „_®œ})Nƒse&0d …u¦…8‚{% 'ž6g%+%'-X !j3?]†- ¤8o “J=OW…‡ F¦ˆ0I‚I6­ S/A> Y/! IU‚Sdn!#8 =)±„F Ž"Mm4.+''±ˆL± (1R„eF2"¬…X4#.+*! " £ˆf„w ¢„V±ž'±† ¥Œ E£…o "¥„E£ƒX±Ž7´’sg0¥‡U? ‚B ©†p K ª‡v‚{ ¥‡L 5$±†F¢Šƒ ¥„*R"  œX‚;BG‡"‚A $c ‹f‚r|c‚"L;  # Š{?K?&t ¦ƒb  —@ „v#ƒ8UJ"5j®‡@  «†iM ?e ¢ˆnƒ¥—EI‰ Yˆt„4¥ˆ…6H¢2ƒE 24<ƒ ‚R q q  P33<„ ¢†Vg ‚89IX‚LIIU‡¦‚ YH ‚"¯„BS/A@"< $ / † b‚v-: =$¨v…g * @±ƒy­‚bL…JJ=­o@#++&! ±"±>¨„;Z‚n?]¤ ‚C ‚B ¢M¤ƒi L ¦m 5} £oV …}†.ƒY ,\©_‚vf‚‚$ C¦†!…_ ƒª‡Sk,ƒH;w F‚r ? ±„«ƒ0‡‚ „9¥…6H¢…9ƒE 2šZ<ƒ ‚R q q  P33<„ ¢tg “M9IX‚LIIU‡¦ˆYH ‚"¯ S/A@"< $ / ’Ab‚v-: =$¨‹…g * @±ˆ­yL…JJ=­†N@#++&! ±ˆh±„¨œZ‚n?]¤ ‰/ ‚B ¢‡!¤‰q L ¦‡^ 5} £„,V Ÿh†.ƒY ,\©‹h‚vf‚‚$ C¦›%…_ ƒªk,ƒH;w FˆK ? ±‹6«—>0‡‚…}&‚U¤3‚8#DªŒuW 39 ‚;&  GY‚FIF ±‚X«„FS" -D!YY †p‚#$: =)¬…+;DR( ¬‚O  J‚« 8#>.t¤ƒz‚6±‚^±—K±ƒ2±‡K±ƒo±ƒ±‚<±ˆl±„8±ŽZ±†l±…T±†±†q±„±‡§ # T ©WƒL‰V ´‰tõð¥…i‰Mƒw©‚ Œ8Bm°ƒXVÆhˆŠ»ªf§P§ƒ ‚:ˆZ<!«`‚ :t ¢… ,²S ©‹$ƒR bf Fw±‡I±‚a±—N±ƒ5±‡N±ƒr±ƒ"±‚?±ˆo±„;±Ž]±†o±…W±† ±†t±„±‡! ‚Y¤…:‚8#Dª¦W 39 “P&  GY‚FIF ±ˆd«S" -D!YY “$‚#$: =)¬T;DR( ¬f  J‚«…p 8#>.±h¤‹@‚6±…<±¯±†d±±‡^±†>±„x±‘X±ˆp±4±X±‹(±Œ±b±ˆ2±Ž<§„M # T ©›BƒL‰V ´”}õð¥šm‰Mƒw©—B Œ8Bm°ˆ^XVÆhˆŠ»ªf§P§“; ‚:ˆZ<!«†9‚ :t ¢,²ƒp ©ŸHƒR bfƒ%O§Œ}m836Pƒu !‚2 0?>‚@IC ¦„JS1$YW †q‚ %: =¨†o  86©‚_B¦ƒ?. *¢†-±G¦…]‚C#‚+r¢‚e­„m‹0 Li‡±…=¦Œ\‚.£9b:¤‚v 9 ¢…)¢L£‹' †7 O§¦#m836Pƒu !“G 0?>‚@IC ¦S1$YW “%‚ %: =¨‘  86©vB¦ˆ. *¢s±„%¦(‚C#‚+r¢†"­žX‹0 Li‡±F¦¡`‚.£¤lb:¤ˆO 9 ¢ )¢ƒi£ŸK †7ƒuwµŽ76Ó§ƒD]§Ž:&J3…D 1‚/)51 ‚:I@ …v+:§ƒRfS.'Y †r‚&: =£ˆ P ¬‚[8±¯ƒ:FRO¢‡3ƒK§ 0 ±†h§˜_ 0±…<¢„‹¤‚w 9 ¢…% ch„~R‚\‚)4/3 G wµ£J6Ó§ˆ D]§§`&J3…D 1“D)51 ‚:I@ …v+:§ŒfS.'Y “&‚&: =£’4P ¬r8±…q¯ŠW:FRO¢ž~ƒK§„R 0 ±=§²J 0±.¢™R‹¤ˆP 9 ¢% –h„~R‚\‚)4/3 G‚P$£Ž1 ±•X )‚0'2',.‚4I=…e$3§„R:+*@¢†s‚#ªˆ #©‚\5'ªƒ3 @ P G ±‡d¦˜Q)±†~±'£a‚C«„-6C¤ˆJR…a‚n %££D ±®~ )“E'2',.‚4I=…e$3§:+*@¢“'‚#ª’) #©s5'ªŠI3 @ P G ±Ÿ/¦²<)±’±¥Z£†:‚C«‹+-6C¤œnR…a‚nY j¤<T ‚GGbdƒw…e3B¢‚(Y¦„V‚ ;/¢†t‚#¦ˆ;£‚{e¥ƒ@M]P±ƒ² ‚9À±¤‹sŒX¤‚d. j¤¦bT “\Gbdƒw…e3B¢ˆ4Y¦!‚ ;/¢“(‚#¦’*;£Že¥ŠJ@M]P±š[² ˆAÀ±‰f¤¥^ŒX¤ˆ=.‚M#¥„ƒb †, ¤=T 3„|†h-¢‚Y±„Z§T…E >¢ˆj±‚&ªƒ -8FC± £i±‚±±‚ ±£  0±‚/¥„„Hq?±„±+ ‚_ ( #¥™/ƒb †, ¤¦cT ’H„|†h-¢ˆY±%§Ž…E >¢’Fj±‡ªŠP-8FC±ƒj£™4±‰`±… ±…*±ƒ>£ „Q 0±‹¥ž „Hq?±±¢/ ˆ8 ( O e¤7 P 9 † †h-±„^¢†v‚#¥ˆ9 ?¤‚s-Lªƒ +8FC¢ˆ^ƒ:± q¤˜Y0¢‚{C±Ž e¤¦] P ’N † †h-±)¢“*‚#¥’-9 ?¤†ys-LªŠQ+8FC¢ )ƒ:± ‡y¤²D0¢ˆTC±£#‚±ƒe²ƒh`¢ƒ8…*±P¢{%±…d±†>±ƒt±ƒe¢„‚j±†(±„*±‚`¤„MQ[¥ „’`?¤„8¥… ‹k£I‡0x¤‹0@ +±¦ƒ,-¢‹Hˆ& ±˜x²ˆo`¢ŒV…*±¡e¢ˆ%±Ž/±’r±Ž±ˆ ¢Œ ‚j±s±‹u±‹L¤“'Q[¥ o’`?¤‹r8¥š ‹k£–|‡0x¤›V@ ±†±ˆ'¦‹1-¢Ÿlˆ&²…"` ²‹*` ± E ± ƒh—5/‹ D:+F'3**5*(    :pV(_ A;u 3& *  ^©FD)<8.\vT ()  ~8[ -ƒ3 „4(,,9 =5  3  Ya  1 H&:63$ ?8@ ) .7xici:O 0v2?0"6  b  '  [&MY2 X.  5 1)P73G(9< *   Tf `U* *r3k<),8 !¦ E  '?6%9 > ? J  # r¥3(!¯J,5 c‚@ #  " a$zd8$l&!"!@Z ¬ : :' 4V5*¤  F­O6‚‚ 4§ !:c9O @D0o  #%V& >%y #( G e8Mƒc‚> (‚XWª   D' '&? $b$VMi® #=]:X¨,%1 %-1¢Ao¬6"s'ƒ|  %/*$ HF , !#&B#rp c"1H!V$/1‚    k% "_$0(0u ­ D R ~TL$  O% ^= 0! ./    %n%0Z­!$7  eX" 'A<1¬&+ $CI \©-'N)  < 2T: #) & 9 :(y>$G' ?‚  0% Aco;w T` Y ‚.H@# g4 6B/ Z  - ( `#6 u<E  bC!,4 0‚ 07TWƒED$& 3 >\#ƒ.8-K  ? (m1Y| ‚:)@DJ GG U     w > Y#    *1 69 ^a @ -D[ ' % ) J @0 7v], VC# 'X , :>   2.J. ,-0¯+9"EC< ;E  f ;'J(|E  :%-|w^ B8-, W>z¥< eW 2%e&) 79 622*^H4%D*) th56x+) I±’B±¢0²Œ0³‘C²˜l@²„M0²–5@±‰B±l±…@±‡e±ˆv±\±‹,±Œ±–±n ‹F D•#:+F'3**5*(    :pV(_ A;u 3& *  ^©…MD)<8.\vT (šO  ~8[ -ƒ3 „4(,,9 =5 ‰)3  Ya  1 H&:63$ ?8@ )‘ .7xici:O 0v2?0"6  b  ' †[&MY2 X. ˆT5 1)P73G(9< *Œ=  Tf `U* *r3k<),8 !¦‚/E  'ŠC?6%9 > ? J  # r¥„A3(!¯‰N,5 c‚@ #‹# " a$zd8$l&!"!@Z ¬„h: :' 4V5*¤} F­ˆ6‚‚ 4§‚g!:c9O @˜0o  #%V& >%y #( G e8Mƒc‚> (‚XWªƒP   D' ‡r&? $b$VMi®ƒ{#=]:X¨ƒK%1 %-1¢‚}o¬‰""s'ƒ| „C%/*$ HF ,Žg!#&B#rp c"1H!V$/1‚  †u k% "_$0(0u ­…]D R ~TL$ †O% ^= 0! ./ †~  %n%0Z­„:$7  ‡=eX" 'A<1¬ƒc+ $CI \©…b'N)  < ‰T: #) & 9 :(y>$G' ?›x 0% Aco;w T` Y ‚.H@# g4 6B/ Z  - (‹`#6 u<E  bC!,4 0‚ ˆ07TWƒED$& 3• >\#ƒ.8-K  ? (m1Y| ‚:)@DJ G•EG U     w > Y#    *1 69 ^a @ …_-D[ ' % ) J7 @0 7v], VC# 'X , :>   2.J. ,-0¯…s+9"EC< ‡RE  f ;'J(|E  ˆ?%-|w^ B8-, W>z¥‚Y eW 2•Ie&) 79 622*^H4%D*) th56x+) t 7¢p#±‰(§,„ G‚xa¤ƒ ‚{:±ƒ£„„I9µ‡g¯H±†k²ƒ  8¢ª#±š=§ŠU„ G‚xa¤šX‚{:±Š/£ž„I9µ’p¯H±›o²—9 os¯~ /‚Vp‚‚/9†#>¢V<£2ŒW ±U²&¢ˆ¥r ‚{-² §„ }±ƒa¥„\!¢„aƒ6±…;¦‚p‚j²J@±Œ) w¯– /‚Vp‚‚/9†#>¢©|<£‘GŒW ±‡a²‚I¢’C¥„pr ‚{-²„9 §‹ }±‰5¥‹M!¢6ƒ6±Ÿ&¦y‚j²‡@± M‚¦ƒ~‚6‡M²†.§Y7m~„d¥‰ƒ8‚e±…n²ˆ ±†£ˆ=#±G¦:‚ Aƒ¦%&‡z:±‚V±‚N¢F±…,±ƒ\±„&¢„5„J¤f*¢‘W4¤ƒ*~ ¦™‚6‡M²ŸT§‰=Y7m~„d¥š1ƒ8‚e±‹z²W±’B£’D=#±…m¦ˆ>‚ Aƒ¦¤p&‡z:±†±…m¢„±”±ŠM±Œ{¢ž „J¤¥j*¢§ 4¤‹#*~q5¤{¥ JD3±‰±ˆ ¥…4ƒ&%§‚2‰K± ƒm±„1 7¤•%{¥™? JD3±š4±U¥]ƒ&%§™}‰K± ‰u±ž, Q« ‚†„Q¢†2„  ‰2@"#*37033¤…6‚a¤G‚±ƒu±ˆ{¤…ˆK[ V«•' ‚†„Q¢ŸX„ ‘& ‰2@"#*3703±‚V¤_‚a¤„9G‚±‰}±¢f¤•<ˆK[D²Œ`¦;‰x!¢B¤…'ƒ]±%“| ²¡s¦™a‰x!¢ B¤Pƒ]±%¨ @£z(~±„¤‚^-¢‘‚W±ƒ@ £‹(~±Œ ¤„r‚^-¢¦ ‚W±‹Eƒps¥ ƒ{)§G“Iw1F;£‰%…±Y¥†/ƒo ˆ Sƒ]‰c8¦„.R¥b-D¶‚<"Q°ª4  HµW#s¢‚‚®„ u‚±†ªƒ >J·‚-"C“±…b¦ƒC l.(‚:.K<£„"„TŒm¢p@±„*§‚W(‚‚P†[¢ƒ((±‘M v¥… ƒ{)§™m“Iw1F;£š:…±‡e¥‹.†/ƒo ŸUSƒ]‰c8¦‹yR¥…Q-D¶…["Q°ªƒp  HµŠC#s¢†N‚®’r u‚±Œªˆa>J·ˆ5"C“±ŒS¦‡7C ‰ .(‚:.K<£ž „TŒm¢¥t@±‰q§’}(‚‚P†[¢‹-(±¥q E§(‚5‚-&o[±‰"§A8*6 „p©‹BQ …|RZ±„/´‚W"0±„ ¥„ ± „' G§‰F‚5‚-&o[±š7§Šj8*6 „p©£ Q …|RZ±‹z´…v"0±ˆC¥’x ± ž±$„,± ±$ž±¥J C¥ŒG-±”F§7 ƒ‚Nmc¦ ‡]†d¤$ ¦„3b':±ƒc±‰¢†t‡7 J¥•)ŒG-±­l§‰U ƒ‚Nmc¦‘( ‡]†d¤† $ ¦ŒM„3b'±‚]±‰7±£¢œ'‡7 <¥M†g<3±† ¦S‚UE§‡-1YN=±‚5¤Š=†F¢Š…D²ƒB€² p ?¥™s†g<3±—!¦Š|‚UE§‹0‡-1YN=±>¤ŸA†F¢šA…D²‹G€²ƒ&p‡/ƒ$ª+…|ƒ#ƒ "_'„z¨T Dh@ ‡pEqExU`5&‰#£L‡<­‚8L%:‚-ˆ±…~¥…,‚V¦ (ŠT±‚±Š±„±‡v¦‚N„c]cª^)s-I-f£s…/£ ‚"§ƒƒ&<5±ƒ$¥‚7|‚X£‚ "4¢‚PA£HR¢|†b±„*ª-" !¦fM‚4A¨ ‚‚D$ ¦2„¤f‚Pƒ±„ ±‡²ƒ/಄'ಈG঄BB‡D²Š{ࣆR©ƒ0†=Š7¦(‡v‚‰h­ƒI4 ±&²…Kಇ अ‚i¦@= ŒU7)T;-?!  s <±!ƒ@±„8±ˆX±™n±‹ ±‡u±•±•6±…J±)±…\±‡±ˆ±‚ ±”' ƒ3ª•"+…|ƒ#ƒ "_'„z¨…T Dh@ ¡EqExU`5&‰#£‰j‡<­‘)‚8L%:‚-ˆ±Œ ¥ˆh…,‚V¦ŒK (ŠT±„8±”D±ˆ>±z¦e„c]cª„s^)s-I-±Z£ˆ9…/£‚~‚"§šZƒ&<5±†V¥Š|‚X£…z"4¢…oA£„R¢Šh†b±ˆbªœ" !¦‡RM‚4A¨…k ‚‚D$ ¦†2„¤‡W‚Pƒ±ˆ$±Ž.²†lಈ\಑à¦pBB‡D²–࣎R©˜4†=Š7¦–[‡v‚‰h­ˆWI4 ± L²‹$ಎ ठ‚i¦ƒ @=  y7)T;-?!  sy 9Q ± ƒY±‚&¢‚‚¥"†EI±†±…c±ƒo±†}±•d±„+¥„g ;± ˆU± ‡H±„b¢†O‚¥|†EI±±ŒT±ˆ±Ž±¯O±‰r¥™ a,£+0¢T…¦"‰\s?¢2±„±‹c¢l@¢ƒ$( 0£•++0¢™z…¦ŒV‰\s?¢„u2±ŒU±¥N¢¥p@¢‹)(F^¥]Š%ƒ §U(4g ~„`±]¦C+‚!qE¦Š :‚_±‚i±^¢‚D‚{£\<±ƒi¤\*53±ˆz£†dŠ@¢ƒ!( c¥šŠ%ƒ §‰s(4g ~„`±‡i¦ˆG+‚!qE¦¡T:‚_±†±†¢‘‚{£‡H<±‰=¤‡M*53±¢e£›hŠ@¢‹&(„&$‚¥zŠƒAƒ} ±‚ h„: ++1=T[<(±„p¤Œ"‚@B¤ <¥@¥c„zA‚1£…wC*£$†Z§ g,L-¢†¢‰r0¥‚U2¤‚6|¢‚ "£ ‚!$¤ $±†[§io‚`]…h¥eM‚4¤ƒgL ¤e‚P±\±{¤Wƒ¢ˆk‚X±†5¤j†vˆ,±‘A¥„" „9…R±‚<±„h£ƒDf±“{ ±†C±„} ‚¥– ŠƒAƒ} ±‡ š„: ++1=T[<(±Ž¤2"‚@B¤† <¥‚c¥‹ „zA‚1£{C*£‹1$†Z§„w g,L-¢‡Y†±‚r¢¡=0¥†2¤Š|¢…y"£ƒ)‚!$¤‚F$±G§Co‚`]…h¥‡QM‚4¤‰;L ¤‡V‚P±…u±…8¤… ƒ¢¢V‚X±‘>¤–n†vˆ,±¦t¥”H „9…R±ˆ±‹£‹If±¨ln¤R‰£{©/G‰_…Oƒ#„N¥ Œ?‚u¤ r¢¢o†@¥d…e!£d‚.-±‚>¬–C5±‚L¢D£IˆM‚±‚h y¤•e‰£…{©™UG‰_…Oƒ#„±‰l¥‘* Œ?‚u¤† r¢ˆj¢‹†@¥ˆh…e!£†C‚.-±…¬®5±…k¢„£•|ˆM‚±‰)J±S±ƒ_£„ „7 ±•]±‡_±‰3£ž „7P$±ŒI¤‚ ¢l–+¦ […(*'4¦„#Œ C '±¡\¤…‚ ¢š–+¦ ˆ_…(*'4¦ž#Œ C+ P£$’^,¤ƒ &¥pj¬ˆD3‚{&±‚±„ £‚W‚\7£6‚O¤n5}±—±“^ V£™J’^,¤ˆiƒ &¥„7p±ˆn¬ 3‚{&±…p±ˆD£‘1‚\7£‡z6‚O¤‡_5}±°~±¨b…a‚h "‚[( 1XFXu … „ £b‚¥ŒOt‡¦^ƒxWKe &)~:P]ƒv k ! 6 ‚Q3,u¢_aªBJ„m & ­#‚-o %B‚ ¦l(fY¯E o+I,F3‚i#ª0RIS‚^8@­- &8TY8'  ‚d …C‹E>Eo<£…}±„ ±ƒk±‚w²eଂB‚„@eƒ~j-‡j¤(„G‚g8ªƒ'D^D­-„s/2*-Œn c±D®‚Y   ‚;‚ƒG¨ƒ ‚( ' 6£ƒ „8 ‚r "—n( 1XFXu … „ £…i‚¥¥ut‡¦‰|ƒxWKe &‘>~:P]ƒv k ! 6 ‚Q3,u¢‡kaªŠ J„m & ­ŒW‚-o %B‚ ¦„8l(fY¯ˆI o+I,F3‚i#ª‹GRIS‚^8@­ˆs &8TY8'  š/ …C‹E>Eo<£H±Œw±‰?±‡,²‰:ଜ-‚„@eƒ~j-‡j¤‹1„G‚g8ª‹D^D­•1„s/2*-Œn c±¥w®’   ‚;‚ƒG¨Š"‚( ' 6£—= „8„e‚, ƒ 1~ZFX… „£d‚ *~:P]ƒv *kz ‚Q3-¥EK $‚,o%A‚ O5 £u ±‚@¯F p4B*F,‚i$ª2QIS‚^8?­/ &8R[9* «”:@k=£…~±„ « „b„.eƒj-‡j±‰ªƒ(D \D¬…!4-+,Œn c±K®‚Z   ‚;‚ƒG¦…6 $ L«tT $ &‚' >, ‚2 ˜ 1~ZFX… „£…k‚ ‘?~:P]ƒv *kz ‚Q3-¥ŠK ŒX‚,o%A‚ O5 £„ ±†f¯ˆJ p4B*F,‚i$ª‹IQIS‚^8?­ˆu &8R[9* ««_:@k=£I±Œy« žM„.eƒj-‡j±”ª‹D \D¬š%4-+,Œn c±¥~®“   ‚;‚ƒG¦ŒM $ L«•T $ &‚' >,%¢|…£ -б"‘O ¢š"…£ ‹/-б"¥s ±…^ ±‹f±'„ ±f ±'™±¢ ±„ ±ˆ ±+|¢…'„N ±+‡U¢™K„NY (±„s±„^±…±^±„ ±„7±ƒ\±‚Q±‡/ ,±_±‹J±Œ ±…±ˆB±@±…f±=±Šs±ŠV±›S±ˆ:¤ ˆ8 ¤ ’/8±b#±ŒS¤‚EA[±’x ±h¤†kA[±ªC ±‰m ±£/±-±„B±…±ˆ[²u𠱡B±v±Ž±“r²›`ð²+ ` ²+†b` A. ±.‚^u 8±‚o©Œ~8'±„±ƒ±„D±‹±†±…@±‹2±ŠF±†?± 8±˜©¦$8'±"±†N±0±™r±±‹±¥±ŸJ±V±ƒ/?\«ˆFƒ2R ‚K£‚OI'±‚G±Š±%R±…t±L±†V±}±_ †y/‚h  ‚{ ±„6£„W‹ S ^«Yƒ2R ‚K£ˆ[I'±ŠK±¡N±„W±ƒ±Ž`±ˆ8±G±±–c œ,/‚h  ‚{ ±”\£˜{‹ S±…c±F ±‹o±…l)«(‡3‚](ƒM$ƒ «(œf‚](ƒM$ƒ ±/†w ±/›8 V±Œ±„D±†~±†   W/#4#0"!#. Xcv §†ttT… ƒ X¤‡£’H±…;¨†ƒO2„m  ±#‘/ W±0±x±ŽD±ŽJ ˆ^ W/#4#0"!#. Xcv § _tT… ƒ X¤ £§{±‹¨–<ƒO2„m  ±" ±"…F ¢‚4@±‚a ¢“I@±x(±ˆ"± „B²Ap²hÐ ±–|± ²¥tp²ˆmÐY*±…O±„y¢P„¦p 8!¢+ƒ±"±ƒ±ˆ; *±‹[±ŒD¢Š<„¦†( 8!¢†ƒ±‡*±‰t±‘3¨‹;M…k±„²…%@ ¨£M…k±ˆ@²“@G ´ ¼³‚L+³ ƒR+¬G ‚+‰F ‡! "´ ˆ¼³…~+³ ŠC+¬š2 ‚+‰F ‡! ±"ƒ ±"‡@ ±*‹C ±*›i ±*ŠP ±*šv ±(’q ±(¨$ ±%‰ ±%”¢‰F ¢žY¢‰0+ ¢žC+ ±…^ ±’¢#„^ ¢#Œq^²%‡\ ²%’e+±ƒr±†n±‡T± †Q ±‹8±c±‰Z±–.± ŽC ±(‘ ±(¦Q¢ ˆ \ ¢ ’3\ A¤…^HŠ4‚y±„± „%±=±h±„T£3‚yc±‚;±… ¢‡g‚%¤ŒH‚G,b±$ F¤šqHŠ4‚y±•#± ‰±±…,±ˆT±Š\£‡Q‚yc±…x±¢œk‚%¤¡{‚G,±‚±¤H¥ . ƒ ¥ ŠW ƒ±J± ˆ ±Š± ŸX±„±q ±‰$±Œ!£'‚#‚¢‚)‚i £'¥‚#‚¢Š.‚i#¢'‚$¤‚.‚uz ¢'¥‚$¤Š3‚uz‡(&ƒ6©kz‚* ‚dƒ Š ¢I~¨ S‚ -’5J¦}' ‚­K h ƒv<‚L†"«>rYMIw©>%@:  G  ]S{) % 2\ƒGN ¦!Ul¦ x* „E¦9 ‚¥,„] C  0ƒ N„a ±†²Шl E‰h£ Tªx‚'nJ¨*nC%¢n¥0Os#«‚1 "y‚-,ƒ c¦)'i+§N) ƒ#)?¥Y eu±ƒ7¤ #†(¤-ƒ*§*W2X!ED 2;*? /%   6|HW z B‚0 nk&ƒPJU!‚4¤+‡±‡L£v‹:©,6ƒQ‚[ƒ[ B/ub±³l˱” ±‘"±˜m±„Q±”Y±–:±‹ ƒQ©•~z‚* ‚dƒ Š ¢…P~¨™D S‚ -’5J¦Š' ‚­‘` h ƒv<‚L†"«†JrYMIw©ˆ\>%@: Œ>G  ]S{) % 2\ƒGN ¦‚3!Ul¦Š5x* „E¦„_ ‚¥‰,„] ‹(C  0ƒ N„a ±W²ƒyШ˜7 E‰h£ƒQ TªˆC‚'nJ¨„nC%¢… ¥‚lOs#«‘ "y‚-,ƒ c¦‡'i+§†") ƒ#)?¥†a eu±Š(¤‡>#†(¤„bƒ*§ˆW2X!ED 2™~;*? /%   6|HW z B‚0 nk&ƒPJU!‚4¤Œ%+‡±>£–z‹:©•_6ƒQ‚[ƒ[ …OB/ub±‘*³ˆq˱¨0±'±‹J ±'¤± } £Š+dS±“ £–_dS±¬m A& ±&ˆ3¥(‘2r ¥(¦62r ±&†# ±&Ž ± S ± ˆq„ ‚¢‡6ˆ9³8( 2 o… ±„b£†w‚£ˆD ‚ ¢‚/†g² …4À£,‚)²…5À® " S ¦…nG’ 4$©„G‚9‚0  ±†[¯‡="Nƒe( ‚¬STh WŠd7t£s­„ :W. :*h‚ Ey‚)1.=R$ ‚¢œIˆ9³¦^( ’G o… ±-£“+‚£’.D  ¢™z†g² Œ À£‡4‚)²Œ&À®„K " S ¦ŸYG’ 4$©P‚9‚0  ±ŽM¯œA"Nƒe( ‚¬–Th WŠd7t£†L­Œ :W. •^*h‚ Ey‚)1.=R$6²‡tP±„f¢†’{´Z±‰ ²™ P±1¢Ÿl’{´†3±Be0±Ž(¢5\±‡z±„j¤ˆ8±†H­ …†;ƒB‚? 0±£;¢¦[\±™±5¤’18± 3­ ™(†;ƒB‚? ±„n¢ˆ  ±9¢’2ƒ/>±•±…±™#±‰±‘±† ¢„rƒV±Œ1±‚ ±Š&±„#±ˆ±‹±„\q±‡C±‚[±—H±ƒ/±‡H±ƒl±ƒ±‚9±ˆi±„5±ŽW±†i±…Q±†±†n±„±‡±ƒ:±„2±ˆR±™h¢‡Uƒ1±‡o±•±•0±…D±#±…V±‡±ˆ±‚±”! @±ª#±Š ±²I±’9±¢'±Œ¢=ƒV±˜e±„C±”O±ˆI±±–+±‰;±e± ±…9±¯±†a±±‡[±†;±„u±‘U±ˆm±1±U±‹%±Œ ±_±ˆ/±Ž9±†w±ˆg±‘'±³S¢’^ƒ1±a±ª±ªc±‹ ± I±‹/±Ž+±±„7±¨Ea.¢Ž*¤#†E± ˆ7¢‹_­m^ƒ/P³‹j‹ .¢£=¤}†E± “@¢ c­–Rm^ƒ/P³œ‹j2±‰ £„#=¢ˆ \±„£\‚C¢J¬„]†6Z‚,!.-= 3±’)£Œa#=¢’5\±£†5‚C¢ƒg¬™†6Z‚,!.-=)R£„!ƒt±†M±ƒ+£„W3±U±ˆ ²P²nP±‚±±‚±± ‚0¥„$)„±.±‹W¢‹D†( R£™4ƒt±—b±‰7£"3±Ž ±’6²ƒoP²™9P±‰c±… ±…-±ƒA± ‹¥ž)„±¢2±¡ ¢Ÿh†(£„S3 £3@/‡B ! ‚eQDg;)At> J32qfG' § iR p ,dcSvii ƒ01„"" IP  y¯„ DL1Ol4:5 ‚‚R1-/rN@ rny*wcQ«rKI‚ 5  "X(BQ 9DO&«Yx-Y^jE<%^ª Hj    1 6  'UhR-ZcP¤x‚..E©‚&bo0 +  ‚ .mfk ~M=¢‚‚J£, 1ª[e-"2O¤[Q# MScF‚@Da=%S‚D-ƒ#45oO .JZ$( ¦~!(2«w)|cK3 £+cT¦m)%-£ &| w 6FJ ‚\_() ]© R;Gj8 a,W1# .?>‚ 6  ‚d ! G '"fM2`~¬# kI 89¬ s 0‚ <­S).5; 'EXO¦p[ §kcIsK5¢ƒ©6Fx-%> cO*,++D‚  B7C; 6‚GI2F   bH+z'DG( fJ$@(_2e".%""u ‚C=«2l‚=Ln‚¯,< Q1ƒ;+ #@dRTt- ('E‚WlE ? <2 K2 W ! T? *xxu6%E))HEl0"8 IJM§j<;q   ] #"zcDC‚F"FI&O¤,‚ƒ ®#EH.d.   J 3 B7 ¤(U  '5‚)GB%*ID =F=` :6'` ), 9-(] ±ª+±Š±„L±ªk± S ‡a !•‚eQDg;)At> J32qfG' §…iR p ,š cSvii ƒ01„"" IP  y¯1 DL1Ol4:5 ‘3‚‚R1-/rN@ rny*wcQ«‡~KI‚ 5  ‰mX(BQ 9DO&«Ž x-Y^jE<%^ª‚.Hj    ŠZ 6  'UhR-ZcP¤…‚..E©Š*bo0 ‹B  ‚ .mfk ~M=¢†g‚J£ 1ªˆM[e-"2O¤ƒ9Q# ˜ScF‚@Da=%S‚D-ƒ#45oO .JZ$( ¦„0!(2«‰B)|cK3 £…cT¦… )%-£ƒI&| ‰c 6FJ ‚\_() ]©…D R;Gj8 ;,W1# .?>‚ 6  ‚d ‡ G '"fM2`~¬†w kI 89¬‡" s 0‚ <­‡D).5; 'EXO¦… [ §‰ cIsK5¢ƒPƒ©„kFx-%> ‰8O*,++D‚  B7C; 6œGI2F   bH+z'DG( fJ$@(_2e".%""u ‚C=«‹ 2l‚=Ln‚¯ˆ ,< Q1ƒ;+ #•@dRTt- ('E‚WlE ? <2 K2 W !•<T? *xxu6%E))HEl0"8 IJM§…[j<;q  1 ] #"zcDC‚F"FI&O¤…n,‚ƒ ®‡,#EH.d.  ˆ J 3 B7 ¤‚EU  '”;5‚)GB%*ID =F=` :6'` ), 9-(]#£„O3¥ˆ8 £3¥’98!£„K 3¤ˆ= £ 3¤’:=/§‡[‚#x"C-±‚p¢ƒw< §”‚#x"C-±œ[¢‰P< ±%ƒu ±%Ž~‚ ±‚¥ƒVc(3±Œ¢ ‡6‚#¢ ƒG!¦ /¢ŠB±†]§ˆ1h'…Z…¢ 7¨q¥„ ƒ¶G )>‚ ^„v[   B‚,&'.v ±ˆ¥Œ!c(3±˜O¢ Ÿ‚#¢ ‰O!¦„O /¢•K±ŽO§5h'…Z…¢¤<7¨†J¥Œ ƒ¶ƒd )•b‚ ^„v[   B‚,&'.v!¤„C03x¢ˆh ¤03x¢’=hK#¯„E"?‚ILL \‰ i9¢„?8±ˆ±†$ #¯k"?‚ILL \‰ i9¢ 8±’>±Ž+£ †y%j¢#… .¢ˆK‰" £ ‘"%j¢#.¢œo‰"=± ˆ¤ƒ)ª!a†jƒ)†M ± ’H¤‡v)ª!–†jƒ)†M ± ˆ> ± ’g ²Œ0¢ˆ?U ²˜P0¢’hU ±%ƒo ±%Žx-¢‡I¤‡P‚#}.¢#ƒo< ¢˜#I¤”‚#}.¢#‰H<¢‰9# ¢žL#¢‰%5 ¢ž85 ±…@ ± g-²2 ±ƒ£ iƒ¤J‰E&£ ”;X`±‚~¤† Œ=±‚* ±‘ /² G ±‰£ˆUiƒ¤Œ~‰E&£ ¬X`±‡3¤  Œ=±‡q¢$†+ ¢$ #¢‚:± „S£…d ¢ˆF± œ£ŸO±„n±† ±œ9± Q&±„[¤ :„~¥‚W´„«p§„^„0C &±&¤ ¤>„~¥—FW´Œ «p§™„0C ±†@ ± Ib³„.W¤†N9±‚j¥V„ &I¢‚[³W¤{…8²‚ ² ²‚ ² ¤ƒw!#¤ ‚1 ®„) .„ G ˆ/ b³™AW¤—c9±ˆv¥Ž „ &I¢‹,‚[³ƒ|W¤™F…8²‰e ²… ²…/ ²ƒC ¤‘rw!#¤ ‹ ®ž .„ G ˆ/ ±…A ±Ž ±/‰! ±/E ²Œ0±$„u ²˜Q0±$Œ ±…E ±Ž ±‰2 ±šG+¢‡I£‡E‚#¢#ƒe< ¢˜)I£“y‚#¢#‰>< ±„8 ±œ7¢‚d#± …p±„¥ ‚7}T ¢#± ;±’\¥ ¦q‚7}T ±‡9 ±œL ¦ˆ# ¦Ÿj# ±… ±œ]'±‚q± ‡D±”H¢ 7 ±ˆ}± Ÿ±©L¢¤>7 ±…I ±Ž ±$‹{ ±$¥f ±Œ! ±˜U ¦/ƒM‹6ym ¦/—q‹6ym +¢‡I£‡:‚#¢#ƒY< ¢˜/I£“n‚#¢#‰2<;«Š-"i ‚7¢‚Y¢$ƒ‹= «›B"i ‚7¢ˆY¢$“=‹=S'®„^ H‚BXxXh‚4&'¤"‰I ¢ 7£6‘ '®ž H‚BXxXh‚4&'¤"”R ¢¤?7£•Z‘+¢‡ I£‡/‚# ¢#ƒM< ¢˜5I£“c‚# ¢#‰&< ¥*‚X(‚‚P† ¥*’~(‚‚P† ±…Z ±% ¢+‚hC¢„_ ¢+ˆAC¢™ ± ƒS ± |u 8±„>±†P±X± .±‚ £‚(¢$¢‚4£ 5± ‚3£„.„J 8±™Q±—e±Ž ± „ ±™V£‰i(¢…¢…34£ƒG5± ‹£ž„J D" ±"„y'¢‡&I¢‡$‚#¢#ƒE< ¢˜;I¢“X‚#¢#‰<„#‚²¦3…P~¤!¯H‡L‚*U{V …pWZL²©‚BOx §U$§m!¦}!¦‚/¤ƒ_ 4ƒwu …           ­>E kD :    ;@   ‚   )A x ‚f ­‚ ' 2p‚!.¤>‚F§=c‚U2 ‚²¦‡V3…P~¤‚o!¯—[H‡L‚*U{V …pWZL²ƒD©‡^‚BOx §„U$§ƒ2m!¦‚O}!¦ˆ~‚/¤„Kƒ_ 4‘owu …           ­†|>E kD : …f   ;@   ‚ †  )A x ‚f ­ˆs ' 2p‚!.¤„)>‚F§‡,=c‚U2 ±G ±‡S£/†v  £/› ¢  ¢†,/¢‡,I±†R¢‡‚#¢#ƒ?> ¢˜AI±¢“M‚#¢#‰> ±ƒE± †>±c ±y± Ž ±§N£‰)„4 £š>„4 £$FF£„"(< £†0FF£‰v(<¢ƒ+ ¢‡{+¢/’G ¢/¦k9¢‡‚#± ƒ±`´ ‹r# ¢ƒ;A ¢“B‚#± ŠP±ŠL´ ¥]# ¢‰A ±‚Y ±‡8 ±+²„*` ±+†g²˜N` ±$‹u ±$¥` ±(g ±(£ ±%„Y ±%b ¢‡‚#¢#ƒ5C ¢“7‚#¢#‰C1±‘A±‡ ± …\±… ¢†- ±¦T±ŽS± ‹d±Œ#¢šQ ±‰& ±š; ± ‡8 ± < ±%†w ±%’ ±‰/ ±šD¢‹T‚q ¢£‚q¤ …E ¤ E §/oT [a,, §/•T [a,,  ± Š>  ± Š? ±)‚= ±)ˆ £„v ± b £š  ± Œ  ± Š@ ±†T ±@±c ±¨.±…Z¤( + ¤(¤8 + ¢(7 ¢(¤973±‘ § †E£ „'‚ ±¦ §u †E£ Œ|‚ ±‹I ± \JT²‰ ±ˆI±a±Œ,±‚O¢„`¢‚±£WR¢@…b¢‚#2¢ƒ¥Wc‚M2±‡M±“<¢„ ±‰p ±±†A±‘[±‹+±ˆ5 [²¢< ±‘g±Œ ±£w±†¢‡S„`¢ƒ'‚±ƒR£ˆtWR¢…b±…\¢‰2¢„!ƒ¥ˆuc‚M2±œQ±¨o¢‰P±ž § „s-,5u § Œw-,5u ¦ ˆ8 ¦ ’78²… ²} ¢†*e±„:% ¢Žue±C±…lA±‹{±„y±ƒw¢ ~‚x9±ŽD¢*Œ ±¡±–±¢ ‰j‚x±±žj¢”NŒ-¤'mt:-±‚¤ƒ" ¤'¤qt:-±‡m¤‹"W) H r%/5ULN[ƒC3#ƒ¢ ‚A#±!Š ) š'H r%/5ULN[ƒC3#ƒ¢ ‡ #±!ž( ¢'„B+¢Šs¨&sAj‚$"CWªwB'L#ƒ1­&…_„`m0D„z gX ‚m k-/g=/f0m ƒRQ£‚?M ©{‚}^F D‡$W±„¥@Jb‚?¤g„‚±@ f&)?C…|„\(:},` ±‘*±„J± ±‡b±†E±„ ƒx®–[7 "c‚‚L/‚ ƒ'd³…Y5£ž‰k‰{¢‹i§—;~Eƒ[¤ŠW! ¦ˆdR‚;‚tfªŒe1f:A^‚9A¥‚,H £ŠMt‚¤…5 0¤‰,dW{¥ŒP„3„S±†.±„+ ˜5‚%ƒ @"$$ 438L‚xd¥ƒz ' ¦‡T‚ {tI§ƒx!f(±ƒ+±‚H¤‰-hƒF‚?¢„xB­pP 4==8‚?i*&±‰y±ˆ.¨ˆ& ek¤‡ %¤„L‚£‡Eƒ ¢…I±„Q¢‹1C šU+5aF vVM;oQnh‚)>s¨‹/sAj‚$"CWªˆiB'L#ƒ1­•*…_„`m0D„z –X ‚m k-/g=/f0m ƒRQ£ˆM ©‘!‚}^F D‡$W±‰m¥‡WJb‚?¤ˆl„‚±ƒ] – &)?C…|„\(:},`ˆ"*„ A‚Kau] a36‚t‚z ‚ U;¥o‚W7®]hs ‚a„ …pƒ+„¢R„k®#Jƒh4 J‚df‚Y¢@‚&¢jw¤0‚p‡5£l…1x¨b5r¢@ƒY©&„B"%m‚ £.z±‚ KY p,(‚sH!=196 * J9¤d|9²0p£hw£ƒY‚‚|¤u%‚¨‚l iq/ o‚o¤pw¤Q‚|9¨\Q)¢E'¦I2Q"¥FƒE‚09±3¥ ¤„LR ` „J…=Ew6,4P$Jc2! *‚a-ªƒkBOIX"):±‚U x!4 ‚L' }/Bj)R(*)R,hq9T (Jq[bƒ)=ƒ3\ƒ ‚5]ngª^„)*F‚ƒ9:¥{Z=¤M@j‚v¦‚>‚ W¢g xb]\&‚4? .}1o ‚ 6‚ „ –"A‚Kau] a36‚t‚z ‚ U;¥…v‚W7®›hs ‚a„ …pƒ+„¢‰p„k®‘8Jƒh4 J‚df‚Y¢‡L‚&¢‰5w¤Œd‚p‡5£‹…1x¨…?b5r¢ˆDƒY©‹=„B"%m‚ £ˆX.z±„z ™Y p,(‚sH!=196 * J9¤ˆ/|9²„p£„w£ŒE‚‚|¤†-%‚¨‘F iq/ o‚o¤ˆ\w¤†%‚|9¨†dQ)¢ˆ6'¦„b2Q"¥‡dƒE‚09±„p¥…; ¤!R ` š„J…=Ew6,4P$Jc2! *‚a-ªŽtBOIX"):±ŠG –|!4 ‚L' }/Bj)R(*)R,hq9T •[Jq[bƒ)=ƒ3\ƒ ‚5]n±†.ª‘„)*F‚ƒ9:¥†TZ=¤‡d@j‚v¦ŠC‚ W¢ƒ –b]\&‚4? .}1o ‚ 6‚‚e,¦‚g…]‡r)&o±ƒ<£‘U„ ¢†q±Ž@¤ƒ3A‚c±²‡8 ±ˆ)±`¤‡xBP±#±…+N±‚9±1±‚7¢ˆ&w£{('±9¥EX‚6;¢ ‚!£w„lr£‚M`”K±’s£‡a,"¢…¯T53(C†U ‚7FT‚m 2¦—z…]‡r)&o±ˆC£ª{„ ¢$q±ŸU¤gA‚c±ƒ<²‘a ±“@±†?¤žgxBP±„U±Œv±„=±…X±ƒm±‹#¢—w£‡g('±…R¥ˆcX‚6;¢…B‚!£‰L„lr£œ8`”K±§w£,±…i¢¯•x53(C†U ‚7FT‚m ±‰o ±Ÿ ±‰i ±ž|ŒC-† $`8(zW"dI  ‚D3,‚caTa50£0<3 6 eFAH‚n@jƒmq#30< 8 -( ®‚),A aP  q 5YZ5K‚Nl‚41h ? "IC¢ƒzP¤ƒ%h0¬EX#MEI‚‚¥m*@«‚-.6n‚#£vA¦‚U ƒ 8  Du\qT‚ sNA¢7‚z¨#+> „2£_!` %[-Fu‚9-Y4 ‚^,2V !5 A( @¤%] ª.BV[ L"¥‚I2 £AAi³d›®.$ y$ \+0‚.¥.I"y2 w‚&W 4, H!>,a¬J8)'->‚"¦heo=*ªop;(9X ©7j‚mC¥eH D« !$5¥0 jR§+ . N\XsJ=(F= c$3 /B9‚N+=‚$ y.%"8 [H7<$cO&Z7"  M YKj(jR'1y1‚ CJ¬+K`1*+i‚$+/  o„*/ ;~B )D04F 07; 1‚  |‚@4/0„?h(%& 38ƒ!3E;­\#!".B… r:\£N¨$ &1‚k6§‚M‚8C£3Z w '1,p`y>Xt‚"]te! †+ $•s8(zW"dI  ‚D3,‚caTa50£†7<3 š\ eFAH‚n@jƒmq#30< 8 -( ®‹G,A aP ’ q 5YZ5K‚Nl‚41h ? "IC¢ŠP¤‹c%h0¬yX#MEI‚‚¥ƒ*@«ŒF-.6n‚#£…A¦ŠY ƒ 8  Œ[u\qT‚ sNA¢†‚z¨‡i+> „2£ƒ=!` %˜&-Fu‚9-Y4 ‚^,2V !5 A( @¤ƒW] ªˆyBV[ L"¥† I2 £„`Ai³„ ›®‰$ y$ \+0‚.¥„fI"y2 Q‚&W 4, H!>,a¬‡68)'->‚"¦†<eo=*ª†wp;(9X ©‡(j‚mC¥„~H D«ˆ+!$5¥ƒm jR§„G+ . ˆgN\XsJ=(F= c$3 /›-9‚N+=‚$ y.%"8 [H7<$cO&Z7"  M ‹bKj(jR'1y1‚ CJ¬ˆK`1*+i‚$+/  –o„*/ ;~B )D04F 07; 1‚  –/‚@4/0„?h(%& 38ƒ!3E;­‘#!".B… r:\£…xN¨‡; &1‚k6§Š M‚8C£‚PZ • '1,p`y>Xt‚"]te! 7 ± Š` ±‚ ±Œ±“q ±“!±š_±¨¤6 ¤‰66V±‚s ±„E±œ^ ±„=±-±‚ ±™P±„ ±™U‡B-ƒQ¯t‚Q>% W‚&†[A£„¨Hp3Oƒ _u¨_* ?(ƒ'¦„m'-‚‚Q5¥sS‚ L¤)‚=‚Y¥)‚ZAƒ‚i¤XLN¢ƒ¦‚*;¦3b D‚p¦4?ƒk‚‚!¢|‚7¦4‚G<±b­‚O„! uƒlƒp";‚"±3§7%)+‚UC¢eV£;%:¥5"]@a¢Y9¨O ‚ „S¥„_£[ƒ4'¤ƒ%4¢0¦1B‚6V¢,‚D¦$"d|¨ H‚,&7¬ ‡i‚4BZ„ƒ9ƒ9«,); ‚yt8<e£‡ $ [-K‚1 KS"P0.+†995\­ƒ{ƒJ‚,~(„im£ ‚,¦bƒ‡7E)‚¢‚Y(£aƒr§]‚6o*+t£JN¨'s…T‚Gƒ ƒj¯–‚Q>% W‚&†[A£‰¨šnp3Oƒ _u¨Š}* ?(ƒ'¦–'-‚‚Q5¥†S‚ L¤ˆt‚=‚Y¥]‚ZAƒ‚i¤‚{LN¢8¦†P;¦‰7b D‚p¦ŒK?ƒk‚‚!¢†[‚7¦‡e4‚G<±„@­š„! uƒlƒp";‚"±„e§ˆ%)+‚UC¢„TV£ƒZ%±‚v¥‰!"]@a¢…9¨) ‚ „S¥‹ _£†/ƒ4'¤Š4¢„I¦‡OB‚6V¢ƒi‚D¦„Y"d|¨ˆuH‚,&7¬š ‡i‚4BZ„ƒ9ƒ9«‹5); ‚yt8<e£Žu $ •_-K‚1 KS"P0.+†995\­™.ƒJ‚,~(„im£†g‚,¦‘ƒ‡7E)‚¢ˆ2(£‡3aƒr§‰ ]‚6o*+t£‚gN¨•+'s…T‚Gƒ ±‘±0² ‡>à ±¦#± ² à‚ ¢Š‡±˜X¢ŒOM±ƒ¢ `¥‚o1±Œa2¢‚†±ƒ)§ˆO'2±ƒ4±^¥‚R‚)‚(#±¢x…£‡.ƒz¢HŠ]±ƒ"¤†y‚L, ¢( z±“% ¢Ÿ,‡±±~¢dM±‡(¢‰`¥Š51±¤,±ƒd¢Š}†±‡a§—)'2±‰<±ˆO¥œ=‚)‚(#±Œ¢ˆj…£œ2ƒz¢–{Š]±ˆi¤—‚L, ¢† ±ƒ±§I ±$“ ±$¬p)±„9¢ …ƒ^±)±‚ ±™L¢ -ƒ^±„±™Q£%ƒm#†\ £%Žv#†\>±‚u£„vL£ƒtL¨X  ‚R@I ±Œ£– L£ L¨ˆ  ‚R@I >±„±ƒa¢lƒ±…,±‚d¥  ±±e±ŒC£‡„) £I‚=g¢ ‚% ±‰F C±™+±Œ¢‰7ƒ±‘;±‚O±Šh¥„l ±ƒf±™0±›£œM„) £†‚=g¢‘0‚%+R¥…fŒ!\ƒx±…U±N¢‘;h±ƒU±‚"£‰£!ƒ:‚±…!¤‚P‰U‡ ¢Š б^¢‰…U±†*_ T¥Ÿ Œ!\ƒx±Žs±‹w¢©h±‡D±„^£—]£ˆ?ƒ:‚±v¤œ;‰U‡ ¢Ÿ б£¢™8…U±A±‚|  ±‰:¢ …ƒ^ ¢ /ƒ^ >£…*§0‚]Š831±ƒ.¨; 86R]P¢–V@¢†&’'±‰±†e¤ƒ ‚Bˆm >£š*§’E‚]Š831±ŽE¨‰ 86R]P¢®!@¢ ’'±”±›i¤“6 ‚Bˆmu8§1‚]Š832±ƒ/¨= 84T]P¢–XA¢†9’±‰±†f¤ƒ ‚Bˆm 8§’F‚]Š832±ŽF¨‰ 84T]P¢®#A¢ $’±”!±›j¤“7 ‚Bˆm¢‘ ¢ª'£g/ £ª / ¢`ƒ&³”c| ¢†4ƒ&³®N|Kc (‹:  T*  …; ±„«…$ j ©ƒ T @  ‚%   c (£  T*  …; ±ˆF«“~ j ©‡, ˆr @  ‚%  ¢Œc> ¢¦ >¢ ˆh ¢ ’;h < ±Œp ±„ ±• ±&ƒ ±&Š| ±(, ±(¥_7±’¢‚g± ‚A±±f±‡ ±«5¢‹2± —E± <±‡?±±(•2 ( ±(ªe ±ƒy ±Œe%±„±±l±‚6 ±™2±ƒm±™7±‰Tm 2¥ $9¢4e¢‚0#±‚ ¤‡,‡±†-£„‚M±†w± „7  2¥{ $9¢„fe¢†#±„\¤–‡±£Š‚M±Ž± ‰~±„@±)Œ" ±ŠL±) F ²†Aà± ‹ ²-à± ¤n¢ I? ¢ Šr? ± ‚ ± Œ3 ± ‚o ±  ±„,±±y ±™?±ƒz±™Dq6±‚U­‚?…a 0( +'²…°± ‚±/¢–J¦‡7KK„_¢“. 6±“j­V…a 0( +'²Œg°± †0±„l¢°5¦œ;KK„_¢§C.Š--… Le1ƒu‚:C#" p 191}‚;*£r9E %Y,/wm /1$$bB‚&+ƒnR„7M!¨,y@ ‚q rƒr 3'‚ zo6G=‚?f¥Q%'.©$-.';ªDR-r¤3nsƒF¤U9$+ªDZ&!2F‚;­ ‚Q 3}O‚;b¢jƒ7£!«e$/!„'I ¤E6 ƒ;)($.!K‰?.*5J/ªgQ58(  *6B%1)Q.Jj 2ªHk8#&1(§/?C$Q1¤9'(¥aH`±ƒN¨ƒƒ67t X! _p +KU©A_+.R!­ k?P!3K«WI‚) 4¨f (%!I®6XXE&:]I6 4@¤l M ±ƒeªJW-D‚ry.  ‚4‚[Q> ‚1+]k8& k‚N= *¤ƒ?„, ‚h¦>5F(«…V„G@:,„i{FM¯)ƒ9 n‚tB 9HL ‚%‚+xz.$Z);H¢8+:¦^R‚%d¢E<©‚iƒ5.ƒ(„ `yb: … •_e1ƒu‚:C#" p 191}‚;*£†y9E %™,/wm /1$$bB‚&+ƒnR„7M!¨ŠJy@ ‚q ’ƒr 3'‚ zo6G=‚?f¥†]%'.©‰Z$-.';ª4DR-r¤‹\nsƒF¤„{9$+ª‰HZ&!2F‚;­Œ$‚Q 3}O‚;b¢…Iƒ7£«ˆ+$/!„'I ¤ƒ#6 ›)($.!K‰?.*5J/ª„Q58(  ‡u6B%1)Q.Jj 2ª„7k8#&1(§ƒN?C$Q1¤ƒu'(¥ŠMH`±ˆ¨‘sƒ67t ‡D! _p +KU©†iA_+.R!­‡k?P!3K«‡HI‚) 4¨„ (%!I®ˆTXXE&:]I6 4@¤…) M ±ˆª‰W-D‚ry.  œ‚[Q> ‚1+]k8& k‚N= *¤ŽH„, ‚h¦‰05F(«šZ„G@:,„i{FM¯•\ƒ9 n‚tB 9HL ’6%‚+xz.$Z);H¢‡+±‡Q¦ˆcR‚%d¢‚b<©— ƒ5.ƒ(„ `yb:‘T.ˆL 3g3 DW+ #PF $($@ 9B`Ch C=§`#C!.  7 L" | CY" T‚?L„%  & T ,Ep u C6a  V;*)5:QB= 5' }   3 :y‚[ BG)0ƒf;?4!'}‚2    * A{B\ 7­8tVE>?‚4e©‚Si l\*^O±+   @6#63=c'& *-4 ®w +    Y g[k‚@4W K*xBH$@4HU"70   $ ¦"1>§RLm¤A'  6VP*J‚L3OKO$D * J(@` fR -I9.<O§!I5<6(¬L#l%@!zV A¦‚4+ ¤P$¢e =02`7$gK)H%§R,&<3 &8 ([}¥r!S*ª O6 h ¦]rA+W6§ F) «$fIO= )©CL #G¬v)kdA FK",)%%!=(ƒ' ,r !0-6-92!‚A@+25L8 {NwW8L`=i'   8X<‚:   9$ >,‚,4 1xA "  &" * 0a^ `(P3="Nk+  12JF$cV X kx'^dY2 ' , (,d+h,¬` { #' ) !‚On?‚4e©i l\*^O±ƒN ŠH  @6#63=c'& *-4 ®….w +    ˆ] g[k‚@4W Œb*xBH$@4HU"70   $ ¦…1>§‰Lm¤„'  6˜!P*J‚L3OKO$D * J(@` fR -I9.<O§ƒSI5<6(¬ˆ#l%@!zV A¦†#+ ¤ƒo$¢„! Š)02`7$gK)H%§… ,&<3 8 ([}¥†gr!S*ª‡O6 h ¦ˆNrA+W6§… F) «ˆ!$fIO= )©„L #G¬…+)kdA ‰K",)%%!=(ƒ' ,›] !0-6-92!‚A@+25L8 {NwW8L`=i'  ‹8X<‚:   9–( >,‚,4 1xA "  &" * 0a^ `(P3="Nk+  1•eJF$cV X kx'^dY2 ' , (,d+h,¬…b` { #' ) !E‚On *1 ? ,h=I P B6)mA5 U6]ª9#N  5? ( +1 %a¬-  = %X¬9= ) t ¤5 ; %=<'(‚< D®%+ &ZOC b,u ƒbN'#Q&V#[ !R")$     ] $ `,V)8 @ f % 3&T L& )W I?>8*#  I'¬M 2 c-­J "$Y%$47©I'&,I ¦Y@  (/1JW:,F $(! .:  FW$3U /dB9 ',  )E> \ eD]B)Z,(; +4 ']  )=" 1‚OI` !5;;      =j L ƒ  /= 5 I 5‚sY %RB ~"~$ 0b  p  "6?‚%,!V¤ .# MuD} )) $ - 167iB CD[9#!ªF?K = ;7$/ -#‚ < 'Vs E c%6b§; ( =‚/C% IhR u S ?@Fa IVM,%2)D : #=n:N ŠU ;•b_$Se#   oa / % h$98 ‚@6`) T/Q? <a¯† %3 #  <š,(! $B 09 S+Vƒ} =&{%$d:z* %$#&#  Š/ BAG‚\ '’ DIC)iKu`v+ ?5)  %%QM †_  ('YjL J ‰K   9 )1M| ŒjL/ ,Q4, DS*~¥ƒ $¬‹^h  ‚#A[-©„}+- I ®‰+L.88 ƒ- Œ&&6. I"7$‚ *1 ? ,h=I P B6)mA5 U6]ªƒk#N  ˆ? ( +1 %a¬„  = %X¬ƒX= ) t ¤‚q ; ‰=<'(‚< D®„]+ &ZOC <,u ƒbN'#Q&V#[ !‡>")$     †1 $ `,V)8 @ †n % 3&T L& )W ‡:?>8*#  I'¬„f 2 c-­‡h "$Y%$47©„'&,I ¦„PY@  (‰1JW:,F $(! .:  FšB$3U /dB9 ',  )E> \ eD]B)Z,(; +4 ']  )‹F" 1‚OI` !5;;      ˆ/j L ƒ  /•A 5 I 5˜&Y %RB ~"~$ 0b  p  "6?‚%,!V¤…V .‘I MuD} )) $ - 167iB CD[9#!ª‡?K ‡T ;7$/ -#‚ < ˆ,Vs E c%6b§‚X ( =–+/C% IhR u S ?@Fa IVM,%2)D : #=n:N†d'ƒ)®rl‚|\‚‚n!‚v_v8 ¬ƒm-‚_ƒp‡3H ,3‚[²†p¥†k„~RIƒY±*£‚VQ7¢‚=„£E±¥n„ck£l…  L…)v0R‚T@ #B‚L¨#g#©@d‚6t% £N1±?§h6„#%¢¦‚ B† oª ?+#|e£‚ ]l§‚ cu* ¤{`±6¦$ƒ]¥GU;£wWFª‚`DkOSR®‚]‚;[ƒq‚hb.ƒ8ƒ`8]¦`„Ku M£B…t¨†thO&ƒpf¥ƒA_†…2*©‚,?„ eI‚‚(¤‚v¥b;e:£‚ W‚ ± ‚K^PW$U N^1†U ƒ4®–l‚|\‚‚n!‚v_v8 ¬-‚_ƒp‡3H ,3‚[²7p¥˜„~RIƒY±‰u£ Q7¢Œf„£…±ˆ> @±‘J¢„G'±r£ TŽLˆ±ƒ ¢‡1±ƒu±„±…d±‡%±‘¢ …¢‹`F F±¦]¢‰N'±Ž&£ ˜ŽLˆ±Šk¢±‡±„D±ŒJ±žj±m±±¦P¢‡#…¢ F >¬ˆ Lwˆ{N£ ¢± ¢ƒ&ƒ¤n=[¤[c‚U2±†:7 A¬ŸN Lwˆ{N£ˆd ¢„.±ƒ\¢’ƒ¤…=[¤ˆyc‚U2±±]%±]±„±…k± ’ ±7±ˆK±t± ¦1´‹U ´¤{¢4\ ¢¦Z\‚s1¥H+‡ ¤‚$I …k±†D±ˆ}±… ±oF¢q$±‰a£kY‚±‡±‚'±V±M£ƒfx‚/±ƒK¢‰F*£k‚e=¤K‚D/¦†aOz…3ƒUƒ>±ˆQ±ƒ¥‡FƒZ†>{+¦ƒ‚R†J‚ ƒ,L¦3…4<¤(ID£†N4£ƒjŽ6 ;¥•[+‡ ¤›JI …k±b±š±‹,±Š:±‚i¢‰u$±”x£…JY‚±Ž[±…±‰!±„l£ŒRx‚/±ˆ¢˜ *£†?‚e=¤‰ ‚D/¦ LOz…3ƒUƒ>±“Z±‹ ¥œJƒZ†>{+¦˜7‚R†J‚ ƒ,L¦Y…4<¤‡?ID£Ž N±‚Q£˜Ž6 ±ƒJ ±‰RYf\±‚X±†&±K±†G¤PJ„|c± „m±U¢C5 &3]{ Q}Khz2‚<"#R,8 q‚H #;OJ 5 $!? 8  "A[ *,2 i<: \ K?W3/'4E‚o. ¦e AM  ++9. OMR‚<¦zyU(:r­‚ =$[]4yQ. Y_Nm 9 eD‚(¦$fL‚-6j­= A keEZa*®9 07 (%  Lx UI - .\! ^IL  6h   g  X e ^ G7k q[O 0> ¥R?' D4 (V%C]6 ! E %‚h ? y 4$M j 19zGlw>& Wp    $ S $ W HHT  \ 5,* / ]+/hSU? B 1n" A. + I. 1Nd#$¨ (We‚E (;5 8Xa(m !S(GP$3y6S\!J&H«)w +ƒ G  H "b;WcIZ J 6 w 74 _d 0:¦>MH% 6vd3(9F-P'B+ (@B?#m,FN8Kf &  @mKF ±’A±‘±„O± †D±„~ Š! 7•RS& C   2 o  += 9& LR#06 RTpI $Z‚C …+!7)?= BT 7 "›XCT{‚l!%‚a *‚ n&.‚ 2ZkL    ‰(qu)!M)>C5 &3]{ ‘f}Khz2‚<"#R,8 q‚H †/;OJ 5 $!? 8 ˆW "A[ *,2 i<:  K?W3/'4E‚o. ¦‚1e AM ‹5++9. OMR‚<¦… yU(:r­Š=$[]4yQ. ‹p_Nm 9 eD‚(¦…fL‚-6±^­ˆ A keEZa*®ƒ 07 (%  L˜C UI - .\! ^IL  6h   g  X e ^ G7k q[O 0> ¥„?' D4 (V%C]6 ˆ! E %‚h ? y 4•$M j 19zGlw>& Wp    $ S $ W H•GHT  \ 5,* / ]+/hSU? B 1n" A. + I. 1Nd#$¨…Y (We‚E (9;5 8Xa(m !S(GP$3y6S\!J&H«†w +ƒ ‡^  H "b;WcIZ ˆJ 6 w 74 _d 0:¦‚[MH% 6”8vd3(9F-P'B+ (@B?#m,FN8Kf &  @mKF …I)‚T­e8 †L‡>L( BK«bTN‡… o‚gK¢uƒS¤†]„P1D¢/ƒP£e1£qxˆ±s£z‡g¤PRP¤A…w 0¢$…u¤ƒS1Œ*‚K±q§X\k8‚|<£\‚±ˆ)£‚a#¬?P„%)‚O/¢†?±r±…W¢…P²‚I@¢‚„¢d!¥1GL®D‚ƒid†W`3ƒ& £8 ‡Y§.+ …B¨†Fll1„kk‚!4¤ƒ`~ƒ*‚'¤‚ 4N«‚;„\^K‚G.U‚£ P‚3¬UY,f;*?J‚¢Q…±‚¦…g„nrF†~ ± ”\±!‹8 ‚d­•x8 †L‡>L( BK«›TN‡… o‚gK¢ŠƒS¤—r„P1D¢‡;ƒP£Š01£Ž%xˆ±„£Š8z‡g¤…vRP¤‹X…w ±…¢ˆj…u¤›1Œ*‚K±…#§ˆ#\k8‚|±„+£ƒ{‚±‘£†Qa#¬b?P„%)‚O/¢?±‡F±‹_¢ŒA²†b@¢‰0„¢„!!¥‰GL®›/‚ƒid†W`3ƒ& £ŒA ‡Y§ˆ + …B¨›Jll1„kk‚!4¤™~ƒ*‚'¤‡T4N«’a„\^K‚G.U‚£…cP‚3¬‡lY,f;*?J‚¢ˆV…±„!¦™±ƒu¥ƒa"¨2Q ƒB£%‚0¤ƒ/ g¦6 g¢.¦lƒ;  0qt' „,J EN*")>‚:‚Z 2l/9J )x-t7‚F5"[¦3.† $ (=tsƒ \ H\‚ ^K9 R> ‚ ¬„@„ v‚g v‚X¤‚M 4  - g ‚Uƒ'(IuE‚1²8P©^&R‚%?I4?¦,D‚Wa±¯‚%L„:ƒ'„g " ²‘%@±”W±ˆQ±  „Y©–@e9=¤…I 4ƒ2¯™]q=Rƒ „pJ,m…% ƒ'c ­ŠGS 0f $$ ‚?©‘c („lw‚^/£‰TM ˆ_?%- o!Z‚T)«Œx @‚Kƒ7XtªŠ3u1.(4\§„03Yk(®ˆ X(o L[ ¥‹tYƒg±ˆC¤‡l16¢ƒ v«˜{b‰y‚S0‚1‚\¤ƒ~'`¨‡VEr0‚\- ¢„% ¤ƒB1e/±‚e±‹v£†rM¨p‚:(‚%%‚1©‡s+"‚!<>±‰I¥‰i"¨‡#Q ƒB£„>‚0¤ŠM g¦ƒs g¢…E.¦‰Aƒ;  šqt' „,J EN*")>‚:‚Z ‹;l/9J )x-t7‚F5"[¦ˆ%.† $ •,=tsƒ \ H\‚ ^K9 R> ‚ ¬™s„ v‚g v‚X¤ˆ 4  S g ‚Uƒ'(IuE‚1²†P©‡u&R‚%?I4?¦‰ ,D‚Wa±ƒ.¯•#‚%L„:ƒ'„g "£ ‚\ £  ¢$‡J: ¢$¡5: ±$Ž ±$§zƒ D¥_„V¤•O>¦.‚]Š73-¤" ‚  %9JZ!(( ‹53Q1 @ ‚Q‚7<g>³ ƒ1’§nK T¢†’; ^„U‚2^  ¬ƒ.<«†`… 9 ª‚[  ‚‚Jƒ F¥¤r„V¤®u>¦’C‚]Š73-¤" ‰]  %9JZ!(( £3Q1 @ ‚Q‚7<g>³ ‡J’§„+K T¢Ÿ{’; ‹g„U‚2^  ¬‰ ƒ.<«›d… 9 ª“  ‚‚Jƒ ±…G ±Ž3 ¢'ƒI¢\‹I ¢'˜M¢–‹I ¢'ƒJ¢]‹I ¢'˜N¢–‹I ± ‚7 ± Š;A¢‚f A R4*$@ƒ*  '  *(E0$)#*.3± „±‚¢… ±’F C¢‡m ‰-A R4*$@ƒ*  ' ˆ *(E0$)#*.3± ±‡U¢ ±†±„?±„x ±^±Œ ±‹d ² …6€±‚! ² M€±‡1±‡S± ƒU¢ƒ$‚M±c± ±œf± ˆ4¢Šj‚M±…±†\ ±'†] ±'›a„_%‚¬!b‡#ƒ  …"£"+ ªv( <;§#?7 £c5„+G¤|+c;£q'3£E£& £H"§ZYt02£#(\²AÀ¦0 ªo ‰ [¤ 2‚,¤_ ¥u >¥4 £$ƒ*£$L¥‚o. ‚+.¥o[ Yªen#W ;‚5N¨L 6z*§I 1Lƒ"±…i¢ƒ”[±‚V§ƒ$‚‹ ªƒ ' $¬YN?Šc>qE"i ‚;¬•4b‡#ƒ  …"£†)+ ª›( <;§Š<#?7 £‘x5„+±†S¤‰G+c;£%'3£ƒ*E£‹O £„n"§‰ZYt02£Œ#(±…;²ˆÀ¦ƒ ª˜: ‰ ±„ ¤ˆJ 2‚,¤„N ¥„ >¥‚p £‰ƒ*£„\L¥‘I. ‚+±‡¥†C[ Yª†mn#W ;‚5±‡?¨„e 6z*§‡g 1Lƒ"±Ž>¢œs”[±ŠH§˜(‚‹ ª‹ ' $¬”}N?Šc>qE"i ±/H ±/¤l ±'ƒK£'ƒ ±'˜O£¡Kƒ ±'†^ ±'›b ³Ž:f±…- ³¦f±”‚  ¥‚|B ¯ƒ =I8OW?‚ … ­%~6ZƒOFvi"‚‚Q¤|YL‚¨„(R/¤5   #%-, 7$a u-VªIiU  G(-'P68; FG8 X`  !& dv   N u3: @R3,«;% &W<¢( 8!<  Wgn .£C#f C?& w2s3^-MC  7 '\, ME-125k6C.=cF:(&&FJ_­ _-  B7'~ "%^B t   *) o# "©F>!ª-r " - #BsA-^>HQ9  - &  2+  3:%"  M+  YJe 3/  +=0 7 9  /$   :  :k) ! 9 8   % (N    3*) "/@2«>g9H71   R@#4V O;P¦90o¯:(  W B' &*#4@D ?F(6# ]%` P8v1( b l(:- SC u>F+4Bc  g"*~kP O U&/ 8E<Z  $"1B {+ ` ‚(!O5­ =,EXƒv65   ("?5ƒj 8  :‚A ,TJ Y\.M1,  ;fq  X9-‚}& rg % !+  H6El q 52Wu®0F  jg /P+  '*E& &GZD?F1F_ ) 2 25,)¬1b­\-M+ |R 9 NC e^VZGK6D *%=akC9w7'"YuT)  \: *~W;r: ± –8±†i±‡d±j ‹$ N•5(n= 6,pY0C 0M =K!  Q  ' %, W 0/ -' #&¦†*91g ;šI9 /G3!7?#6="w h S1! < O0- !v;/ Š%rNx3 VKi1  "‘y 13cL =‚Ks8 ("  ZnF%\¬†:1V\I_Y­‰H gV7c5;ei Œ`+ W- Q7 "56*- l 4>¤ƒ35 ŠF  #%-, 7$a u-Vª„oiU  ˆK(-'P68; FG8 X`  ‹&!& dv   N u3: @R3,«…% &W<¢ ‡~!<  Wgn .£ƒ!#f C˜ & w2s3^-MC  7 '\, ME-125k6C.=cF:(&&FJ_­ƒ<_-  ˆ 7'~ "%^B t  ƒz*) o# "©ƒe>!ª‚ir " ‰ #BsA-^>HQ9  „e &  2+  3Žn:%"  M+  YJe 3/  +=0 ‡# 9  /$  †a:  :k) ! ‡ 9 8   % (N ‡   3*) "/@2«„Wg9H71 ‡<  R@#4V O;P¦ƒY90o¯…o(  W B' &ˆi*#4@D ?F(6# ]%` Pš#v1( b l(:- SC u>F+4Bc  g"*~kP O U&/ 8E<Z  $‹+1B {+ ` ‚(!O5­‡| =,EXƒv65   (•&?5ƒj 8  :‚A ,TJ Y\.M1,  ;–q  X9-‚}& rg % !+  H6El q 52Wu®…wF  jg /v+  '*E& &GZD?F1F_ ) 2 25,)¬† b­‡s-M+ |R 9 ˆSC e^VZGK6D±‚; *”I=akC9w7'"YuT)  \: *~W;r: ¤ŒB ²)‹(0 ¤¡U ²)›N09±„1±!±~§„c M‚‚Ir ±™D±ƒ±™I§•  M‚‚Ir±†±‚ ±—-±ˆ%J£‘m+£Š[†_$±ˆ±ƒq±¢ˆ9‹±'±ƒpx±‚{±†¤VH¢8‰±±‡z N£§+£¤†_$±‘-±Œ<±‹*±‡d¢ ‹±„F±ˆ(±‡d±ˆO±Œu¤† H¢–<‰±ƒ4±œ ±“ ²‹b€± Šr ±ªk²š<€± •{ ±…2 ±ŽP£*‚zV$ £*“ V$D¦'ƒ h ¦‚kc…N3¦E ‡k}„ ¦'˜ h ¦“c…N3¦”i ‡k}„8¥'ƒ h ¤‚`mˆF¤G ‡l… ¥'˜ h ¤“mˆF¤”k ‡l…%ª*‚Sy1;=f…Z ª*’yy1;=f…Zµ%†&k µ%‘$&k ±„A ±™T ±,„ ±,‹.‚/¤‰b‡a    ¢ˆ2¢ ˆj ¢ ’Ej ±“j ±­ ± ±©4±$”K±‡Z ±$®6±œ^ §$H‹n‡5 §$š3‹n‡5%± …±±*±ƒ` ± (±ˆ=±©±Šw…>‚V§„#ƒ†3¨)~6Z\‚B‚Lƒv£= „u¢‚G]¬W !  9/ 4ƒ4 _9E…-T]§v%H (§@¤S%¦i %lƒ4\   £ƒh :…"(†    [h  G£‚F³ bª„& $„ i´‰ & ¥„ˆg„d2²…|@¨w! ‚a§™6ƒ†3¨’>~6Z\‚B‚Lƒv£q „u¢^]¬‚mW !—Y  9/ 4ƒ4 _9E…-T]§‰A%H (§„@¤ƒ6S%¦‚Si %ˆ|lƒ4\   £„Iƒh :“|(†    …d[h  †G£„-‚F³‡*bªž $„ i´”& ¥™Cˆg„d2²@¨¤=w! ±(† ±(›8 ±(† ±(›<k 2±ƒ± † ±‚g± k¢ˆe±¢Œa„p±ˆ ±‹Af±5±…y 4±4± X±‡± † ¢¢P±Œ¢¡e„p±S±›g±†?±ˆL±~ ±(† ±(›C ±"E ±"…z ±(†6 ±(›i ±%‚~ ±%Ž ±ˆ\ ± ' ± ±¤/²q@ ²£@ ± ±¤(  , ±,‡7 ±„i ±™|Q &±ƒ±‚0±ˆ±ƒ¢Œ9Š,±…U±±"±‚1 &±‹[±ŒY±–a±‡¢¦$Š,±^±¢±‘H±ˆ am¦„UT„<Š<±…7±„5a±ƒ*± ±J¢‹$±†<¢†%±ƒ)±†±‚\¦ˆ \‡r3M©Ž*I# gs#!£ŒA0)±L¦ƒE‚=0 ±ƒa o¦™hT„<Š<±–L±L±U±Šp±§W±„|¢™u$±(¢±†f±Ž]±œG¦\‡r3M©£]I# gs#!£œg0)±‡%¦‹J‚=0 ±˜¥ ‡g w ¥ ’ w£Œ3i £¥Yi£Š5"ƒ( £›J"ƒ(¢&i‚ ¢&ˆ[‚E ±’.±†±ˆ+± k¢‚‰l¢@ƒ~±„& ±§A±0±v± ‰1¢™]‰l¢‘fƒ~±Œ+"¥5‚m£ †p ¥…<‚m£ Žp ±Œ2 ±›  ¢'‚±‚7 ¢'¥!‚±Š<²à ²•$à„Y&‚"¤Ci…[ŒD±‚[ B …>2{K9†5*fO%&¥ ƒ' pƒ¢‚W3¥/>.Y¢-ƒ¢„jbh«*'@ 58I$‚§ L;(AC£‚R‚?¦<‚ƒLM±ƒ^ª6ƒi†;‚}s‚)>'j ±‚F±‚`±‚5±-¤=‡ B:¤¢ƒ3D¢‚?„¤!S„wo¥ˆ~… O ‚0¤–Vi…[ŒD±‡b š6B …>2{K9†5*fO%&¥Š*ƒ' pƒ¢“l3¥†;>.Y¢ˆxƒ¢‘b±ƒ «ŠS'@ 58I$‚§…/L;(AC£ŠR‚?¦‹S‚ƒLM±ˆ=ª™ƒi†;‚}s‚)>'j ±…x±Š+±…T±ƒi¤‰)‡ B:¤„tZ\3±’X±‡8¢ˆWB¢ˆ+:¢Š=M¢…¢Œ!'±„f§Š"+,)CJ‚1¨hŠT_/_TQ£‹7[ ¢ˆFe¥—W†2†P‚>¢˜fD¢’e„¤‡8S„wo¥"… O ±($ ±(¥W± ^±„Z ± „±/ ±‡ ±ŽN±±'‘2 ±–/±'¦e¢ ˆ§ T(h B£mT£K'U£ SL¦ ;„W¦ƒw!†Nn²‚O ¥‚ª‰B ˆ#  n¥‘-†/@IF£ˆYK«ŒJ (ƒZ7&U^ >§ ‰(h B£„ mT£„j'U£‚\SL¦‰w;„W¦‘qw!†Nn²‰@ ¥Š\ª£- ˆ#  ¢‹9¤Œlk ¢ L¤¦k ±†& ± ±(! ±(¥T ±Z±…P²ƒ8Ð ±žo±’²aÐ;Z§‚QƒL‚D†L…±‚0±‡±5J£7+±/±H£‚`ƒI±‚;£‰(ŒS ±Š_±‡F¥N?9N±^¥‚'ƒGe2 \§—dƒL‚D†L…±‡7±‘:±ˆ{±„9£‡ +±‡7±…a£‰~ƒI±†p££ŒS ±•h±8¥¤R?9N±¥¥Š,ƒGe2£ƒc £ˆ£d‚D$ £¤w‚D$7³ DC¤ˆ8LJ±‚v±‚² ‡*€ ³ ƒgC¤“08LJ±ˆJ±ˆ² —P€ ±c ±‡k C±“±±ŽN±…)±…P¦Bˆ1l:±ƒ\±„N¢ƒ[‹~¤}‚rƒb*£ ’`C²Cp±c E±¨±†±§t±ŽG±–e¦Œvˆ1l:±ˆ±e¢›&‹~¤W‚rƒb*£ ¬KC²¥vp±ž ±'” ±'© c±ƒX ±=±‰ ±‚X±‰(±‚B ±“m±“Q±Y¢/‰]+ ¢/ž+ ¤‚aa‚@ ¤‹Ma‚@ ±&†T ±&ŽF;¦‡Z# !±†[±ƒ@¦}‚H!G;d ¦F# !±•5±‡Y¦‰‚H!G;d ± ±¨C ±%‚/ ±%8 ±ƒZ ±ˆa ¢'‚!£‚3Jz ¢'¥‚!£Š8Jz¢‚'Y ¢ˆ3Y=¢Œ5¦† #«U '  ¢¤¦”z #«ˆs '  ±… ±Ž ±"n ±"†# ±ˆ} ±¢# ¥&(† ¥j&(† ±!ƒ ±!†B1±Œ.¢†$…=±ƒ ¤Yc‚U2 ±£y¢”~…=±‡$¤ˆwc‚U2  ±…±ˆA±N ±—±—¤3Œn ¤•FŒn ±‡d ±‘±^±ƒj ±‡j±‰>²'‚  ²'—¢Œ\= ¢¦= ±†W ±•1 ±-„$ ±-Œ)±#ˆ±‡O ±#q±’X ¢'‚t;¢1ŒZ ¢'—x;¢”UŒZ ±,„Z ±,‹q!¢†(e²†:à± … ¢Žse²&à± ž| ± ±¨A>±‚ ª >„>1:± ±ƒ{  ±— ª‡M >„>1:± ›o±‰B ±%„R ±%[ ±*‚F²^ ±*’l²‰c ±ˆ( ±; ¢'‚=¢WJ ¢'¥ ‚=¢ˆ\J ¢'‚=¢YI ¢'¥ ‚=¢ˆ^I ±,„x ±,Œ ±…o ±’# ±‡= ±) ±/ˆ ±/œ=±Œ>±„T ±›±Š ±(& ±(¥Y §o8i ! §ª8i !#¤'ƒB'b ¤ŠE ‚L' ¤'˜F'b ¤ži ‚L'j1"±ŠP«‚.0)S/:lY/±…@£\‚W±‚F¥†4L ¢ƒV„ 4±…)±£v«Šy0)S/:lY/±‘t£‹‚W±ˆN¥ L ¢Ž_„%±ƒW± “?±#±’| ±’1± ¨C±‰(±§ %`±)7¤ZŒ‚P ±š±)ˆN¤•~Œ‚P±Šc±‡n ±›x±rH ±Œi± 2¢8…37£ “5ƒV*±‹K¢ƒ‚N #±~± ˜}¢‰$…3±„o£ ­ ƒV*± ~¢—8‚N ± ±†#¤'ƒ@'b ¤ŠC ‚L' ¤'˜D'b ¤žg ‚L'± Y±ƒl ± …±ˆ ²'‚y ²6  ²'—} ²”Z   ± ŠAJ"«‚,0*S/:lY/²…>°£T‚\±‚:±‡R #«Šw0*S/:lY/²‘r°£Š}‚\±ˆB±’[-± ‚A±O±„D±‚±“@ ± Œj±…u±Œ ±…V±¨D9±‘0¨ƒE  *²ƒ8À£”*#1 ±¦C¨‰Q  *²‡mÀ£©]#1±#†<±ƒ ±#±Ž ± ƒ* ± SA¦„.S/(W/«#‚T ‚E‚nƒ() ¦ŒyS/(W/«#’z ‚E‚nƒ()£Š+"ƒ) £›@"ƒ) ±#„S ±#(¢ƒP ¢ˆP ±ˆ! ±4 ± ±‡!c ,±‘Xb±…G" ±Š ±ƒ3¢ƒ± ± “j5±ƒX±† 2±¦k±†n±‘{± ƒT±˜e±Š¢†hƒ±‡± ¨n±•h±Šo±š&¤#ƒK ¤#Œ )¢‚x¢l‚±‚Tj ¢†*¢†$‚±‘.±‡[£ˆFPg £¡lPg ± ˆN²‡~ ±… ± “e²ŸI ±™;^,²’À±‰® ƒƒ±O´0eP±‚U±‰\ -²§"À±—y® Žƒ±¦´† eP±‰l±ž±[±Ž{ ±†:±£ ±† ±—'¦e…E£)ƒ]% ¦‹…E£)‹b%±#‘3²$ŠQ@ ²$¤<@C±„m¢ŠWŽ5±…w±„¢ )‚¢‚>† ¢B‰±‚%±ƒO±“ ±…`£„j…0¤0‚P 6 G±‰t¢£}Ž5±Œ±5¢ ƒ‚¢‹*† ¢‰±‰±Šm±¬v±i£™j…0¤†w‚P ±‡M-¥ˆ1ƒR…m±…±? ¥Ÿ|ƒR…m±“y±…XF¢ƒ/¢xŒ ¢;r±‰m¢ ‚‚I±‚5±ƒ?±†¢…*T¶…—UP±A±…M±’z L¢œU¢“ Œ ±‚=¢‹;;±…±„{±¡8¢ ‡\‚I±…r±‡t±Žm¢ŸT¶š—UP±‡±R±§/© „n<„   ±‘?±ˆ © <„   ±«*±“ ±…] ±’3± Š ±’±‚± ƒ±–a ± •7±ªJ±…A± Š ±°±‘±R±ƒ^ ±‡^±‰2 ¦‘ ‚Q ¦ª1‚Q±C ±œ±‡1‚\(ª†; =cˆ-axm±‡¥'N5„±„±Š4±†X£y0¢‚P¢‚M?±ˆ+¨N +4LG!¥‚Zƒn‚Lƒ¢(ƒ£„&)¦‚o#!¤ƒp|e±K±“M²…`¦‚Uƒb>?‰A§‡ƒdƒH?69¢f‚Z¢†/‡`±„;± -ª›N =cˆ-ax±…t±%¥†3N5„±:±•K±Ž£¨D0¢†¢†?‰A§œ7ƒdƒH?69¢‡-‚Z¢–U‡`±‹R±‰-±ˆ<±Ž+±‰± ‚D±ƒL ±O±Ÿ@±˜Y± Š6±Šc ±$c ±$›N ±*1 ±*W ±…T ±’ ±&… ±&‚ |±@[Z¢gƒ§„(c  (!±†s`Z±Š]¢…W\±‚W£x ‚e±ƒ±‚{£‚pD‚Mª/=\ƒaz„, †-¢‚„I±”±w£„a¤†h@Y†c¥%l!„5 ±†G±‘p±‰%¢ƒ§ŽQc  (!±Žw±‹w±…9±¢(¢"\±ˆ+£ˆ ‚e±‡ ±†8£‹ED‚Mª›=\ƒaz„, †-¢Š „I±©±£*£Š(¤—@Y†c±†X¥ˆ%ƒ`§ƒ^u‚Zƒ‚:ƒ ƒ —'‚ E ˆfZ3F ~&S,¢†?+¬œ{‚z …b…)Tƒsk¥Œ‚cZ¤œ5Ou‚&¤‡ƒ<:A±‹v¢Ž`‚£‚A1¢‹xƒ%¢…ƒ±‰6ªxg8=A*#=a§‰y ‚Ju²ƒwЮ™ ! ‡g…0C <1£„wuD¨‰v "X‚ 2¤…4A$#±†±„V¤Œ&ƒiX¥i†MVw1§‡M5+m‚4¦‡i#F_¦‰oZ¥‡R My²†>°£Š8ƒ=£…%V±ˆ&£‰+„LY¬Ÿ}„p‚E‚7f X‚£Ž„{¤‰m-…¨œ=‚K ‚@†'1ª™|: g Qƒt‚ƒ¯“b„n[K. 6O)2*£†(ƒ(¥ˆU%ƒ±‚}§˜u‚Zƒ‚:ƒ+± ƒv-±ƒ@±„F±ˆ ± ‹z±… ±˜s±‹]±# ±'‚ ±'— ± ‡ ± Ž' `* ±*‘±… ± ‡; ±Š_± œn ± ±©+ ±ŠX ±— J±#†P %‚ Ž" ƒo J±#% %—" Ž" ‹o£-… £- ±‰J ±¡ ±/‚ ±/–>¢$‰\ ¢$£G ±(ˆR ±(ž ±$Ž ±$¨ ±(• ±(ª: ±%‚= ±%F´ƒ Š€ ´œ3Š€t%±( ±%‹}±–, ±*‚ ±*’E ±…} ±Ži¢ˆ'ƒ3 ¢¡Mƒ3 ?±`S^¥)@! ¤‚n‚ -O§7'‚A£”5ƒMƒ±‡N¢‰0¢„¢Ž‚N£„/3B¢‹‚w±Ž$±ˆ ±Œ±„¥›K‚pŠ@ƒ ¢„q£‰ L„E¤ƒAK&£‚d7B±…3£˜4bW±Š'±‡,£‰:‚58±…4±Š}¤œ ˆƒ'E§‹:/UƒE‚ R£ˆ$X‚ª•hts†‡®˜ :Pƒ„ƒƒ0&4±ˆ £oŒ6±†*¢‡tJ¢Šs‚l±ƒ¨•O‡KM‚ZFO‚k ±'‚ ±'—$ ±'‚% ±'—) ±&ƒ` ±&‹R-S±‡7¦†T‚Pd‚xW±ƒ=±\D® ‚0"l ƒRB4 Š>Q`£‚Q$±±‚±±ˆK£ f‡²‰ ±ƒ U±œJ¦—i‚Pd‚xW±‰I±Ž±‚g® ™{"l ƒRB4 Š>Q`£‰dQ$±…±….±ƒB±—%£ ›Q‡²” ±ˆe²ŠYP ²¢$P)² €ª'… C  ²¢3€ª'š4 C  ±ƒ ±„* ±˜3±“3±„y±‹J¨„X ƒ;ƒ  ±‹±¥5¨š ƒ;ƒ  §“alZ §«,lZY*±N±ŒJ¢‚x„ ±ƒQ±†P±‚±„Q¦ ‰/0.ƒ:3 *±¤a±¥p¢‘R„ ±‡j±n±†S±&¦ S0.ƒ:3 ±X ±¨~±$ŒT±‹W ±$¦?±›}%±‹]± †H£‹v?‚] ±š7± Ž:£œ?‚] ±/‡6 ±/›Z5X¢†‡t¤…9o,¤ƒA H±‡>±‚±ƒ±ƒF±‚¢†Y…`¢‚>‚k±a±ƒ>§C8E‚M;±…9±Œw±„;±„O X¢›/‡t¤ŽWo,¤j H±’U±†b±†7±‡5±„O¢•3…`¢ˆ‚k±ˆR±‡W§ˆa8E‚M;±Ÿ$±¡{±™n±Š9±)± ‚b¥„m‚(„{± †±˜9 ±¥<± ‡¥“G‚(„{± Žg±²$ ±&†) ±&Ž ± ‰Z ± ”q¢*…E‰) ¢*•k‰)kl±Ž±‚.¤‡Bƒg ±ƒ9¢ŒTƒ/¢„o±†6 ¢)‚P¢‚'‚I¢„Y)£†UQ§ƒGuˆB)+£[‚‚H±‚¢u‚¥  ¤„:ƒn‚? ± ±"„> p±£2±‡5¤ hƒg ±ŒW¢iƒ/¢Š{±_±ˆ ¢†‚P¢‡{‚I¢‹w)£‘^Q§˜:GuˆB)+£†"‚‚H±‡x¢‰ ‚¥‚%  ¤˜8:ƒn‚?²#:° ²#‰°£(“%a £(¨Xa ±'Œ ±'¡ B±Ž0¢70±…r±ƒ/±‰±„¢…0 ±ŸE¢ƒi0±Ž^±‡g±—v±Šw¢Ÿ s" ±"…(±‡j ±‚% ±‡ ±$‡Q ±$¡<!±‚2¢R-±„( ±…d¢† -±‹ ± …y±t± ± }±‡H± ;·•KÖff ·­Öff¢  ¢ ˆ!ƒYg«‚]‹ ? „Y¯•>;z¦-‚]Š730¬ƒN;J & 4‚G¤}" ‚   &;JZ"'( ‹6/S4< ‚Q‚3 7$c?³ ƒ32¥lR¢†’E %\‚f Z‚TD     §ƒ <¦†_…  Nª‚\  ‚‚Jƒ k«—p‹ ? „Y¯®.>;z¦’B‚]Š730¬Œ;J & 4‚G¤" ‰^   &;JZ"'( £/S4< ‚Q‚3 7$c?³ ‡L2¥„)R¢Ÿp’E %‹e‚f Z‚TD     §‹ <¦›c…  ±–ª“  ‚‚Jƒ ±‚< ±†t5¢u‰s¥ŽJˆ@c&±ƒ¢ ¢–‰s¥§pˆ@c&±šK¢„H ±…A±‚~± ±Ž_±'±ˆ2 ±/‰ ±/7Od±Šm§$ƒ a&E  tZ  ±…¢; .Iƒ;#4 !"  ‚)<  ' lu9 ! f±¤§$˜a&E  †MZ  ±¢ƒX .”mƒ;#4 !"  ‚)<  ' lu9 !² À ² ˆÀ ') ±)…n±„±Š ±š±›.1©…6‚VP[]_3¢ ‚B# ©ž46‚VP[]_3¢ ‡!#±"„4±ƒ " ±"ˆi±ˆV ±"F ±"…{ ±•s ±¯ ±/‰x ±/ž ±$™ ±$²} ±…/ ±œz¤$†E ¤~†E!± †±‚>¢ ƒN ± ޱ…{¢ ‘8ƒN+±xf±‚^±‹O±† ±¦ ±†r±Š)±š)±¢$•k ¢$¯V#£Y…9 ±!„±ƒF £¢l…9 ±!ˆE±10­L“E  "±4 ­™r“E  "±¡I ¢ †y±‡z ¢ ’±“ 6¢ƒeB¢ ‡?G±(¢‚£D±‚¢ƒQe±¢„¢†&‚N ±‡a±„{±ˆs±Œ±Ž? ?¢ B¢ ’VG±†¢ƒw‚±‚D£„@D±l¢†ƒQ±‡&±‹n±–¢‰Z¢šJ‚N ±„# ±‚x!*±‡W¤U„' ²… ృs£R¤„ ƒ2 ¢ …_  £ƒiw¢§!p …D„]¢…¢ g¢I±‡e¤„4‚H¤‚…7f­k… ‚0hL£‰„q„M±u¥? uƒg±†O£ˆD G±œj¤š{„' ²– ౉£…A±ˆV¤ ƒ2 ±¢‡R…_±‚k±—W±ƒ@±‡Z±ƒ±ƒ.±‚K£ˆzƒiw¢„G§Ž{p …D„]±†z¢…b…±†¢„%g¢„~±:¤4‚H¤ …7f­–o… ‚0hL£žP„q„M±’¥ˆV uƒg±ŽT£œh1£„ ‚"e±ƒ+±‡<±…m £ŒW‚"e±Ž4±œ±†±š ± …2 ± I ±‚+Q±ƒB ±†±+±‰ ²#‡P ²#% ±"G ±"…| ±)„ ±)‰c‰O)„S¦rM‚_]‡§, 65>%ƒyƒv?‚+‚p‚ ƒQ 1& ¬‚"e6 /op>(q¦„…l*y ¦„G,,5 (\T)S/#A/«=qc‚Q6 ‚.£?  0 P‚#p* 5 t  " I¥'nT¦^^…`%¬K…1 #ƒv¤…j¢y- ‚"6k‚m#L? U‚}z )" f¦G ‚(¢‚Y£*5W Q"„ -b  ±ƒd¨…X… @F« ?DT5> %  JMc 7P_¢W §, D ¨/ b3fWƒ+ªK= FD‚e^B ƒ&&0 ‚hH„&@   ‚O Z‚JpL"@    0 dƒRFƒz‚]\‚‚$‚ ‚;K2O4]-/‚pD@)„L ±„Q !‚‚i,mu,$!='  8 AQ]£…=I §g`PTS©\ˆK‚&&„‚. ±‹/±Œ „k¦—M‚_]‡§†!, ™\5>%ƒyƒv?‚+‚p‚ ƒQ 1& ¬‹@e6 /op>(q¦•…l*y ¦ŠS,,5 ˆs\T)S/#A/«Œqqc‚Q6 ‚.£‚b  ŠY P‚#p* 5 t  " I¥„MnT¦ˆb^…`%¬‹b…1 #ƒv¤ˆE…j¢ƒW- ™m6k‚m#L? U‚}z )" ±„¦‰ ‚(¢†H£„I5±ƒ Š="„ -b  ±ˆ¨”2… @F«…`?DT5> % † JMc 7P_¢ˆH §„E D ¨‡M b3fWƒ+ªŠ = FD‚e^B œ|&&0 ‚hH„&@   X Z‚JpL"@    ±ˆ" –hƒRFƒz‚]\‚‚$‚ —nK2O4]-/‚pD@)„L ±Š !‘:‚‚i,mu,$!='  8 AQ]£ŒTI §ˆg`PT±‚p©•ˆK‚&&„‚.±I¢3 ±œ#¢…e3±a¢) ±œ;¢…}+R±ˆ]¤„r=(†±„~£ƒp=(£ Š ±ƒ}¤‚2M±‚£q_@±„]±9¤†<‚(&¨h86+Z>¢…x@ T±¢¤–=(†±‹ £=(£ ˜Z ±Š¤…C2M±Ž£•u_@±š±‡¤–'<‚(&¨‡+h86+Z>¢}@(±Uª(l ±œ/ª…q(l ±#ˆT±…= # ±#‘)±‹±†w±„ ± ±Ž/ ±‘ ±¦&±Œ$ ±‚D ±ˆP ±„±ƒs± †h ± ±’M± ŽZ±G±ˆ% ±¦m±p ±…, ±žR±'’r±‡V ±'§v±[* ±* O ±*- ± ±©.¢ ƒl ¢ ˆ ±ƒ# ±‰/%±K±†±‰,±‚ ±„}±ŽZ±ž_±–&£(7( £(¥j(,±Š± “±‚]H ¢eq ±–R± ªi±‡± „}¢†,q‰/„§aa ‹9‡t¥Gaƒ6¥‚"‰Œa£7‡X¦ qŽj¥ @…"¤‡"¤}‹¨!P=! £QˆI¤ Tƒ7²‡u`¥ †>ƒ2¥ %„¦ 4¤ †!£ ‚E¨ ƒ2¥„k%„¦~4¤‡O †!£‚h‚E¨—T†qŠ}¢†„$±‘,G±”_±9±‚x²fూC¢)„G.±ƒ #±®±¡N±‡-²‰;౜.¢‹2„G±•2±Š# ±)‚J ±)ˆhp¨Œ Ca!±–h¢ƒ0ƒM¢%±†d¢ƒ†±=Y±~¤„{-Š.±>±ˆ'¤Š)R £…OB#±„¢†>±„j±‹l¢ŠC!±ˆ.±¢‘Jj s¨¡ Ca!±°¢”EƒM¢†1±Žh¢Ž4†±†±M±‰D¤œF-Š.±„p±‘¤™R £Œ;B#±Š ¢/±Œ±¥W¢ŸG!±a±ƒ,¢¥njg-£z—" ¤>Œ8‚z £6- =h±k¦hƒLƒ/„ ±ƒ% 5£š —" ¤‘SŒ8‚z £†B- ±‰±ˆl±†J¦–ƒLƒ/„ ±“K£'‚DŒj £'—HŒj±ŒW ±›1±‡I"¯…‚_**6ƒ-B&¤ ‚_1.±„p "¯ž.‚_**6ƒ-B&¤ ‡>1.±Œ ±&†( ±&ޤ%ƒ  ¤%Ž! ± ‚±™j±„X $ ± †5±³U±Š ±) ±)†K ±‚V ±š! ¢‚@D±‚q ¢“UD±Ž}z±‡R±F±„_±ˆ.±„ ±†R¢F{£j#g¢Œh†$¢`<±ƒT±‚!¢‚lj¢ˆb?±k±†x£C\ƒN¢‚£‡Q„…Q£/’)‚%²-P¢…p]±ƒ ±…[±q ~±œe±ž[±Šk±”b±Ž3±ŽV¢…%{£ˆ0#g¢¤3†$¢…<±‡C±„]¢‡$j¢—‚@¢)(¢Uƒ%§ F§ #R®† \"  £ƒ>¯P …*  …5   5T1     =  4      )J$      ¨…P5( 9¦~Ž5D„EP) !  m\ d  ‚[n    /C-( 5.¥)#ˆ †  ƒ1…6 x 7 ` ƒiJ¦‚tYg¨+†!<%; c DG%¢…kH ± –3± †B±„|±ˆ7±ŽA±–±l „  —@ƒ ‚' 6u.@ *H! …£°6F+ ‰T#ƒ" ) &  ,~¢’1x¢ˆ:Y±Œb±”$ ‹] g^"5  ¥…k ] ‹!Fqƒ7&T=G 9 , ±†O¢ˆG' £(G  ‚x‚;>‚@¢ƒ[(¢ˆ ƒ%§ƒ(F§‚E#R® \"  £‡>>¯* …*  …5  „# 5T1     =‡( 4      )J$      ¨Ž%5( 9¦šiŽ5D„EP) !‹ m\ d  ‚[n  ‡~ /C-( 5.¥•-#ˆ †  ˜d…6 x 7 ` ƒiJ¦ˆ;Yg¨Q†!<%; ˆc DG%¢šH L) ±)† ±„±‡ ±‰` ±ˆ±Ž)±žd ±(2 ±(¥e„@#‚¤ a‰NŠ-¢ ?¤„ -’5J£ rN£h…@¥y U£?‚c¦‚9x)ˆ¢}¢ x¢@ƒK¢[¬D90ƒ[#-9‚]¤FVŠJ£‚¥¥‚±ˆ-¨Š‚;O) ²± †l ²Y± ޱ‘µ‡UU µ˜.UU£$2s‚8 £$šs‚8‚x±‚ ¢Sˆ^ $G@YZn.QN †<ªrG\I1]£„ ‚e¢„i‡³\U±ƒ¦  -@±‡-£Žb`£X‡Šl£‚ p±±‡k¤„;„‚tˆ ±¢-±Œ±ˆr }±‡¢šyˆ^ ‘$G@YZn.QN †<ª†rG\I1]£ŒT‚e¢‘‡³ˆ`U±Ž/¦„A -@±££f`£– ‡Šl£‡[ p±‘D±p¤˜_„‚tˆ+§…9‚SP[ƒC3¢ ‚C# §ž59‚SP[ƒC3¢ ‡"#!¤'. ‚ ´‚Jµ ¤'¥2 ‚ ´ŠOµ¢“e ¢«0 ± o± ‚Sy ± ‰s± …r±ƒ'<"§–E $±†q ±"„q§°0 $±Žc x* ±*‘ £$¢% £†m$¢‡%¢7 ¢’L o ±š ±)n ±)‡5 ±'‘m±ƒp±† ±'¦q±‹±Ž1±ˆ±ˆm± †HJ±† ±‘5±—G± Žt±ˆ:±†#±š$ ±ƒj ±ˆI±†¢‚64±…)±G±±„'¢ƒ-C±£ˆ±‚n± ‹f±‹£„(‡"„Q¦†(ƒ … v\` I±›¢‡=4±–>±‹p±…&±>¢ˆ C±„=£p±‘H± ¥Q± !£”N‡"„Q¦šLƒ … v\` ±— ±°EF¥jU 5‚;± ‚8± †\¤ ‹K… V±ŠHm "¥šU 5‚;± ‡± H¤ ¥6… V±•Q±ˆ ±ˆ7¢ ‡CH ±—¢ ¡.H ±*ˆ/ ±*˜U ±ƒ ±… ±g ±œF±ŒW±ŠS£(Ž9 £(£L9+§„}ƒ PWYm± ‚0 §ž#ƒ PWYm± ‡4«  gc{ ƒUU±‚U  « Š0 gc{ ƒUU±ˆO#±˜+¢A>@¢l9¢}{¥‚Y ƒg±ƒ( '±±Q¢‘V>±‰ ¢ˆp9¢†\{¥—4Y ƒg±“N# ±†K± „±„X ±±Ž± ‹±‹I ±…X ±ŽD ±‚ ±c ±&†Rµ„X5S ±&ŽDµŒ]5S1T¢>ˆa¢‡GO±1"¢3…k±ƒ)±„9±…o±U±‡ ¥ƒ<„ƒ$‰\V± h¢…=…-±Šo±†¢‹4m£‡AŠp X¢•Qˆa¢ mO±žF±†.¢ˆ~…k±‡O±Œ=±‘±†4±Žf¥›„ƒ$‰\V± †¢Ÿ(…-±•x±Ž¢ gm£›O "0   !   A  4,  4  Xv           +    # s'_ , C H R       H9k& "& )     % -@ .&  \I%    B* $         > D M e1 WT  ' &< )  1 # R6  % $)    / E   7! 1+#  ,c -F"        1U(     @  7  )? H jR+  c F K               "%     q-%3 ¨  +# !  O 8Y4?f&  $  F:  * h:,  1         5   #     5 'F  6       3$  (Wt    + E        / D   "U & &'  !!    (%*   &      O  $  b  B 1  *  $ d ‚<     0 4%  ` E'   NC -  ? $ .<#   $ A H;         #$      6A   @9 7  ( 7K  (/    )  R  G: 2+  B       (     (   4  ?.        1$  (! 5  &     @  %-   M     ; )     =     P 2 2 A   0 L&  } : +2'   R  %2 E&=   5   %  & %@1    )  A" ^WP0L   & # '": 1 43,9   M    ^ #&h FM #   ;**  *  4 ..     &   L &X =$  ' &" Vx  6 (   J ? 4  :7 'L 7   !&S    (W !"  O!    C3  >Q .T|    -     "  , % * "    $ *    1#$   $   &  42  $ ' %0-$ A    #   M!c 8b! & $ !  !- K ,G    7$" E  )   9F 9h?   !   R2  *! ±8±f œ8 5•8_'#+ P      40  $W!      ,  7   45 " "  )+  6$  ) /…D    $    $P 9š-     A   B#  '  G-  I@ X7s>O "0   !   A  4,  4  XŠ           +    # s‘<_ , C H R       H9k& "& )     % -@ .†2  \I%    Bˆu $         > D M e1 W  ' &< )  1 # R6  % ‚G)    / E‹3   7! 1+#  ,c -„l"        1ˆY(     @  7  )? H j‹i+  c F K               "…     q-%3 ¨   +‡]# !  O 8Y4?f&  ƒ  F:  * h˜,  1         5   #     5 'F  6       3$  (Wt ƒI   + E‡e        / D   "U & &'  !„    (%*   &ƒ=      O  ‚`  b  B‰ 1  *  $ d ‚<     0„R 4%  `Žb E'   NC -  ? $ .<#   $ A H‡;         #$      6†   @9 7  ( 7†S  (/    )  R  G†y: 2+  B       („4     (   4  ?‡7.        1$ ƒN (! 5  &     „J@  %-   Mˆb     ; )     =     P™z 2 2 A   0 L&  } : +2'   R  %2 E&=   5   %  & %@1    )  A‹" ^WP0L   & # '": 1ˆ  43,9   M    •^ #&h FM #   ;**  *  4 ..     &   L &X =$  •H' &" Vx  6 (   J ? 4  :7 'L 7   !&S    (W !"  O!    …WC3  >Q :.T|    -     "  , % * "    $ *    …j1#$   $   &  4‡)2  $ ' %0-$ Aˆ    #   M!c 8b! & $ ‚,!  !- ”6K ,G    7$" E  )   9F 9h?   !   R2  *!S '±’5±‚G±ƒ@¢„ ±†9±^¢…bƒA±t±‚n '±§H±‹±t¢Œ±Ž±§I¢–ƒA±‰ ±— ±‡U ±Ÿ #ª ‚4-,5u ª Š8-,5u²#ˆ0 ²#X0 ±˜*±~±(ƒ ±±P±¡±(‹L#±Š£r&¢…7E£Œi#†$¢…†g¢Ž:‚1 $±˜o£„/&¢@E£¡m#†$¢•:†g¢¢^‚1P%¢(z±’X± ‡\« 'MNƒ‚(mƒLB± †e±Ž &¢¥;z±«~± ’s« MNƒ‚(mƒLB± ŽW±ž? ¢¢p†@ ¢…¢‹†@ ±/‰ ±/8| :¦‚oˆ@"±‚<±F¥^…%_b£ A4¨*n1ƒS-±†>¤ ‘T =¦#ˆ@"±†b±‰ ¥ˆ)…%_±„£ Š4¨§n1ƒS-±›B¤–C ‘T ±/’1 ±/¦U²J€ ²¡_€ ±" ±"…?¢ƒ ¢œ<A±†v±‚*¢‹pz±¢Š&…@±†$ ±ŽA±œ¢¡#z±†b¢šL…@±‚:±šH ±w ±¨B±#…±†_ ±#[±ŽQ)±ƒ±h± †u£•X ±‡ ±„$± J£¯Cƒ9£‡;†f*¢„?5©‚3Eƒe ‹<‚K±…/¢ƒV}¤‚\Q<‚^§ u‚W,ƒ(¢ƒL"±…r± ±ˆs¢…hy£‚K¢ _±… ¥„ˆ}m‚/‡v²†V€¨† ‚$l‚H¥ƒ'ŠA‚}j£"3w±‹/¥~R+:±~±‚I¢8©„‚Rƒ‚)M‚E= ± ”V =£œN†f*¢‰F5©›YEƒe ‹<‚K±ŽM¢‰b}¤Q<‚^§Š2u‚W,ƒ(¢‡r"±‘ ±ˆS± >¢3y£‹7¢ „±_¥žˆ}m‚/‡v²‘_€¨›‚$l‚H¥˜M'ŠA‚}j£†i3w±›U¥†WR+:±‰±ŠN¢‚U©˜:‚Rƒ‚)M‚E= ±$ ±$©~ ±‡y²+…~  ±‘²+š" 1¤‚&^)£’c5_²z@ ¤‹^)£§g5±†&²‰@¢-„{ ¢- ±*Š ±*š7:³k± ^ !±•.±‰4±†"³ŒIk±‚;±„=±‹4± „±&‡q±… & ±&c±ŠZ³(Ì ³(¥O̤ƒ~  ¤Œj  ±‰ ±¢.±$—#± “ ±$±± §6%±‚,±$±‚±’v ±…K±ƒ`±‡p±§ ±‡^ ±œq ±&† ±&Ž ± ±©2)²„5°±ˆN¢„W-±† ²‰<°±•¢,-±Ž ±V ±†]5± ‚w±‚+±z±‡p±Z±d ± ‡±… ±§E±\±‡.±…} ±!ƒ±†3± †G ±!†U±Ž%± šk;  ‚D| 3MF-   ŠH| 3MF-¥‚MP+S. ¥‡,P+S.ƒd#k¤a‚[‚w¨ƒ}4‚-‚%‹HVp±‡^§ƒhK„&†{±#±†G±ƒY¤x‚n1ƒ(±„¢c…®.*yK8*%†¢&‡y¢‚9L±„0¢P±&±…` r¤–t‚[‚w¨#4‚-‚%‹HVp±|§”(hK„&†{±‡/±± ¤‹!‚n1ƒ(±ˆ*¢ˆg…®‹E*yK8*%†¢‘L‡y¢ˆL±‹G¢‰U±ƒC±š±‚N±–y ±—a±°B£‚hƒ£ŠIб„*±†²D0± …} £—{ƒ££oбŠ6±Žs²ˆ60± š! ±M ±¦s ±„w¢"„V ±‹¢"š ±* WM$±‹r±‚Q±†F¢Nƒd±M¢ˆ]„L±†±‹& $±¡±‹o±—[¢Žƒd±Œd¢¢H„L±‘"±›L£$Ž„ £$¨„  ±ˆ.£ „F ±—£ ŒmF ±$…B ±$Ÿ- ±/‡ ±/›/,†+ (!c6($e^&A%lFLQ$-M2U5_# a'§QV‚BD 6! Q{54_9G,#%3  7k‚1wOG(3qi  V ®OgU?#)/ƒ 0 3I&q‚ 7$0z ‚tGV1])C£_‚D¬g(l9 ed   = 7=Q‚! 4% '¦#El®!/ :2/$54U©(0 «<@E+‚-UFl¬/ :# A&}8§. ><0ƒ >P5$-sii1‚BVHO‚(£- ª`k} ‚50/ ±‚u£d^­s  # !GƒA£pN‚ YWGK)SJ; 0.'¨:F|2JJ© E&I1:ª-F'+$©6!y.07(¥^B²ƒ|P¥H,I ¦#h; ,= 7=Q‚! 4% '¦‚FEl®‹J/ :2/$54U©„N0 «ˆ@@E+‚-UFl¬Œ./ :# A&}±…§‡t ><0ƒ ˜ P5$-sii1‚BVHO‚(£ƒ_ ªˆ+k} ‚50/ ±†d£„^­‰_  # !GƒA£…(N‚ tYWGK)SJ; 0.'¨‡&F|2JJ©†_E&I1:ª‡ -F'+$©‡6!y.07(¥…^B²‹P¥„,I ¦„Xh; ˆh,û±Š2£š3…4a =¢†ª/ ƒwq !ƒ±(² …zp±Œ8¤g‚t3 ¦ :o†x„W ±„N¢†i >¢’MªŠX ƒwq !ƒ±…N² Žfp±›¤‡o‚t3 ¦ –mo†x„W ±Š¢—A¤† ^„‚}±ƒ± ‡6±Ž(±ˆm±†x ¤T^„‚}±‹o± ¡!±£,±™±ŽP%£+…l‚±…x¥0 ¦' f ³‡ ¥±ŒK &£‘@…l‚±ŽC¥‡ ¦‡/ f ³’¥±œq±ƒh±$Ž- ±‰t±$žSA£! 0©‚Z xrŒn_±±¥†v <‚F)‡ CaW Z  iI. B£!„N 0©˜Z xrŒn_±†Z±ˆ-¥Ž{ ”`‚F)‡ CaW Z  iI. ±/‘s ±/¦ ±¤ •45 ±h¤ š •45 ±(ƒ_ ±(™+£Y‚{c±†h±…±‡f £¥l‚{c±Ž.±±œjG ±`¢_B±±‡[¢ Š!jC±–-±‰6 "±¢s¢†fB±‡±’r¢ ˜{j±„x±°±™\ ±„: ±ŠB;± ±•qo¢„f‚-±¢ˆZŠR ±–±¯±…'¢“@‚-±‰¢œ~ŠR ±/“D ±/§h±"ˆu¢*‚r] ¢*“] O( ±(– ±%†. ±%‘7 ±%†0 ±%‘9 ±%†' ±%‘0 ±(’m ±(¨ ¢#ƒG ¢#Œ±Q±. ±+±…c±‹±(…U ±œ.±(Z£„,Œg £™,Œg¢‚Y ¢ˆ*Y ±$„\£‰X ±$žG£Ÿ  ±$y ±$ªd>Y¢„h‚[±z²&à±)±‚±’J¤s z£‚;£ƒi‚ ±ƒR±…R±‚w²ƒ^P£‚a ±Š±ˆ>H£hU'±’u `¢Ž‚[±† ²à±ˆo±„u±ª¤„% z£†*£ŒU‚ ±‰&±‹Z±‡²Š|P£† ±Ÿ±˜d±‡0±ˆM£ƒU'±§E±† ±†n±„T±†±‡'¢…s„1¢†ƒX±‚±‰z¢‚± ˆ±Š£‚n‘ ±O±Œ? E±› ± ±Š`±’I±‘P¢‘ „1¢SƒX±…E±˜T¢ˆ|± “±Ÿ£˜!‘ ±ˆf± c ±'Œv ±'¡z ±J ±©p ± ±¤2b m£N¨--„x…9†a«)v [¥~'  ‚1 . !&#‚±‚¢I‚©…_ŠI‚D +±‚i¦‚B< ƒZ+ p£†%N¨™S-„x…9†a«„Ov [¥‰'  ‹ . !&#‚±`¢…~‚©šcŠI‚D +±ˆ0¦ŠG< ƒZ+ ¢‚=C±‚m ¢“RC±Ž‚E¢‰‰P¢4±†¢Ž‚'¦t 2'±„5¢rO±‚±§ §;t †F{ U(+84"^I ±{¬ ‚ -2 /±ƒd± R! ( 5ˆ}‰ 8 ¢>±ƒ6 ±[ ¢ž#‰P¢4±T¢¥^‚'¦„& 2'±Œ¢…aO±…;±ƒP§…S §t †F{ †tU(+84"^I ±†Y±‡¬‡z‚ -2 /±‹±‰p ›=! ( 5ˆ}‰ 8 ¢–B±ˆ} ±Št ±¢?' P¢‚:‡;£„$±ƒx©?4I  ¨ƒWƒXp‚U ¨‚*9‚ ,K©‚ „wdYeƒ@¤%r±† R¢—M‡;£Š'$±ˆ0©ƒ|4I  ¨BƒXp‚U ¨*9‚ ,K©— „wdYeƒ@¤…~r±š5  ±†#4±Œ`½ ƒw3VeU´2%P±‚\ ±u½ Ž w3VeU´† %P±‰s ±,… ±,Œ&±‡±… ±ŽT±Œ! ±) ±)†G ±‰¦„zHa K ±’"¦Œ~Ha K ±‹ ±œ ±‰h ±š} ±$ ±¡9¢ ƒk ¢ ˆ , ±,‡4¢ ˆ@U ¢ ’iUVh£‚A‰‡±’o±‡6¢‚$±ƒX±…b£ƒy ˆs±Šw±ƒY±‚8¢„ 6±‚]±‚ ±‚Q¢ƒ|‚p¢Š…S¢c†`±‚u±£‚/†]±‚ i£—T‰‡±¬±˜K¢ŽX±Ž±y£›D ˆs±™Q±ŠE±ˆ ¢Š6±‰N±‰>±‡¢ŒQ‚p¢£p…S¢‹l†`±Šg±–£’U†]±Š1¢ˆƒ± ‚O±„p±ƒs± ¢”Gƒ± †>±ž[±™&±•Bs 7±‚:¢–`‚±±Œf±ƒ^±„O±‡ £‡x‚*±v¢‚G‡ ±‚±ƒ' 7±‡A¢°‚±Š4±{±‰f±‹m±b£“‚*±¢z¢—z‡ ±‰±—K¢&ƒ}6 ¢&‹o6¢n–+ ¢š–+£„*Œg £™*Œg ±$„]£‰Y ±$žH£Ÿ  ±ˆx ±š „‚¥ƒ}ˆ=i±‚a§‚~‚ƒPg„†c±„¢ƒ£rSƒa£‚ „+e¥†9lBG£‡\c¥‚ DYƒ¢‚q£N% §)5†OC‚=C.±„¢x¢e¢4„J©‚0ƒ1[c±j¢ƒK© ‚f{R‚P‡f‚eƒc§‚H0‚‚z"©m1yiƒ<‚2ƒvƒ ª2%‚/WKcEvˆv±m¦UvƒF+ƒR„y±‚E±„_±G:¦‰X9_ ‚?‚h ‚ ¥˜#}ˆ=i±‡h§œ$‚ƒPg„†c±<¢ž(ƒ£†~Sƒa£ŠW„+e¥’mlBG£’c¥Š DYƒ¢†nq£ƒ,% §˜t5†OC‚=C.±‹O¢„g¢ƒ!¢‰ „J©\‚0ƒ1[c±…'¢ˆpƒK©šv‚f{R‚P‡f‚eƒc§ H0‚‚z"©–q1yiƒ<‚2ƒvƒ ª–e%‚/WKcEvˆv±‡4¦‘{vƒF+ƒR„y±ˆ±‹v±‰L±‚W¦|9_ ‚?‚h<¬ =!z )!ST±‚±‚+ ±‘ ¬ˆV=!z )!ST±‡4±‡r ±*‰i ±*šw 9±‘'±ŠV±‡±“|±¢†±ƒj¢ƒH…± †S±†¤ƒ^;¢‚„d 9±ªM±— ±’±«G±„Q¢‰{†±ˆ"¢’"…±  >±›¤”;¢‰%„d ± ±©9 ±‚$ ±…V ±ˆ7 ±‘ n* ±*‘ §/pT [a,, §/•T [a,, ±‘ ±¨R¢…% ¢ž8% ±“m ±«8-T±†s±‚±…$±‚%±„{±R¢‡P„l±…$±±†(±–2±ƒ¢d:¢†Z[±„R¢‚>^±-¢ƒ"±…> T±˜±†A±;±…W±ŒF±Š>¢–*„l±Œ±ˆ4±Ž}±°±Št¢¥h:¢œ [±Š¢’d^±‡¢‹!"±™b ²'‚x ¤5 d3 ²'—| ¤”Y d3 ¢'‚#¢‚*‚O ¢'¥‚#¢Š/‚O%±ŽY¦ƒ  ±3¦ˆ] ±-†x ±-Ž} ± ±¨9 ±‡ ±s¢"‚_ ¢"…R‚_Kc±£’²ƒ`ð±1¤‚PJ8£†w‡A²†X𱃱b²„WÀ±†B£ ˆ'…O¢‡P±‘i¤ƒC‹664¢…w…V¢†K£wŒt c±¢'£«=²ð±ƒT¤ŠPJ8£žB‡A²Ž#𱇱„²CÀ±.£ ¢…O¢’P±¦m¤˜v‹664¢–…V¢ŽK£–Œt| ;²˜u ±…E±‡"±‚F±Œ±… ±‚± ±?²AÀ¢ƒ†.¤†c3)±’n <²² ±‹Q±Žm±‹2±š\±‹±† ±¨u±‰1²•EÀ¢™2†.¤— 3)±§'±‡ ±Žq² ‡S°±†] ±ŽT±¨\² X°±› ¢'ƒ5'¢' ¢'˜9'¢¡5' ¢'ƒ7'¢' ¢'˜;'¢¡7'±‘. ¢'ƒ9'¢' ¢'˜='¢¡9' ²ŒwÀ ±ƒ9±‚V²›QÀ#² Š §“R #7 $" ² ”, §© #7 $"h 0±@±’O¤v\„Q¢‡G±„>¢‚‚I±„z¢"‚O±Œ;± ‡_ 3±©f±ª¤‰b\„Q¢Žw‡G±‹*¢‡n‚I±‹k¢„W‚O±¦&± d ±ƒ±ƒq±ˆ ±†±‹±œ+ z ± ˆ~ ²'„5 ²Š/  ²'™9 ²žS 6U±)„p L  2)   > (+L 7"#$@ G 5f; .0 ±* Q V±)Š7 L/ 2)   > (+L 7"#$@ G 5f; .0!§Œk:±ˆ §¦:±b ±!ƒ ±!†N‚$ £„Rˆm†k¢‚)±…K±g±„w±† ±6^B±ƒA±‚¢7Q¢Š‚ £Iƒ#‚"¢gƒ"±ƒ¢'¤Q5<ƒ"±]±„£‡k3¤‡p ‰!„H¢Š@ˆ1¥‹jfCv±W±†Q¢2Z±‰D £™eˆm†k¢Št±‘±„ ± ±Ž±†±ƒ<±ƒt±‡0±„J¢Š#Q¢˜^‚ £‡5ƒ#‚"¢†;ƒ"±Š¢…)'¤ˆo5<ƒ"±…±ˆQ£@3¤¡[ ‰!„H¢ŸDˆ1¥¡fCv±‡±h¢‚OZ±h± „± ± ˆ5± 6 ; ±„T ¢'ƒ6'¢' ¢'˜:'¢¡6' ¢'ƒ8'¢' ¢'˜<'¢¡8'/L± ‚±‚±%±ƒhj±‡L±„~ ¢‚;†E£ŽyU‚n±b¢ˆf„q¢b ¤„: ^± †@±†e±˜p±† ±‰T±…"±–&±ŠR±„C±ˆa±™y¢D†E££}U‚n±¦¢™ „q¢…ib±‡"±ˆ±‚+¤”5„:²'“+p ²'¨/p ±l ±ŠX ¢'ƒ:'¢' ¢'˜>'¢¡:'A[¢i±’± ‡£ ƒ4R¢ŠGƒK+¢Bw¢ƒ?±„£ƒY‚7‚!²„M€±ƒf¢ƒ&!±‡C±Š ¢Ž|lu±ˆ±‚N¢U" a¢¥|±«B± ’£„ƒ4R¢¢ƒK±ƒ]¢„1w¢Œ?±ˆN£’3‚7‚!²ŠU€±‡¢ŠD!±±£u¢¤/l±†<±˜;±ŠS¢ƒr" ±G ±ˆ8 ± …B ± Y ±† ±Žt ±%‡9 ±%’B 8) ±)……m(‚n¥ˆ7‡hj‚P±„$¨ƒd‚(„'‡$ ¥kn4 ƒf§…I„M"KO±‡v§„KPj3B(¢_„H±ƒ±†j£h‚_‚z¤+!cL]¤‚_Uh©QJ†/ˆ)ƒ/(S¢9¥!&9¤‚wC£‚¢ƒ%….§$r    D K|$+1H't9£8ƒG § O$§z6f‚<|¢‚v³|¨7`bei ¢ƒ%©=WLWƒc(¨‹[‚GX‚PWƒ1¢„„V±‡¦…s†4",†D 6N…FZM‚ ‚ ƒ)1?‚I#$ªOA'.Se…7£6±ƒr±"¤†4 Œ ‚x¥J‡hj‚P±‰+¨ ‚(„'‡$ ¥‹ n4 ƒf§–^„M"KO±A§Pj3B(¢Œ„H±‡>±Žn£Œ‚_‚z¤… !cL±Q¤Š%Uh©˜J†/ˆ)ƒ/(S¢„k¥ˆl&9¤†fC£„C¢Œ….§…\r   Žx D K|$+1H't9£‡$ƒG §†X O$§‡6f‚<|¢‰v³…!|¨ˆU`bei ¢‡Z©‰WLWƒc(¨¥F‚GX‚PWƒ1¢#„V±Žx¦šw†4",†D •iN…FZM‚ ‚ ƒ)1?‚I#$ªuA'.Se…7£†s6±‹ ±‰'¤šC4 Œ ¤„ ¤Œl ± ±d¢(‡ƒk ¢(œ:ƒk1±‘F¢&ƒ 1±ƒ3£‚)ŠSƒ ±¦Y¢&˜$1±“Y£–MŠSƒ'O£…Q‚<…P¢Šw‡Y±e±‡Z£–&9¦3/ƒƒ\¤FE¢/±ƒ}£„(m±ˆ±†l±‡9¢/ƒ@e S£šd‚<…P¢¤‡Y±Œ±’q£­q9¦ /ƒƒ\¤†cFE¢‡%/±ˆ2£Œd(m±¡q±Ž^±œl¢…vƒ@±‘  ¨(“S7  " ¨(©7  " ±ƒ3±‹k±"Ž ±ˆ:±±"£ ±ƒ8 ±˜K ±†)±‚²†P ±—>±Ž;²ŽqP±(ŠJ±ƒ ±(Ÿ}±—< ± ‰ ± ”' ±ˆB ±—¢(… ¢(š7 ±(… ±(š@±ƒ± †" ±I± m ±/ˆ ±/œ> ±‡ ±ŽFw*  ¢„\¥#‡A„]  H±±‡S±‚l±—X±ƒA±‡[±„±ƒ/±‚L¢ˆ{„\±„H¥Ž}‡A„]±†{±…c±†±„&[j¢ƒbŒh±Š6£m=e§‰OM"A@±…Z±†)±‚¢‘r&¥A4…T£ƒZ‚s„,±ƒ ±‚_±‡&¢†1…7¢1±3¤; ±¢ˆ&Še l¢˜uŒh±£\£‹ =e§šdM"A@±‹f±R±‰L¢©=&¥Š-4…T£’4‚s„,±‰(±‰P±{¢›5…7¢•d±Y¤ˆ@ ±ƒ8¢œJŠe ±†k ±“ ±ƒ{£!‡{ ±‰£!P‚%¢R„j±‚{±–¥‚"m‚r†7±…X±„{£‚'~‚n±ˆi£‚[ƒj±‚/¢‹.‚q±‚!±‚±±!±.¢%ƒq¢‚1±… ¥„Y„e‚2†/ƒ@±†u¤„J„N„I¢„u‡w±„T¤ˆG†0‚oH ¢¤e„j±ˆ±¯6¥“7m‚r†7±’ ±$£Š+~‚n±”£‰\[ƒj±… ¢¢y‚q±‰l±…6±ƒJ±Š ±‡¢‡-ƒq¢ˆr1±Œ)¥žD„e‚2†/ƒ@±‘~¤–P„J„N„I¢•‡w±ŒY¤œk†0‚oH+Q±ƒT±„4±…¢{R±‘a±‚n± ±ˆ9¤…F*‚HŒ¢‡rg±†²[бƒW±R¤Š7'ov2±‘ U±Œr±Š@±‘5¢†!R±©,±†]± „A±‘¤Ÿ1*‚HŒ¢’{g±Ž ²¢_б™ ±‡¤š]'o±ˆ ±ˆ7±¥) §(“T-7  " §(©-7  " ± „N ± ‹l%±†W±ˆR±‚±Z ±“ ±’{±†p±ž ±)…9 ±)‹‚±†Q«‚9tƒ„B†{ƒXR±‚£8 \±… A¢ƒC¤9‡/!£%Vb±†l±…JG£+3£“„)ª‚ L‚ # ©‚K… " ‰:£…Bƒ±ƒU¦Ž,'‚Q ±›d«›_tƒ„B†{ƒXR±‹%£‘M \±‹±‰ ¢CC¤‹P‡/!£†Vb±ž7±±‡3£ƒh3£­j„)ª L‚ # ©— K… " ‰:£šuƒ±‹Z¦¢@,'‚Q¤/‡%2; ¤/›I2;-¢‡gO±ˆq±‹s ±'ª ¢¡ O±•%±• ± ^,¢eŠ ±ƒ$±ƒ±‚±±…5«Rƒh‚ ƒ O‚9,s( -¢š Š ±”9±Ž(±‡h±ˆ,±:«•vƒh‚ ƒ O‚9,s(¤‚‚C ¤‡m‚C)¢„Cƒ3±…G±…g±“t ¢™Vƒ3±±p±©' ±m ±†t ±'”6 ±'©:±$„u± „3 ±$ž`± Œ8 ±ˆ ±!¢&ƒw6 ¢&‹i6u 8£Š%"ƒ*±‰ ±Q±_±ƒ1±‰±ƒk±—t±’.£‚ ¦‚>q]„K 8£›:"ƒ*±•A±†0±…N±Œ±—p±ˆ±±_±§a£‰ ¦–6>q]„K !¦„/S/(W/±‡ ¦ŒzS/(W/±‚e.ª 4…Er‚z„Ia'8±‚W¥ƒ@‡ˆƒ‚H¢ƒsp£(ƒ)±‚l£):¢‚R±…k±<±‡¢…x|¢‚*+±"±ƒh±‚¢G†£yƒ «[u1„o? …VƒU  6 @> †*ƒ ±„ ¥D‡p . 0ª–34…Er‚z„Ia'8±‡^¥œf‡ˆƒ‚H¢p£†4ƒ)± £…O:¢ŠR±‘±†±Žb¢C|¢…I+±ƒ^±’B±†6¢›2†£ƒ «–_u1„o? …VƒU  –i @> †*ƒ ±‹7¥”h‡p .G ¥!Œ> §x'Q…G£ „(>±‡;±ƒ' "¥•*!Œ> §R'Q…G£ Œ[(>±’D±ˆn ±() ±(¥\±†a±‡ ±—v±‘5 ±7± TZ ±…o± Œ]±•^ ±‰ ±’'²#ƒo ²#ŒD „\/‚#¢‚“±„|¢”~„ , ‚w&:3 G3w72¦%‡Y eƒ1ƒk£89„±ˆ@¥8„Aj-†±‚¢„^…@±„£%‡A±‹ ¢ ƒKi¤R‚ƒE±‚S£3‰GŒF¢Z‚M¢;†¢ƒ8,¢2b¢‚,¦9ƒƒ_¤8ƒH±ŽO±†a±…I±…}±†f¢G‚G¢‚x„±ƒ2±„*±ˆJª3‚RJf%A£H £q…„C¢ ‡G£&l+±S±‚<¥’'41„£³‚(¬¢Db¢Š`…Q ±‘±˜k±„I f£–|…-±¡4£ˆS‚RJf%A£‚+H £Œ…„C¢ Žt‡G£‡l+±†±‹¥¬41„£ˆx³‡o¬¢†b¢Ÿ…Q ±/‰I ±/m£ƒT £ˆT ±)…0±‚ . ±)Šw±„9 £(‚_4ƒb¢‰9 £(˜4ƒb¢] ±‚^¥‚&"‚ ±‘8¥‰&"‚±r ±ƒe±ޱŠ ±‹+±¥K±   ±™< ¥‚g V ¥Š- V  ±Y±ˆ±‡e ±… ±“±j¢‚I# ¢‡(#)Q±R£‡6Œc‚"±„G¢&¢‡b‚<±‚v³ޱƒJ±… £‡h„Le¤‚„Iƒa¨ˆa^ H…-¢ŒIƒT S±†Y£ \Œc‚"±{¢ƒI¢’y‚<±šA³…>ޱŠ ±„±£œl„Le¤—H„Iƒa¨™^ H…-¢ mƒT ±ƒ_ ±ˆf ±$•| ±$¯g ± …k ±  ±%ƒ ±%ŽD  ƒ8ŒM3*    ™E ƒ8ŒM3*  ±‚?±…^ ±ˆK±ŸI ±$…q ±$Ÿ\ ±$† ±$Ÿo ±$† ±$Ÿz ±$† ±$  ±$†% ±$  ±$†8 ±$ # ±"ƒ5¤ƒ|ƒ'7 ±"‡j¤”"ƒ'7ƒ4 U¤ƒS‚o!£ƒDD¦%ƒ29‚L±…;£†„L±„R±_£2†xƒ&¦‚QM‚±ƒ>±†?±„.±‚9¥†„!H‡„¢h|¢^±…Z±s±ƒ±‚u±‚¢X±‚~¥†Qˆu„4[‚X±ƒ~¨ƒL „P/"†0|„¦= T‰M¢Œ±¦L‚*_0‚m£oI¦‰M‚S >b X¤˜f‚o!£ˆKD¦šKƒ29‚L±ŽY£—2„L±Š^±Š*£f†xƒ&¦ŒzM‚±‡d±‘V±‰ ±‰¥R„!H‡„¢‰3|¢„}±ŽF±†+±Š ±ˆI±ˆ¢ˆX±‡¥ <ˆu„4[‚X±¨˜P „P/"†0|„¦•p T‰M¢œ,±†`¦‡c‚*_0‚m£ˆtI¦q‚S >b < ±„U ±$a ±$›L ±%Š? ±%•H$¢'g]¢…V±" ¢'¤k]¢ˆ…V±¤F ±†4 ±ŸZ ±'„} ±'šk 1±_¤3‚g:¢dƒC±T¢ˆ!± ƒF±ˆ ¢†l±‡j±‹F 5±¥±ƒ¤„Y‚g:¢…CƒC±¨¢‘!± ‡{±u¢—±o±Ÿj ±I ±¨o ¢'6‚±‚b ¢'¥:‚±Šg ±… ±Ž £,Y(¢ £…3Y(¢Š ± ±©-$±^±‚N¤ ‚N ±†e±‘(¤‡ ‚N±‚S± ƒY ±†± ŠJV(±”1¥a‘k±„m¯‚M+$)##‚$± ‡ )±©D¥˜,‘k±Œ8¯‹9+$)##‚$±  p ±‘6 ±©/£+x6ƒ©„FN†„ £+‡Q6ƒ©˜jN†„ ±‹ ±—?7±ˆ|±P±ƒ,±y¢ =X± † ±¢"±Š±‡±„5¢ ŠX± š> ±U ±„3‚¤„<Q‚-±‚(¢Š-5¤†V‚Hƒx±ƒ£^0 ±„b¢‡M±†s²,@¦‚ +ˆ|R£‚‚8R±#±‚± ±ƒ±ƒM±‚>§„4„F‚$‚&„]±ˆ±K£Œy¢ƒƒ: ¤™OQ‚-±‡/¢£S5¤—k‚Hƒx±‹j£Ž0 ± ¢Q±’ ²„ @¦™T+ˆ|R£‰h‚8R±…±…2±ƒF±‘`±‰U±‹§ž„F‚$‚&„]±“±¥O£¢,¢Š)ƒ:P$¢Œdx¢‚Y¨+ƒw" ± /± …±ƒ '¢yx¢ˆY¨ˆvƒw± ƒ± œ ± š±—2 ±+„ ±+‰x¢‚k" ¢Š6" ±ƒ ±™S &±“[±…>±‡!±Šu± /±±˜8±‡ ±\$ (±¨n±Ž\±l±– ± …g±ˆ.±²#±œ$±‡#±‚Al 0¢‹Sˆ¥…{Ng¤&…,± 1±±‡)zp±‡$²‡ð 7¢ fˆ¥Ÿ!N±†s¤ˆq…,± §|±„P±±†N±†x±)²›?ð²"{ ²"†0 ±$™ ±$³ ±,„% ±,‹< ±,„ ±,‹/ ±ƒx ±‹>¤#" ¤#ˆw<Z¢“b±ƒ3±Š_±…p±ƒ$± ˆ ¢y‚P¤ˆPt)±‚v£‚dDQ±,±ˆe±‡D£ƒP‹ƒa¢…x…u±‚£„"Tp1± ]¢¨u±ŒQ±›t±‘±ˆ± w¢…1‚P¤—*t)±‡£‹9DQ±ª±“n±œH£™‹ƒa¢–…u±‡t£‹9Tp±‚N±•7 n" ±"…#ƒ<V£J‚v]£i‚U5¥††„ˆ=£sƒ;±Ž6±‚Z¢‚?†¢‡/{£PK ±‚%¥‹ „4‚4¢†1n¦pL‚‚>:©‚ ƒ8J‚Ng±…%±ƒl±†¢-'¤*WƒD‚f©Ds„Q…5S^„H¤D…ƒ 0©C …N i>„‚…8¥‰‰0R±T¦ƒ`/,‚rƒ ƒQ¢i+±‚p¢… ‡5 _£¤]‚v]£†p‚U5¥Ÿ5†„ˆ=£‹ƒ;±ŸK±‹%¢Žs†±‚>¢‹F‡/±…!£‰K ±…¥¢h „4‚4¢|n¦‰\L‚‚>:©m ƒ8J‚Ng±Œ±‰@±!¢ƒj'¤‰WƒD‚f©š/s„Q…5S^„H¤‹M…ƒ 0©•G …N i>„‚…8¥ž9‰0R±‡¦”/,‚rƒ ƒQ¢‰+±Šu¢™1‡5 ±-‚V ±-Š[ ±†Y ±E± „D±‚ ± ŒH±†H±†p  ±a £‡P'¢ŽY £<'¢¢:Yk 2£Ž1t¢‹±…)±0¢ ƒƒ ±…;-£sU±ŽD±_±…h 4£¤1t¢œ(±‹5±…¢ Š;ƒ ±Ž±‹6£‰eU±£w±‡8±š ±%Š+ ±%•41±…B±‚A±p§…`  ±žh±ˆM±†%§ŸK  ±… ±Ž ±Œ} ±ž?±p± ‡X±„±h±‰gA¢ˆ}‰g ±¦± ’±ˆ6±…%±žk±ˆF¢!‰g ±%‰. ±%”7B] 5 98RI -Y-i6Y!55E‚{m#h @ Fƒ#± Š(¢‚dR£‚ #±ˆ²"ð²„`` ` 5™B 98RI -Y-i6Y!55E‚{m#h @ Fƒ#± •?¢†|d±„£†E #±m²¥Uð²‹w`{ ;³„­±†R¢Z…³ ­§h ‚z&£‚Q ±±‚ ±¦ „„* ;³™.­±—g¢Ž…³ ƒi­§™3 ‚z&£‰aQ ±… ±…+±ƒ?¦ ž„* -±U¢"ƒI¢†[£‰Z ±¤h¢"Œ¢ F£Ÿ ¢m–+ ¢š–+ ±Œ ±š`¤‡ ¤˜&£#y £#‰N ±‰G ±š\};±‡'±ƒX±‚a±ˆ3±;±†J±…S¢ƒ&t±ƒS¢…N±Š¢ƒ$!¢…0I] =±E±‹#±†±‘±…s±6±‹[¢Št±‡l¢Œ"N±Ÿ ¢˜W!¢ŒGI±‚z ¨*‹Z/0 ¨*›BZ/0±’j±w ±ª5±¤{ ¢o<± „W± ‚8 ¢ˆ5<± Š_± —<³#†&B ³#Ž{B ¦(‚ W ¦(—G W ±$•5 ±$¯ )¨ƒD3"¤ƒ4 ¨”Y3"¤ŽK ±)_ ±)‡&K£‚*d±[§‚+6  ‚b3%    ! ¾…bmmeeem`¥ƒ„Kƒ)¥Bƒ' L£›Pd±žp§ˆ76  š-3%    ! ¾ŸMmmeeem`¥˜ „Kƒ)¥”fƒ' A±ƒ{±ƒ%±q±…M« ‡ (  M8 J ±›F±‡±„-±Ž9«  w(  M8 J ±ƒf ±˜y ±&…w ±&i±Œ ± ±¤%±ƒ±m± ±• ±Œ±G± šr±ªS±„C±‘3 ±/±¥WU (±ƒ9± ƒ2±‹5¢…HA²‚bб‚W¢‘VA±ƒ±…~ (±ˆ@± ‡X±š¢Œ4A²†бŠI¢¦ZA±˜P±Ž ±Š) ±£O ±/‡ ±/›- ±‡' ±r ±j ±  :±ŒE±–¤‚ C²@²@¢ƒz(­ŒX  ~²@ H±¡X±±‡T±­d±ƒB¤‡\‚ C±„²ƒ0@²‚M@¢Œf(­›2  ~²„'@±‡. ±8 ±„F   @B !&1 KP(±‚o    ˆ  @B !&1 KP(±ˆ6 ;¢”2¢X—k± ‡²ð3 £‚;U6£Ž‚lƒGF£‡pƒ"Y±ƒi¢ ‚2±5 @¢©E¢™~—k± ŽY²§Kð± ‡$£Š-U6££‚lƒG±† £˜ƒ"Y±‹¢‰‚2±¤Y ±!± …k±† ±¦l± Œ\±šA:® /@ ‚af±‚ ±²U ®™4 /@ ‚af±†F±(‰n±Šh ±(Ÿ!±Ÿ ±“u±ƒO ±«@±ˆ¢+N„h ¢+†'„h ±‚X ±š# ±/…K ±/™o¢†vA ¢bA¢‚m& ¢Š8&#¢„-¥*‚lq5 ¢‰ -¥*Šq5 ¢‹%‡'²'‚f  ¢ 8‡'²'˜  ±ƒL ±ˆS ±—+ ±®v!¢‚[±ˆ#±‚, ¢‹3[±Ÿn±–P G±‹2² ð ,ˆ‚b65¤… P‡±‚~¢1C¤6ƒ\± ƒp  K± E²‡fð —R,ˆ‚b65¤“dP‡±‰j¢„JC¤‡Tƒ\± ‰7$ ¦9‚}L-(±ƒ  ¦„f9‚}L-(±ˆO ± ‡ ±  ± ‡ ±  k* ±*‘ ±…. ±‘b ¤ f±ˆ ¤¤ f±”C ±† ±Œo±,±’/ ±ˆ±¦S ±’:± ‡G±—s ±§M± K±±^ ±— ±°3 ± … ± Œ ±#†s ±#H ±Ž{ ±¤ ±Z ±©¢‚%Yv ¢ˆ1Y±‰K=  ‚: 3MJ)   Š> 3MJ) ±‹` ±˜¢ 3 ¢¨13 J! ±!„-¢”{‚F£$‚X… c£‚Y4 ¢®!‚F£$—\… c£—6Y4¤$Ž„ ¤$§~„ % P©"†= ‡@#N!<„Y±†u±…|±„5± ƒ ±„D¤Š-Eˆ5¢14±§‚1W†_ .(±0¤$\=v P©šH†= ‡@#N!<„Y±˜ ±ŽG±Œ9± †)±Š¤¤Eˆ5¢Œ:4±¢§’WW†_ .(±‡ ¤ˆ;\=v@±~± ‹¢‹8‡u¦ †Qƒk†{@± ±¦± –¢¥#‡u¦•S†Qƒk†{@± * ±"ƒw ±"ˆ,%« ‚@!4NI, « ŠD!4NI, ±† ±•Y ±…= ±Ž) ±…B ±Ž.'!±‡C ±!ƒd±›ge 0±’@¢ƒxŒ±ˆw±ƒh±†r±#±‡±Ž&±,±‚z¢ƒuƒG 0±«f¢• Œ±“ ±Ž±Ž8±„`±œ#±£Y±‡±Š¢‹zƒG ± „@ ± ŒD ± ±©5 ±†( ± " ±"„N ¤ˆ6 $ ± – ¤‘T $ ± ¯~£  £f³‡%U ³˜:U±\±ƒh ±‡h±‰<)¨'‚;Œ1 1¢3D ¨'—?Œ1 1¢‰8D‚I²”pऔg 7±‚±¢ )±—±‚±‚¢†I±…"±ƒ*±P¥55& £ƒMz®] 2Z $ "¢‚8†\¢‚lƒ¨ƒƒPƒ7*‡=)¥^aƒ*§ p‡)4ƒJ‚E±‚±‹W ±(ªj± R !²ªà¤® 7±‹ ±ž¢‰ ±…±®i±‰[±…%¢i†I±Œ±‰2±…i¥„j5& £ˆtƒMz®š ] 2Z $ "¢A†±ˆN¢—pƒ¨•;ƒƒPƒ7*‡=)¥†%aƒ*§0p‡)4ƒJ‚E±Š±Ÿ{ ±'8 ±'¤<±‘K±C ±¦^±©i ¼8çgw ¼’Mçgw£ ‚] £  5£†p¥[+ ±„E±†s £m†p¥†+ ±±Že ±‚C¢"‡v ±—V¢"Kk2±”*± ±‰a¢‚g8¢‚`ŽQ¢‰KH¢¨ ˆP‚WV 4±­P± ‰ ±¡,¢—k8¢˜ŽQ¢™qH¢…u¨”DˆP‚WV ±„~±Š ±š±›- ±&† ±&Ž ¢ˆxP± —w ¢—RP± ±b ±“~¤$ƒZ„? ±©¤$Žc„? ±t ±„R ±ˆ6 ±— ±&„9 ±&Œ+ ±'ˆ ±'A¥ƒ Tk¦%‚/@ ²Sp£‚/‚B ¥ˆTk¦%¥‚/@ ²¦p£Š4‚B3¢Œ#B¤ŒadR±…mh±†8 ¢¡6B¤¦dR±‹y±‡T±š\±>" ±³;yVY ±¤³‚^y±„±ˆK ;±…>±‰ ±PD¤†| ±^±„}b£‚‹ j±3¢z¦‚>q]„K‚ @±‹J±•@±ƒs±ƒ"¤ŽG ±…M±‹±‰7£œ‹ j±‰%¢†S¦–5>q]„K‚ Q&§Œ …Iu±„u±L±„¢‚n‚/±‚±ƒx &§¡0 …Iu±Œ@±Š8±’a¢ˆB‚/±ˆ±‹²-‡. ²-3±‡ ±Žu ±ŽX±¨`  £O±$†k±Œ £•&O±$‘t±¡ ±&†n ±&Ž`!£LU±X± ˆ. £¥_U±2± ¢ ±‰ ±—o¢ˆ]l ¢—7l ±…N ±’9¢„r±†"£#…eŒ‚*±†±ƒe ¢š±@£#šiŒ‚*±Ž±˜ " ¤ 5sz±'| ±Š ¤…5sz±'‡C ±)„( ±)‰o7£Š&"ƒ*±‰± `¥‚>q]„K £›;"ƒ*±•B± …O¥–7>q]„KH_¢‚ˆ+£‚J¢T‚±‚S±J±b±‚g±ƒt±I¢†w±8±J¢ƒ(‚±r±‚S±t±#¢^‚1±…h±@j d¢—ˆ+£›p¢Šr‚±ˆ_±~±„±±‹x±Œ`¢˜c†w±‰±„5±ƒ¢’‚±ˆ^±ˆ'±‡|±…<¢‡|‚1±Ž=±¤D±–l1« |BSDTs}¢ {¥8¦ƒw!†Gf¢‚5± ƒ@  2«‡R |BSDTs}¢„,{¥Š 8¦‘Zw!†Gf¢‰5± ‰ ±/Œ3 ±/ W ±(• ±(ª9, ±,Ž1 ±,‡ ±“" ±¬H ±/‡5 ±/›Y ±$†Z ±$ E¢„.z ¢Š:z¢ „r< ¢ <‚}/:±•±…±™"±‰±‘±†±ˆG±Œ0±‚±Š%±„"±ˆ±‹±„[p±‡B±‚Z±—G±ƒ.±‡G±ƒk±ƒ±‚8±ˆh±„4±ŽV±†h±…P±†±†m±„±‡±ƒ9±„1±ˆQ±™g±‹±‡n±•±•/±…C±"±…U±‡±ˆ±‚±” <±ª"±Š ±²H±’8±¢&±Œ±‘±˜d±„B±”N±ˆH±±–*±‰:±d±±…8±¯±†`±±‡Z±†:±„t±‘T±ˆl±0±T±‹$±Œ ±^±ˆ.±Ž8±†v±ˆf±‘&±³R±–±`±ª±ªb±‹ ± H±‹.±Ž*±±„6±¨D#£‚5G±ƒ< £Š±!±‰¤ ‡h/R ¤ ’/R²'“,p ²'¨0p ±‡H ±²ˆ7 ² ²$’|€ ²$¬g€ ±)…@ ±)‹± –?±…,±„* ±–A±A¢…% ¢ž9%['¨ kƒ9]<O±…±Žw£ƒƒ¢j"¢† ‰ ±’@ )¨‰'kƒ9]<O±‹±¨b£Šyƒ¢†1"¢–/‰ m* ±*‘4¦ ‚#J±:±Œo±ƒN  ¦ƒ& ‚#J±ƒv±›I±‰/£Evmq±†X± Š+ £©kv±ˆ8±„±D± ¤ ± ±¤K„ $‚¯ˆ-W0@ ‚„rO±“5²ˆ@¢‹ …o¢ƒ6p±„F±0±‡±(²†cÀ£Œ)†M£‚(X£ƒ"z$±ƒ¢‚4(¢,¢ƒI„[£(c§ƒC`stN¦u,'3p±‚p±‚¨‚>J06,] ¢‚DV¨=+c}a)e±ƒR£ƒ~4©‚?‡z‰‚ZZ1§n?oƒf£†r1¥1LDŠƒ¤ ˆj‹¥„J±…²Ž)À££t†M£…O(X£Šmz$±†r¢…S(¢ƒh¢Œ5„[£…`c§’`stN¦‡a,'3p±ˆD±ˆ¨‰>J06,] ¢†]V¨ˆ[+c}a)e±ˆ£ŒS4©œ*‡z‰‚ZZ1§Œw?oƒf£Žd1¥•5LDŠƒ¤•K ˆj‹¥”p¤„2‚± „) ±†g ¢ƒ:±‡M¢–6>¤Šs2‚± ‰p ±/„ ±/˜,N$£gŠ£$„ /£D¢0(©† v/‚\/) %£š Š£$™$/£‡¢ƒM(©š/v/‚\/)_k¢~‡f¥†i‹ Kƒv±ƒ¢†-e±Š!±‚"£„$2¤Š#ƒ% „#p±{£m 1£‚<‚b‰¤‡5‰@± £‡‚4h±†:¤… ‡V‚U‚F o¢—‡f¥ ‹ Kƒv±Œ.¢Žxe±–U±ŒK£Œ(2¤¡nƒ% „#±ˆ;±U£…* 1£œ'‚b‰¤œ5‰@±¥@£—B‚4±‡±Ž?¤™/‡V‚U‚F ±Šb ±›w ±…0 ±œ{±%†>±†` ±%‘G±w ±‘v ±§ L£„ †'±ƒ/¢„&H±1¢ƒx±ƒc²Ð¥m ƒ .†\± „Q±… ¤„#Œv±† £‚ˆG ±„M L£™3 †'±”D¢Š2H±…W¢Ž3x±‹)²ƒnÐ¥™8 ƒ .†\± ‹=±‹~¤žŒv±‘£— ˆG ±š±!.±( ±!„k±•L ± † ± I ± †! ± JO%±†O¦ƒ ‚ ¢ †`µ†ªx¥. ± %±›b¦9 ‚ ¢ ž+µ]ªx¥§ ±–J+S±ˆK±,¢„Œ0± ‡±‚i£‡w‡ƒ@±ˆ ±Št±…t±ƒF±„|¢† O±‡P±Œe±‹±Ž{£ƒ‚>±†? S±^±†3¢5Œ0± ’&±Š/£ŸB‡ƒ@±v±™N±Œ`±‰N±Œ¢Ž_O±¡;±¡i± 4±Ÿ!£Š‚>±šc ±ˆc ± .! `b±‹H±‚K ±‰L±…±š"±†d ±"‚k ±"‡ ;y±‚±±±…±†l±Œ ±– ±›=±’±F±ž±‘u±¡  ± †:¢%„9†2 ± c¢%˜]†2‚~8±„±™  4bn6Z\‚L'IEw0i"‚T03oL.§„f‚‚#‚C/£‡p&£‚OS¢/9¦D17U]N±“±…U£—jR¤ƒGhG²ŽX CƒTƒ5P5#1‰2C$±‚ %Fƒ @ƒF%I8 ¦ƒY) e²“aà  ;±‰±², ‘ 4bn6Z\‚L'IEw0i"‚T03oL.§‘‚‚#‚C/£’&£OS¢…9¦‰ 17U]N±ªQ±Ž*£±UR¤‹ GhG²£\ •vƒTƒ5P5#1‰2C$±‡b ‘KFƒ @ƒF%I8 ¦Šp) e²¨à±c±„F ±™.±™y=±ƒg±‚E±c¤ ‚o4'± ‹_«m@GI!+@y¢„S­(" #X# (O/=R >±ˆn±ˆQ±‰g¤ ‹[4'± ¥J«¥m@GI!+@y¢‹j­ˆ-" #X# (O/=Rfn¤ƒ ‚ƒC%¤„ ¢„ Žgq±Œp¤q^±‹£‚CA.±„8±„±…`¢ƒ o²ˆà¢„/6±•g±C¢‹ƒ±o±‡²ƒaP£…DIƒj s¤˜‚ƒC%¤‰ ¢0Žg±Š±ž¤‰<^±—8£†iA±… ±‹~±›d±ŽL¢‡Bo²–wࢋ 6±¯R±ŒL¢  ƒ±¥"±—<²ŠxP£™hIƒjgp£†S%±†i±‚(£ nS¬Ru"+#‚„W¢†d±±<ª†6  ¢–l±¥Ž hOVƒ8¢‹?±‚C¥/‚R) 3¦‚ 3‚yŽ2 r£Ÿy%±—~±Ž\£ „LS¬—^Ru"+#‚„W¢d±›k±…Uª  ¢°W±ˆr¥£hOVƒ8¢ r±’i¥ˆ4‚R) 3¦–13‚yŽ2 ¢'„8'¢Š2P ¢'™<'¢žVP ±‡ ±( ±† ±Žx2±f±%ƒ±‚.§Qˆb ±†m±%˜±‰E§”uˆb ±(• ±(ªP ±$ ±¨J ±$™' ±$³ ±` ±© ±ˆ3 ±~ ±‚e ±‡± †[±˜ ± ‘±±y± †d±˜ ± ‘ ±±z ±' ±¨M ± †m ± ‘[j¢‰$‰T­„oƒIPMm„p¨ƒ'S/=kW/±ˆ2±‚±† ±‚D±„G±‚ ¢‚9‚c¦d9‚4¥V‚P‚{± ‰>±•±‚M¢„< l¢ž7‰T­žƒIPMm„p¨‰Qƒ'S/=kW/±”f±†~±f±…v±Œ±…x¢‘‚c¦‡P9‚4¥‡G‚P‚{± žB±ª3±’s¢‹S¢‚Y ¢ˆY±†`± ˆ ±“± F ±$˜ ±$±{ ±*ˆ, ±*˜R ± Š ± • ±‹h ±šB£ ‚Av £ ŠEv ±&†^ ±&ŽP ¢$U“<± ¢$š@“<±Œ±…EE¤q„*ƒ„s£&\²ˆð±‚±…(b !¤—„*ƒ„s£¦L\²[ð±†a±Š|±…±…x±“ ±Œd±§3‚¥@%„Jƒ_¢„$¢‚¢‚.£}„*£„^¢$j¢) £E9¢)¢ …{„s±„d±ƒ ±‡W¨ƒyK„Gv0‚f±‚« ‚hk‚OS¢_£‚+05 ¥•0@%„Jƒ_¢…„$¢™>‚¢‰<‚.£‘/}„*£†$„^¢ˆoj¢Œ] £‚<E±ŠB±„>±ˆ=¢‹6)¢ ”U„s±‹P±‡U±,¨dK„Gv0‚f±—«•I ‚hk‚OS¢;_£–O05¢(‡H ¢‡H ±,‚ ±,‰#¢*Œ‚ ¢*œ5‚K#¢ˆ:!±†2±‚!£‰S±„'©‘  #¢M!±±‰?£¢{S±0©¦? ±$•,±„*±†/ ±$¯±3±F  ±ŒQ²$ŠR` ²$¤=`£•E £®+Ets¨‡L‚vC±…± †i£'fj¢9R£/y{¢ˆj‚±…n¤ƒ/d6q±„+¢ƒD{±ƒH¢p‡1¤‚Hˆ.S‡'y±‚5¤…N‚e…v¤†O‚‚5*¢‘a[ |¨œ_‚vC±‹$± ž4£ƒY±ˆ1±„ ¢Š%R£„gy{¢—D‚±ŒZ¤‰7d6q±‹¢Šb{±‡}¢‰E‡1¤œ3ˆ.S‡'±Œ±—9¤›‚e…v¤–u‚‚5*¢¦[±²Y ±"A ±"…v ±'” ±'©±$³_ ±$‡m ±$¡X ±"_ ±"† ±*† ±*–;£`„" £‰~„"± ‡a± ƒw ± e± ‹ ±,ƒ ±,Š($¢„ [±†f¢N…a ¢›W[±;¢ˆ@…a¢…-= ¢x=)±ƒ0±"†L±ˆ ¢…nƒ ±œV±"‘U±¢šƒ ±†k ±6 ±‹` ±¥ ±ƒ ±‹~%±ŠZ±0±†\±ŒD ±™4±¥c±s± hƒzp¢ŠG±H±=¢L…4¥Hw&¢PP¢3$±Wf²"p¦),Iƒi@£H„<.ªt ¢:!±…v & +&2 K£‰j¯D FI ( : A.¤'‚I4x 5Ri0    9 .±ƒA¦+'ƒ0 `-BN-  †M‚,‡#L¢{"¢‡m‹±„`¦…3‰*!|±Œ< ‚¢ŸZ±†O±Š[¢‘a…4¥†(Hw&¢‰P¢Œg$±Œ±… ²‰&p¦‹@,Iƒi±4£˜„<.ª„1t ¢„)!±Žb …?& +&2 K£—uj¯‡0 FI ( : A.¤†V'‚I4±‡ ‡&Ri0    9 .±Š_¦‰'ƒ0 šK-BN-  †M‚,‡#L¢Œ"¢ ‹±Š'¦•Y‰*!|± ` ±…p ±Ž\‚m-2±• ±…±™±‰±‘±†±ˆD±Œ-±‚±Š"±„±‡}±‹±„Xm±‡?±‚W±—D±ƒ+±‡D±ƒh±ƒ±‚5±ˆe±„1±ŽS±†e±…M±†±†j±„±‡±ƒ6±„.±ˆN±™d±‹±‡k±”}±•,±…R±‡±‡~±‚±” 4±ª±Š±²E±’5±¢#±Œ±‘±˜a±„?±”K±ˆE±±–'±‰7±a±±…5±¯±†]±±‡W±†7±„q±‘Q±ˆi±-±Q±‹!±Œ ±[±ˆ+±Ž5±†s±ˆc±‘#±³O±– ±]±ª±ª_±‹+±Ž'±±„3±¨A±"±…> ±"…K±Ž ~ ±‡o¢-„| ¢-A±<²;0²:0±L±R² ƒi°±‘ ±šb²‰'0²„r0±…e±Š'² ‹n°±¥%H`¢‡J¢‚"±˜;±±„R±‚u¢…$‚£ŠJH„#P±/±~¢„B†d±ƒI±‚q¢Mƒt±‚W±‚s¢’ ±„±‰-±? c¢œ&J¢†‚"±±a±¡,±‘±‡¢(‚£¢H„#±„±„N±†6¢“†d±‰±ˆy¢‡>ƒt±†p±Š¢«o ±™±™S±£c ±q ±K ±&†E ±&Ž7±'ƒS±/ ±'˜W±¡S ±† ±Ž~ ¥ e… E‚h ¥ ‹… E‚h ±$ƒ) ±$‚}¢Œh‡¥1…¢&[§<Š B†*¢¢‚:# &§?ogAo£@§8„Sl."‚¢‚d£Cƒ*¥M‚[RQ¥N~#]§NqcB‚2±‚:¢ ’a ¢¡{‡± ¥‡_1…¢ƒ[§˜Š B†*¢ƒK¢‡g‚:±„±ƒ?±‚b§‰?ogAo£„T@§„Sl."‚¢‡‚d£†ƒ*¥†U‚[RQ¥„6N~#]§‡9NqcB‚2±‹¢ •%’a ¦‚c)‚m ¦‹O)‚m ± …} ± Ž'Q±‹e±ƒH±…±‡;±£„„a±ˆn± …~£ŠŒ*q¢‡)¦h%>¢…[…y¤…R]…S1¢†Ja± Q± x±œn±‹(±’R±ˆY£›g„a±—H± ŽS££zŒ*q¢’2¦‰Z%>¢š_…y¤›]…S1¢–pa±£=‚6«#Š@@… B£„ ±‡B±†¦‡{=LM= '±…{²‚𱎱ƒm±‚v¤~/±{±‚g¢J¨i O 5!£ƒ ƒ(£W‚D¢“;„*¢G&±‚'²!À±ˆ §„( H1#&+¢…Ž3 «•6Š@@… B£' ±˜W±’P¦“=LM= ±±A²„yð±¥O±‹8±†¤Šj/±†3±‘A¢‡;¨… O 5!£Š*ƒ(£‰,‚D¢­&„*¢‹P&±Š²–%À±?§‹? H1#&+¢™&Ž3 ±Š ±¡L£(…o £(šGo±%‡"±‹U ±%’+±›{o5¥ƒ)S ¥ƒd ¬‡ƒR  ‚¦‚'J(±…±ˆn 5¥”>S ¥Ž-d ¬œƒR  ‚¦ˆJ(±±'±„±ƒ%¢‡ƒ57 ±ŒZ±Ž.¢œƒ5±†±‚r± … ±&± J} ;£‹n3±—J£‚K3;¢‚5‚y£‚WƒVŠ*± _±ƒ±•'£‚#s„ ±ŽA =£¡3±°p£“`3;¢L‚±ˆ?£š"ƒVŠ*± ‡g±‰s±¯£,s„ ±£tB±“l±„f¢{<±‚±‚¢‚<‚O£ ‚f`¤ … ±B±F±‚w±‚X±„,²„` ±‹.±Œ D±­±Šr¢…j<±„@±Šm¢‰(‚O£…_‚f`¤†… ±ˆ3±…_±Š±‡ ±™_²‰f` ±$ ±$©{‹;*…H 0ve?=/`Ry88[‚y ƒ~§& 2."O   } [ JH;‚PWŒ\R3> %:    De‚=Wa1 4 33| „U RWK7R«C '‚f ¯08 H'I4¯U  Wc%- /t†7¢UU } ! ;3wg§/ K-©‚tQ"(7U S0 C 2jQ };d§5*/5¨.jLIko !S)!*o$.x (TMw@#ƒ~9%A%{U $ ;7 Q‚5& ¤y0©) -* 3£/±†#¨eJ ‚3„j©/ %:   Š7 De‚=Wa1 ‘I 33| „U RWK7R«†O '‚f ¯ˆ{8 H'I4¯  Wc%- /t†7¢‚xU Š9} ! ;3wg§„C/ K-©‰‚tQ"(7U ‹j0 C 2jQ };d§…*/±)¨ˆW.jLIko !˜)!*o$.x (TMw@#ƒ~9%A%{U ‡o ;7 Q‚5& ¤„h0©ƒH -* 3£‚k±¨?J ‚3„j©‡®ˆ|:" WSCZ‚ % 2š'PN(&$‚$M)1a2."0 V#8:q7u?8xb<«‹Wƒ' #„±ƒ$²„R`¢o$¢—_Z¥‚Y ‰ 6¢6ƒ4 c£¡…Ka±±Y²‹$`¥‘O‰2ƒ ±Š'¢…f‚U±ˆ¬›d$.)„†>„±‘~²ŠZ`¢…$¢±JZ¥—3Y ‰ ±\¢¤Zƒ4 ±&ƒ ±&‹  ±2¤‚!K+J ±†9¤™lK+J ±ˆE ±‘c@¦‚Yƒ F¢ M²„p±Š8³eC ¦—lƒ F¢ „:M²Œp±¢³©PCMc¢„ ¢”E‚0¢w7¢5g¦k: ƒ±± ¤fAFƒA±‡)£„#(=±ƒH¤‹gƒ+‡X±„4¢‡(|£ˆ5‚{±„1£'Š † e¢™, ¢­k‚0¢‹7¢‘Jg¦†w: ƒ±…;±ƒg¤™1AFƒA±Žt£‰w(=±‰P¤¥Rƒ+‡X±=¢œ[|£˜[‚{±Œ6£•KŠ † ±Ž| ±¦G/±„h¢ˆWJ£‚•^f± D ±•}¢“nJ£›k•^f± •h¢P0 ¢•c0 ±•p ±¯o 4¢„w¢…rv±„2£JŠ¢Q6±‡± ‚X£y ‚e±‘8¢I†O 6¢š&„w¢v±Ž[£‹aŠ¢ƒ/6±ža± ˆ,£ˆ ‚e±«#¢¢M†O ±‘f ±« £.’Y £™T’Y ±(† ±(›L ±+ ±¢>-±Œ_±ƒ± ‡±Ž~±… ±¡r±‹^± Ž^±¨i±Œ(¢]‘^±ƒ.²‚7Po ¢•p‘^±‹y²…tP±…$ ±ˆe ±™zE ±ƒ2±¢ ˆ(±‡t«‹Z*!Z;ƒWV ±‡!±„;¢ }±¡_«¡ *!Z;ƒWV ±— ±°D ¤ƒVZ²ƒFp ¤”kZ²Ž]p ±)… ±)ŠU ¦&{GhG ¦&‰{GhG ±”] ±¬( ±$–* ±$°±,Ž6 ±$†_ ±$ J±„g±)' ±Šs±)£K<¢y†~¢ „(0±‚^¥†S:-‚ ¢S†~¢ Œ\(±‹9±ŠP¥–y:-‚‡nƒX±”r£ƒ}¯ S‚@e …#­"-ƒpcCEˆ  I0B 2#‚~ ] % ' E @Ov ")(c1c% ±„« UU8"WG§,1„QH:²I°   .B3%A$ WB ?   !$ #5 D ©  .n%^¦ H ®x"= 0²ƒ€ D‚# 4 E„p !W£‚:M±„2±„¦+&0%¨ 8‚p¢„^ ,%P-G  w!ƒ*B 7 P91F=u:6, 23d@¤}'ƒ. !ƒW8‡$ "  (h@A3X¢†}­;a/)1; 9#­  HQZTR«E5" !K(I/¥…Q=G. !±‘+±˜n± ² ±‡c±†F±…± ˆq ƒl±ª£…"ƒ}¯™F S‚@e …#­‘7-ƒpcCEˆ  ˆeI0B 2#‚~ ] %Œ?' E @Ov ")(c1c% ±ˆ7«ˆ UU8"WG§‹C1„QH:²ƒ{° ‡U .B3%A$ WB ? ƒy !$ #5 D ©ƒ, .n%^¦‚IH ®‰d"= 0²‡@€ ‚# 4 E„p !W£‰&M±Š±Š¦ˆ+&0%¨„@8‚p¢Œt^ ,šP-G  w!ƒ*B 7 P91F=u:6, 23d@¤Œ'ƒ. •!ƒW8‡$ "  (h@A3X¢–3†}­†a/)1; 9#­ˆ  HQZTR«ˆJ5" !K(I/¥™u=G. ± ‡, ± ‘U‚±T±„C¤*“„K±…S±‚'¢‚`„f±±…%±‰$O ±ƒC±‚[±†²B ¢…E‚(¤„„#5¤‚l‚H‰k7±…*£Œ9‚ ±‚¦‚252¤% «†V>\#q6G ±¥g±‰J¤šP“„K±‹_±Ž[¢ „f±‰±Œk± o± ‡;±‰±ˆc±²ƒ ¢N‚(¤™!„#5¤˜‚H‰k7±Šq£œ_‚ ±‡w¦‰-252¤‚-% «šz>\#q6G ±&†v ±&Žh&±™¢ vD±‚ ±²7±ƒM¢ ‘D±„  ¢‚:B±‚i ¢“OB±Ž ±!; ±!„x ±‡L ±W )£ &±>±ˆH±ƒ-±‚n±‚4±” ¢†>‰<±ƒx )£–&±¥ ±‘4±‡F±‡#±Š&±©¢›q‰<±˜ ±/†: ±/š^ , ±,‡2^,¢Ž]ƒhª5{ ‚!E)±†1±‡±±Œ_±M±†H -¢£pƒhª™[{ ‚!E)±’e±’%±Œ±¡c±s±_ ±'”5 ±'©97X±±ƒ-£•L<±ƒ#±… ¢‚MD±ƒD±ƒ±¢‚„J¥,‡wC‡-±ƒ{¢ˆt†D¤„(„Mi¥&R‚D Z±–.±ˆ4£®AL<±”8±‘@¢ŒvD±‹H±Ž'±…v¢‰b„J¥˜w‡wC‡-±ŒP¢ž'†D¤”'(„M±†B¥•JR‚D ±• ±®9G ±“}´…`%P²\ЧD…oi ±…5±‰= "±©´‹l%P²‚Ч‹[…oi ±'±™c ±&ƒ_ ±&‹Q ±†} ±i±!‡ ±ŠQ ±£w3¥†,ƒƒ $¢–A<^ ±…: ¥›?ƒƒ $¢® <± ‡J±‹%± ±¤ƒi„f ± ‰±˜[¤T„f ±.e ±.„±ƒ±ƒ ±”-±Ž¢‡>/ ¢ /~2 ³k´¼¢‚8±‚R±J¢‚C³WL G±•-±…±‰3±‘+±†!±ˆk³ŒHk±‚9´ˆ¼±‹3±„y¢Š±…q±„¢‘³‡CL(Q± ‚e£ ‚(^)¤†K± Y /@ $ 3 8  #Z  &‚OD 5 R± ‡ £ ‹^)¤s†K±…1 ¤] /@ $ 3 8 ˆ #Z  &‚OD 5 ±&… ±&q ±$•Q ±$¯< ±$—g ±$±R@¢…c†;±ˆ[²*pA±’%¤‚j ¢Ÿ †;±‘y²„Pp±±§X¤ˆ1 ± ± ‚b ± ‰ ± †QI ¥tY‚#ƒ¥A‰Pl:±‚A¢ ’_±… s $¥‰?Y‚#ƒ¥Œu‰Pl:±‹-¢ ¬J±š±†:¤ŒD + ¤¡W +± †±„a ± ޱ•¢(7 ¢(¤:7 ±/ˆ! ±/œER#K¥ ~N±‚9¤„L„nƒ%¤B:>± ƒF  &±ƒ}¥ƒv ~N±†q¤“&„nƒ%¤ˆ B:>± ‰  º/Ž< º/¢`¥(‚ ¥(—E ±˜ ±±: ±-…$ ±-) ±&†" ±&Ž ±* ±* E‚}/:±•±…±™$±‰±‘±† ±ˆI±Œ2±‚!±Š'±„$±ˆ±‹±„]r±‡D±‚\±—I±ƒ0±‡I±ƒm±ƒ±‚:±ˆj±„6±ŽX±†j±…R±†±†o±„±‡±ƒ;±„3±ˆS±™i±‹±‡p±•±•1±…E±$±…W±‡±ˆ±‚±”" <±ª$±Š ±²J±’:±¢(±Œ±‘±˜f±„D±”P±ˆJ±±–,±‰<±f± ±…:±¯±†b±±‡\±†<±„v±‘V±ˆn±2±V±‹&±Œ±`±ˆ0±Ž:±†x±ˆh±‘(±³T±–±b±ª±ªd±‹ ± J±‹0±Ž,±±„8±¨F ±*ŒG ±*œm ±&†! ±&Ž I ±™o ±(“| ±(©/‚E£{‰r‰@¢‡!8±‰ ±ƒr¢‚B‚ ±‡±…|£T&¯]'zPS"‚.ƒ!‚}„ q¥‚'AV ±‚K±(¢ ¤ƒ ‚=)±ƒ¢2-±ƒn¥6$±„F¢…ˆ±†£ƒ4„±±†£‹e„fZ ±ˆu £–‰r‰@¢ G8±š"±Œ=¢Žv‚ ±’±B£ƒ2&¯˜('zPS"‚.ƒ!‚}„ q¥‰rAV ±†:±Š¢„B¤‘_ ‚=)±Š¢„K-±‹ ¥„I6$±¢žoˆ±›£˜34„±†^±0£  „fZ ±†+±‚ ²†€ ±—@±Ž=²Žr€¢ „Kg ¢ ŒOgƒn'd¤R‚d+¢!z¥u‡Šƒ,±¢bŠ3¢FƒJ{p±£%„]¤G|¢‚¥~„$ƒl%£Y(¢@„G/¥n=ˆ8~¢^K¢t(3£# ƒ+²#࢈ct¢nW¢d„£#„(qy§ˆ3*|…;¢"-¤ˆ7ƒ…` ¢œ+$±‡]¦ I(ŒE‚y±w£•z‡‚¢‘†w±ƒV±¢Š R£‘*ƒ¢† ‚-¤¡7‰ML‚d¢…B*±™8¤ ¤Qˆ …-£; „F¢—†p¨–~7‚">(qy§˜Y*|…;¢†{-¤œ[ƒ…` ±…C ±‹K ±ƒ ±œ( ±a ±…7±ˆ ±‡n±ƒ{±B¢ˆq4±V ±™!±’±ˆ!±‰¢ <4±‘| ±(†& ±(›Y ±(’s ±(¨&¢•n‚H ¢¯‚H ±$‹ ±$¤y ±'“ ±'¨#¤+Y ¤q†C ¤…2Y ¤‹†C ±(…| ±(›/£/†m £/› ±ˆ; ±‘'±Ž*± ‚g ±Ÿ?± š2 ± ±©3Y(£‚5‰c„3± #±ƒR;}£b:)£ƒ"1¢&‚| ,£›[‰c„3± ˆi±›±„*±ˆo£¥f:)£‹"1¢¤J‚| ±" ±"…A ±b ±©#±W¢"ƒH£‰[ ±¤j¢"Œ£Ÿ¢$†\ ¢$ G ±( ±(–E ±\ ± q ± ˆ^ ± “ ±(„w ±(š* ±(„y ±(š, ±(„} ±(š0o5±ˆ¢‰'ƒr£‚Y>¢ f©ƒ*<qI ‚£…oAO£ ‡NcŽ=±‹A 5±¢š<ƒr£ˆ"Y>¢ „D©šR*<qI ‚£Ž[AO£ ¡9cŽ=± t ±… ±ŽV(±$¢ƒK\¢‰7=£j!¢…Œ ±„C±Žl¢„Z… )±’9¢Œ\¢”N=£„'!¢ŸŒ ±L±Ÿ¢˜~… §„/S/# §ŒY/S/#± †±%‰s ± ?±%ž1³‚3Û¬‹7, ‚9 ‚Q ³…Û¬£, ‚9 ‚Q §„6S/:lY/ §S/:lY/ ±Y ±¨ ±,| ±,‰2±ƒZ± =¤‚o>^…]¢,‰{ ±‰f± ™¤—s>^…]¢”P‰{ ±ˆ8 ±‘V ±ƒ, ±‡E±&rO%¢”|‚F£‚3f±… ±„±‰\¤‚Y4‚0±‹1 %¢®"‚F£‹"3f±‹±Œ±ž`¤—7Y4‚0±›W ¤'‚CŒ=- ±‡ ¤'—GŒ=- ±$‚*¥ƒ;…c‚"ƒ8ƒu£‚S&K¬Fƒ3 dP[‚kX3‰*¢†dŠ£`‚„¢z‡±†t±‡]¢†@Q¤Tg#Q¢…`±„G£ƒZ8 ±…¢‘=P±†j±†{¢ˆl…#±‹d¢ƒQƒ&¦†=„4IK‚Y ¥˜N…c‚"ƒ8ƒu£‡Z&K¬š4Fƒ3 dP[‚kX3‰*¢—yŠ£Š+‚„¢Ž.‡±‘±a¢‘WQ¤…3g#Q¢+±“!£ˆ8 ±W¢«(P±‘s±Žm¢p…#± E±†=¢Šhƒ&¦ša„4IK‚Y ± ‚} ± &²“c€ ²­ €²* ²*Ÿ5 ±ƒ1 ±Š ±$– ±$¯} ±$– ±$°Q& &"ƒ"   & &"‹  ¢,…CI ¢,ŒZI±†I ±F ±„$ ±‹L ±š& ±#† ±#Žd ±†? ±’s ¢‚CE±‚u ¢“XE±Ž ±Š!±$‚_ ±Ÿ4±$h²ˆP ²#Pa .± E² ˆÀ±…l£'±²…Y€±ƒb±|±^±* .± …k² |À±ŒX£†{±‡&²ŒJ€±‡{±±–b±ƒG ²'„4 ²Š.  ²'™8 ²žR c (;Z¢3¢…wƒ*±‰e±….£?~³ Þ£ˆa‰g ±.„A 0±‡'±„¢š¢‘ƒ*±ži±Šu£ˆD~³‚(Þ£”?ˆa‰g  ±—d ! ±—l!±¢D„_±‚b ±ƒ`¢™„_±Š-±…±„ ±–,±, C± „\±‚$c±D±;© ‚ ±T§‚‚xw<¤‚…^ ¥‚$5!…P± F± ±Š(±„±‰±„Z© ƒ[‚ ±Š)§'‚xw<¤—…^ ¥—5$5!…P±•;9±…r¢ ‰*± u±ƒu~¢ƒ\0 ±8¢˜T‰*± ˆa±‹±–¢”0   ±‰> ±ƒ/ ±‰; ± …~ ± ' ±"‚S ±"‡±&…'±ˆh ±&±™ x ±…0 ± ‚ ± †6 ± ‚ ± †7 ±$—@ ±$±+.S±” ¢†l„|±ŠW±_¥‚„Q±‹R¢‚‚I±†¢E£„ (‚BZ±‹n£…Š 8±‰U±…B±‡[±’x V±©¢˜„|±— ±„¥Šo„Q±š,¢‡g‚I±/¢„£Œb(‚B±ˆL± r£šRŠ 8±™{±‹±`±§ ±/ƒz ±/˜ D &@ƒ--(< D &@‹-(<±(ªrz 7`ª s '±ƒC±‚£‚QO¢‹ƒ%±†>¤„‚!±†f± „0  :±Tªƒ9 s '±‡2±„L£‡ O¢™tƒ%±*¤Šx‚!±Ž± ‰w'±…:±„8¢†„, ±–O±O¢œ„±†£ƒN £ˆN ¥„rƒ PWƒF ¥žƒ PWƒF£6 £’K¢‚/Y ¢ˆ;Y ± †z ± ’ ±&…; ±&-S &±Žs±ˆ0± •{± …f±…V±‚d:±‘h±„$±“ (±¤±”d± ­F± ŒR±ŒG±†}±ˆ,±§±‹;±§@ ±(‡/ ±(œb‚z8¥‚%‰6‡-g±™¢…[£‹ ƒ0‚'±ˆ¢xƒ~¥†qŠi±W±N±ˆU£„W‚-±ƒ±„ ±D¢‚n¢2q¢£‚~D[£ƒa‘3¥„‚ ¬‡zg‚ =‚(‚7#F£~‚?ŽLf±…B±‚ £B~ ±…_¨ƒ&y\Š„(ˆm‚,†e±†$±ˆN£„RW±„±‚t£‰‚R‚©„`i8v a!£‘E‡9j§ˆX}_wc%±†G±†q¬†|   ;I,!±„i£‡kƒ±…D±ˆt± „V²/j ²/– ±"ƒA ±"‡v‹Y#…M &J#4EC := .Q  ?NEmˆ4   H)ƒ6 CI‚CP0"}‚I…)‚W #  )!A -82FIp# L *W-ZQa  ƒl " 8AXD R£„op¨+a2t8«‚]Q% 0_+*„r¦ I ,S +  !_  1 K6%= ; ' R&ªkc8  ©‚,A ,OPF ! w 0D]T   X ƒ1¨ )?14  ( *   < 9 GQ2 %¯ 7\ + 6 81/ r„pR&+'= Ny7  U+ N?2&*zb8¦Z …cL£^ ‚¥†%`a¢‚3?­]„1*   S…D §‚v ±ƒ¤p4 ¤. +¥. ƒ3j±‚±V 'ƒ~7‡7&Y? HZ  !r4«7 l‚AAU&^­5+- !3 $B(¥…y) 1  ,)5< ]c8 ‚JKP0/ .‚2 + 20/  S¬JF ?# .!#, %‚K &s@6/1X { ±’H±‘±„N±”^±±…B±¯±ªl …c &•/J#4EC := .Q  ?NEmˆ4   ™n)ƒ6 CI‚CP0"}‚I…)‚W # ‰/ )!A -82FIp# L *‘,W-ZQa  ƒl " 8AXD R£Šop¨ˆY+a2t8«Q% 0_+*„r¦‚0I ,S +Š:  !_  1 K6%= ; ' R&ª„Bkc8  ©Š0A ,OPF !‹5 w 0D]T   X ƒ1¨…j)?14  (‡P*   < 9 GQ2 %¯‚i7\ + 6—U81/ r„pR&+'= Ny7  U+ N?2&*zb8¦ˆ% …cL£ƒ} ‚¥`a¢†k?­7„1*   S…D §‰b ±ˆX¤‡x4 ¤„G +¥‡L ƒ3j±…L±Š+ ›ƒ~7‡7&Y? HZ  !r4«‹@ l‚AAU&^­ˆ'+- !3 $B(¥š}) 1•= ,)5< ]c8 ‚JKP0/ .‚2 + 20/  S¬†F ?# T!#, %‚K &s@6/1X {%± ‚k±‡%±‚ ±u ± ±Žk±†A±ž ±Œ] ±¦ ¢'-‚±‚Y ¢'¥1‚±Š^±$‡&±• ±$¡±ªEL¨‚^ˆ'[‚U±$l¨{?ˆMƒF „{<£‚4¥2 ‚ M¨—qˆ'[‚U±$Œu¨•?ˆMƒF š.<£ˆ ¥‰7 ‚ +±‚q±ƒ>¤†ˆo" ±†8±ˆ±)¤–9ˆo"¢ƒX ¢ˆX ±’ ±¬%±‚b±‚ ±ˆ6±ˆ pu£…Žb¢dE±Š.±ƒ ¢ƒ…`±„c¢‡N±†t£ˆi‚F¢‚~ƒ*¢ƒ.±†;±ƒN±ƒ#¥qc‚L;h±ƒ~¢M„]±ˆ¢ƒk¢ƒƒ:¨Nˆ )ƒ& y v£š%Žb¢†kE±£T±‹k¢O…`± ¢R±’ £Ÿbi‚F¢ŠIƒ*¢‹}.±•±‰V±‡<¥‰c‚L;h±ˆ3¢§8„]±“¢˜k¢Š*ƒ:¨”rˆ )ƒ& y¢lƒ" ¢†@ƒ"9±%„t£47u\±‚b£ ±/¨L ±%}£•87u±†#±‰y£”, ±> ±©d ±/ ±¨U ±†) ±ŸO,­ A7%k±„T ­… A7%k±r ±#ƒ} ±#ŒR±%z±\ ±%±–`+¨' $ o ¤‚ 6 ¨'¥ $ o ¤Š! 6 ±$”A ±$®,=X±‚ ©„t0 £ ‚^©ƒr0   4<(   M+ I@+V±<±ƒs¥=„Lˆ ± Z±—©– 0 £ŠG ‚^© 0   ‡N4<(   M+ I@+V±„±‰:¥‘B=„Lˆ £ˆ6 3¢†Y £”j 3¢ D£)O £)†UOp*†L C7  …G o%…G‚. Y¤O[J  #\8"'‚*b(…xNƒu¯-r"w iN*%G©F)e„Š7«A5 ‚K j¥?/)  &<? T" %9§y$ 0!  %$)!#E !$< % - 5'h!!  $,  )G L1  § 'I‚ ""2ƒP(r# 'M#  ¤4ƒI¨   £„{G L evv$.„Dbb9b8¬ f!$2 G¦SQw"[£=£W6±¥ƒP"t§Md) '  %5u2 M4g/t&(JP    ,!+%8 I#W`  £„-  =rC:|  8¢(ƒ9±ƒ=­:w!"2®3H XMD‚‚'0 V  3  Zm - ‚dc .45S K S 0o PoA<  ( qkB ­jJ†%¬I? (ƒ&  2‡U(O;ƒK  o ,  +Yƒ# U'‚…_<‚*-# 5e $Av! 6 B*.  q g!1-%5A!(36 J ,8²ƒp¨m  ±†_ 0±¢3±Œ!±‘(±˜s±ˆU±–7±o±†k±‡g±_± ³\±ªo †k •(C7  …G o%…G‚. Y¤…V[J  ™I\8"'‚*b(…xNƒu¯‰Kr"w iN*%G©‘#F)e„Š7«†A5 ‚K j¥ˆb?/) ŒD &<? T" %9§ƒ$ 0ŠJ  %$)!#E !$< % - 5'h!!  „4$,  )G L1  §‰$'I‚ ‹%""2ƒP(r# 'M#  ¤…ƒI¨  £ˆ]„{G ˜ evv$.„Dbb9b8¬ƒ>f!$2 G¦ˆQw"[£ƒ}=£ƒv6±ƒQ¥ŒP"t§†d) '  Ž5u2 M4g/t&(JP  †x ,!+%8 I#W`  £Š5 ‡ =rC:|  8¢„Aƒ9±Š[­„ow!"2®‰H XMD‚‚'0 V™u 3  Zm - ‚dc .45S K S 0o PoA<  ( qkB ­‹sJ†%¬ˆ;? (ƒ&  –"2‡U(O;ƒK  o , •@+Yƒ# U'‚…_<‚*-# …|e $Av! 6‘2B*.  q g!1-%5A!(36 J ,8²‹p¨ˆr  ±› ±‚¤‰)…) ±†¤š%)…)+¢†q¢… ‚c± ‰± : ¢%q¢‘?‚c±  `± …S ± ƒ6 ± ŠT1±‘±‚?± ‹U±{ ±Š ±¦+±…±…± š/±‡B²&ƒuÀ ²&‹gÀS _ª H ¤Q…'£-&;± ƒnz¥ƒ‰?±   T !!‚&= 3 * ¤‡^L H£lT‚R¤Ž`!~ ± „K±i eª ‚-H ¤‹BQ…'£ƒ &;± ’H±ˆ¥‰?±Œ) ‡{T !!‚&= 3 * ¤L H£†3T‚R¤Ÿ!~ ±‰) ±ž< ±&…z ±&l ±e ±†x1±‡¢†6…X± n±„O±†J ±4¢ž…X± ‡v±ž:±Ž< ±$A±ƒJ±Ž0 ±$©,±“p±¢T¤$ˆ † ¤$¡x†3±ƒ¢ƒ~q±ƒ!±n¢ ‡Oc ±˜¢›Iq±‡±„*¢ ¡:c ±ˆE ±‘1 ± ±…9O$¢‚Jƒ±‹,¢ Žˆ±‚ K±†(£ †C@± &¢—]ƒ±œA¢ ¥Mˆ±Šv±‡7±F£ –i@±†] ±‡P ± ±–¢‚'„0 ±­b¢—+„0 p* ±*‘+¨‹ r  ‡7± †gn ¨  r  ‡7± Žk±†5 G±‡|±†£…B9Z£ ,‚gV{±‚ ¢h0£„*²ƒRТhB§ƒ{w0‡|(a¤†"‡M±” J±±—&£‘v9Z£ ˆw‚gV±„j±…?¢ƒ$0£Š„*²’,ТˆYB§fw0‡|(a¤›&‡M±¨3`l±Œ3±‡<±†j±†2¢ „o±Š±‚±„(±‚l±`£ƒJ…6‚>±ƒ¥‚ Jn±‚£?‚.±ƒ@±†¢‹7…P±…t±‚K±…¢‰† o±¡F± b±—±’f¢‰„o±–±‰H±›s±†±†£’$…6‚>±‰t¥‡`Jn±ˆ£‡0‚.±‡u±Žp¢¥"…P±}±Š=±Œ±‚<¢+† ±%ƒ ±%Ž ´‡UP ´˜4UP ±„* ±›u ¥("x | ¥(¥;"x |c /±ƒ¢ƒ3±…p±„M±‡±†@± ™1±‚b±E¢‡}‚r±‚k /±Œ=¢‹3±6±9±•]±,± ³±ŠT±¤x¢˜#‚r±Šp+¤Œ- n£‡| ²‚Z@ ¤¥S n£G ²‡@ ±(5 ±(¥h3± ‡_±Œ R±s±’P±’2 ± ’±še±…±›^±¨±¦V±…¶>p ¶’Sp ±‰C ±¡ ±„A ±ŠMxn±Š¢‚E±‡§ Fr‚¢-„$²T`¤8b‰1±‚1¢\„1¢‚u4¤/+!²0p±ƒC±Š­#„B„ A ,#¢[¢‚sv¢/±„/ ± –2±¯ {±Ÿ¢‹c±‘=§‹ Fr‚¢‡s„$²„2`¤—S8b‰1±†i¢6„1¢‰a4¤„H+!²‡Np±‡x±¤­‹,„B„ A ±ˆ±•'¢–¢ˆ:v¢U±‹FK¥ˆS ± †¢…'¢ Mm­z†Y)ƒ) $# ¢F¢R ‚ ƒƒi#‚8n/2'ƒ".  M¥• ± O¢Œ^'¢ …fm­–~†Y)ƒ) $# ¢†¢‚o –/ƒƒi#‚8n/2'ƒ".  ± †p±„P±… ± ’±‹<±‹} ±‰- ±ž@?¢’? ¢ƒkƒB¢ˆuD±Š¥-,leƒK ¢«e ¢ŽƒB¢“~D±š5¥ˆD,leƒK!¢†~¤ ‚a„;  ¢Z†~¤ j„;   ±‚3±‡g£!V3 ±‹±–A£…hV3 ±ˆP ±‘< ±. ±.ƒ: ±’b ±ª- ±$™ ±$³ ±„(±-‡ ±‰/±-›8)¥.&0/± ‚(±†: ¥šT&0/± ‡±‘C³m{ ³£{ ±‰J ±š_+±„3.¨… Š ±g±‚Q¨š Š¢ˆ(ƒ3 ¢¡Nƒ3H ±’±ƒ±Š\/¢Aw¢„'K±ƒ%± H #±«@±‡5±•s±‡z¢„0w¢Š/K±ŠC± ‡~ :¢“w‚¤‚=:7±‚2±*§ISw3a¦H…0`ƒm±„¢B<£ƒ=  ?¢«B‚¤Š:7±…Q±ƒf§‰5Sw3a¦"…0`ƒm±‰s±„7¢„w<£‰  ±ƒ` ±ˆg³lL ³¢L p" ±"…%µƒx¨ µœ+x¨ ±) ±)†Iy 7¢ef¦†=8&ƒz‰1¢ ‚Mm¢`B¢…T$±Œ6¥w^±–B =¢ƒCf¦ž8&ƒz‰1¢ˆX‚M±„\¢„"`±‚~¢Ž@$±›¥…^±°- ± ±©0 ± ±©8 ±…3 ±‘g±$”^±†N ±$®I±‘W±'‚fY ±'—j±†  ± ²$ˆ} ±C ±š2²$ž ±‘i ±&… ±&± ”aJ©‹Z…i,  ‚@¢ƒDƒ±W±‰0±…±‚B±…*±“ox±ˆ ¢ˆ-¤;„…^ƒ±W±„7 O© Z…i,  ‚@¢œjƒ±¡l±”G±Œk±ˆ±‹'±„C±­Z±Œ± ¢`¤a„…^ƒ±‡0±‹N ±‰' ±ž:%±ƒ\± †i±„P± „m ±Œ'± Ž/±Y± ™ ±ƒb ±ˆA,© +BYLzP±#‚%  ©† +BYLzP±#‡l¢$‰d ¢$£O²”rP ²¬=P &" ±"„[ ±(V ±(¦ ±'„| ±'š£/„  £/˜-  ±ƒ±ƒ±‚ ±Šd±†±‹ ±ƒ( ±œN M" ±"… ±*‹b ±*œ ±‰o ±£ 4* ±*Z)± ‰!¢†'±3± ± “J¢m±„±¢Q D &@ƒ.-(< D &@‹ -(< ± ‡l ± p-±ŠJ±‡h±‡`±†;±‚ ±£p±‘±d±Ž-±‰f 0£^j‘8¢‚ƒj±&±„i±±†R±e±‚)£Š‚t±†2 1£›j‘8¢“ƒj±…L±±¦_±•,±‡m±†^£šŠ‚t±–X ±/ˆ ±/œ;A©ˆ+PcƒC#¬ ‚G ©¡QPcƒC#¬ ‡& ¦…%ˆ]3 ¦ž=%ˆ]3!¤ˆ#P_„± ‚[ ¤¡IP_„± ‡:!ª ‚=y-,5u ª ŠAy-,5u ¢3± ‚~ ¢¨73± ‡]¢‚S# ¢‡2#¢‚K# ¢‡*# ±0 ±¨Ve .¥…ƒPg„¢†[#±‰$±ƒ±‘q+±„#±„d~±“] 2¥žDƒPg„¢y#±“M±‡d±©<±•^±”I±‹{±ƒ±¨£ˆ*Pc £¡PPc ±( ±¨N ±K ±¨q'±9±&Ž¢ƒ+±’h ±†@±&£R¢“Q±§ ± ±¨F ±-†y ±-Ž~ ±‚N ±‡ ±-†z ±-Ž¢…% ¢ž<% ± ±¨> ±”{ ±ªƒ*N£ŠrC‚x±…±[£†<'ƒq±ƒZ¢†C¢+4¦T„c2¯Š`{j:‚Or -:]h ¦&g£„ >¤*7a¢‚¦<1‚k«/V R(0­-‚I !,3LX‚g2£HƒT¤R„g\¥By«4‚bz!OO±‚j¦0H„W±‡4±‚P±„±Š U£ C‚x±Ž&±¡p£’p'ƒq±ˆ¢‰ †C¢4¦‰„c2¯¢+{j:‚Or -:]h ¦ƒXg£‹M >¤…7a¢„K¦Š(1‚k«…K/V R(0­‚I !,3LX‚g2£‡4ƒT¤‡C„g\¥…2By«‡R‚bz!OO±‡¦‰H„W±’=±ŠB±™#±ž= # ± „I ±$ ±$©|¢ 3 ¢¨23 <±± d¢3J¥z’ZO¤*ƒ4#I±d¤6±… ² ¢±‚² Ð ±'ª ±‹9±±¨O D±š<± Œ{¢ƒpJ¥še’ZO¤Œ3ƒ4#I±‰V¤• 6±Š\±…d²‡$¢ˆ ±„"²”/Ð ±‚u ±‡T²‚R€ ²‡1€ ±‚} ±‡\¢‚J# ¢‡)#±… ±d ±ŒT±ŠP ±[ ±„9%o¦„% ? ±… ±†{¦‰y ? ±‹!C±ŠV¢„Z‚-± ˆ6±…C¢Š-x±ƒX5 ±£|¢“4‚-± ‘ ±Ÿ.¢Ÿ1x±™ ±‡LN*±ƒ ±*t±‹ƒA[£kƒ)ŽQ¦‚e„R7‰bƒF¤ƒ25Y©…* ƒE L;¢ƒ~F¢‚U‚I¢„!H±‚±‚y¢„(‚1±†T®ƒ+Š [6q0‚$¥qU>±‚j¢>!¢"‚%±Œ ¤)'‚'±‚¢…¥M[-4¤‹;‚r‚l†¢‚"¥Šo‚0†z-¢‚P±¤„<„A0‚±†Rj§‚K ƒl…„^‚J _£–~ƒ)ŽQ¦œ „R7‰bƒF¤ŒP5Y©–? ƒE L;¢Š F¢ ‚I¢ŽJH±†'±Š}¢?‚1±Ž®šP+Š [6q0‚$¥ˆ±†Y¢Š*!¢…Z‚%±šf¤‡r)'‚'±†¢ˆ#…¥„ [-4¤¥&‚r‚l†¢Š¥Ÿo‚0†z-¢–6‚P±†N¤”b„A0‚±ŽW±ƒ§•A‚K ƒl…„^‚J ¢…=„0£„a- ¢šP„0£›aa- ±$‚k ±$œV9±„j¢‰%…¢„sƒ±#‰¢‡j‹ ±™}¢¢K…¢Žƒ±#ž¢œ‹³"‡± ƒ< ³"„R‡± —`5±—±‰0¤ ‚FA)²‹€±‡g ±±%±šE¤ OA)² €±¢ ˆEx ¢ ’nx%±Œ ±„±„k±‹ ±5±ˆS±™o±Ÿ2¤†'\j‚ ¤r\j‚¢(”Z+ ¢(ª +'¢#†o±c±±“. ¢#D±¢g±¥K±§R ± ±¨E ± ‚p ±  ¤…:ƒƒ7„ ¤ž`ƒƒ7„ ±$„ ±$s±ŒR¢!; ±g¢„V; ±D ±šj ±‰r ±£ ¢'‚s;¢0ŒZ ¢'—w;¢”TŒZ¢ˆ"ƒ/ ¢¡Hƒ/¢3 ¢¨63 ¢$•j±ˆ0 ¢$¯U±˜V²#‡o ²#D £/„M £/˜q ¢‚i²b0 ¢Š4²ŠN0 ±/‚ ±/–?‚²‡2€±‚¢‘\†r²‡0ࢉ`Q¢ƒP¢„o±‚.¢ƒf[¨‚+….‚(…$„±6¢ˆ~}¢f!±+¢•:E¢V‡,²†,À£\‰K‡H±Œ:± ¢z…5£0…B*£*…%H£px ²œE€±‡ ¢«†r²N࢚uQ¢Œ¢±†T¢‹,[¨™v….‚(…$„±„h¢—X}¢„#!±…`¢¯%E¢Œ_‡,²ŽÀ£•`‰K‡H±¡m±†R¢’ …5£‡G…B*£ˆ/…%H£ƒ xCB ±‰/±„z ª„I!0$> ª!0$> ±,‚e ±,‰|'¢Žg3¥ ƒ:QYT±˜a ¢Ÿ|3¥ ŠY:QYT±²L ±Œ[²ƒÀ± ±¡n²ˆqÀ±ª ±ƒ` ±‰h £… /:±†q £U/:±’ ± ±¤!±…y±„ ±”S±ˆA/±’J¦‚ ƒ±„FT ±«p¦ŽG ƒ±2± … !±”3±˜D¢' †Q ±©F±±j¢'‘F†Q£(‘#% £(¦V%!§Œm5±ˆ §¦5±e ±%‡K ±%’T±P±„ ±„.± ±%„ ±%± …m±–t ± ‘±°_ ¨"5:o7 ¨"…j:o7=±‚t²†^ె²…5À²…6À²ƒMð ±(²Ž$à±L²Œ!À²Œ'À²Œ"ð ±V ±„4. ±.„= ±.‚$ ±/†C ±/šg ±\ ±„: ± * ± ˆHz7¤ 0ƒ"¨v F\A±‚J¢‡kD¢…~†.±ƒ8§‚_-C'¢ ‚Xg ± ˆO 8¤ „.0ƒ"¨§A F\A±†9¢WD¢”X†.±Š$§ˆ,‚_-C'¢ ˆg ±„f ±Šn7±X¢%ƒ!f²<`§Œ/Nf„BV+ ±†_¢%˜%f²ƒY`§ SNf„BV++±…)± ‹F±‚K±Œ ±Œo± 𠱇p±œ6±œ9 ±z£ ƒ. ±© £ ‡r. ±†. ±±a±"‡A ±žv±"œE„6$‚¢ƒ+†O¤x 9^§ˆmU#>‡Ov‚¥‚ X+>ƒI£‚ †z‡¥>C‚(1±V±[±ƒ¢„'ƒ+±‹¤‚[‡g‚7ƒ:±ƒ%£&|±‚±ƒG£\?¥†‚E-j£]+D¥j1(IX¢ƒ91¥m‚F,#¢Y¤‚$nN‚y¢[£-W‡<§‚ $‚ ‹Vx9ƒh©:Fu+yOuPk§):& {*e©: c†?†G‚Zƒ§‡4‚ ƒH¢8…J¦(EA-e£ „Kj¤‚2„.>„p ‚¢˜>†O¤… 9^§¢U#>‡Ov‚¥‹(X+>ƒI£“"†z‡¥rC‚(1±ƒy±Œ±‡:¢Œ+ƒ+±–¤š&‡g‚7ƒ:±Šp£…|±„B±Œ3£…R\?¥”`‚E-j£ˆI+D¥†>1(IX¢‰A1¥ˆm‚F,#¢…3Y¤‰BnN‚y¢„£‰W‡<§›u$‚ ‹Vx9ƒh©‹CFu+yOuPk§‰:& {*e©•> c†?†G‚Zƒ§œ54‚ ƒH¢^…J±…q¦ˆ?EA-e£‰„Kj¤–V„.>„p ±* ±* 54¤VzC±‚J±Š/± ƒC±. ¤…]zC±‹6±™ ± .±‰ ± ±¨< ±/‡ ±/›+ ±Œ? ±›c.±†± †¤‚3z¢‚$¥`M‚4¤`‚Pƒ± ‰2±†C 0±ŽY± b¤‰~z¢…t$¥‡LM‚4¤‡Q‚Pƒ± ™X±Z ±%†o ±%‘x£%  £%Œ‚ }¢‡,‡V¦\/Y;  %| "p:hƒ v""ƒ-B&:‚rƒ N¤‚"U£†|±„s£ƒ.±#¤ ‚dk(±6±„M±‚¦%ƒ1C±“R ±²O ¢œ?‡V¦…c/Y;  %™.| "p:hƒ v""ƒ-B&:‚rƒ N¤ˆ.U£Žg|±‘'£‡p.±„B¤ †Cdk(±©!±V±‡J¦‡<ƒ1C±§v3±ŒQ± ‘£‰p±‡f¢†-: ±f± ¨M£—`p±¢D: ±&†' ±&Ž ±'3 ±'–7 .±ˆF² À ±…5±— ² ªÀ ±$‘J ±$«5 ±$‰A ±$£,¢‚ …[ ¢e…[&P£9ƒ d±”c±†Z±ˆ±…C±‡ ±„ ¢b‡D£„j‚-‚8±ƒ'¢+s±‡±†d±ˆM±‰}¢o„p± Q£–Lƒ d±® ±—o±”<±l±’ ±ˆ¢¥-‡D£“D‚-‚8±Š¢ˆs±’±ŽV±Q±Ÿ0¢‘„p±•1 B«„_ H‚BXxXh‚`7±…Jª…:"‚`   £„L…£ˆ'±„x¢;!£†q B«ž H‚BXxXh‚`7±‹Vª0:"‚`   £U…£–ˆ'±š+¢‰@!£› ¢ƒ+ ¢‡}+%¢†x‚#±†y¢ƒ-C ¢“,‚#±’¢‰C ±&…v ±&h¢'“; ¢'¨; §(“U-7  " §(©-7  " ±/ ±/¤(¢+ƒ!C ¢+ˆzC ±…$ ±‘X±‰#±(„d ±š8±(Œi ±%‡{ ±%“±‡1±‚* ±œD±™u¢+‚iC ¢+ˆBC£-„g‚E £-Œl‚E ±ƒ1²(8 ±‹|²(•\¢+ƒC ¢+ˆnC¢$Cx ¢$š.x ± o ± Œ±‚M±ˆ% ±‹k±Ÿp¢( 7 ¢(¤@7¢/’H ¢/¦l¢+ƒ C ¢+ˆdC ±/ˆ ±/œ<¢ƒ!+ ¢ˆ+3·…@Qu£!‹x¦‚ b ·‹LQu£! |¦—<b/´…L´!‹}Ê¥‚ d ´‹X´!¡Ê¥—=d ¥(‚ d ¥(—>d¢+ƒC ¢+ˆ\CM#¢4‚v±‚ ±Œ7¢"o¢iƒe±‹`± “±Šp %¢©Z‚v±‹+±L¢‚Eo¢‰Uƒe±š:± ¬|±•y±'±‡! ±'¤±&¢+ƒC ¢+ˆ[C=±ƒA±…±± 9±#±ƒw±…f ±ˆH±Ž=±…;± …n±†j±”±š ±'”8 ±'©< ±ƒ ±ŠW ±/‡ ±/›, ±/‡ ±/›.+¢–6=¢ˆ …;±ˆx±‘Q ¢®=¢¡w…;±”±§ ±-‡1 ±-6 ±'”i ±'©m ±&„8 ±&Œ*²/„+€ ²/˜O€ ±†9 ± ±‡¦„0$. ±¦›{$. ±/†x ±/›/±ƒr±…q±„;±„w¢ “} ±™±Ÿ±‹'±‹h¢ ¨Q}-±‚4±…±‚{± †±…; ±›Z±‹±/± S±šn#¥• .F;¤B_ ¥®/.F;¤„_ ±„~ ±I²† ²’8 x# ±#‰M" M£ ƒ&±†F¤‘'@¢o‚9±e¢ƒ]‚&±ƒT¢„(¨‰d3…m- ‚ ±„K§5 3? m¢ˆ{‰g P£ ‡B&±‘]¤¨r@¢‰:‚9±…¢’7‚&±ˆ ¢Œg(¨žh3…m- ‚ ±‹b§ˆ: 3? ±ƒ ¢‰g £‚3Y‚Q±ƒ$ £ˆ?Y‚Q±M "±…!±…%±ƒ&±¢‚fMC¤ŽeB ¢ ‰)¢ j‚X±J¥‚# ¤£xB ¢˜W‰)¢ ‡>‚X±‡R¥†X ±! ±!„@  ±Ž¦7‚v( ±œy¦†?‚v( ¤…a +±'Žp ¤št +±'¤#±…± ƒT ±Œd± Šr  ±™9j 2¢Oޤˆ9‚Z‚±ƒL£†Jƒ][£–">±…?¢Š„u±(±‰ 3¢™uޤ’0ˆ9‚Z‚±‰X£‘aƒ][£­m>±Ÿ*¢Ÿ!„u±ƒE±; = ±ƒo ±(ŠP ±(  ª†lB. ª7B. ±-‡q ±-v‡n*ƒk¬ƒ=ƒ…WT ‚Nv@-±‚ ƒ| AX%Wb e4…108D%*9F ¥…Mb­…† ;]M$?N /¢j‚±\¦‚_ƒQ-&$B¤lJJ§`ƒ2 ƒ01¢„?ƒ,®pƒ.kk>x7+p£S<«"y2% „' ¢j 2ud&‡%‚(i K+¢s«^.) <¢‚£si±kq¤%x&^©pƒA,yzOw=¥~HƒC ¦‚Iog*&§S+ M¥ ƒ\¥du\¤j‚iS‚0±‚l«;$3„(9(:3" ‚)‰lƒ<(C: Es0GP _¤$1…¬ˆQEZ‚`@„\ ƒ7c+`1'.K„Jz¬‚#‚p$‚kQ7?<ª#ƒ$%9 &q±ªy>‚6e+^‚‡1 ƒ|¬˜Pƒ…WT ‚Nv@-±‡ " AX%Wb e4…108D%*9F ¥Ž1Mb­–† ;]M$?N /¢‡v‚±Š'¦ƒQ-&$B¤ƒJJ§Œ ƒ2 ƒ01¢ŒCƒ,®Œƒ.kk>x7+p£…rS±0«‡hy2% „' ¢ƒH ˜R2ud&‡%‚(i K+¢ƒLs«ˆc^.) <¢† £„-si±„'±‰]¤…]x&^©JƒA,yzOw=¥ˆjHƒC ¦‡hIog*&§†[+ M¥ˆƒ\¥„}u\¤ˆ‚iS‚0±‡!«‰$3„(9(:3" œ‰lƒ<(C: Es0GP _¤‰1…¬UEZ‚`@„\ •Qƒ7c+`1'.K„Jz¬’D#‚p$‚kQ7?<ª‡:ƒ$%9 &±ˆv±ƒ1ª–>‚6e+^‚‡1 ±R ±¨x ±/Š ±/ž/ £…@q‡8±$‡ £šSq‡8±$’N!¯'ƒ LR/…s6«u‚gƒe…a |"/@¤u7I ±…±ƒ.±{¤‚R.„qPl§~…]t*ƒ`S¤xk O³u§¤k _£$A„E¢RLªO@Q‚(: i±±‡n§0pv%‚^3£‚xR‚¦ Oc„b ª~‚J‚D-5V3ˆQ  .y„ y‚0IC‚]O,£Qeƒ  2ƒb#3+#‚be_‚r0!N ¦L]_5L¦w[>w4I¥[%„0N¤#HT' W‚(‚U^s) %H SD.Y\ ±²T ƒQ©œ.„2ƒ1T£…XE‚4¯™3rA‚^…ƒz%‚KQ%P=c¤‹!ƒ'Yj¥”*‚<†S‚Y£‡ƒ¢Žb‚£’)‚P¢‚C¨‹EkS‚)E ¥…9‚¥‰M‚‚d¨ŽMI#]yI¤†L h£ˆ >…s±ƒ«˜@‚gƒe…a |"/@¤„'7I ±Œe±‡±„7¤‹>.„qP±…$§X…]t*ƒ`S¤ˆdk O³†I§¤†s _£ˆA„E¢„kLª‡m@Q‚(: i±ƒW±…J±C§ªpv%‚^3£ŽR‚¦ˆOc„b ª—‚J‚D-5V3ˆQ –=.y„ y‚0IC‚]O,£†eƒ  Xƒb#3+#‚be_‚r0!N ¦†%]_5L¦ˆ[>w4I¥ˆ`%„0N¤‚@HT' •{‚(‚U^s) %H SD.Y\ ±+ ±¨Q §(“Y-7  " §(© -7  " ± †i ± Žm u" ±"…* ±†¢#‚mC ±’<¢#ˆFC¢ƒ#+ ¢ˆ+ ±† ±’=¥‡T ¥KT ±† ²Š  ±’?²”.  ±† ±’@ ±† ±w+± ±+†P±¤)%±‹s±ƒJ±‚±†q ±˜'±‡p±—9±Žvm 3w¢‘t±X±ˆ/£vYx±±u±…P±ƒR§Œ. G±” 5±– ¢«±žm±z£‰zYx±‰J±…±Ž<±Š>§œT G±¨% ±%…4 ±%=£‡IF £˜IF £‡IF±‡, £˜IF±w ±%„ ±% ±Œ ±˜E ¥&ƒGhG| ¥&‹GhG|±%ˆ3±‹Y ±%“<± ] ±%„ ±%±y±‚_ ±¦ ±Š*>£+g¯‚>q]ƒ/b:$:B‚N4/Po £+†@¯–8>q]ƒ/b:$:B‚N4/Po ±$…R ±$Ÿ=¤…E.A ¤Žc.A% ±%– ±%‹ ±‹P ±š* ±$†~ ±$ i ±ˆg± ‚)±ˆ( ±z± ‡±, ¢‚IG±‚} ¢“^G±Ž ±& ±ž; ±& ±¨L H±†N±‚V¦ƒ  ±ƒ ¢‡@¤†^Ц†  ²…-À£ƒ!£‚!¨…ˆ0  7 H±›a±‹!¦A  ±‡2¢D¤ž)Цe  ²ŽÀ£ˆU!£ˆ)¨žyˆ0  7 ±$… ±$Ÿ#±ŒD.&±ˆ%±Œ5 ±¥j±&…u±˜K± Y ±(ƒO ±(™ ±‚t ±‡S²$À ²$ªÀ¢Œ@m ¢¥fm¢…% ¢ž7%¢+‚nC ¢+ˆGC²~ ²©$ ¢/‹~„ ¢/ "„ ±'”7 ±'©; ±ƒ ±Š]V(¨Œ:ˆ)-¢†/‡¤Z¤ec‚U2¢‡ )¨¤ˆ)-¢• ‡¤„.Z¤‰c‚U2¢Z ±/„u ±/™ ±„$ ±•9 L±†M±‚U§ƒ  # ±ƒ £>‡¥†)4Ч†  " ²…'À£‚£‚¨… ˆ0   M±›`±‹ §@  # ±‡1£ˆB‡¥t4Чd  " ²ŽÀ£ˆS£ˆ'¨žxˆ0   ±„+ ±•@%x+±…²Q°±‹# ±+†Q± ²ƒn°±ŸG£ˆCPg £¡iPg ±-„ ±-Œ ±Œ ±˜F`-¯'‚q   . J3(ˆr  .¯'—u   ”R J3(ˆr ¢…% ¢ž;%²\Ð ²¡qÐ ±# ±¨I±l±‹)±„j ±œ>± ±‡T ± ±Ž ! ±H ±Ÿ± …±‡PM$¢‡Z1±m­„"‚(r ‚N†\ƒ/£ƒ~To $¢œm1±„K­›m‚(r ‚N†\ƒ/£iTo ±ˆH ±  ±ˆr ± =u 7±… ±‹%±ƒ±‚2²†iP±…>¤‚2¨‚ [‚F<±±…: 9±‹± ±¢p±†E±†!²•CP±‹¤…*‚2¨‰)[‚F<±¤±šm 2 ±‡x ±$+ ±$ªK#±…E¤‰P ¨ˆ/g&¨ƒ ‚9ˆY #±‹M¤£; ¨3g&¨“9 ‚9ˆY &* ±*L±nz ±ŠZ±ˆ±‚6±‚ ±‹"±^ ²!‚E°± „ ²!†°± Œ ±„2 ±•G†h*ƒ¤/ „4±ƒz­M? Œ‚ƒV + ;2+wiE9L0¤y‚1@‹8¤X&ƒ2¨:6=)$® G +‚ Q0† ¤}=_ƒ§!e"­ ZO,~(_­ F F=‚@#} BJ¦ @aA±… C!ZwJ„ƒ-5Rc; TgN±¢wƒt¢‚D+¢'~Y¦  v"¢)‚"§fxy74…8¦‚#Ca±n±N¥9nL‚YR¢ ƒ>§&1@b=¢ƒ|§‚ƒ$J‚H‡)…f¥%‚+~‚n±†©…K;‚>‚§…5‚ „6b‚27¦kK5 W¥H‰p‚±…E¥TC25¤3 >„=®qW} [a6‚. @ƒg†4 ±‘ ±˜o±–4±‰D± ‘] ƒ3¤–B „4±‰­šs? Œ‚ƒV ‰I ;2+wiE9L0¤’‚1@‹8¤†d&ƒ2¨ˆZ:6=)$®Œ@G +‚ Q0† ¤‹&=_ƒ§„E!e"­ˆ ZO,~(_­‹"F F=‚@#} BJ¦„j@a±5±E ˜!ZwJ„ƒ-5Rc; TgN±„G¢ˆBƒt¢†3+¢ƒF~±ƒ¦ˆv v"¢„a‚"§@xy74…8¦‰#Ca±‡B±‡V¥‡*nL‚YR¢„9ƒ>§‡D1@b=¢‡P|§›nƒ$J‚H‡)…f¥‹.‚+~‚n±Ž©šO;‚>‚§šh‚ „6b‚27¦‡2K5 W¥n‰p‚±‹¥ˆkC25¤ˆ8 >„=®•W} [a6‚. @ƒg†4±„9±"”F ±•N±"©J%±$“§‰{/ @‚ ‚L ±$­§š!/ @‚ ‚L²° ²™A°±ª0 ±„@ ±•U£ƒN £ˆ N ±‚z ±ˆN¤ ‡jG9 ¤ ’G9 ±„G ±•\‚L§?& +®„fJ Q) 83±ƒ±…±‡x¬&t ' " 3§X«…M‡u‚(P ‚:¤„`‹b%§‚$p‚8 ®-#AY +! US¥sT [a &§…F& +®Š$„fJ Q) 83±”1±‹ ±”,¬„Lt ' " 3§ˆ\«šQ‡u‚(P ‚:¤š‹b%§‰;p‚8 ®ˆ2#AY +! US¥•T [a ±‚l ±‰]B®= ‚y5{$ dP[ƒ43¢ ‚:# ±²V ®™5= ‚y5{$ dP[ƒ43¢ ‡#‡|'ƒQ« ^^ XX…s8Š-¥ < U«uƒ,-4ˆ0 ˆ1I¤ =‚©h…-‚Cs„w4®d  & ­?6C>*WN6«Ayx)c-…!_5¥ V¤x)© 4K]"¨\ .ƒ0  !90ƒ .-#4J'9‚]§ "1‚1¤GŒ ‡£‚=D¥O…tJ±‚?S¦ƒ‚ T¢‚'A©F„ ‡)£‚Z ±ƒ£‚(]£" $¨"‚y‚p ¥ /W1¥hMX„0 (UsOyADW„pQ tkƒPNT 7 ,   q +A'm‚q¥‡%¨,…N‚0…g" .… Nm^RJ ?69 - !H Z  3&$§ 1‚(¦jc‚~ 4±ª-±Š±’D±‘$±„S±”[±ˆT±–<±‰C±‡±–±o± T ƒn«•^^ XX…s8Š-¥…< U«šƒ,-4ˆ0 ˆ1I¤‰+=‚©’)h…-‚Cs„w4®‡p  & ­ˆ^?6C>*WN6«uyx)c-…!_5¥‚5 V¤Š7x)©„34K]"¨‰` .ƒ0  ‹*!90ƒ .-#4J'9‚]§„i "1‚1¤˜Œ ‡£…oD¥ˆ…tJ±†.±ƒr¦Œ ‚ T¢†_A© „ ‡)£‰F ±ˆ\£ˆ0]£ˆ" ±„=¨‡@‚y‚p ¥ƒH /W±„f¥‰=MX„0 šUsOyADW„pQ tkƒPNT 7 , ‹ q +A'm‚q¥ˆ‡%¨•0…N‚0…g" •a… Nm^RJ ?69 …X- !H Z  3&$§21‚(¦ˆjc‚~ ±„` ±ž1±ƒ8± Šz±Y±”¢‚‡= ±ˆ?± –±…±© ¢’5‡=K±†m¤…, #±‚[£-ƒu ±ƒ¢#Š,±£‘,¢‚c‰M¢+¦ƒ"oYm± ƒg¢]‚f¢‰l3 M±œ¤‹8 #±‹&£Œaƒu ±‡6¢‹:Š,±„]£¨K,¢‘=‰M¢ˆ+¦‰*oYm± ™¢‡$‚f¢š3±>±#‘~ ±¡S±#§1£ˆ!P_ £¡GP_‚X¤„*ƒ1 ±†S²!À£[†QA£…w¤Q&  8= Y# ¤‚Q ¢¢r¢!c¥„wBSU †d…n   £B¶Ì„@¹hhˆB£p`¢„!„I 2¤™1*ƒ1 ±—h²†-À£Ž†QA£‡X…w¤‚qQ& —_ 8= Y# ±ƒF¤‡b‚Q ¢„ ¢ƒ:r¢‚]c¥‰„wBSU±„O •>…n   £†~B¶…hÌ„@¹†hhˆB±„/£‡4p`¢ž „IC¢‚0„/¢„8b¢„WY± Š}±„ £„Y‚-„D±…~±‚A#c±…W¤…j„G^±±„ I¢›V„/¢Vb¢‘ Y± ¢H±‹k£“3‚-„D±Œj±ˆ±‡A±„ ±e±ˆI¤–„G^±‰ ±˜% ±/q ±/–K# „e; ‚;EqExU‚3&(„wi9 # ž ; ‚;EqExU‚3&(„wi9 ¦ƒDt ¦ˆ Dt ¦ƒDt ¦ˆ Dt²ˆ9@ ²—@9 $˜E,,  $²0,,„V‚'°Ž- „f; ‚;EqExU‚3&(„wi9 $ŽL   ¦ˆnM<¨‚r,K 2‚x'1M²e ´…2´…3 ‰E  wPg †)!Mg&‚d+ ªF R‡2 ‚^ ‚‚P‚g(~¦9 …²4 ‚(°£@ ž ; ‚;EqExU‚3&(„wi9 $Ÿa   ¦”M<¨†vr,K 2Š>'1M²…T ´Œ´Œ$ £0  wPg –†)!Mg&‚d+ ª•y R‡2 “ ‚‚P‚g(~¦‰> …²•X ±„N ±•c  ± „;  ± „<-¦ ˆrM<¨ŒE+  ¦ ” M<¨¡I+  ¢„^‚-£‚+!< ¢“8‚-£†`!<C²!‚ 0±Œ¦V_# ¦…Q## ±o ²!…H0±¦¦¥Z_# ¦V## ±„ ±„U ±•j)¦Œ^m '**±…l±„ ¦¤)m '**±”F±‹* ¦‰Hn"{‚ ¦š]n"{‚ ¦‰Kn"z‚ ¦š`n"z‚ ±„\ ±•q ±‰ ± M@¨‹†YO&4_¢)E~¤XŒ$‚? ¨ *†YO&4±š¢)‡\~¤•|Œ$‚?+¢‚„~¦†UO'±Œ ¢“„~¦ O'±˜4?¦Žb-ª ƒ&?DE¤˜\1 ¦Ÿw-ª ŠT&?DE¤²G1+£Ž[3B¥ ƒ;T[R¢˜UM £Ÿp3B¥ ŠM;T[R¢²@MA¦Ži,;ª ƒ4MPQ¸˜c~çwà ¦Ÿ~,;ª Š[4MPQ¸²N~çwàS'©ŽZ-¯ ƒ(=F C³˜Tç±”G '©Ÿo-¯ ŠL(=F C³²?籩K;¦Ža-ª ƒ (=DE¢˜[ ¦Ÿv-ª ŠS(=DE¢²FC¤ /† Œ¢ *±‚\±†A±‘e±ŽZ ¤–/† Œ¢ž *±Š'±›E±§±Ÿ ±$™E¢‚‰_ ±$³0¢—J‰_·$˜www~ ·$²bww~²$™!à ²$³ à ±/‡ ±/›0 ±)‚ ±)‡Q±#‚±’E ±#ŠU±¬0 ±„/ ±Š7 z" ±"…/¥/„h ¥/™  ±(‹X ±(¡ ² ,  ² ˆ0  ±(’o ±(¨"±)…±”# / ±)Šc±¨G F¦Š<…20ƒX¤C¥!$%ƒ ¢ƒ¤$$¢"aªƒ)‰6 |¤+  Q±‡[¦—`Š<…20ƒX¤ƒGC¥‡c!$%ƒ ¢„ƒ¤ƒ;$$¢‚^aª’‰6 |¤„0+ ±‡5 ± ˆ1 ± “H¢)Z ¢)†FZ ±$™. ±$³ ±‚y ±‡X2 R£‡. ±„N£ #¤‚l‚ ` ª85u7H ‚/+±‚w±…2±‚&¢ g±>¯ „)49'‚2N# !‡ ±!†~ U£ D. ±‘£ƒE #¤u‚ ` ª•<5u7H ‚/+±˜*±Šy±’L¢…yg±ƒ[¯•-„)49'‚2N# !‡ £… /:±ˆI £V/:±—# ±%„E ±%N ±ˆ> ±— ±Š& ±£LO%¢‡+‡±„k±† ±†±ˆ£„(6¢‡@H± Š %¢ Q‡±Ž ±—±Ž^±“,£Œk(6¢¡+H± ž&v 5±†]£ <±:²ƒ0¦p†>=‚$ ±†3¤„ 0‚±‹n±„3±‰A ±k 6±{£ |<±„l²‡P0¦J†>=‚$ ±¤Š{0‚±¥Y±‰z±e E$ ±$š0 ± ‡T ± ‘}v6±‹6§‚P‡H‚„ƒdU£†‡§ ‚xB(¥bc82±…l±ƒ^  7± I§š‡H‚„ƒdU£”q‡§„  ‚xB(¥‰c82±ŽA±‰%!¢‚T±]¢ƒZ ¢†±†¢ŠK²/< ²/•` ±-†w ±-Ž|;±‚|±ƒu±ƒ ±œ"±‹@±‹±ˆ±•±•F±ˆ\±8 ±'\ ±'¥` ±‰ ± O ±)„E ±)Š ¤(‡Bf` ¤(œuf`¢Nm ¢…gm ±&† ±&Ž ±‘b ±« ±%†x ±%’¢'Œ-L ¢'¡1L ±V ±¨| ±) ±¦O ±ƒq ±ˆxW!±… ±!„±oi 1±‡(£„*² Z`£‚$J„m±–y±‚{±„/¢*§ŽY]< ~ 3±œ;£Š+*² ˆ `£™oJ„m±°d±Ž±™b¢†§¢2Y]< ~±Œ>±‚p ±¡Q±‡(Wf¢8‚hP±‡¢.N±ˆ(w¢‡u±…*¢$¢P`±ˆ(¢"'±ƒ¤nY9„±ƒ/±ƒ,±„I±…%±ˆ¥7†#†I¤„Q‹@a l¢¥K‚h±…W±:¢…TN±“?±…V¢žfu±Œu¢„C¢ƒ `±‘¢ˆ'±‰y¤ˆ Y9„±‡d±±R±±¥–j†#†I¤˜u‹@a2±‡=¢FŠ ±‚7¢ ƒ'±‡u ±œP¢™lŠ ±š¢ ‰/±’~=±‹±(±ƒ±‡O± ”J±”e±†] ± -±˜s±Ši±–)± ®5±©i±œ ±)‚q ±)ˆ8+±‚ ± ‚¢‰o¢ ‹jƒ ±‰O± †;¢—bo¢  nƒ ±*‹B ±*›h¤„! ¤Œl ±&…x ±&j£  £e ±ˆ? ±—4¥  :.&±#¢±‚H  ¥ ‚* :.&±‹L¢ˆv±ˆ¥‡| ¥˜'| ±#†} ±#R ±$x ±$›cW &¢‘e‚Xi±‚z±†A±† ±†bd±‡O£‡' ,¢« ‚X±†u±.±ŽE±k±R±‰N±…±œS£—?'_-¢<£„O‚Q£‚ ‚Oª‚&$AC ‚D±ƒD¤‚`‚LA -¢ƒO<£“)‚Q£‰ ‚Oªˆy&$AC ‚D±‡]¤‰#`‚LA ±$– ±$°±Š`±"† ±Ÿs±"Žc#¦ƒE).0£ƒ5) ¦”Z).0£ŽL) ±$ ±ž9Q& &"„Q  / & &"ŒC  / ±‰; ±¡)¦… ƒ P[ƒC3¢ ‚@# ¦ž2ƒ P[ƒC3¢ ‡#[ *±„m±‡±†h±ƒj± ƒe±ƒ±‰\±y±„Lk±ƒ) ,±Šy±‘H±‘±›5± ‰m±Š&±”e±¢}±™±ˆ±—Muu±”&±ƒK²‰p0£„q £‚ ±ƒ £Žy e¤_g%±ƒ3£cZ±‚±…{±J¢DW¦‡^†S.ƒ;‚t¢‚%r¤c1d©ƒ?u ‚FK}ˆZ± {±©9±ˆR²›0£Š} £Ž> ±‡3£˜iŽy ±„¤ˆ*g%±‡"£„Z±„<±Žg±…c¢ŠW¦¡I†S.ƒ;‚t¢.r¤–g1d©–Dƒ?u ‚FK}ˆ±ˆ_±•? ±„a ±‰hL ±)„o k b~U&]‚G^F ±* P !±)Š6 .k b~U&]‚G^F ±ŠR ±—±%– ±* ±*‘( £i ±I £‡= ±‡Q ±„! ±‹l ±&…6 ±&(!±Œ<£‚vf'± …- ±¥b£‡+f'± 2 ± ‚o ± Šs 3 ±‡y ±_ ±©…" ‚F©I0ˆ [ƒF„8^Z¤S0<¢}’m¤‚>‚iT5j£ND‚^©5CA*R‚#&ƒ#±N¥-aQ„h¦O. $¬]-A< a_¤:ƒc(B`£C£†#±D [e‡R‚Zj08 ! Q?-#§*U ¥,(‚G±z¤1P±.±ˆ>ª  ¯‚<VU4>   ' : 0? a!±ƒ`ª%Zw!$&.¢”kD¤ŽEƒ;~ª‚‚<>>†Q+ ‚U©–\0ˆ [ƒF„8^Z¤…Z0<¢›#’m¤‹\‚iT5±‘£†ZD‚^©ŒiCA*R‚#&ƒ#±ƒq¥‹VaQ„h¦„u. $¬ˆa-A< a_¤ŒQƒc(B±…?£7£V#±„" ™&e‡R‚Zj08 ! Q?-#§„4*U ¥‡w(‚G±…i¤ƒPP±ƒj±‘*ª…E ¯‘VU4>  ‡ ' : 0? a!±‡yª‡CZw!$&.¢®VD¤£Iƒ;~ª’A‚<>>†Q+ ¦„M0 ¦0%±ŒM±ƒ±‡ ±ƒ4 ±›'±‡L±Ž}±ˆ{ ' ±‰E³% J ³%ŒJ ±/Œs ±/¡ ±$™ ±$²o ±!‚B ±!…r 6¤s‰s†:ƒB±±Š±„±—3¢ˆL±„#²•p²‡J°±‡K¢‡Š 7¤–‰s†:ƒB±‡±–S±ˆ+±®~¢mL±Š+²¯p²<°±œO¢œCвƒ7 ²‰C $ O¤‹|.±Œ(±‰±‡¢ ‚‚I± m¢‡ $¯|fˆlƒ1 ƒ]±‰H¢‚&o©07|‚$ P¤¡.±=±“1±ŽM¢ ‡d‚I± Œv¢$¯–fˆlƒ1 ƒ]±™n¢‡o©‰57|‚$U(¨ ‡4‚Q …pWZ±p±‚0±(±„±…(±> (¨˜V‡4‚Q …pWZ±…_±…O±ƒd±ˆ?±”±…W ±†z ±ŽE ±‹: ±¤`Sa¤dm9o±ˆu¢‚±l±„m¦‚aw%‚^d±†+¢†7#m±ƒK£A<‚0¢ƒ=‘1¢…(‚d¤9„‚E‹¢’ ` m¤–#dm9±ƒ±“-±ˆ@¢† ±„(±Y¦‘;w%‚^d±¢(#±…±Ši£„v<‚0¢(‘1¢1‚±ˆV¤–=„‚E‹¢•R’ ±•£ ‚/$Nª | 7 2£$P±‡w  *6M®R^‚@Y„P  2'. & 7 [s7 $±‚/¢j‚B ( )(5  !  ,£„+J£”w;‚±‡#¤ƒ<±„] ±‰G±†j ƒ •N S‚{BM _  %…qA¦…;`EQ8¯™b „C2„n,‰3‚9¯‰R#Xe'M¦‘D ˆD ƒjƒ¨†>=6*r§‰‚, ‚e¦Œbmp‚:§‚K  z%§‹k?‚gƒ+¤„@jXD«ˆfƒSRG L  ‹;%\*ƒ^9,?'[Lp©„m%)Y%FQ²;ð¥Š24Wª˜6‰7ƒ>/$Nªƒ=| 7 2£„P±c …C*6M®,^‚@Y„P  ˆ'. & 7 [s7 $±ˆ¢‡r‚B ‡( )(5  !  ,£‹IJ£®b;‚±¤ˆN<±‹t ±Š7 ±¢¢3 ¢¨53 §ƒ  V §˜(  V ±/†z ±/› ±+‚X ±+ˆ1 ±„ ±‰%¢ƒN ¢ˆ N ±‡' ±žr ±* ±* BU (±‡_±}± †±„O±„±†I±±l±'±‡ (±}±“± N±$± ±Ž;±¢"±¥±ƒD±›9²(JÐ ²(¢}Ð ± ˆ_ ± “ ± ±©)¢ …ƒ^ ¢ ,ƒ^h m±ƒc¢„\ª†  %/  3±±'£‚)±)±‡W¢…†G &  %3<ƒU4  #0….‚X :!K±„l±M ±(ªn p±¢Šhª’T %/  3±ƒ7±…E±…£†Q)±›±I¢š#†G &•? %3<ƒU4  #0….‚X :!K±Š3±‘s%± W±‹E±‚H±†P ± ƒz±š±†a±št²‡+P ²˜@P£%ƒg!†c £%Žp!†c ±‰ ±š5±†n3T¢0‘D±6±‚±-¢s†Z£Rƒ);±¨…‚2?‚C/±4£VH¦|‚¤yOSo± ¢ •) Z¢–C‘D±†=±›,±ŠK¢’†Z£†^ƒ);±‰[¨5…‚2?‚C/±‹]£„|H¦ˆ|‚¤Œ%yOS±…N± ‡o¢ ¯ ±-‚ ±-Š ±'Œ~ ±'¢²†h ²3 ±ƒx ±Œd I¢ƒO¢†u2£7 4ŠU‰@B¢-¤…;+†oT§V!+‚n;{¢„a=±— N¢‰[¢Žy±&£‚z7 —ŠU‰@B¢„6-¤”+†oT§‡V!+‚n;{¢‹R=±°z5±‹^³ƒ9¤qUDJ±’j±’ ±š8³‡n¤ŠFUDJ±§n±§K [" ±"…*´QÌÀ¥ ‚p±‚L ´œ+ÌÀ¥…m ‚p±ˆTQ&±D¢‚:¤„JŒU…7³ƒlV±‹¥„d M‚ &±‡P¢†4:¤ž5ŒU…7³ŽuV± ¥•  M‚ ±‡[ ±&-± 8±‹<± ‡1±†±ˆ. ± ƒ[±š± ’:±–-±œRdo¢…O‰n£ŽFƒ]‚(£…IC,±…2±ƒW±@¤lm‚±†?±„0±X£† „s‚B±l±‚5±ƒK±„z± §ƒNƒ29‚A…_ƒ±ƒ£„d‰pB¢‚H; p¢šb‰n£§lƒ]‚(£ŽgC,±–G±‰c±‹i¤…m‚±ŽC±G±‰£W„s‚B±…±†$±Š7±ŠN±…U§9ƒ29‚A…_ƒ±˜ £š‰pB¢ŠM;¤†|T ¤GT ±&‡ ±& ±$Šl ±$¤W ±'l ±'¢p¢‡b ¢œu 7±%‡0­‚aD …''‚7x„: 7 ±%’9­˜D …''‚7x„: 7ƒ 6¢‚6£C‚w1¤‡S‡ZˆH¢ƒI„/±…u±ƒ¤ u‚„5¢ 3±‚#±'£bm£CZ„¢$*£‚„|±‡N±ƒz±“ ¬3, Uƒ4F‚ ¤4Hƒ;©fls3iyp¢ƒ9c²‚NÐ¥K {‡ …-±I£-s!±‚ ¦„q†f„,J ± ”X±ˆR B¢—I£…J‚w1¤ ;S‡ZˆH¢Œg„/±Œ±3¤Š4u‚„5¢„13±…±˜r£„m£‰Z„¢ƒC±‚f£‹ „|±–(±ˆ±¬t¬‹<, Uƒ4F‚ ¤ˆ&Hƒ;©•jls3iyp¢˜lc²ˆÐ¥q {‡ …-±‡"£‡Ds!±„&¦•:„q†f„,Ja ,±„h¢Š,ŠK±ƒ²u`¤6ƒ>‡C0L±“±’l±ˆw±‡] 0±™{¢£RŠK±šg²‰a`¤ƒ>‡C0±„ ±­±§p±ž*±b §ƒ4D#&!- §šD#&!-ƒWd¢ƒG„e£‚@£„ƒ>‡¥`??…&¦†‚~"„V±ƒ/£*‚<¢%¥ƒ4 _‚¦4w~gK£5„H„5¤|-£(‚JƒH¨†Z5‹O9D ‚5¢b…|±‚kf±ƒ£ƒ1G¢V±1­)5"/:SC‚ F !¬TA$‚`ƒt ‚'‡z£…*‹<ª‚R†z‚ 10 .‚¦ƒU/‚‡‚D§"z]ƒIKD6±‚p l¢˜Z„e£‡@£9ƒ>‡¥Š~??…&¦—*‚~"„V±‹z£^‚<¢‚H¥94 _‚¦‰8w~gK£ŒL„H„5¤…[-£‡n‚JƒH¨ž%5‹O9D ‚5¢ˆ-…|±†Z±„±‰r£‰G¢ˆG±…f­ˆ~5"/:SC‚ F !¬›?A$‚`ƒt ‚'‡z£›*‹<ª˜†z‚ 10 .‚¦“{/‚‡‚D§ˆ'z]ƒIKD6±— ±G ±šmA¢‹mˆ£ƒE$P±ˆYh±£f ¢¡ˆ£œk$P±• ±‹q±– £ˆ5f ±ŠQ ±™+U (±1±ˆ*±ƒH±†(±±‹ ±†A±„h±ˆ±‹ (±©W±‘H±|±‘?±ˆI±¢W±Ž ±™l±6±Ÿ/±Œ7±!– ±¥]±!¯ym2±”0e¯ `=„n‚> %d†"&‚2±‡±…c¢mƒ8£#„ 6±©C±ƒ¯ ˜+=„n‚> %d†"&‚2±p±”=¢ˆ ƒ8£›„ u# ±#‰J±)!±ˆ ±)†h±œ@²#ˆ ²#a ±Œ ±šw ±†) ± ±-†? ±-ŽDL#¬T=Uˆ z „.>C¥ƒŠb±„4±ˆx $¬•g=Uˆ z „.>C¥šiŠb±‹±£…) £Ž³…5k ³Ž!kh 1±‚±….¢Xu£ˆ(‚w±ƒS±ƒs±‡K±‘y±†{±†!¢‚Œl 2±„d±Œy¢„Gu£—‚w±‰'±‰{± ±¦}±œ.±Ž&¢–'Œl G ±‰ ±(W ±(¦ =Y¢…ˆ.±†%³ƒ0³¤‚¢=‡²‚`¢†Ns±†/BA±‚[£|ƒ-¢„E‰£ƒ^‡¢…<‹¤… 5¢]ˆ _¢š/ˆ.±—:³‰<³¤Ž7¢ˆA‡²„c`¢žs±z±‰.±„y±ˆ/£ˆƒ-¢ž0‰£Žg‡¢š@‹¤¢5… 5¢•ˆ ±Šs ±¢>²†,p ²ŸRp! ±!†} ±!ƒDu 7¢Œ]$±†±‚<¤‚2z¢‚$±‚J¢B¥_M‚4£_‚P±‡/ 9¢¡p$±a±…¤‰}z¢…s$±…i¢ƒ~¥‡KM‚4£‡P‚P±!*¥ ‚ ,± ±„  ¥‚e ‚ ,± ›w±‰M;­nj‚&ƒLSƒB…² ‚1@ ­›j‚&ƒLSƒB…² ‡@m#±‚3 ±#‰B±œ ¢Žn…±‡| ¢¤…±”0‚±;±‚;¥ƒB1ƒ#SI¢†c¢Œgƒ±ƒG±…V±‡M¤„ [[…Y²Pృf²ƒ_@±‚¥„[,`' ¥‡y‚* ¢L…¢w„¢ƒ:g±K¢.ƒ±†&¦‚‚\‡s„w ±¤N±‡B¥œh1ƒ#SI¢Š5†c¢|ƒ±Œ±’ ±ƒ"±‘v¤›X[[…Y²…ొR²‰g@±†*¥0,`' ¥“‚* ¢‰>…¢¢{„¢˜mg±‡$¢‡Eƒ±Ž+¦•<‚‚\‡s„wŠ-… [4*-^" ‚ Ym‚= S 3{l¤ |p „0l3:Wx7† ;N Y=}/dk ­‚X K ;$I „^‚U‚4J0$pX0Qs#¤‚Zs¦hp3C©‚^Y s+ _n£t £ƒp£x9O¢+„]©…^x- `?£3‚7¦+|‚E"W£M%; ‚ @h‚?ƒ!~r~,$$!;'&C¤8p¢…je£F1‚±‚~d¬k_[I^ ƒ§#,<;Y ¬g‚oƒLnkj+ ©}Il2! ¤Y_=¦y xVQ‚<£0„p(£Z«,lbEBI"i¥ 2I?8 :*N? 3]hUH4G7LY¤‚_ 1 uq HP  *¨+ n!$fƒH:¥XS mT BK!"|#MP‚ _t3 ‘XI?8 :*N? 3]hUH4G7LY¤‡r_ ‡H uq HP  *¨ˆ0 n!$fƒH:¥‚uS •T BK!"|#MP‚ _t3@±!±’\±„8 "± E±‹?±ƒc²…a@²ˆ\@±© ±¨±‹O…'‚?¢‰v¢j)ªK†„t vƒ9]„\¢ƒFƒ?§…‚cz‚*…J¢K2±†.^¢‚.„C¢<*¦M 1ƒ¨ƒ~2‚[A9©I‚M^6®ƒF-*%,†I„3Q#‚:± ¤>‚1‚{±ƒB£‡j*¥+l 4¤,‚Q‚\ƒZ¢„3£ƒ£‚W~¦?‚YWo"±_£@c{¥\V„](©†k‚H‚_ ‚‚Z…I¢l‚\£R/l¥ ‰C\†L¨ƒhv‚uƒu…?«…f‚1-!,;‚?&¢SƒX±… ± ¤Žcv! ‚K¢–‰v¢…q)ªšq†„t vƒ9]„\¢Œdƒ?§–‚cz‚*…J¢Š2±’b±ƒ¢ŒW„C¢…b*¦‰Q 1ƒ¨2‚[A±-©‰‚M^6®›-*%,†I„3Q#‚:±„<¤ˆ ‚1‚{±†u±ƒa£V*¥…cl 4¤‚Q‚\ƒZ¢‹£†qƒ£‡‚W~¦ˆ0‚YWo"±…x£ˆ^c{¥‰1V„](© V‚H‚_ ‚‚Z…I¢‹u‚\£‰D/l¥–$‰C\†L¨™v‚uƒu…?«– ‚1-!,;‚?&¢‡jƒX±%±ƒ'¤¢'cv!8W£‚p‘D±”d±ƒm±…£o(‚Y±†e±‹± ±‚¢:X§…ˆ}…M$} ƒ3±…e£ˆd†o~¢*„BY}¢ˆb‰4 \£˜‘D±® ±!±ŒU£¥:(‚Y±Ž0±šY±‡}±†6¢ŠX§žqˆ}…M$} ƒ3±n£h†o~¢•]„B±±ƒ¢‰4 ±$™N ±$³9+w±EVX¢†u ±…~±žZ±‰B±…¢—±!ƒ<±…7 ! ±!†y±Š~¢,…@I ¢,ŒWI ±,†S ±,j‰1/„H ƒ,3>oJ?8 ‚S#Rz* b¢lP¯ƒNG‚F$(ƒ‚ †#‚*-^"©ƒ15 H4'J«…(ƒ=‚+j tk‚M¢¤ZjK‚~¨C@a&ƒZ¤j08-¦n|6S& ¥!_iFS¨/(ƒP §„&JK2Dƒ-¢ƒ -©H>h‚?c07¥7' N(|=z‚ %)‚OS:‚aH3I7‚?£Y¤‚E‚#§Fx$ 5#±‚i¢u#¨/9„!>H¦0BF$¦ƒƒ;‚*uK*¦sxo‚9¢‚fZ£‚Q¥‚~y‚¨S C F¬PIc @ ?;¤w1D¤u #­ƒJJ=-p)#P GF¬ ‚,‚l‚ƒ „O‚z8ƒ4t¤ˆM~§nDƒF-  &…R,M OZ5*x!x s„0Zt>Ep"X0))M‚WYu£ y¯k'^>_&hZx6L¢‚¬/I*,m$Vy#J ¦ ,)ƒ^W!¢o+ qƒSWuD!h‚PƒKS9< * . „b ˜?3>oJ?8 ‚S#Rz* b¢…sP¯œtG‚F$(ƒ‚ †#‚*-^"©ŒO5 H4'J«–=ƒ=‚+j tk‚M¢‡$¤Š%jK‚~¨w@a&ƒZ¤ƒ 08-¦Œ|6S& ¥„G_iFS¨‰3(ƒP §=JK2Dƒ-¢„|ƒ ±!©ˆ>h‚?c07¥ƒ' ˜(|=z‚ %)‚OS:‚aH3I7‚?£„OY¤Š‚#§…5x$ 5#±†¢„1#¨‰9„!>H¦„hBF$¦‘yƒ;‚*uK*¦ˆ_xo‚9¢ˆ:Z£ˆQ¥‰oy‚¨„l C F¬‡nIc @ ?;¤ƒKw1D¤†* #­‹ZJJ=-p)#P GF¬™w‚,‚l‚ƒ „O‚z8ƒ4t¤‹ˆM~§ˆnDƒF- •&…R,M OZ5*x!x •Bs„0Zt>Ep"X0))M‚WYu£…Ty¯4k'^>_&hZx6L¢…g‚¬‡FI*,m$Vy#J ¦ˆ,)ƒ^W!¢ƒ + ”3qƒSWuD!h‚PƒKS9< * . W ± ˆ[¢#ƒF ¢#Œ h)±"¢†6…u ±)†/±ƒ?¢šZ…u,R¬=Z‰? ƒv±.± †²—-@±‚#±ƒ¢‚†±‹u±‚1±ƒw¢„h¢ ‡y±„&<±i±†4 U¬•PZ‰? ƒv±¡C± K²®x@±…U±Šf¢‹†±šO±‰"±ˆ¢=¢¨w‡y±/±ˆ.±‡0±šX9¢ ‚ r£) ƒc¢?†Z¢†?±ƒj ¢ Œ2r£ˆ- ƒc¢‹V†Z¢›C±™4± ‚ £* ƒd±‡¢†@±ƒk ± Œ4£ˆ. ƒd±’1¢›D±™ ±(…h ±(› ±(…l ±(›¢(…s1 ¢(›&1‚&¢‚|‰-¢‚y*±Ž"±…v¢„ …(¢„y`P±7±‡.±…3±T±‡S±‚±ƒ{¢‚Q‚O¢. ±5¢7W§…6ˆ[)‚„@¤ƒx40d±‚2£‚E‹H…±„£Š;|‚±¤…yTƒ1‡ ¢˜‰-¢ˆ*±§H±¢• …(¢"`±D±ˆ}±žy±Œ~±…C±?±†K±’U¢‰=‚O¢…G ±ˆS¢‰ W§Ÿ!ˆ[)‚„@¤40d±Š$£—I‹H…±™E£ša|‚±‰¤šTƒ1‡ ¢ ‚ ±‡ ¢ Œ6±’2 ±'‚T ±'—X#±84± ŒH±‚4 ±Š$±„l± ¦3±—8$¤Ž¥‚ ¤œ]¥†#‚@ H#*S<0?c% ±%‚ ±’?  ‰&H#*S<0?c% ±%‡R ±*‹' ±*›M ±„f ±R[ e¢Š 7±‚A§ 5-ƒ $ ²1À¨n=±y¤ŠV!¯ƒn ! 9$(a 8n&‚} !:±“?±“±‚r ± –1 k¢Ÿ7±‹_§ ‹5-ƒ $ ²%À¨„ =±…h¤˜vV!¯ŠZ ! 9$(±†5 ‡)n&‚} !:±­*±¨4±ˆ9 ±%†! ±%‘*‚§‚c ‚EV„±P±†F±‚9¨‚‡‚!j… £…| ±ƒ:±„ £O‚9J¢„_‰T¦ˆ9‚ …hfa¢q\¤$ƒ0/+¤Ug¢ a¥‚5 ^D³t¿¦ƒ0f….ƒ §—v ‚EV„±‡\±’z±†_¨™a‡‚!j… £Žh ±Š&±‹(£‰$‚9J¢žJ‰T¦=‚ …hfa¢¦$\¤Jƒ0/+¤…mUg¢ˆ$a¥Š5 ^D³ƒ¿¦—:0f….ƒ ±"<¢…O3 ±"…q¢Ž$3 ±*Œ ±*œ7 ±ŽB ±ŸW ±P ±¨v ±)‚ ±)‡d'¢ŽY3¥ ƒ:Q]P±˜S ¢Ÿn3¥ ŠK:Q]P±²>m"±…+ ±"…"±š/ƒ<±ƒ.©4y6‚5:7y $(w. -A…,k ƒ%V30l4©‚F -C±b ‚ @3NZ!(+ ®‹[‚}sƒN!0#3(cB¤‡C ¨…! ‚JM¢‚‚6±ƒ1±…£†‘_R£‰ ¤ƒGhG±’`¦…IP@ ?±ˆ5©™Zy6‚5:7y $’=w. -A…,k ƒ%V30l4©] -C±†A ‰_ @3NZ!(+ ®£&‚}sƒN!0#3(cB¤/ ¨“{ ‚J±‡9¢‰=‚6±‡f±c£ ‘_R£”¤‹ GhG±¨¦™mP@ ±^ ±©%±Žk±„K±…± ‹ ±£~±‹7±‹x±  Kƒu n ' %ƒp† *" (‚P?‚"£^Gb§y:G‘a_A¢!†T£fˆ*…,¢J‚x£o†~¢tƒO±)¢Kƒ8±6£Q†¤+ 5±…~£U‚ ±W¦„q‚IE?ª ^2…M ‚87&5±„]±…±‚B±1¦h/ +: ¦„/.%71¨‚O„k„M…K‚E‚ ¢!„B±¦!$‡…[#±“¨,2!±ƒM±“F ±: z •: %ƒp† *" (‚P?‚"£…eGb§›:G‘a_A¢Š?†T£‘{ˆ*…,¢†V‚x£‰:†~¢(ƒO±‹R¢„qƒ8±‰:£ŒQ†¤„}+ 5±D£§ ‚ ±…F¦]‚IE?ªŽd ^2…M ‚87&5±‹I±Œ ±†[±„n¦…/ +: ¦Œo/.%71¨šo‚O„k„M…K‚E‚ ¢‹*„B±ˆw¦•%$‡…[#±¨;¨†s2!±Šd±§j9±‚}?±ƒX±Œ"±”±‡0Z ±†l±‡+±Šv±¦ ±© ±œc±†!±±ˆ ±¦9±_/¢‚Q$¤ <4„r±Šm±‚N ¢Š$¤‰u<4„r±™G±‰?±{± ƒ ±©!± ‡s£Š8"ƒ( £›M"ƒ()¢†>…n±F±‰ ±#…F ¢—S…n±z±“3±#K ±( ±(¥I£ ‚3 £ Š7±D±Œ ±–W±* ±*„O ±*”u M§„qzPWƒ/¦y7\…G ¤‚ ‚ *¢ „¤…H‹@¬ƒ L"}.*ªiP'=/Š N§žzPWƒ/¦‹7\…G ¤Š ‚ *¢ ¤šL‹@¬‹ L"}.*ª• P'=/б„i±…( ±‹U±Œ£ƒ N £ˆN ±Š ±˜nM$±„A£„#†O†`±n±ƒ-± ‚ ± “&±ƒ±Œ# $±‰H£I†O†`±§9±Šx± ‰± ¨Y±Š&± G ¥…# ¥“}¢'“ ; ¢'¨; ±&…& ±&±+‚±…- ±+‡[±™Qx 7© R>yq£ VG¢+…Q£ƒ#¢ ¢L§†5 0  <©ˆ\ R>y±„`£„& V±ƒ¢Š…Q£‘l#¢ˆ)¢…§ 0 ¢ƒO ¢Œ ±6 ± K ±˜ ±±; ±,‚c ±,‰z¤ … > ¤  > $´— ´0z¢J ´…$— ´‚Sz¢ˆN/±…?±‹s±'‚^¥_ ±Ž]±±'‰u¥£9_ X* ±*~:¢ ‡F²ð±…w¢„{±…b± ƒ= ¢ J²ƒOð±ŽL¢y{±k± —a ±O ±„-_ ,£ƒ{„pб…~£‰M=M± ‰n±†G±ƒ±‚s±•±Žq .£!„pб’2£”M=±A± ˜H±3±†V±Še±ªR±Ÿ#±‚±‚ ±6 ±‰_±…)±¥E±…}(¢ ?‚Q±„±†5±“ ¢ ˆC‚Q±›b±Ž'±¨FN]¢‚ ³‚Zî«<%G.‚HXG(q¤‚Dƒ/…u‚}¢v‚^±ƒ0±}¦ƒ+[-‚S ¢…K†u±ƒ:==±‡±…@¤b ƒ= ±‚ba ± f¢Ž@³‡î«ˆ <%G.‚HXG(q¤šƒ/…u‚}¢ˆA‚^±‡±„9¦Œ+[-‚S ¢”%†u±‰B±„V±‡[±¡ ±šD¤– ƒ= ±ˆ)±•±#)±ŽE ±#‰~±¨0 ±”` ±¬+¥‚UM+Q. ¥‡4M+Q. ±$™ ±$²v ±‚V ±‡5 ¥&„4 ¥&‹t4 ±ˆ ±”P ± ±©*£$˜( £$²£ƒ2Id £ŒId ±ˆD ±— ±‚±± ±›<±’±E¢‚#Y ¢ˆ/Y ±’B ±§U B±,¤Œz‚qn†L¢/'±'²‚>£†E†[±…0±±ƒC­ j`/o)Ad.± ƒf  D±¤?¤¤E‚qn†L¢ƒa'±…²†v£”wE†[±‹8±ˆ ±‡\­‡% j`/o)Ad.± ‰- ª„Q0(> ª0(> ¦6‚j / ¦…=‚j / ±)/±H±† ±)†v±‡!±š* ±(@ ±(¥s-±…"±[±ƒ,±‡V±„ ±‘V±5±‰4±+±ž'±•1£†p£ „$j ±¬|£l†p£ Œyj±…± Œ+ ±’3± £v ±,‚% ±,‰< ±‡G ±˜\>±‚±ƒ0±„T±ƒ±_£/ƒS±±ƒP±‚t¢B‰G¤ƒz‡ lz~±‰ B±—$±ˆ7±z±E±†>±‡`£ˆzƒS±‰±’*±ˆ|¢§-‰G¤™-‡ lz±ˆ±39¢|£ƒA1”?±±ƒF¢ †B…Y ¢¥£œg1”?±¡±Œ¢ ž …Y ¥&ƒGhG‚ ¥&‹GhG‚¢„@9 ¢ 9 ±ƒ7 ±˜J ±$†u ±$ `‚¢’K±/¢‚rB±W±‡k£¢ ‚±‚¤‡3ƒ±ŠM±ƒ'v¢@‚K¢„ (§zƒJ…jvƒS…B¢v…A¢‚U¤‡'ƒƒ.¥ˆ'†£3%s¥„W9‹fz ¢§^±†6¢ŒB±žl±”£‹?¢…2‚±‹¤’Jƒ±¢±Œ±P¢ƒ}‚K¢Œa(§›eƒJ…jvƒS…B¢‹…A¢‰xU¤œ+ƒƒ.¥–8ˆ'†£‡J%±ƒ¥•4„W9‹fz ±$…m ±$ŸX ±$† ±$Ÿk ±$†4 ±$  ±$†G ±$ 2 ±*‹ ±*›(+±˜a±‚T± ‰±ƒ! ±²±š±ƒX± ™:±Š8S&±–«‹9Q h‚c± ƒ/±‚|¤ƒ@& (±¯=«£Q h‚c± ‡H±‡1¤ŽI±…m ±)ƒ} ±)‰D V ±‰t%¢…d-±‡bY± ˆ# ¢’-±’ ±…± œG ±‰w ±£1¢Š=‡v± „}± ±Š+±ƒt ¢ŸP‡v± ± …W±Ÿ/±‹ ±)…(±‡ , ±)Šo±Ž- ±- ±¨S ±ƒq ±‰y ±!e± '±Œ ±!…"± ‡± =¤$–PG ¤$°;G ¢‚7A±‚e ¢“LA±|/ ±/¨K ±/”+Y*¤‰r„h…:-¢‡‘R±‚±‰u±ƒ(²ƒ+ð±‘a£kuU *¤Ÿ„h…:-¢ .‘R±‹,±¡@±Œ²‡cð±§£‰uU %. ±.‚B²„ P ²ˆBP£ 2„z9 £ Š[„z±ƒv  ±ŒPo±„2 ±I±‰y ±$„^ ±$žI¢&„> ¢&‹u> ±" ±"…I ±!‚| ±!†9±%„± ; ±% ± £_‚ /^                            <±• ±…±™6±‰0±‘$±†±ˆf±ŒE±‚6±Š;±„5±ˆ±‹+±„n±±‡Q±‚j±—V±ƒ?±‡Y±ƒ~±ƒ-±‚J±ˆy±„F±Žf±†y±…a±†±†}±„$±‡)±ƒJ±„B±ˆ`±™v±‹±ˆ±•±•A±…S±3±…f±‡!±ˆ±‚*±”2‚w*£† ¢d¤‚}9 ¤f P|;±‚H¤+%§‚* ‚ „1ƒ  @D  TL  2 ±}®Q /} (yj¤.E¢‚ -±ƒ:  ±£[ ¢„5d¤ˆQ‚}9 ¤„U P±„±‚w±‹4¤…L+%§‘ ‚ „1ƒ †s @D  TL  2 ±†[±‡®‡B /} (yj¤‰E¢›v-±‰( ±(ªi ±(•: ±$„ ±$m ±‘ ±ªC‚~¥…K†E…4…Q§‚$bgu]w¢‰\ƒ\±x¨‚,9D"C‚±ˆ@±“E±-²‚W€±‰ ±…%±‚e±‚P¢ƒL±,¢‹U„,±£ˆ$;¢ƒNбS¤„„f…Y ~¥žq†E…4…Q§‹Bbgu]w¢šqƒ\±„¨ŒU9D"C‚±“W±«±…²‡€±—g±Šy±‰V±†i¢Š7L±„i¢¥@„,±‰q£(;¢™Š±y¤˜?„f…Y%±Œ±0±{± ‰ ±¡+±žE±ˆl± žC±ƒ±ƒ±’w±ƒ.t±Œ+±=±, ±”,±Ž±ªB±‡f±… ±¡/±‡±ƒI ±† ±ŽM?±‚)±‚±ƒo±„ ±ˆP±…9¢ƒX4 ±›O±‹/±‰{±‹>±ž±‹¢—|4 ±&…4 ±&& ±‚y ±‰e%¢ˆj§„Q Ga ¢’§ŒU Ga ¢“bq ¢«-q ±‘< ±¦O± ! £'„ir±… £'™ir±Šb±”7 ±… ±Ž ±$“7 ±$­" ¢‚Y¤$ƒK/( ¢ˆ'Y¤$“q/(‚ ²“€¢…<²‚_P© fuR‚9  ‚'A ': ² ‹X€ X /=D$ + ' p£`‚‚< # # #  &| AE5± ± ±! ²¬E€¢‘I<²‡P©ˆfuR‚9  ‹A ': ² ¥C€ ¤\ /=D$ + ' p£†'‚‚< #ˆ# #  &| AE5±„ ±† ±Ÿ.¢#ƒ ¢#‹W/¢Œ]± …K± ± *±ˆd ¢r± ± ˆ± ¢]±¥†xT& ¥CT&# ±#‘- ±#ˆ\¢‡D ¢˜$D±…k±…T ±ŒW±ŒEA]¥",ƒeƒ=³‡(þ±ŒB£Vƒ±+±Ž 1„D9E  #.   )   4+ % ‚ ±- _¥™H,ƒeƒ=³Fþ±W£Šƒ±ˆI±£  1”j9E  #.   )   4+ % ‚ ±ƒJ ±(Š_ ±(  ±$ŒW ±$¦B  ±‰ ±$j±! ±$›U±–T)¦ƒGL ±‚±—% ¦‰SL ±ŽM±±5±‚h¢%‘L>©6!%|taG= ±‡o¢%¦P>©‰;!%|taG= ¤ƒ\[²ƒLp ¤”q[²Žcp < ± ‡Z ±‚ ±‹J!©(‚'†BeˆV ©(—Z†BeˆV ±„a ±±†±‚z ±Ža±‡/ ±, ±¨R Ar±„I : @[n q2 (! ± ‹ ¨- Q@‚Q¬S53(† ‚;B D±…y±o ‰X @[n q2 (! ± ¤u¨ˆ3- Q@‚Q¬•w53(† ‚;B±‘b  ±Žm B±ƒ¥”&q:‚±j±‚3£q&£…6E¦Œ J#†$±ˆ¤0ƒc>†)¤Ž9m$ C±˜$¥­Lq:‚±Š5±‰$£„.&£?E¦¡ J#†$±K¤‘Vƒc>†)¤¢]m$ ±‚~ ±‹I ±/†j ±/› ±/ ±/•5±'†~X ±'œ±†1] +±Št± ‡EF ±…²‚S`±‹t±ƒI±†±ƒ{±„|±†u -± ± ‘n± ƒx±m²‡ `±šN±Š5±±ˆ±±›y±ƒt  ±)‹ ±Œ`±…R)¢H„{±‡9±h±( ¢©n„{±%±‡/±‡k 2±’z±ƒ±t±‡B±‚_± ƒd¢†C„!±‚J£{‰Dƒ¢‘ 4±¨ ±‹b±ƒ9±…±’Y±†± ŠU¢‘L„!±Š<£–‰Dƒ¢•8‘¥• *D: ¥®1*D:±%†rR ±%‘{±x ±%†- ±%‘6 ±*8 ±*^±‰± ±š,±šy=¢‰[‡±… ±•W±‡+±ƒ ¢†M ¢¡&‡±ŒX±¯B±œ/±˜=¢šq²° ²™@°±*% * ±* Kƒ'M¢9“ £„ ƒK±†-­@}UY WH£ƒG±†±‚ ±†a¢‚„¢Y¥:…(±‚C±1±‚|¢1§‚`‚‚-9zU¢‚H¯PJ H?R  0- [6 19 et ;%¤1t±ƒf±‚U¥ƒŠO r£ˆ9 ±”¢ƒ.©„!-6oƒƒnQ±ŒG S¢™_“ £ ƒK±—B­†L}UY WH£{±G±†1±Že¢™d„¢„ ¥‰…(±†2±„P±‹h¢…i§‘:‚‚-9zU¢‰H¯†$J H?R  0- †c6 19 et ;%¤‡"t±‹±‡ ¥ŠO r£“B ±©"¢–;ƒ.©”G-6oƒƒnQ± k‚0¨9f4_…X‡5 ‚£‚@‚a¢ƒrX±c¦ƒX *±ˆ-¤‚k…;B‚e¢R¢sƒ3¤wƒ, =¢†£6„A|±ƒg±…&±\¥m .q±‡^§F†‹„L £†H‚X1£…A†FJ¤> -‚Qz ¨•Lf4_…X‡5 ‚£œ%@‚a¢X±¡x¦‰d *±x¤…;B‚e¢…x¢‰wƒ3¤ƒ, =¢G£‰„A|±’A±Œ±…¥†" .q±3§›1†‹„L £›L‚X1£•g†FJ¤‰C -‚Q±• ±$‘m ±$«X ±…w ±Žc ±: ±©`±ƒ/±‰ ±Šz±- ±‘h ±¦{¢( 7 ¢(¤=7 ±*, ±*R±w± „< ±…f± ‹- ±$V ±$›A‚: ¨„d?li9²…1À²…2À© # T 7  %kK 7_kY Nd#‚e( ‚ƒD²ˆVp®KE £<B¨8!…!  8{@‚A,  ‚zG H 7=h ¨ž ?li9²ŒÀ²Œ#À©„J # T 7  %–kK 7_kY Nd#‚e( ‚ƒD²ž p®†$E £‡SB¨‰=!…!  ”\{@‚A,  ‚zG H 7=h±%‚U± ‹X ±%^± Ÿ|/ ±‹[± ‰a±‡hP" ± ‚B±š5± že±±†±‚? ±ƒ± ƒ+± ˆ ±šh± б ”‚`+¤ŠEH K¢ƒ1k±…S±ƒt±‡{±…U±‡$±r£„Q4*§j8 ‚<£„‰9‚±„3¢>ƒ±‚$±‡s±‡U¨ƒ_+ $ ¤„J ¢‚„g¢… +¢”TM²‚Hð¢‚)O£†5‰I±…£‚6Š‚¥‚ H+ `±†%¥…4;‚=ŠN .¤ŸXH K¢œWk±–h±бF±’ ±‘M±‰v£h4*§‰08 ‚<£›Q‰9‚±‹~¢„-ƒ±„`±_±–/¨ŠK+ $ ¤‹; ¢‰2„g¢^+¢®?M²Qð¢ŠO£—†5‰I±ŠJ£’\Š‚¥‡bH+ ±‡w±Ž*¥™X;‚=ŠN ±$– ±$¯| ¢‚1?±‚] ¢“F?±t  ±—f ±ˆC ±— # ±—n±1±Š ±„±¡S ±(‰7 ±(žjr5«&"‰wKp‚~ %±‡]« „(>(‚' !±…J>±ƒ%±$±Œ* 8«•9"‰wKp‚~ %±–7« ŒY(>(‚' !±Ÿ5±ˆ0±ˆl±ƒA± N ±(’k ±(¨ ±… ±‹( ±‚ ±d { ± •±D ± ƒ± ¬h±‰6 ±‹, ±š5¥…ƒPg„±…\±ƒ±„c ¥žCƒPg„±±‡c±‹z ±*…5 ±*•[ ±&ƒ] ±&‹O1±…+±ˆ.±†W¥‡3ƒFk ±š>±Ÿy± B¥—YƒFk - ±-‰#±ˆi§„P Ga ±’§ŒT Ga ± ‡ ± # ± ‡! ± % ±"‚} ±"‡2²$– ` ²$° `£8 ƒ £‰V ƒ¢ „~ƒ^ ¢ 'ƒ^7±’_±ƒ)±v±„}¢‚$±…A ±ª*±‡±„2±ŠQ¢œ$±J ±† ±Žn7¥aƒ|† ²<¤+[Œ%‚Ee ¥šƒ|† ²‰Z¤+•Œ%‚Ee ±/Š ±/ž. ±‚V¢"„>‚ ±›|¢"G‚ ±… ±š ¤ %s8±‡ ¤ „Ks8±Y ± ±„q±†±‚y ±Ž`±‡.)±ŽX±‡±Œ@¢ ‰s0 ±£k± ,±U¢ ¡>0]k±U£„‘1ƒ;±†¢†#†I±±‡r±ƒp¤Š{„q‚jƒJ±V±ƒJ±‚±‹:±…R¢ƒ¢~ƒ ±†n±±J±…5±“#£EPN¢ˆY‹3 m±†\£*‘1ƒ;±=¢—8†I±‡±”&±‹t¤¢F„q‚jƒJ±…±‡9±„S±š±Œ>¢†\ƒ¢‡ƒ ±Ž ±„=±…±Ž ±­£ˆ7PN¢]‹3`-¢ƒ\‰z± †±‚«O„w9|F‚l²H±…[±‚q .¢˜o‰z± A±†-«™„w9|F‚l²…±”5±‡ ± ˆT± ‚} ± “k± ‹i ²#ƒð¶‰?™›à ²#‹Xð¶£*™›à ±%„ ±%y6¥)„b  $= $S 'q  c     "±‚K ± ”U 8¥‰G„b  $Š1= $S 'q  c     "±ˆq6 $ˆEO?…X@B±„ ²….` 6 $ O?…X@B±ˆE²”` ±&„H ±&Œ: ±/‰B ±/f ± ‡R ± ’i ±(„v ±(š) ±7 ±Ža ±&†f ±&ŽX¥• #&B9 ¥®3#&B9u 8£†3ƒF±G±‡K¥‰rC/¤(YOV¢–B<¢ ,'±…;±„8£•+‚- 8£›FƒF±Še±˜`¥R‰rC/¤Œ?YOV¢® <¢ ˆ'±‹±Š@£¯‚- ±/‘H ±/¥l³j’ ³D’ ±‰4 ±  ±'“ ±'¨ ¢/‚’ ¢/–2’'¢…lJ± “'±Œ±‚ ¢Œ]J± ¨Z±œ:±‰& S ±‡? ±%„ ±%S&±ƒ1±~` £‡r ±‡i±‚ª‹YB!Z#' „ (±‡ ±„:± …£¡] ±’r±Šª¡ B!Z#' „  D±†±’}±„P¢ŠˆvU¢ ‚{D¢‚•9£@ƒ …[£‡G…z¢„sŽP±ƒ.±‡`¤(Œ# …G H±›*±¬#±n¢¡Pˆv±ƒ¢ ‹PD¢œ•9£‹Iƒ …[£œK…z¢š&ŽP±“T±e¤”LŒ# …G ±‰x ±£ ±“ ±ªc±X±ƒd ±‡d±‰8 ±$˜. ±$²)±ƒ~±–z± „m¢/ ±‰±° ± ¢© ±$ ±$©}¢D ¢’Y ±*†w ±*—²•LP ²­P ±&… ±&Œ~dj±Žf¤'[&¥“A l§gK%ƒ d¤!YL99¤?ƒ>;]±ƒ1±†LªI‚Z'#4±…L¦1$n±ƒ¢„"^¢‡h£ƒ)P±“! u±£y¤ƒ[&¥«  l§‡hgK%ƒ ±„S¤ƒ@YL9±‚u¤‰?ƒ>;±…±’ ±8ª†‚Z'#4±‹T¦†1$n±Š¢Œw^¢’q£˜\P±§E¤ ƒ0  ¤ ‹4  ±4±…E±‡ ±¤±± ¢‚Y± ƒ ¢ˆ Y± †<£$–:" £$¯z:"/ T¨5  %¥„ U ±,¢Jƒ± … ±…¢a±ƒ¢j¤ydUŒr 5 ‚jQ d‚_ „/ 0 V¨¥H  %¥ŠU ±…R¢…)ƒ± w±Šd¢‡i±†L¢Œs¤•}dUŒr –h ‚jQ d‚_ „/ 0±T±ƒ` ±‡`±‰4 ±Œ ±" ±(3 ±(–f 1 ±™W¢ 3 ¢¨33 ±%‚q ±%z ¦„U 0 ¦  0;£‚YM±m²y¢*±B £ˆYM±„s±ƒ)²‡M¢‡2±Š!£‚YH±†± C £ˆ#YH±± Šy 8±†v±Š!±‡¢&±‚±‹x¢‚&±‰^±-¦.‡D±Œ9 <±’F±ƒ±•8±ŽK¢§d&±…B±šR¢†[±žb±–9±…t¦‘T‡D± ]¢K ¢’` ±ƒ-±z¢ >X ±‡±„6¢ ŠX±-…2±„5 ±-7±˜Y ±&‡= ±&/-±‚ ±Œ±ƒT±“/± ±—3±¥A±‰`±­± ,b .¢\‹H±†/¢ƒJ„+±‡9± †C£ƒa.±g¢rŠT£†Y:ˆ /¢š‹H±—D¢~„+±‘b± Ž£ˆ.±§R¢—%ŠT£–:ˆ r 6±‘+±‚X± …q±F¢e„±ƒN±‚²‚°±†r£‚_„)†±ƒC±9 7±¦>± ± <±„x¢ˆ0„±‡=±„W²j°±Ž£œJ„)†±“i±‡ ±$…i ±$ŸT ±$…| ±$Ÿg ±!k ±!…( ±$†0 ±$  ±$†C ±$ . ±$•\ ±$¯G ± ƒO ± ‡u ©, < ©,ˆ) < ±'… ±'š §„A10#A § 10#A ±$„ ±$t±)‹ ±(“# ±(¨V$ ¢#!ƒM±”h ±)‹ ¢#ˆvƒM±®S±…Nru¢ˆ1‡g¢Oƒ¥%WRC'¢ƒL`±X¢0‰±†U¦c‰<ƒ[!ƒ £,^6¦.w £‚El£…Yƒ{±ƒ±‚=±„N² ¥/x9±•±„:± x¢D‡g¢Šmƒ¥YWRC'¢u`±…~¢ŒG‰±Ž¦˜.‰<ƒ[!ƒ £ƒ^^6¦„w £†}l£“rYƒ{±Š±ˆ±ŠV²ˆ  ¥ˆMx9±®p±™m±‰‡NƒK - @7I".; 6 G+    9,@& G TWTƒo(E  &S…{©‚M‚a  ²ˆR` =(Rr  ƒ[ "  ¤q ¥”Q`¥…© z « J, < = ©OC4k(¢„g-¦{’ZO ©fE ‚)I²eÀ ] /  & ' Epi@D F   #  7 & '- ej  3 ^‚1M B)©M:ƒ ±…=¨  7­ R lW I)®  |‚"‚      !D + ‚%C) 4 B@ #‚ . ! |&<'E[7. ±²S±†±ª ±‹:±Ž2±±„B±¨P ƒZ …- @7I".; 6™2G+    9,@& G TWTƒo(E  &S…{©“b‚a  ²•` ‹T(Rr  ƒ[ "  ¤ˆ7 ¥«\Q`¥Œf© † «ƒF J, < = ©…C4k(¢<-¦šf’ZO ©‹oE ‚)I²‰WÀ ]• /  & ' Epi@D F   #  7 & '- ej  3 ^‚1M B)©†:ƒ ±•c¨…e  7­‡ R lW I)®ˆ |‚"‚  ‚)   !D +”0 ‚%C) 4 B@ #‚ . ! |&<'E[7. 0 ±™V ±!‚@ ±!…}¢,„O‚0y ¢,‹f‚0±ˆ~ ±" ±"…D¢3 ¢¨43£ƒT £ˆT %±ƒ± †±-± ±8± \±§±–I £ˆ7 3±†y £”k 3± d ±B±U±‡P ±¡W±† ±¢$‡g5 ¢$¡R5£%ƒh$†b £%Žq$†b‚ ‚{f,ƒo 0‚G‚DX(¦†X‚Ce‚wX±`±„g©‹8Q …iL U¥‚n)£%C £‚£ ¦„ Q¥„ˆ@4£(%¥4,‚F¢‡t  ˜f,ƒo 0‚G‚DX(¦—m‚Ce‚wX±Ž±©£Q …iL U¥‰jn)£…C £…4£ƒH¦Œt Q¥’`ˆ@4£…|%¥†<,‚F¢’}@±•d±ˆ9 ¢{O±‚v±ƒP²† ±¯ ±‘± ‡¢„-O±‡.±ŠA²Žq¢ˆƒ/ ¢¡Cƒ/£…> £Ž> ±-…/ ±-4%±Š?±„±‚±„ ±ŸR±?±Šh±¢…% ¢ž:%±‹2dn¢g£~Y‚f©…\'W K >±}±ˆk±E©k # V ¢zUªQ ]‡P„$U†H£[‡A¦‡h‚/©Tˆ;#1£…U±2 q¢¡|£ˆ Y‚f©’'W K >±„ ±“±‰ ©„( # V ¢ŠOUª›< ]‡P„$U†H£‹d‡A¦–‡h‚/©–ˆ;#1£•{±•V ± ‰T ± ”k ±(“1 ±(¨d ±) ±)†d ± ‰H ± ”_¥†tT' ¥?T' ±$‡D ±$¡/ ª‚E#.)T- ª‡$#.)T-#£‰x/±ƒ:±"Šv £š-x/±‰F±" )±‰ ±‚] ±¢0±†<±„p±‚#±£H…¢„!±‚J ±Œ;±…B±ƒW£‰kH…¢’l!±‰;=±„r±‚%±£E…¢„!±‚L ±Œ=±…D±ƒY£‰pE…¢’n!±‰= ±Š/ ±£U-±‚y±…R£m9¢‚z ±†+±Ž>£†%9¢‰k‚}/:±•±…±™!±‰±‘±†±ˆF±Œ/±‚±Š$±„!±‡±‹±„Zo±‡A±‚Y±—F±ƒ-±‡F±ƒj±ƒ±‚7±ˆg±„3±ŽU±†g±…O±†±†l±„±‡±ƒ8±„0±ˆP±™f±‹±‡m±”±•.±…B±!±…T±‡±ˆ±‚±” <±ª!±Š ±²G±’7±¢%±Œ±‘±˜c±„A±”M±ˆG±±–)±‰9±c±±…7±¯±†_±±‡Y±†9±„s±‘S±ˆk±/±S±‹#±Œ ±]±ˆ-±Ž7±†u±ˆe±‘%±³Q±– ±_±ª±ªa±‹ ± G±‹-±Ž)±±„5±¨C¢,‚)F ¢,‰@F ±(„ ±(™N_ -±<±„B±]±†=±„a± „j¢‹`x¢ƒOƒ$¤‰$iƒ -±¥O±‰I±Š(±‘T±‹M± ™n¢¡x¢Šfƒ$¤Hiƒ ±‰/ ±¢U1±‚"±…±‚#¢…I…±†} ±—5±‹±œ¢š|…± ±)„> ±)Š ±$— ±$°n ±)8 ±)†)µ$‹Tl´„/ªÐ´Š)ªÐ µ$¤|Tl´™3ªÐ´žMªÐ%±ŒK¦,‰00.ƒ:3 ±¥q¦,T0.ƒ:3 ±.‚ ±.„'¢ˆ ƒ/ ¢¡Fƒ/ ±…' ±‘[ K¥Žp ‚$¤Q‡±‡~±ƒ\± „|±S± †2£Š!=(¢„;†(±‚D¢Y'±†J¨…+I>;‡$_ L¥¤ ‚$¤‰o‡±”2±Ž± ŒG±Š?± £¤ =(¢D†(±’j¢‡2'±a¨™OI>;‡$_ ¤I -±…A ¤¥ -±” ± ˆ{ ± ” ± Š ± • ± Š ± •( ± Š ± •. ; ±Œo D. ±.‚a ±ƒ ±†@ ±ƒ. ±‰:†e/ƒ¦@Š„o¤4“‚p«6‚$?‚y¨…0„Cqsd¥‚,Y¢k£…n„6§¨z ‚N( ¦G:"«% xN0O;F«„.c‚w!'M#¥\S?‚7¤c/ƒ5§&¦*‰G…ƒ¢‚L¢‡£…«ŒMR( ¨ O)'ƒ© ‚K/K© ‚y£ƒR9¤&' UN6&jˆKl.'t_‚J¤„pA£",£x‚% K‚‚Z‚v Nƒ1.+‚q !TR,+% {%Dƒ%F*pw8g£‚? ƒM¦•@Š„o±… ¤™,4“‚p«‰$6‚$?‚y¨‘…0„Cqsd¥†‚,Y¢ˆQk£Œ:…n„6§‚)¨Š/z ‚N( ¦„,G:"«ˆ % xN0O;F«‹„.c‚w!'M#¥„e\S?‚7z¤‡Lc/ƒ5§‚d&¦—Q*‰G…ƒ¢ƒ8‚L¢‡Q‡±ƒu±ƒ%±‚B£ˆr…±„>«Ž`ŒMR( ¨†r O)'ƒ©…Z ‚K/K©† ‚y£†wƒR9±„±‡$±ƒC±„;¤ˆ[&' ™qUN6&jˆKl.'t_‚J¤‹„pA£‡x",£• x‚% •9K‚‚Z‚v Nƒ1.+‚q±…M !,TR,+% {%Dƒ%F*pw8g±…_±‡£ˆ ‚?±‚#±”* ´'„3ªÐ´Š-ªÐ ´'™7ªÐ´žQªÐ± †;±%Šl ± d±%Ÿ¥‚p++T. ¥‡O++T. 8 ±˜ ±c ± x ±$˜} ±$²h ±“# ±¬I=¥Œ ±ƒp±ƒ±…m±j±† ¥¡ ±‹6±†4±ŒY±†±›#¢$•} ¢$¯h ±#Y±7± ±#Š.±‡±•3 £‚ YN¤3 £ˆYN¤‡£o! £„!!/±‡¦‰og R± ‚± F ±œ0¦š.og R± ™c± ˆ7!±“*£ ± ‰! ±¨=£z± ž% ±&„7 ±&Œ)±/¨T²(Rp ²(¦p²j𠲡ð ±P ±¦v ±$Ž ±$¨ & ±&g ±&‡y¤(‰‰6 ¤(žJ‰6¢ ˆJ ¢ ’s…H'‚_¬‚~q‚*;j@r3†²ƒÀ¦„<ƒ„aŠ-1±ˆ¤‰lC„u¢sƒ1¦„}#a¥†6@o@%±n£‚Jƒ{±„>¢gƒ9¢‚ h¤ƒN-ª„%ƒ`%„Dg‚o‚.ƒ:¢UK±ƒ±ƒ¤‚‚V‚?£‚#7 ¦W…^]‚J£‚U%`¢‚x‚#±‚£„ ±ƒv¢‚-£^W„-ª…Q‚1† |_a+9„=:£ƒ>…%H£=1§†4gƒg|ªW ƒ,X‚gˆ1!I‚6±„;¬‚HZl‚GB',2B,¢B‚£9ƒR.£nƒP *5‚(hF* =FQ~:m.>:) ‚b¬˜q‚*;j@r3†²ˆ#À¦bƒ„aŠ-1±‘:¤šlC„u¢‡ƒ1¦Œ_}#a¥’j@o@%±„£Œsƒ{±ŒB¢Œ~ƒ9¢†hh¤ˆNƒN-ª›pƒ`%„Dg‚o‚.ƒ:¢…K±Še±‡¤‹‚V‚?£†[7 ¦oW…^]‚J£‰A%`¢ˆL‚#±ˆ £‹ ±ˆ¢†8-£Š3W„-ªŸ<‚1† |_a+9„=:£ŽG…%H£‰=1§›8gƒg|ª– ƒ,X‚gˆ1!I‚6±Š¬’nZl‚GB',2B,¢†‚£‡PƒR.£‰sƒP •N5‚(hF* =FQ~:m.>:) ¤@.†L± ‡I ¤.†L± ¡4 ±*ŠD ±*šj ¦*„w‚h…}S ¦*•‚h…}S ±O ±¨u± …V±ˆ] ± ±a ±(†4 ±(›g%¤ƒIM± v±Œ ¤‰UM± ¥A±šl=¥…ƒPg„± ƒ±†?±„e±‚z ¥žEƒPg„± ‡e±–e±‹|±Š ±± ‡r±„ ±¡'± Ÿ=±”9 ±/‰q ±/ž ±(‡ ±(œ@ ±,…5 ±,ŒL¢,…^! ¢,Œu! ±,…_ ±,Œv ¦,„.7= ¦,‹*.7= ±,…a ±,Œx ±,…b ±,Œy£,…7, £,ŒN,  ±™=7R± Š¢‚!‚I±„\±ƒ±† ±F± ˜h¢‡u‚I±‹z±†X±š: ±( ±(¥M)±2±"‡A±Ž/¢‚…| ±–E±"±¨¢’7…| ± ˆu ± ” %¥„zƒ PWƒF± ‚- ¥ž ƒ PWƒF± ‡ ±‡ ±Žs ±ŽV±¨^£ ˆlN= £ ”N=¢#IW ¢#ŠW± ŽD ±&…u ±&g ±†. ±„4‚ ‚zP &L 2 4Prf±—~¨†ƒ#8bRE+§,nI‚O±9¤4+„h²‚80¢j "2 E#D2±‚V£k=¢C; ƒ[ 5 ‚Aˆe‚MƒG±‚E£‚h‹G ƒu ‚HR‚$ )  B6‚Fiƒ#7$±…±Œ1 ‚ ˜ P &L 2 4Prf±±$¨—4ƒ#8bRE+§†8nI‚O±Š¤h+„h²Œa0¢‚xj "—} E#D2ª+*d"22 "z;Q>O+9kS+©u/1=fƒ+±±7¢:£-…h?§-I„&6ƒ4¥?*%¢ ¤BD $F h  Q*`‚4=F@r‚ h'2ƒ'¢  )*@  - B'sf¦4 1s©.9A £F/k§ a‚^ M J‚#% ‚Y^L¤ O¤‚0w¤‚Uvd ¥j+,Y£Bƒ¦@I`‚KA§ 1@¢„ ^  R q/[ 2 'H]ƒL„4„ £Xo‡>±P¦ … ‡| i_p< *‚‚v ) J6.‚Y‚ h#7$«i, -®S0[w _?‚K‚nD‚d±†O¢‚…N±‹Y ²¢.@±˜r±n±†h±^± ³[ „E«˜\ 4L s4PŠ_¢‡$Z $šL^Xxb‚IP@ :% )Zx s4t‚I¦ŠN„ $E ‘:/„g( ƒ#8bRE+‚C>ª†7*d"22 ‰^"z;Q>O+9kS+©ŒCu/1=fƒ+±ƒ&±‹`¢„`£‰1…h?§‹DI„&6ƒ4¥†*%¢¤ƒaBD $™ h  Q*`‚4=F@r‚ h'2ƒ'¢ƒ; ‡t*@  - B'sf¦„# 1s©ƒM9A £ƒ/k§Š a‚^ M $‚#% ‚Y^L¤†wO¤ˆw¤ˆ]vd ¥ˆ[+,Y£„[ƒ¦‡^I`‚KA§„U1@¢Œu^  ™tR q/[ 2 'H]ƒL„4„ £‹ao‡>±‰B¦–… ‡| —_p< *‚‚v ) J6.‚Y‚ h#7$«†0, -®y0[w _?‚K‚nD‚d±f¢Š …N±Ÿ}| ±E ± ƒ±‰7 ±)„ ±)‰Y)£‚_Ž>± ‡5£ƒA £—rŽ>± ’L£› )¤ˆ7 $ £‚^ ±– ¤‘U $ £ ±° ±…B ±‹NJ!¢„7²†ð±‚±‡4±ƒm£[-+P±Œ $¢Š!7²‘5ð±…P±œ8±™ £‡r-+±‚m± >$ ±$³Y ±$™r ±/…E ±/™i ±Œ ±! 9±‚2±‚^±£‚ R‚±:?>$£^N¦bt<7†¦C0dT 6G B±—E±‡e±ž£ŠR‚±™±‰+±„v±ƒa£ŒgN¦•ft<7†¦–v0dT 6±† ±(+ ±(¥^ ±‡s ±> ±/ˆ ±/œ.+ ±+‹5 ±+…`¢ƒX ¢ˆX±ƒ~ ±…? ±‚f±‰E[±ƒh ±5±‰/ ±ˆ ±%!ª ‚Bv-,5u ª ŠFv-,5u ±) ±)†_£(ŠuA‡: £( (A‡:¤i* ¤…X*±‚@±‚ ±‹,±f ±# ±¤6!¢'Šf„E±±… ¢'Ÿj„E±†a±Œ7 ±(„% ±(™X £†v¢)ƒC £‹†v¢)‹C` ,¢„ ±Œ~±„i<¢ 4±…x¢$I¥„B-y‹5±†m /¢‰±ž±Šu±‡(¢ 𱑢¢(I¥™u-y‹5±Ž:U¦`ƒ‚7ˆk±„H±ˆ² “ ði¢‡*/¦‰(*fs¢†/±†0±†#£Av†±‚/±Ž¥ƒ[ †Gi†"¢ Y ±)‹ Z¦–sƒ‚7ˆk±ŠT±”R² ªX𱄢/¦Žy‰(*fs¢ /±N±Žx£š,v†±Š!±£ ¥™ †Gi†"¢…QY ±'…k ±'šo ±YU±ƒP ±„±/±‰ ±…9 ±‹E\+¤}‰r ±!s b*‚;‚L H)K+ ("[] ,¤–‰r ±!†( ’*‚;‚L H)K+ ("[] ±%‰" ±%”+%±—/±T±ƒF±ƒu ±®z±…±Š2±ˆ ¦”#RZ ¦«nRZ ±* ±* C  ±—h % ±—p±e±Š) ±„C±¡t£ˆEPg £¡kPg , ±,‡5f 0±‡+¢“Q¢„?¥tHk„ £‚ K+± ƒy±r£‚^ƒ[b±O 1±œ>¢¬w¢$?¥‹Hk„ £™kK+± б©]£gƒ[b±— ±‚N ±‡-Z *¢ =f¢ik±”A±ƒQ±‚¢†&.±†u±¢Š…R +¢ ‹ff¢…k±¬ ±‡@±„Z¢.±Ž±¢C¢š(…Rƒ@Y¢*n W\ƒc5+$0 ƒe&H7£†‰y±†:£-c±‚z¤‚ F¨L… 55ƒr ±ƒ£„w'0¦N‚B !V±ƒª :   @‰0.e ‚ d<t²Ep£^L   96M(3N$¯1J a!$‚"7,G¥ˆ8ƒ&‡! `¢…1n ™}\ƒc5+$0 ƒe&H7£—‰y±£ac±‡ ¤Š F¨‹c… 55ƒr ±‡q£ŒB'0¦Š:‚B !V±’Yª ©%   •D‰0.e ‚ d<t²¥xp£‡7L  ˆ 96M(3N$¯ˆ#1J a!$‚"7,±‚d¥œ\ƒ&‡!¤ 8ƒ ¤ Šaƒi 0¤…fu¢0\a£‡|¢‚‚±„?±ƒZ±Š ±±„ 4¤šy±…|¢¦V\±ƒ?£h¢†M‚±‹0±‡s±£x±†^±”& ±(ƒR ±(™ - ± ŠV[)±„-l ±‚¢:?£U‡2¦ ˆ#}`¤…1 u‚% -±S± …K±†L¢š%?£‹^‡2¦– ˆ#}`¤•W u‚%¢&ƒz6 ¢&‹l6 §„Y3/A §$3/A ±/†y ±/›±'ƒR±. ±'˜V±¡Rw9§'X&6Z\ƒ9«ƒMKK'5‚H¢‹¢ƒj£|I]²†]ಠ…/À²…0À 9§’]¢‚ ¤ƒV‘n ±‡@¢…p‚d¢ ƒ3D±„¢„ ‡[£„_ˆgF±e 8¢Q]¢‡¤œ|‘n ±˜U¢’$‚d¢ š~D±‹L¢™ ‡[£•ˆgF±¢ ±#ˆ ±#V¢(Ž4 ¢(¤24 ±(4 ±(¤g ±J ±¨p£ƒN £ˆN£ˆ)Pc £¡OPc±V±ƒb ±‡b±‰6 ±7¢‚m5 ±„¢—q5-±ˆS±#”±‹±T±C ±f±#­l±›C±‰Y±¤g ±ƒu ±’O ±†¢…t ±›%¢t ±ƒa ±ˆh ±(N ±(¦±„|±"„[ ±‹±"š±‡k±"†B ±‘ ±"Ž4 ±N ±¨tr%±& ±%‹{±–* ±… ±|±‘j±&5 ±«±&†| ±)‚a ±)ˆ($±“0± †%£qH‚ ±¬V± Žz£ˆcH‚¢&69 ¢‰D6±‘N‚4¤Œ};!±‚§‰ <$v(¥‚9 ‚*±&¥p<0… ¢‹&†'£^ H¤?%ƒ £6$±„&¤Wƒ. ¢b‚±„b±V±‚y¤ƒq‚sŽP^±†E W‚8VvKƒjZ‚5(7!J EU²ƒvp ¤¢;!±‹0§‘2‰ <$v(¥Œb ‚*±†¥ˆ6<0… ¢¢q†'£„ H¤‰ %ƒ £„U$±‹¤†+ƒ. ¢†j‚±‹S±…o±Š¤\‚sŽP^±›I — ‚8VvKƒjZ‚5(7!J EU²˜p ±$e ±$›P ±"8 ±"…m ]" ±"…± ƒ ±™:± ‡f ±‚* ±‡ £$˜ 0 £$±x0 ±’C¤*‚8H ±§V¤*ˆH ²ŒuÀ ±ƒ7±‚T²›OÀ ±ƒ5 ±‹ ±" ±"…= ±‚x± †³gŽ ±,± P³Š<Ž)±‚w± †³ež² ±+± O³Š:ž²© A£t$¢Œ2±U¢ˆ.O±†A £¦$¢¥X±¡j¢O.±‚r±Ž±… }* ±*‘#¢‚F# ¢‡%# ±“c ±«.£ ‚[ £  ±‰, ±šA ±*Œ ±*œ8 ±ˆ; ±—‚|¢G…O±L£“3‚$¢W?±Ž5±¢… ¢¢ƒ>„ ±±‰¢--:£1‡2£S ±„o;±…=£…-ƒZб†¥‰l‚'BXƒ`±¤BcZƒZ ¢–Z…O±†S£¬Y‚$¢Šu?±ŸJ±‰L¢‘T ¢ƒ)¢g„ ±‰±”6¢˜x-±ƒl£‰‡±„j£aS ±Œ ±ƒx±Ž£ŸƒZб‘ ¥Ÿ‚'BXƒ`± &¤•fcZƒZ  ±Œ4¢/ˆ±ƒ! ±¡G¢ ˆ±ˆh(±”e±‚¢5‚±†C ±©x±„1¢‹>‚±Ž5 ±“Y±ˆZ± 9 ±¨l±‘x± ›$ ±&…( ±& ±…J£ ‡S+q ±Ž6£ ¡>+q ±‰¢ –K< ±š2¢ ®< B( ±(•u ±+ ±¦Q¢‚ Y ¢ˆ,Y¢%ˆj ¢%“s ±ƒ4 ±ˆ; ¢v)LK ¢ƒT)±‰8±…¢!†- ¢‡g†- ±H ±¨n¢>Š ¢™dŠ'¥… ƒ P[ƒC¢ ‚=# ¥ž/ƒ P[ƒC¢ ‡#±&‚p± ˆ ±&Šb± œ* ± …: ± Q£mƒYŽD £›ƒYŽD¢„-z ¢Š9z#±–f*±ƒv±†1 ±° ±†6±ˆU±| ±r ±L ±'‚ ±'— ±'‚ ±'—¢„, ¢‰  ±@ ±Š ±'…& ±'š*±’Ks w¢Ž+¦ƒDu „O ‚s7>ƒ &†+@9©‰@n"~‚R0B±…<¬‚2 "% A K²…8€¤‚L¥‚v7U]Nª‚V ]A‚K‚nƒ( w¢£>¦ˆDu u ‚s7>ƒ &†+@9©šUn"~‚R0B±‹H¬Š6 "% A K²O€¤†tL¥Š<7U]Nª’| ]A‚K‚nƒ(±)…$±ˆ - ±)Šk±  £”Gƒg ± £­mƒg ±¡ 8! ±!ƒuVc±‘Z±‡l±‰~¢…i¢H¢ˆ#D¢F>5£tŒ_ ±…%±ˆ@¢wk²t ²j Q¢N„±]±ƒ±n±…^¨„ -6H‡p' . n±¦m±‘ ±›¢‹D…i¢‰L¢“:D¢ˆ >±ƒ£˜?Œ_ ±Œp±‘,¢ˆck²†H ²†r ±„j¢‡l„±ªH±Ž ±‰`±šb¨”F-6H‡p' ±†  ±—b  ±—j±>±Šh ±™ ±› q* ±*‘ ±v ±‡J ±U ± j ±%‚} ±%Ž ±(“s ±(©& D¤„l†X…F*ªaƒ)ƒ P[ƒC3h¢ ‚>#±ƒq±‚z±†W± ˆ¥‹‚ ‚l±…v±†p D¤™†X…F*ª›ƒ)ƒ P[ƒC3h¢ ‡#±‹<±†±C± “ ¥ H‚ ‚l±–±Žu ±,„t ±,Œ  C¢…±…{±ƒ¥P0QC'¤ 2#`© ) '‚B¤ +¢ƒ"¢6W£‚ L±ˆa F¢Ÿ%±—±‰(¥0QC'¤ „!#`©†f ) '‚B¤‡ +¢Š@¢‰ W£œ L±“j‚y±‹±‚¤P.…p§[ 0W S‰Aª .Is_ .±ƒ £*D1±®…¢ƒV  K‰  !/ JH†t |£~'±„t²p ± ± ±›?¤‘e.…p§ 0W S‰Aª ‡X.Is_ .±†x£ƒID1±ƒS®‰o…¢‘hV  š6‰  !/ JH†t |£Œ'±Š;²‰ pS'±„f±…¢ˆUD¢~•^¨„j3Lw±ƒE±? '±•{±‹!¢“lD¢›i•^¨š3Lw±“k±•c+±#±!ƒ£„(ƒ;±‡) ±¢6±!‡D£Œi(ƒ;±—O¤$4)! ¤$©)!I±‚¢‚7–-±X= ±ƒ±‚u± ±‚N±Z±ˆ±‡±Ž*ª‹\ ( ]G£ˆo†@b¢…{ L±—%¢›]–-±ƒ{± „,±‹q±ˆ}±‡|±†g±…±g± |±£.ª¡ ( ]G£™†@b¢ˆ…{ ± ‡ ±  ± ‡ ± !v6²‡F0   ,„K:'# )[ 4C$¤ …K,±„?±‚;±…  7²˜[0 Œ;  ,„K:'# )[ 4C$¤¦u…K,±™r±ˆ±Œ4 !* ±*G(¦#8W]V>D¤†v!U ¦#‰ W]V>D¤ a!U ±‚ ±ˆ$ ±-„ ±-Œ!¢”a ¢®±Œ3P ±› ±…z&± ±&ˆl±¥L ±-„6 ±-Œ; ±$‡n ±$¡Y¢U ¢/[j±ƒ ±„/¥;‚~%Œ]¢q‚¤„h?ƒ@±„C¢‚R)¢ˆK‚;±‚5±‚a±•±e/±‚X±…#¢ƒ(¤‚02‹Uˆ"¢‰m„Z¢†2-±ƒs l±˜ ±‰6¥ša‚~%Œ]¢‹‚¤’$„h?ƒ@±ŠO¢‹)¢”‚;±Œ^±Še±­J±…±„±‹D±Œ¢ŠF¤œ2‹Uˆ"¢žq„Z¢I-±˜ ±ˆz¢$‡u ±¢ ¢$œ±ƒ ±’; ±«aY *¢Mƒ5¢„.ƒ$¢†~I±ƒH±‚f± 7±…9¢6]±†i *¢©sƒ5¢Lƒ$¢‘'I±›±‡± …l±Ž¢Ÿ\]±Ž'¢Ž`3¥ ƒ :Q[R±˜Z ¢Ÿu3¥ ŠR:Q[R±²E £„ 8„±•* £*8„±¬u ±/“e ±/¨ % O±S±† £„1@§gd $8£‚$ +¤N2 ¦G„a!©ƒq" ˆ£}N «ˆ_%@   Q±Š±‘7£‹|@§„gd $8£…C +¤‚XN2 ¦‰mG„a!©’K" ˆ£ˆnN «¢J%@  % O±V±†"£„2A¨Z` $8¢‚&¦> /¦D„n¨ƒyˆ£~O ª‰ =   Q±Š!±‘9£‹}A¨„ Z` $8¢…E¦‚Z> /¦‰rD„n¨’Sˆ£ˆoO ª¢t=  - ±- ±-ˆ  ±† ±‚¢4' ±†H¢ˆ ' ±$ŠN ±$¤9¢ˆ&ƒ3 ¢¡Lƒ3?±„J²„4¢ƒU£0“!±†k±… ±“$²Š<¢ˆ £›“!±Ž]±ŠG K( ±(•~ ±$+ ±$§±‰JZ*¤ f„vK±4¯‹3  +-ƒ±„hµ„$D +¤ ‹„vK±„¯¢~  +-ƒ±žSµ $D£b„" £Š„" ±/’j ±/§ ±†p ±\ ± ±¢0±(‘±I ±(¦N±‡ ±‚T ±ˆ`‚e/U9±oC:BLLy6¢n…qM#9 #²@@J¢¢Y!¢„a!§d`: Um¤ /„<§|??h: Y±•h±…@±š(±Š ±‘X±†F±‰ ±±‚o±‹"±„\¢ˆr…q±‹d±„z±±‡\±ƒ±˜±ƒH±‡d±„±ƒ<±‚_±‰±„Q²Žh@±‡±†±†R¢†±„3±‡6±ƒ\¢„MY±ˆn±š ¢‹%„a±ˆ§•d`: Um±•O±…\¤B /„<±…p±‡(§ˆ"|??h:±‚7±”A ±†8 ±$ ±†? ±+ ±†F ±2 ±†M ±9 ±…& ±‘Zµ‡UU µ˜(UU ± ±©( ¤ ]²L ¤¦5 ]²¡a ¢ƒtf±ƒd ¢• f±Ž{N$¨B'…‡@±Œ±t±„K±…?¢†J7 %¨•U'…‡@±± ± ±•e¢šn7 j+ ±+†CIb G/~  <!S$ G ), #%‚M"-1,_s  Xƒ7¦ ‚'!¢‚$± „b b GšU~  <!S$ G ), #%‚M"-1,_s  Xƒ7¦ ‡!¢†P$± ‹y5¥}B#D±‚¥„ ^$±„ ¥¨HB#D±‹¥Š^$±‹9 ±…: ±‘n%±n± ‡O±‚$±L ±¦± ’f±†Y±‡…?‚J§ƒa¯‚B9 „&‹TPD ‚*1£T‡¤7£ˆB‚h¢r±Z§a†=LM=²}à±…Q²ˆð¤n5!© ,9X­ƒg!9"‚$ L$ŽgƒV& ƒj  & *  &(=;+5c A    7)*&H‚nI, $   W „.P…TG)¤8"‡S§N„6 0g:D*…)*d Z ? ‚B9 „&‹TPD ‚*1£‰r‡¤’37£”MB‚h¢ƒ±Œ§Œx†=LM=²ˆC౎=²–tð¤†5!©ƒI ,9X­Œ<!9"‚$ š7$ŽgƒV& ƒj  &‹ *  &(=;+5c A  ‡} 7)*&H‚nI, $ • W „.P…TG)¤•k"‡S§†„6 Vg:D*…)*d Z ? ‡/¢‚L&¢!„ L;z¢‚_h¢~r=¢ƒ‚:±‚I±R±…"£V7t¢S…P±Œ3¢GZ¤`†zŠ/‚±A«po  ‚d±… .±–o¢†R\¦›Cƒ2ƒ4‚yŠ¢Š^w¢“+„,¢‰q„w±K±ƒ?£J‚n>¢ŠP&¢Œ8„ ±ˆ±ƒ±˜E¢ˆS‚_±„W¢„r±‚y¢‘u‚:±ˆ±‡Z±Œ£„o7t¢‡q…P±¦¢¤KZ¤–†zŠ/‚±‡«‰uo  ‚d±™? ±ƒX ±ˆ_£(Š9 £—sŠ9& ² Ð  ±; ²Žeб ‹±ˆ ±•%« ‚?!4NI, « ŠC!4NI, ±‚ ±Z¤ƒ ¤Œk ¢(H ¢¤;H ±$‘k ±$«V ±ˆU ±  ±¢6 ±‰& ± qta ±„c±ƒ ±„g ±S ¢†=³ Dc ¢’q³ •wc ±…N ±Ž: ±Œ ±šv ± ‰, ± “U ± ‰/ ± “X ±†g ±2 ±‰q ±¡<±±… ±ƒ_±t ±‡1 ±˜F ±ˆ¢'„. ±™(¢'‹'. ¤#yUCJ±P ¤#ŠNUCJ±›; ±‡o ±: ±$ ±¥7 ±‰u ±£±‚V± ±‹t±‰r ±‚b ±‡¢&hq± ‡N ¢&ˆZq± ›r ±$•` ±$¯K a±$‚v±†- ±•t±$±–S ±/ƒy ±/˜ ¤‚iN+‚< ¤‹UN+‚<P%±’>£—L±’'±‚±ˆ±ƒ¢f„Z¢Cƒ; &±§Q£°r±©r±†I±¢ ±˜ ¢ˆ}„Z¢”gƒ;+±‹ ¢‹|±“¢ˆ;‹ ±¤3¢˜0±¬k¢n‹ ±)(±:±S ±)†o±‘`±‡,E ²Œ.У‚uf'±„*¦l±…,±Š$ ²¥TУ‡*f'±™.¦ˆ(l±1±žH'¢~4¢#j@£ƒ"($ ¢‹4¢#¥n@£‹'($ ±*Šs ±*› > ±‡*„C%‚¨‚‚;"%‚~„Ca„,±‚¨†‚ 7¢‚B?¦„d;ˆ)ƒk¤… h‹§ƒq‚‚:CWe2¢‚`¢…d+¢6‡©‚g„c‚ S/‚F‚) ‚¨—!‚;"%‚~„Ca„,±‡¨ŸA‚¢!'8£†,\¥‚4ƒtOIv¥4'EO!§(0O‚U29«‚?   "0G‚nƒKS ‰BP ±²‡wp£3 „( V¥™Y‚jJ…P±›%±ŠI£‘r…¢‰0W¢±ˆ9£Œ„A£ƒ5wE špwZHiQb ! &†z(tS p2>¢‡l±„±ƒW£\¥‘ƒtOIv¥„M'EO!§‡F0O‚U2±„n«‹   "™0G‚nƒKS ‰BP ±Œ#²*p£…z „(¢( ƒ! ¢(¥<ƒ! ±(’w ±(¨* G£‚W:‚4±…Y±ƒ&±„W¢‚„±5¤…p‚;h±‚I£‡&…:9>±‹9£7,§TO<f I£—j:‚4±–n±Z±n¢™Z„±§ ¤y‚;h±Š;£œ*…:9±•q±›_£ƒT,§¤>TO<ft6£„CˆXd®0 '?‚Sd$(±#‚~£F ±‡F¨;4‹‚? 9£iˆXd®‰90 '?‚Sd$(±#˜£‡] ±K¨”_4‹‚? ± ±©7 ²(‹{À±‹3 ²(¡.À±›Y ±Q ±¨w ±‘:¢„]‚- ±¦M¢“7‚- ±‚9 ±…<±ƒ±mª.‚kJ&K2± „  ±†:±œGª…[.‚kJ&K2± ‰gy 5¢„>d¢m]¨4= ‚ <¥8l|<±"±ƒ ± ”5±'±ƒ ±‰A 9¢dd¢Ž!]¨„g4= ‚ <¥ˆl|±ƒ[±Š±‘c± ® ±Œ0±ˆH ±Œ7 ±› ±*‡b ±*˜ ±(Œ ±(¡3 ±'U ±'¢Y‚¥‚H"d ‚²‹: $ ±N£Œi2‚'ªw!(; ' :'¤‚9 £ƒ.‚¦Hh! a£Š#j?©kfM=¬ /"I,!'²ƒ\ౄn£† ²ƒ,p±‚£MM ±h ¥—["d ‚²œO ± ±‰£¤42‚'ª„)!(; ' :'¤†( £‹|.‚¦†h! a£˜}j?©ˆWfM=¬†{ /"I,!'²Šzà±C£›  ²ˆsp±’+£ˆRM ±k ±¤~ ±†J ±h ±!D ±!…„M‚¥p’q<9§0?cD¥‚‚0’U m§'„+*5¤`)f¤w1ƒ6¤G/a¦n@8ƒ{²2ð§"#5&‚@¨c%„ TO„©K‡k‹¤R…(3V£‚8‚D‚G³…+\±…2³…,\' gMX   @^ 82  CZ L~  „_ JW %WlK5¥*q5ƒ!ƒ]±‡Q£/Œ‚¥ †mo‰£C„!¢ƒ m±“S ±‘' ‚)¥–’q<9§…%0?cD¥›(‚0’U m§ŠE„+*5¤‘u)f¤ˆ1ƒ6¤ˆaG/a¦"@8ƒ{²‹[ð§„H#5&‚@¨‹z%„ TO„©˜‡k‹¤ˆ…(3±ƒu£‘‚D‚G³Œ\±‹:³Œ\±„@ ‰<MX   @^ 8š2  CZ L~  „_ JW %WlK5¥‹3q5ƒ!ƒ]±C£•3Œ‚¥–?†mo‰£† „!¢Š$m±§w¥‚x(+R. ¥‡W(+R. ±v ±¢ 9±…uz¢ƒ±gF?±‡! ±@±ˆE¢†o±„#±„_±‡]±¡ ±(’_±‰T ±(¨±™z±- ±&ƒ ±&Šw ±(” ±(©8 ¢#~E±’C ¢#ŠSE±¬. ±•@ ±­ ±)[ ±)‡" ± ƒW ± Šu ±‰±„P * ¥”E  ± ‚M¥š”E  ±'Š9±‡v± ±'Ÿ=±˜±ƒ"¢„) ¢‚?£„ ¢‚¢5¢{E£Z‚M^±£ „F±<£^U¢R¢W²Уw J±±±‰M£)'±]±£+<¢dG¦‚AL%`¢‚o‚±‚d¨#O‡.„J0„7±‹ !£™! ¢›4¢ŠS¢’E£†f‚M^±‰c£=„F±‹e£…U¢ŠR¢Œ-±…6²ƒxУ™B J±…±ƒ<±˜'£‡t)'±‡e±…/£„`<¢‰9G¦œ,L%`¢x‚±—h¨•VO‡.„J0„±…~±›F"¢$‡H¢ ‚ZC±‘j ¢Ž~‡H¢ ‹/C±§¢"K ¢"…I S ¢I¯6†U  rSM¢…_‡L $± ˆW¢‚|I¯˜†U  rSM¢”9‡L%¤ˆS'‚7±=±Œ; ¤—-'‚7±‡± _ A£… …±‚h±…¢!C±…t±‡(¢†%¤ƒi‚;5¢„=±’±“±ƒ¢{> A£š3…±±'¢„SC±?±–¢%¤‰qi‚;5¢‹[±¬±¨N±Š¢–>-±(‰?¨9 <$@ ±; ±(žr¨_ <$@ ±‡ ±$…] ±$ŸH±‚5±‚ ±‹!±] ±&†G ±&Ž9 ¢‚Y±ŠT±ƒ ¢ˆ Y±•k±†B¢„A ¢Š ±(’i ±(¨ ´'„6¬Ð´Š0¬Ð ´'™:¬Ð´žT¬Ð¢ ˆ;= ¢ ’d=±%‹±… % ±%–±ŠSd-¤‚U`±‚!±§ )DX† ¥ƒNB!†?ƒC±‚H± „  .¤Š `±…@±ƒU§ˆs )DX† ¥’(B!†?ƒC±‰9± ‰W ± ƒ' ± ‡Mi±ƒ` ±C±‰'' ±”z ± ‚J±®e'¢Žn3¥ ƒ:QWV±˜h ¢ 3¥ Š`:QWV±²S,£@,±;£_ ‚$ £¤S,±œ±„2£‡} ‚$± @£… ‰l‚t±†c¢‚O¢‚q„2±…r±‚@±”[±‚z¢†(ƒ±,±„r±‚¢ƒ_P @£š‰l‚t±—x¢Š#O¢š<„2±=±ˆ±®F±Ž¢›,ƒ±¢_±•±‡]¢˜P ±(’u ±(¨( ±!ƒ ±!†D ±† ±dL £„H!±'…'  ( * u"-" ±,Ž3 !£‰O!±'Šn ‡ ( * u"-" ±)‚1 ±)‡x¤%†E ¤†E±+‹=4 P¢‚VˆT±i TN…ƒ3?`?„O! =\p.6© ‚V)nw ¢…\¢^¢+0±…<±O ±‘_±ˆx U¢—iˆT±„G ™N…ƒ3?`?„O! =\p.6©ˆx‚V)nw±„E¢“x\¢„w¢‡I0±Ÿ'±‡ ±/…a ±/š ±… ±x\ )¢W±Œ`± ¢eVg±ˆ ±ƒr¢|„t±”h .¢†$W±¦±¡ ¢‰QV±…±–c±ˆ'¢‰n„t±©l±”: ±(‚ ±(˜2 ¤…9ƒƒ7„ ¤ž_ƒƒ7„¢‡=/ ¢/ ±(/ ±(¥b ±“v ±© ±ˆ5 ±‘S ±(G ±(¥z_ -£‘)‚?±k±ƒ±‡V± ]±± ‡Z¢‘-!¢‰>±ˆ% -£¦<‚?±†r±‹]±‘± …L±_± L¢¦`!¢™7>±œI ± ‚? ± Œh ] ±‰{ § „q-,5u § Œu-,5u ±= ±„-±ƒ± †*±†±1± ±<± u±`±§±–M£&ƒv. £&‹h. ±,„ ±,‹1 }± ƒk±” ±…5± ˆ ±©B-²ƒ@² †@²,@²@ ²7@² [@²§@²–H@ ±ƒ9 ±˜Lc .¢Oz±„E¢ƒP•±)±… ¢‡.’8¢‡C‡±ƒC±…Z 0¢¥bz±‰L¢œv•±ˆt±`¢¡’±ˆ*¢œG‡±ŠZ±™~ ±‚q ±‡P ±Œ+ ±› ±-…* ±-/ * ±*? ± ‰C ± ”Z ±‡@ ± ‚|7¦%‹T‚tK¤w."N®…]Il_ƒ=gJDN'c¯‚P_ ED ¦‡z„^$¥y0¢ƒ;‚£„J©gj= $A §_6%k¤„*[Gk§†LQG/‚3©[¢‚['±]¤@M‚I±8± “K±…. >¦–8‹T‚tK¤†~."N®™8…]Il_ƒ=gJDN'c¯‰2‚P_ ED ¦™z„^$¥‡0¢Œ‚£MJ±‚8©Š=gj= $A §†6%k¤Œ.[Gk§‘cQG/‚3©…:¢Š&'±ŠI¤‡M‚I±‡@± ¨~±•T¢(Ž] ¢(£G] >$ ±$š) ±( ±(¥H ±‰ ± K ±*ˆ_ ±*™ ±ˆ^ ±•#¤‚¥ ¤…8¥ƒL+¤‹' Dƒ7± a¢ƒwA ¤ : Dƒ7± †@¢ŒLAƒ9¢‡ ‚GX±”U±„a¢ˆƒ*±S£?… ¢‡pZ±\¢>„ ¨8„]}Ep‰±ŒB±ƒF±‚^±†±„1#©[U l„j ‚  ]% )#†&0‚_‚K¥gv ¨a 8‚S¤ˆBˆY>¬g1M$?‚!"‡ ¤Š"‚-…i F¢œ3‚G±…_±­{±•v¢”Nƒ*±ƒv£Šh… ¢“Z±†;¢ˆ„ ¨™„]}Ep‰±›±‰±ˆf±Œx±‹O±ƒ`©‰0U šW„j ‚  ]% )#†&0‚_‚K¥‹pv ¨•e 8‚S¤uˆY>¬‘ 1M$?‚!"‡ ±ˆ¤žF‚-…i£S†R £-†R ±… ±Ž ±† ±ŽU ±Œ6 ±KE±‚g¢V‚±L±ƒ,±‚K±Au "±œ ¢Št‚±„7±ƒ±‰±ˆS±…Z±ˆ ±#…x ±#ŽM} <¤‹o±˜I±‰ ¢l…£ƒ#±%¢‚mD±ˆ"¢‹H…s±Ž:±…l±…^ <¤¡±±o±š!¢Œ…£˜jƒ#±…Z¢‹BD±“+¢ L…s±£m±±c²#‡+ ²#  ±t=±’4 ±¢ ±š(±§8 ±% ±¨K?±„ ±±‰O\+¯'‚r   / J3(‰y  ,¯'—v   ”S J3(‰y  ²‚R² N ²‹p² Œe#¤'ƒA'b ¤ŠD ‚L' ¤'˜E'b ¤žh ‚L'G!¢ƒ2ˆ¦„2S/:E/±ƒ±±O¢”5$ !¢”Gˆ¦Œ}S/:E/±Ž6±ƒd±ª:¢©h$J¢‚E‘¢@&£„A’:±‡e±ƒ±ƒ ±†G±…±„B¢x¢†g‚H¥B …tƒy‰±ˆn±…;± M¢—X‘¢…G&£g’:±‘±”4±Ž#±ž±Œj±.¢…¢ R‚H¥•F …tƒy‰±ž!±‹±ƒ$ ±ƒs ±ˆ ±‚T± P ±‹r± ŒgL±”x¢„pˆ7¢T‚¢‚h±‚C±ƒI¢ƒ@‚±ƒQ±…,±“"±‚£‰ˆ<‚o±’±…v±‚±@ L±®¢–ˆ7¢Œk‚¢ˆj‚h±‹/±’#¢‰H‚±ˆ±Ž±­ ±‰u£žˆ<‚o±§H±{±„±•d‚% ®< Q‡ |Vƒ  4r4¤‘T‚m £†~‡Fl£1…e¤†‚9ƒ±‚± ¬/…#1J)63M=$£ŒcH6¢YD:£†F‚n‚d¢‚?¢‚J+±– ±…)±…±;±‡d¢Šuˆi ®•O Q‡ |Vƒ  4r4¤ªz‚m £˜‡Fl£‰|…e¤’K‚9ƒ±„$±‹I¬‹F…#1J)63M=$£¤.H±ˆ¢…HD±ƒY£• ‚n‚d¢ˆn?¢†+±¯w±2±š ±‡±i¢Ÿˆi#¤'ƒ?'b ¤ŠB ‚L' ¤'˜C'b ¤žf ‚L'|9 '&/( ("N#9-@\URyV‚d /T2±"…Z±x  : '•&/( ("N#9-@\URyV‚d /T2±"Ž/±‡?-±„2±†w± t±Œ ±† ±f±’± †,±œ0±.¢iƒ" ¢†=ƒ"g0¤‚ e²…5pX ‚(vK ‚B"v±ˆ9±…6 2¤Šj e²‘ip±ƒ 1vK ‚B"v±˜_±; ±ƒ± †± ±6± Z±–GƒG]±Žh¢ŒYq±ˆ(¤…w‚EH±„4¥† F9§JO &ˆ)au`V…QX`$£6‚4"ªAR&N¢‚$£ i±T£/‚5£_‚*­‚EC V!&V w8¤]M‚O_£… ¤-ƒg¬]*  e0§g#j0¬d$=!‚2&©‚:K‡^8 £ƒ, ±ƒu c±£{¢¥q±s¤’+‚EH±Ž]¥S F9§ƒ(O —qˆ)au`V…QX`$£ƒh‚4"ªˆ_AR&N¢…q$£„)i±„£Š‚5£†‚*­‘C V!&V w8¤‡IM‚O_£Šj ¤‡5ƒg¬‡N*  e0§…#j0¬‰$=!‚2&©—mK‡^8 £“R ±˜4¢y—-¢?;¢76>±†B ¢š—-¢‘T;¢†C6±‰ ±ŽFJ"±U± ˆG¢vƒ± ƒ]±ƒS¢|±„v±Œ #±©{± “^¢¨Aƒ± ‰1±‰[¢†U±Œ{± .±“d±„ ±¨w±<²‘&P ²ªLP ± ±¨:²$‰J ²$£5¤*‰d…A ¤*š …A ± ±©/²ˆ9Ð ²‘Wв} ²©# ±$–L ±$°7 ¦ „{Ha K ¦ ŒHa K ±(" ±(–U/±ƒb±‚±‡¢Š=± ƒ, ±‰j±†)±l¢•F± —P!± †k¦ƒ$u,P', ± ’¦Š;u,P', ¦„Q¦…v…‡ }ƒ ±† ±Š£„ ^±†¨‚ F‚) £‚ 0Q¢‡ƒk±‚¤‚i†YŒ!*±‚I£@U'|£ƒX…K,±‚s±‚¤‚  1±„F¢…#>¤†Tˆpk¢ˆP$¤ˆuƒbp„ 0‚t|Zj‚ƒW6L /‚ ¢±‡N¢ƒ‚C¢‚Mƒ0 J¢˜QQ¦Ÿ…‡ }ƒ ±)±›(£Š^±Žd¨‹@‚ F‚) £†20Q¢’ƒk±‰T¤š4†YŒ!±ƒ\±Š£„/U'±ƒ8£’2…K,±ˆG±ˆ¤†$ 1±‹d¢x>¤ ?ˆpk¢“Y$¤yƒbp„ –c‚t|Zj‚ƒW6L /‚ ¢†a±—t¢Š'‚C¢ŠRƒ0±‚9 ±%‚ ±%)²%‚Ð ²%Ð ±'Q ±'¢U±%‚E ±%N±…l±˜v ±…+ ±žQ ±+‚\ ±+ˆ5²*5Ð ²*‘[ÐG ±“¢Ž ,±±0±‡\±Œ P¢’yr "±¨¢Ÿ",±‡#±ˆ!±N±¡>±†)¢§r ±‚!¢ „( ±{¢ Œh( ±)„" ±)‰i±y¢= ±œS¢†=¢&ƒt/ ¢&‹f/ ±Ž¥-#b k ±œo¥†5#b k ±Ž¥0Y„ ±œa¥†'0Y„ ¨(†X‰gN9N 8 ¨(œ ‰gN9N 8%§Œ>hX £‡y+ §¥dhX £D+ ¦ … ‚e&U" ¦ 6‚e&U" ±ˆe ± 0 ±‰p ±£ ± ƒ& ± O ±(P ±(¦C±±ˆ±‡o±Œ.±M±‰B±ƒ ±¥/±‘0±Ÿ:±ƒV±¡2±‡±™h±Š! ±‚= ±†u =£ P‹y¦<#‚MP-H¤qo'0¢‚q„b¥‚Q± R¢†CH±t£‚}0±…w ±ª* ?£•P‹y¦…C#‚MP-H¤›o'0¢Œ„b¥‹± §¢H±‡;£Š0±š r* ±*‘¢ˆ%ƒ3 ¢¡Kƒ3±ƒ- ±Š±ˆj%¢‹"X±'‚W¤+_# ¢œ7X±'‰n¤¤O_#^,±†±‚;¤‚1z¢‚$±‚I¢A¤‚+‚4£^‚P -±`±…¤‰|z¢…r$±…h¢ƒ}¤‰‚4£‡O‚P ±„, ±Š ±‘5± ‚± ±¦H± †d±…S£(‰] £(Ÿ‚^'¨Aƒa@ '±1±‚ £9 px¢Wƒ+±¢„d±9¢[e¨|,~(wG±$±R \rn†< P]!cgJ‚@Z.±‚y¤‡T& ±ƒ©‚@B_04IQKt¤"Q ‚#±ƒg£8‚Bq¢…br¤ƒ6„-O±ƒy 0¨–Tƒa@ '±†8±›1£‰W p±’ ¢†cƒ+±‰`¢:„d±‹b¢…e¨Š,~(wG±Œ*±‡j±„0 ˜'rn†< P]!cgJ‚@Z.±†h¤@& ±‡;©‘B_04IQKt¤‡Q ‚#±ˆ£ˆV‚Bq¢Ž7r¤!„-O±‰@ ±,„ ±,‹0*±ˆ ²…:€L£[‡} ±”>²š>€±r£”‡} ±† ±ŽQ+¦ ‡v6s§“V-7  " ¦ ’6s§© -7  "%±Ša±Œ± ‡2±Œ( ±Ÿt±šj± œ6±¡[‚c*§‚†"?…¤…8o‚g£ƒ9$£7/VR±X¦‚^‡)‚w3)…N¥G£ƒ6£'c±ˆT£'` ‚Ly?8O0 (B ^£G¦„W3¢`‚%±ƒ= O?9 8MN9'K;r ±…8±ƒz±D 2§—,†"?…¤ŽVo‚±‰2£09$£‹N/V±…1±„6¦š)‡)‚w3)…N¥ƒy£†v6£‚cc±‘@£…='` ‘&y?8O0 (B ^£ˆ G¦Š W3¢ˆQ‚%±‡V ‡:O?9 8MN9'K;r ±Ÿ#±‰A±‘j ±/†^ ±/›#±†±ƒeA±ˆf ±/±‰q±ƒ~±j/ S¨6‹+ „±‹±Ž-¥ƒFR£d„£x04¤„p‚-‚5‚R¥‚h4&>±x²‡Y £‹a‡90±„F W¨•I‹+ „±¤+±ŸB¥‰RR£‹ „£¨C0±ƒf¤“J‚-‚5‚R¥ˆp4&>±†-². £¥L‡90±Š +¯”q ^ ¯¬< ^ ±• ±®B± „P± J ± ‹n± ‡#±ƒ±$ƒM ±˜&±$ŽV ±)z ±)‡A ±. ±¨T±‚(±ƒ ±‘±ˆa±†I±‰r ±5±ž¢(‹<‡6 ¢( o‡6…I"‚]¦ˆ-GNJ‚5V§…8h4CJ*„ª58M‚FbG1 ¬ƒv $ƒp9qy;¢„{¢ˆ`&® ) 8B+p Ff±‡C¨6‚0$± )@  RMTU2¬ƒ‚_„]D7mZ‚4*ƒ'(±…±‚d¤†3r1t¥‚^/ZP£$X‚#±¢…'¤`eVH¨D%ct s:Q±‚¢qƒt¦‚I‚f‚„ ‚p¢ƒ{Z¥‚9c‚I«@ƒu+'ƒA„‚6) ƒ0L9: H@jqDC7„Nc¨m‚F‚34A±‚)£ƒ7‚|8£D„6)ªX ƒlƒBˆ‚ ‚e¦@GNJ‚5V§ž^h4CJ*„ª‰S8M‚FbG1 ¬• $ƒp9qy;¢†'„{¢•&®ŠI) 8B+p Ff±G¨ŒM‚0$±…~ ‡o@  RMTU2¬šO‚_„]D7mZ‚4*ƒ'±ƒZ±Œ_±†S¤• r1t¥‰J/ZP£†xX‚#±‡#¢Œ¤…yeVH¨ˆb%ct s:Q±…U¢‰Fƒt¦œ4‚f‚„ ‚p¢Z¥‰v9c‚I«–Dƒu+'ƒA„‚6) ˜cL9: H@jqDC7„Nc¨‘'m‚F‚34A±ˆ£ŠN‚|8£‰I„6)ª”| ƒlƒBˆ‚~w±Šp±"„u  5 % 9{co <B?&…R]£(E¨) ( , L064)R00() 5 bdCp\0ƒ‚N ±/¨M |±¤±"~  •9 % 9{co <B?&…R±†$£…v(E¨ˆ*) ( ,”-L064)R00() 5 bdCp\0ƒ‚N ± ‡S ± ‘|u.ˆ *A"x7S?1$K,'' 'kZs:L (4+58‚h;a1   j / %9. %N 0C  -#ƒ$. o P"60w 2$d ;&S !=9$"GƒH#* d~=0G   D+‚S0 !+ R !6pq k01$kJ/ ;6S;:ª@_>‚pBAN '!#% V‚;Sc^pn;FZz])*&2Q#!W4/  -!N6v &K _ W]; YokF~Y"n;d#'# =>~&"+ %,$  <0 |hat-4 9)' A;1P*5 *&«3" X!5‚k¦'QDD.3¨*‚(jIh!¥ + 2j(G6hFc?U-(6< 9B%DS1$)#@l ± ±‡±ˆo± „@ ˆB *•T"x7S?1$K,'' 'kZs:L (4+58‚h;a1  Iu> o ‰%"60w 2$d ;šS !=9$"GƒH#* d~=0G   D+‚S0 !+ R !6pq ‹t01$kJ/ ;6S;:ª‰2_>‚pBAN '•!#% V‚;Sc^pn;FZz])*&2Q#!W4/  -•TN6v &K _ W]; YokF~Y"n;d#'# …e=>~&"+ %R$  <0 |hat-4 9)' A;1P*5 *&«† " X!5‚k¦‡>QDD.3¨ˆ*‚(jIh!¥‚' + 2•(G6hFc?U-(6< 9B%DS1$)#@l ²'„MвŠGÐ ²'™QвžkÐ U" ±"… ‚ M¥…X>£ƒ,ˆ±…y¥ˆ=AM=±Œk±ƒV±‚#±‡+¢Š;±†±‚2±†z¥Š6LH†…8±‰&¢†s±Ž$£0‘J‚¨‚%]34'„o±4w¥ˆ1‡vA ±•`¥Žv>£`ˆ±9±…¥“=AM=±¤6±‡E±„_±¢˜b;±Œ~±†K±Ž¥¤!LH†…8±”/¢ss±£(£•c‘J‚¨’K]34'„o±‡ ±ˆ|¥•,ˆ1‡vA)¤‰BXh¤ ‚s-L±# ¤¢hXh¤ †us-L±–V ¨&ƒ$FgF ¨&‹FgF+±ˆ!;±„A¥–D  ±–{±„p±¥°/  ±)‚' ±)‡n ±*ƒy ±*”±± ‚< ±¨(± ‡ ±'L ±'–P ±‰= ±šR5±‚±“£‰>)|² ‡€±. ±‰V±ªZ£˜)|²  m€±†u±Q± „ ±žf± ‹Fs 6±ƒ4±e±Q±ˆ±y± „ ¢ ‚D±…0£Œ?‡s±…Co£1‡Š 8±˜G±¡z±‡]±Q±± ’c¢ ‹TD±9£¡C‡s±•i±†H£•U‡Š9£…N†-£‚3†J²#‘ 0¤„@ £žt†-£‹Q†J²#¦$0¤ŒE‹1-…J  iƒvPOdbxK*<‚qbaC R¦T\&  Pw7 ZB ?J‚!_„ƒ ƒQ¬(g?P\M-G wjW W „d‚N§VP)‚22O¦‚ 9„?«*6- "®,3k&H>¥Ze/2­J&%P‚&s *VZ VO?j(Zf±ƒ% ,,<w ‚%T t Y Pp?u)‚,0,l'%  |.2‚‚H¢M©. ƒ-‚'!:¥‚I$ '¥3 0¢a'¥ƒ+( ƒg¢‚:®d<ƒ EYZ1%¤ƒd6±‚G¢i`¥ ‚[ |¤:bF<§:R‚`j[¢‚+g¤ƒM* ¦Q‚|L‚h 6C3†vƒ..1  ƒ@J‚g2ªFc *a}¦b}M‚j +E +kTj7&2)@V WflL)@=-^3 } ‚_ <&o  9_V/@O9>@>„IH± s^c -y@ , zZ+§&?n':  wR$1 "  ]Tp-$ ¨1M{3'M  #75%‚+.‚K{q> #Yo;.ip% …` – iƒvPOdbxK*<‚qbaC R¦†[\& š8 Pw7 ZB ?J‚!_„ƒ ƒQ¬Š9(g?P\M-G ’ jW W „d‚N§†bP)‚22O¦‰_‚ 9„?«9*6- "±‚@®‹H,3k&H>¥…e/2­‰ J&%P‚&s Œ)*VZ VO?j(Zf±ˆ ‡r,<w ‚%T ±ƒR ˜$ Pp?u)‚,0,l'%  |.2‚‚H¢„©‡y ƒ-‚'!:¥†8$ '¥ƒR 0¢„'¥‹t+( ƒg¢…H‚:®><ƒ EYZ1%¤Šd6±ˆ¢‡q`¥‡~‚[ |¤„SbF<§‡XR‚`j[¢…hg¤‡HM* ¦ˆsQ‚|L‚h š!C3†vƒ..1  ƒ@J‚g2ª‹Oc *a}¦ˆT}M‚j +•I +kTj7&2)@V WflL)@=-^3 } ‚_ –o&o  9_V/@O9>@>„IH±†H ’^c -y@ , zZ+§…?n':  ‡'wR$1 "  ]Tp-$ ¨ˆ6M{3'M  ”G75%‚+.‚K{q> #Yo;.ip% ±Žv ±¤ ±,…U ±,Œl ±„g ±Šo ±-‡g ±-l³‰>: ³žQ:³‰CU ³žVU³‰<š ³žOš ±ˆi ± 4 ±'ˆ ±'  ¢'4‚±‚` ¢'¥8‚±Še²‰+ ²ž>¤ˆ5 ¤ ²‰2@ ²žE@ ± ‰ ± ”²‰/ ²žB ¢'5‚±‚a ¢'¥9‚±Šf-±p±Ž±±‡q±‡_ ±†w±Ÿ%±‡(±u±Q ¦‡\ ¦œ\  ±#…±Š.±’ ±#p±Ÿa±¦,'¢Œdn±I±ˆ±P ¢¦ n±¡^±Y±†/%¬/†o   ¬/›  !±ƒ5¢Wa² ”V° ±‰A¢Š"a² ©Z°V(±‡¤F‰QjU± „²ƒr€¨ …k0±…P²ƒ ` )±O¤Œz‰QjU± ‹]²’L€¨ ŸV0±šT²—1`±±ˆ ±¦7±]…G/‚Z¥…X„V‡W‚i¢gƒ¤‚A‚“!§‚v1%U‚5§ƒˆk0tm‚X¢ƒC‚8¢(‡¥ƒV‚cƒ[±‚±Š£‚d¢_‡¥o‚„.Lƒ±„N£3(±‡5±‚M¦†b„w‚?†‚ ¤AD‚±‡:±ƒ^²ƒ P±‚+¢‚†<¢ƒ9n£„tˆQ¤‚rh‚G:±…C¢D„3¤T„ g£u‚ £„‚l ±ƒ,¦3EW:¤T†fCG©’?‚vqbCB¥bƒ~ƒv£‚Aƒv*§v 0…*r‚oŠ"¨{†%J@‡cƒ^2b¦ZS„B….i¢‚T‚t£#„J¢‚ …i±‚ ¤‹5„`>‚@ ‚f¥šk„V‡W‚i¢†nƒ¤šA‚A‚“!§Œ1%U‚5§”2ˆk0tm‚X¢‰O‚8¢‰s‡¥ ‚cƒ[±„5±”A£†Cd¢ˆc‡¥Œ‚„.Lƒ±‰-£'(±Ž{±…+¦ž-„w‚?†‚ ¤ƒsD‚±±‡M²†(P±„g¢‹ †<¢‡qn£^„tˆQ¤‰^h‚G:±‹¢‡L„3¤ˆE„ g£†‚ £‹6‚l ±†i¦„hEW:¤‰)†fCG©¬*‚vqbCB¥‹kƒ~ƒv£Š3ƒv*§•z 0…*r‚oŠ"¨–.†%J@‡cƒ^2±†)¦‘S„B….i¢ˆ-‚t£ˆ:„J¢Š…i±„)¤ŸY„`>‚@4£‰]bƒf¦6‚ ‚Ec± „&  £˜7bƒf¦†6‚ ‚Ec± ‰m£(‰^ £(Ÿ ±(> ±(¥q ±(ƒ\ ±(™G ±†-¢1z¢Gv¦‚b„= 1³‚Qö±/ "±›@¢ z¢„|v¦k„= 1³ŠCö±‘U ±‚Q ±‡0¢(‚7] ¢(—j]%¢ ‡zE§“W-7  " ¢ ’#E§© -7  " £'‚n>^¢+‰{ £'—r>^¢”O‰{ ±,†R ±,i ±#†Q ±#&ƒ/H±• ¢qƒ¤Œ?gŠt±‰±‘£‚5Y‚x±ˆE±Œ.±‚±Š#±„ ±‡~±‹±„Yn±‡@±‚X±—E±ƒ,±‡E±ƒi±ƒ±‚6±ˆf±„2±ŽT±†f±…N±†±†k±„±‡±ƒ7£ƒz0±ˆO±™e±‹±‡l±”~±•-±…A¢ˆ&‡z±…S±‡±‡±‚±” J±ª ¢†xƒ¤¥egŠt±’6±¢$£ˆAY‚x±‘±˜b±„@±”L±ˆF±±–(±‰8±b±±…6±¯±†^±±‡X±†8±„r±‘R±ˆj±.±R±‹"±Œ ±\±ˆ,±Ž6±†t£‡:z0±‘$±³P±– ±^±ª±ª`±‹¢˜L‡z±‹,±Ž(±±„4±¨B‚z3©@7‰?Š72.   $ˆZ8 I` * !`¢9‚p?i¢lj±…v{£ƒ ²i £ƒC+H²A@±d§p† ‚ŠF¢[_ª†N‡WQz?=¢>ƒ ,?%V 49 ‚A+ƒN& ¥„0-f|±r @©™f7‰?Š72.  ‘' $ˆZ8 I` * !`¢†E‚p±‰ ±ˆm¢†Kj±A±ˆF£†q ²„% £‰K+±„a²‡_@±†§™}p† ‚ŠF¢¥__ªœ‡WQz?=¢‡ƒ ‘E,?%V 49 ‚A+ƒN& ¥Œ5-f|±„-±ƒ$±p±…L¥ ‡3 C ±‡±„,±Ž8¥ ¡ C‚n2¢ŒLŒ±C #] ! ,1 CS/e//§?S @ ±‚5±‡²6°« ƒP& ¥C‚¤$…5±ƒ ±ƒ¤03'/«…‡j,HQ;%‚H&£† " ƒu:±„w¢†j 5¢¥rŒ±¡X ˆn] ! ,1 CS/e//§sS @ ±†[±’²ˆ|°«‡j ƒP& ¥ƒb‚¤Š…5±‘e±‡C¤Š3'/«žl‡j,HQ;%‚H&£› " –:ƒu:±Š>¢/j ±( ±(¥RW i«„ƒ0£‰-U<±†Q³…vç¸ U…t0 jI 3%    ! G±…!  „ $ ƒy²,0 i«™0ƒ0£šBU<±“³ç¸ƒkU…t0 ™5I 3%    ! G±Ž   ž $ ƒy²¢00±„4±…S ±‰±•y!±ƒQ± ŠP¢‡*† ±‰]± ¢¢œ]† 5±ˆ&±ƒ)±'±Œ/±…M±‚# ±‘±Š±„d±¦±V±‡|±ƒ"±‚s ±‹m±Šwr 6¢‡A‹±ŠQ±†¢‚\± ²kP±‚¢2‚o±‘X±ƒh±†±ˆi 7¢ g‹±—±/¢†)\± „v²ƒ'P±†,¢ˆP‚o±¦\±”±Ž± %±²„7 £/‰ ±ˆT²™; £•S‰ @±‡X±ˆ¦ ‚u= !Žl²Oà§‚b.7±„z 2d ‡pJmO 5 CCqm[< B±v±i¦ —y= !Žl²†(৉2b.7±Œ ”Vd ‡pJmO 5 CCqm[< ±g ±’|¤)`Y ¤)…``Y ±‡¢'F±ŽC ±ŽL¢‰|F±¨. ±!‚} ±!†: ¢‚9Y±…c ¢ˆEY±ŸN±“±Šq ±ªj±•z±‚I±…v ±ˆU±Ÿa ±$† ±$Ÿt ±$† ±$Ÿ ±$† ±$  ±$†* ±$  ±$†= ±$ ( ±„ ±™)= Z£–'7 s +" k-.£R9¢i¢(±,¬ƒ nˆ  ¤‚ +¥ƒ¬…    ^£­c'7 ‡as +" k-.£„R9¢ƒ5i¢‚R(±Š¬‘a nˆ  ¤ˆ +¥‡+¬Œ+   ‚j0±k±ƒI¦ƒ[‚ [~¢ƒ/…!¤…>†$±„^±B¢„„s±‡\¨„ƒ(7=GM=±ƒr¢‚%ƒB¢‰ˆ±…]±†?¢„6±†O±‚$2±ˆ5¨„ƒ% C1‚†qY£‚9‚ƒ/¢†.\±Ž±¦1ƒ…uƒM,§et /Z ¢ƒb 3±¥~±ˆP¦‚ [~¢ŒM…!¤–>†$±Šj±v¢Ž?„s±`¨ƒ(7=GM=±ˆQ¢‰kƒB¢ hˆ±ŽI±+¢Š!6±@±†=±„g±‘ ¨~ƒ% C1‚†qY£B‚ƒ/¢›2\±£4±†J¦Wƒ…uƒM,§ˆ|t /Z ¢˜ £)` £)…a`„K(‚¥‡M‚gz‚l‚]¢‚O¤‚d‡{v‰^£ƒY a¢‰{±ƒ}£‚F‚"=±‚¥|[mƒK¢ W£B‡#¢ud¤ ƒ ‚¤F ¬ƒ ƒX! „ˆy¤g„.& k¤*‚a-¢*U¥`vƒ%ƒƒ £)'±‚?¢ƒ ‚]¢`<±†B±‚A±X¦ƒ{(5(£+“p¤…{„:¢a…,¦i‰I‚W‚<*ƒa©ƒ(,ZŒ5‚HZ}±Š|¤‚>F¤a== ¤)ƒ6‚U¢|=¤‡9‚E‰" ‚+¥œ`‚gz‚l‚]¢‡ O¤œ ‡{v‰^£Œw a¢›±Š £Žz‚"=±„)¥Œ%[mƒK¢„FW£‹Y‡#¢…Td¤‡a ƒ ‚¤‚tF ¬˜Pƒ ƒX! „ˆ±„+¤ˆ2„.& ±„ ¤‰‚a-¢„bU¥:vƒ%ƒƒ £‡q)'±ˆ¢‰~‚]¢„y<±`±…~±† ¦ˆeƒ{(5(£›“p¤‘„:¢ˆS…,¦•m‰I‚W‚<*ƒa©˜[,ZŒ5‚HZ}±›"¤ˆF¤ˆx== ¤ˆ.ƒ6‚U¢ƒ=¤›]‚E‰"£†gDA £“DA%±!‚c±Œ)± W±ƒG ±!† ±¦± ƒt±—k ±‡e ±Ÿ0£ˆBPg £¡hPg„\$‚¤/ ƒˆm±ƒB§†gŠl‚q‚£&b†¢ƒm£h‚¨:K‚W- <‚@±:¦„Z9 ‚.¢!O¥#bS£‡s*¦{A„k©„.$.…5ˆ²_À¥Kuƒc w¢Oh¢‚{o±‚G£zƒC+¢-ƒ ¤oI ±6¢„_d ,m‚;‚sx†IGg; ….§Y$ „+c_¢†<«j ‡~7i*,5 G ƒ eƒp<^=C7C/+‚[¤?†%†)±…:>¢‚„b¢Y- ±’E ‚2¤•B ƒˆm±ˆI§  Šl‚q‚±‰,£‘;b†¢‰y£Š3‚¨ŒnK‚W- <‚@±ƒ]¦9 ‚.¢…GO¥‰#bS£“ *¦ˆAA„±ƒI©›y$.…5ˆ²„À¥ˆuƒc w¢ƒnh¢‹go±†£TƒC+¢‡Kƒ ¤…,I ±…k¢4d šm‚;‚sx†IGg; ….§‹Y$ „+c_¢ˆ†<«•j ‡~7i*,5 •DG ƒ eƒp<^=C7C/+‚[¤6?†%†)±‹±‡U¢Š„b¢‚v- ±•3 ±¬~ ±‰ ±’5±ƒ.±„%±ƒ±ƒ±Šb±ˆV ±”C±Š1±Ž2±Ž±Ÿf±˜|3±‚4±#‘$¬ƒ^ $@ ±‹R±#¦(¬‹c $@¢„ ‘r5 ¢›U‘r±[ ±-‚S ±-ŠX‚¢Œ‹S±f±‹@±†F±%±…0±…*¢Œ4$±ƒSH±„a±†)±†±ƒ¤_c‚U2¢F‚$¢ƒ„Z±…S¢„rŠ,¦†3Š=c±`¥8ƒwƒsƒƒF±‚/£H…D;±‹ ¢¥E‹S±‹±œU±±ƒH±Y±A¢£$±‹±ƒ±M±•±Œl±‡*¤ˆ}c‚U2¢„‚$¢„Z±\¢™vŠ,¦›fŠ=c±‡'¥‘^ƒwƒsƒƒF±ˆ£‰M…D;±Ÿ9 ±-‡r ±-w‰-„5 (E]W>"dI )‚D‚`‚‚EL¢‚‚ 5z„ƒX jƒK< x~ y2ªl<GD%ƒX z5YZ;2‚`'&"L!'+"dC£ƒD5¥p‚Lh0‚#¬D"X‚ 4Ax0±(¦‚b>$X£MQ{£‚`ƒd §C&O\&Tƒ=¤,ƒL4^¤5‚+U±‚=®‚#ƒ^.4"‚^A‚2k!g„d$£Iƒs{£OG¢@ ¤{H ¨t,$ 0‚.¢‚,1­‚]!-$+iqx>‚/§9H)'=ƒ¤ \$¤EeD¤6‚`/]¢‚C=£„:‚:£/ j©j+ .¨*XsJƒk' A‚r+‚*h"dI )‚D‚`‚‚EL¢‡%‚ š[z„ƒX jƒK< x~ y2ª‹ <GD%ƒX ’4z5YZ;2‚`'&"L!'+"dC£‰P5¥‰;‚Lh0‚#¬x"X‚ 4Ax0±ƒK¦ >$X£…sQ{£Šdƒd §ŒZ&O\&Tƒ=¤… ƒL4±R¤‡{‚+U±…®™nƒ^.4"‚^A‚2k!g„d±ƒV£‰ƒs{£…OG¢„_ ¤ƒ7H ¨Š`,$ 0‚.¢†d1­‘7!-$+iqx>‚/§‡%H)'=ƒ¤†^\$¤‡EeD¤‡'‚`/]¢†\=£‹X‚:£ƒl j©„Fj+ .¨ˆf*XsJƒk' ›,‚r+‚*hW¦ *@ L ±‹4 4r&' *(‚"*$Df©RZ?C$„$®hi3 >ƒ8c"-(1:&@‚HG CS?X`l0$k>W¦ ƒg@ L ±¥ ‹=r&' *(‚"*$Df©ˆDZ?C$„$®•li3 >ƒ8c"±‚V¢„'“±ƒ*±‡C±ƒg±ƒ±‚4¢ˆR±„0±ŽR±†d±…L±†±†i±„±‡¢ƒ ±„-±ˆM±™c±‹±‡j±”|±•+±¢tƒ]±‡±‡}±‚£…A†)ˆ2 H±ª±Š±²D¢~„6±¢"¢‡8„X±‘±˜`±„>±”J±ˆD±±–&¢†^‚X±`±±…4¢›r“±†\±±‡V±†6±„p¢‘>±ˆh±,±P±‹ ±Œ±Z±ˆ*±Ž4¢†R ±ˆb±‘"±³N±– ±\±ª±ª^± ?¢‡Mƒ]±Ž&±±„2£™e†)ˆ2 ± ±„p ±,…2 ±,ŒI¢,…W$ ¢,Œn$ ±,…X ±,Œo ¦,„.77 ¦,‹).77 ±n ±“ ±,…Z ±,Œq ±,…[ ±,Œr£,…4(" £,ŒK(" ±, ±¦w ±'…j ±'šn" I±™Z®9)I]‚ƒN=!£†U±“¤ „\E £… ±…T±—lL±‚~¥ƒZSF  P±².±‚}®‹9)I]‚ƒN=!±„o£MU±ªS¤ ‹HE £Œ  ±Ž)±±W±•±ˆE¥ŠqSF!²…-À²….À±v ²ŒÀ²ŒÀ±›au 8¢ˆƒ_±ƒ±‚±…`¢ˆk±†G±…@±.±‚B±±Œ)±‡3±‹( 8¢+ƒ_±”'±Ž±&¢ 6±•!±‹H±›±—F±¤A±œO±8±ŸLYj b‚X;Y|$k 4R"T)„, J‚*  j b—k;Y|$k 4R"T)„, J‚*  ±"B ±"…w6± „¤•[mD¢ƒ"ƒ1£{‹| ± Œ¤¯FmD¢˜&ƒ1£•‹| ±$– ±$¯f.±‚w© SU(t!7±Ž9¦ /PyP¢1£‚k ± „  /±†)©„? SU(t!7±¦†`/PyP¢‡ 1£‰\ ± ‰a 9) ±)†¢!: ¢!ƒw V ± ˆZ ¢‚FF±‚y ¢“[F±Ž] ,¢$*±Ž0±{±‚W¢ƒ ‚"±‚+¢kV£ƒe„k…F± ,¢¢7*±§V±„±¢ˆ_‚"±ˆ3¢Š@V£P„k…F±‰5±Ž$±‚b±ŽU±±±ˆB ±£7±‡i±§{±… ±ƒ=±F ¦c„#2p ¦Š„#2p±‰±‚< ± j±E ±(“ ±(¨S‚!¨ V‰t‚B^4ƒx±‡±ˆl±Œ>±‡±†I±c  _QON$.AƒUs„W4A Z=%3‚i±†£…bz¤ƒ9 ¢…¥6 X2¤*00A¢…A±‘¢ gd ±)‹ ¨•3V‰t‚B^4ƒx± *±’ ±S±±Ž±„A  ˜*QON$.AƒUs„W4A Z=%3‚i± £”<z¤Š% ¢‹w¥„O X2¤‡H00A¢‹…A±ˆ ±•±¦M¢…Pg±‘ )¤ ˆD §“Z-7  " ¤ ’+D §© -7  " ±‹G±$ƒ(± ±¤m±$˜,±¡( ±‹H±$ƒ)± ±¤n±$˜-±¡)B¢‚g  W S 2($@ƒ+ +¯ *(F0,!$(5,± „±ˆ@±‚¢… ±’G D¢‡n ‰. W S 2($@ƒ+ +¯ˆ *(F0,!$(5,± ±—±‡V¢ £  ‚²Tp £ ˆ ‚²¦p#¢ŒXq±ˆ'£ˆ;H ¢¥~q±r£”oH ±v ±¦ ±'ƒ*± ±'˜.±¡* ±‡D ±-§'&X ¥‚@ƒf §'¥*X ¥ŠEƒf  ±‡5²…bà ±S²‹jà K ±•^ ±/Œr ±/¡7Y£f…m¢†7ƒo±‡W±‚ ±„W¤ˆ+ƒ‚qƒ&±ƒ ±±‰±Œ8¤=‹….U¢‚I‰X¢„ ±ƒY¥†R„HT‚,Y Y£¢y…m¢’kƒo±’±†i±Œ¤Ÿvƒ‚qƒ&±†J±©s±” ±¡<¤–p‹….U¢’o‰X¢‹#±‹^¥šv„HT‚,Y-£ƒ‚² †#p¤‹ ‚ £J‚² np¤¥ ‚£(…o £(šHo¢%‡_ ¢%’h ±+u ±+‡N£lƒYŽD £›ƒYŽD-q"£…X{@§‚1  W ±"…&£š\{@§–U  W²(ŽXð ²(¤ 𠱆(±‚e±ŽB ±ŸN±‡±žh ±”D ±­j ±%‡ ±%’ ¢'‘¢ƒ: ¢'¦¢‹?¢+j ¢+†Yj£(‚r £(—Ir?[¤†s‹hƒ+k± ±„,B±Š}±‰~±‡¤ ¢ƒ8F¢‚|¢|V£‡'„‹h±‡S¢ƒeƒ)¤ƒ;…I‚R±„±= _¤ ‹hƒ+k±‡±`±ˆF±–±¡I±k¤ˆ ¢‰ F¢‰±‡m¢…9V£¡„‹h±E¢™ƒ)¤“a…I‚R±‰q±ˆT/Q±ŠTM-±#‹,±‚g ±•d±£z±‰k±‘B±# _±‰~¢ ‰4. ¢ ”K. ±†^ ±›q ±u ±“ ±¯ :±Ž¤ A†u*  .<  C+ Q±…¢…‰m¢R‚:±‡h±ˆ0 ±"ˆp ?±§C¤ ˆE†u* „? .<  C+ Q±t¢š ‰m¢†‚:±m±‚0±œT ¢'=‚±‚i ¢'¥A‚±Šn ¢'>‚±‚j ¢'¥B‚±Šo±ƒ`±P ±’:±‡) ±…' ±Œ ±-„ ±-Œ ±)ƒ ±)ˆG šÖ/  !"#$%&'()*+,-./ › / #$' !%& "()*+,-./ ›@/).( % ", ! &  -#+*'$/ ›u / ›ª/   " !/%('#$&.)*+,- ›ß/ œ/ "#& !$% /'()*+,-./ - )&+/ !.%* #($"' ,funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/sman/fun4.index.prop000066400000000000000000004151611256243640000250750ustar00rootroot00000000000000M§iæ//proj/rd/eric/funtools-1.4.5/man/man1/funcalc.1funcalc‚ñ'Funtools calculator (for binary tables)1­EÑxœ­[ ÛÈ‘þ+Yl Å’lÍ>`Èk³žYg^{ᙵ÷01‚ÙñL‘ Ò(‡ü®ü½«¯ªºÙ¤4›\ñjÈîêîz~UÕ|wñó•1«¶Hlž˜©ù©-š²Ìkƒ¿ÛÜ6eeF+úg™¶:˜Æ.sWÍÍ¿{ÿËÍõM7÷nZ|¦¬±Õ}ÝTøíŒ{Øò¯•Ye¹Ã¯ÜäYñ¿¶f[•÷ŸÍDyã^™»ÿ5wI™·›¢þüÙ¼ÿåöúý;Z#P5ô¿¯L[» Ú+šÚ4¥ÙÚšÿÛ¬IÊÍ–K™|e74]6bŒL÷;Æ3W×YYÐÙa‚ßIY46+²âþôeYû)ü›¶`ÓÿÁ)±•-R[?®l›mÛ˜{W¸Ê6´Í¤LÉŠºq65åJ÷U1Õ=¸¤mð—QŽyBž‚ÛÂi'¦(ý$ÞeVN3ZgETfg« ’4YmÚ"uIn+¢1JiJclÛ”S}86—W7¯?\³(:iÓ<ëˆçu³¶4?ÏË= ¨–YSAk:¶1‹–Ì[g›&Ab“èĴڋ걇– ºÉJhF?]ßÞôôÒÐF*»7nGzÁ2ÏÌucöeõ¥6Ë‘im“Ù %šÖív›g.ÕNÁ&G¤à4”di·Ùæ`òëŽÁ¤dÅ£R‚êÈÙ µW@¬nˆ(«/:oÖe{¿6uIúŸm¶eÕX:@M?ól•%¶á™£ºMÖÆÖ,Ÿ =LŒ‰ßCu¼XiÿX§#Z.™“[IlYÔ[—Ð2Äbs³®œ3{{¨€k1ÖÛü)ɪî:jŸM½Ïšd=Y±EcWæN<€E¢ZU冑҄éeá2ZnAoi )YØIò=l£­jçéGú{ç«`XÝbÄŒ+KŒÌŠ]™Öùù•ûk›+€¥ÔŽW%îGBÁ1WYU7}~y7E«ÞÒµþS43¡Q;:)ÿ;³yD€4™ÆÎ¥lùA¬9Є9ˆ£aK¶$tv˜Ò(›¹‹&±5nOŒv²åcÏÆ¤·Uߺ³yëjv*ºŒß«ì¶RFáÌñ ¨à²lÖŸ&°¨uV8 KxcyF¬dw(.æ˜4ÙÆhF¢ZÄÆ×üúBߌƴ!ó®lœx"ºÔ5®Ú<øè¬f¤bEÙ€lp¤ì‰ìöUÖˆi÷´$Þ¥Þ*À.W$ìtìR®†S"ñ_œâµ:»T´²*÷LF5<…¯$fÔx^¼à¦x9n¹•ƒÃÖÑ<~ Ú£mI+/IÂjþ.´s´ÙOd‹0ä"Ú섌cEzƒ“’llʆ`±yNZJV¢…Ûª‚L±`ç°_¸|SÈn0jŠhøõùÕĸÙýŒ¾z˜È·kK›„6ô–l575ýc«n«ÞÄS·"ᦺØëØ/’%7fç*Ѫ¥»Ï öºÕøxÄX—×l‡!åÎéRt; ˜xiŽÄ€ÞaKÊvÉçvÝ’á@܃%Oî ýõÞnc­~` ÄiŠÈua%ÍÝ„C©wÔm¯JÄX~NþЬ”#Þ±\Ý ú…áÿ˜—Êfú[~ø'ÿä@OtFY-þiŸ%I‰êXÝù/ ïr,Ü¥F·EGW̯ƒ·Œ¬¤™¹)ýfQns6V¶·}–çfmwN=—ç—ç³ç;èn90þx€Œ-áÈnRÛX‘¤N X ¢´J!xk@VõþG3u(½® #ùø*îú‘ýMÖ¶¸§¤VØW‘â@g‹»ä>Ÿyh+ñ¥³B~l]ˆ\q¡:ÍúF:»,w¤v4Œöžt\P?EÛ!m0ŸÄ\È/Ï’¬ÉCEX\«B÷,R†ËÀ ªZuN¬H-Å`bê!Àq6@Že*:ћ۟Þø™öó‚¶ sqóúúl¬(H€8¿øqAè¶ÎîaÀϧ„Fy„¼»^}3ÿž_Q¼“7¿F³¢w#„‹ÞfÇ2þ¿¥oÎû”>F”¢wRºZøa«¼´Jära¾ÿvøð·!_rû£F#¼eÄb«ÊØ¿Ð9 F¡£ú#J´º& š§XyÉÒÔ;ÈÌ'€2BŒO:üJ„I­ÓÜýžu ”,Ò.P+ÂëMI»\Ž : ¼ŽW®ªH)hoÞI(ØÞ@)Ô(7cË:ÏöUIºMô9s´ŸÔiSTc¿ÍÛÕd‡FÀ©BáGªúSÕ÷ñSÿä‰BºßÖ-‡ &Ÿþ ;K?¶%„ÝÝ“3ž L¬(Â9b¸K^rÉ€fß­º+>V³.k=$ T z´²Á3× ™3ñʶÈ){ùKng½ ŠýH@ 3g2ÈÞ”ûˆ…óg@ #bÞÙù•ÕìK=/™1òçWûlîÂôt©„GŸt•œjž6B’×Šâ …Å Åœ\XÅÀ9x†ÊMUɼ݀5н³"ÉÛ”®‡…\®5gáÞ}€#‘øïž}^œ?ª/¢óÏ'‚ŒBEÈüfÌXnÉz;­Ü¥í¹:R)þ…¥øô9™·Tzæßÿ"Á –‡ÆEÔfR l,ôõü\áMt²wyà*`Ö¡Î_ÄÏéÌOÏé韈³0-Ò]öäKS¬äÌÏ7?rèq¬óà²ßÒs}x>È×WEG¬¤èì¸|Ó¸ÂÇÛÎÕF•®[Ê–"“¨ý%Û†ÂOâ*À 9‘BìÁg®,Î’³¢ug]ƨͻ" ‰ú Å%ãHœ¢RYO#†²Ø<Ì6ôoƬW}ïã£8£ž¹ÈÞ™˜={vÃÞžHb»ÈÉÎò?¯óÙj“4/}2i(]ñ<}!À¤·îp¹5ä¹R=xÖPiÖ%|N%Âç0nfnû±fŠÊ](8V.ç@©FõòNö5AYz›Aâq¸x¬­‰úšæÄGО%Ú°BŸ3wMÔNçö'ØàûìqÓvf>úri¯ϪÉÅ÷ǺNl]¹MPk×Q9×üãgíß°c0ç±A°mWs³psîùD´•ôÉ™þ›œ¶×3°3/Ëí̼gb©#P32ô3¼“×H½+í7 q9ÔÚú™’%ó8üM `Ùf9é:&«²·)%Š|ëÈrBCì†=ÌHÜCb:&½½…h>”û7Ž^Š “6·Å—¢ÜýkuÇ­~Èܘ‹¸671q\’d7»F1¡ªËê:\þTG…\µC'§ôG®QÔ(ð/BG—@Õ‘@¥—ª½0çïm0 ú-ºC˜· …pžk’l­@nod©úXhl†‚f¶ëêˆúï¶x‚ɳÙLHÜ—4š+|xÄ’í/¢EZ¢ïû¼\¢wê· !÷ÌD£cê-©ý„ع*5ß°Åu0ôÄÐ@®Ge$ÝÇÔÍÿ´uÐ#Ëä%™2ÔåÂyº>$¿O)‹Š^7s$!!# ö©È3÷5ÿœ†´àúý²ª£E¾ïâùÖµÁ„ý‚ëKe;˺w*Œ0É»–xO‹ <vó‰Ù!SÒ¿É,šÑ®ÌÒq÷ ¶R¯G~Þ°‚èÚDéÏ ï Fº¸÷È´¢2¶¯ûÒlÖ9Ù9m†h銻ùX!;=ýÁ<›=3ãÿíÁ:²y‚uÑ)W–ƒÂ×÷fúŠþeˆ'gä­‘ÜFLôïºÏÂÒÚ÷ÿôÌPÝÅXa »ñàëÀâî•·OxJܽ’+>áþInîøFVdNtf2@¹2c[#g‹ ]à\ÄÈeèÉÒu.Fî)Y½{o¼ »Eö·òw?òl‰Æûxè€íF6Ž Ö)np½_Wgøïæ@ ZϬõ”@×SuIO齞½¬\óŒú¬`ÏÙôíÑ„i.4ÏD?~í_»;‚m¶ƒƒæLèõ*‡þSžMíYDOý~T„ÝúwS_¹¸î#ZQ8~jÍÙÜœë±vwD¾DZ·|#ˆ[¹ÖJ@cwÒUYdçµÙe–׿øðæã¨“7HªrXÆä«©ú‹¨§—šÅ×rãpKz1¡íÃÐàÍKÛ”Ùˆ×{6†‰a`ôp>Î=òW,Ì«—<lþð‡èé/™Àyù‘Ás¹{Xñ–D¿»»1æWÿÛPWº§YiŽ`I-â3î¥aœ€ãèpöƒäŠS³wNñܾÔ+ Zõ¥L 0?—›ž%åE…;wIV™ïè9þ?CáÊÿñ}÷óy÷ó»“?Ÿ÷ú“ÿuúÄ£.P(d³ÖKÕ[hÎ2˳æ0L[¥ÌMUTy—rk¤¯Õbµâöz œÖV\ë}÷ëÛ·|ÅŒKÖ®æjd”ß‘üöˆÚdX²IÓ’Îö¯'¡:Ä7Wo>J«Ë§¿Kr¨)w„o)m[»ä‹Ð —ÅPîìZ7t‚ײýÎ^ò’ÉS>è\úrÞSÞêËg³çC‚Q0%²‡9i=&R($Êc«Š‡Ó0¦'ãV±¡Õ©õ·ÏG ž™TߌÍ+=Ž+_·Œ ‹O®o¯þòáý'XÍ Éi„äiHDúœÆ÷kydGŒxã y/áxÚH|B²^$nÖk–NÏ`OïNlóUغ&®H9i„†^à¯ÒÇŒZ,–)ržNŽ~ãØ²£\DeCr‹ëP5ÜfôG{Ö—©h /JÂm„ áa¡ù¿.>¾Y\™P˜£OtT¯¼ùîg&¨*0?~@;dÜÉëE(ŽL·æNî¹+ˆ8®õ«¹huÙô‹Td2;òÞgjµÝÅuô¾øèËUFäßo¦Årc> ‹*ðRjê «Nß@”k¿®c\øBilƒîQ¦w!‘ Ð`r*{IùøÖžR@ Ôc¥¦úu2‹£²}ÝPÆŠCzOŸ±¢¸©B‰YoâöŸgy© HüÍÌH«)<–(w¾äb²ÆÈÅÿ^ºpëE}?›Oš­¸]Õ(øËpq+lN„é´Ó6æ>"ÎHL`öwœC÷²;¼b9¸÷8â>’Áw>e¼¶Ë$xö1Kâ´Æ_0S8°¢ü™—\’†St#[NI•mý¶A·:ãr¢ bô” ×2 ªGQÑI}#|â¶Êáw¤«…í×"Ú`SvKëjZúH‘(Lë>IÇà$Ü”´dF’¸tÉEÎwY1àæÍuqÚPîS­:‡ÛýÃëý"šÚ#ÊÜ<*Ä$<ÑIˆ˜ÜNó¼|±Éî×ÈYIyÁ;®œ†oV€LS­ †ª%Ÿvƒ±÷(©6ÂU­Á†âñç¶(ÃãbÊYuVÇwëãNʨr¶. Åa,)ï'Ü ÒË9[Ý IÍYé´+𺕖¤yíí˜/0ÚÊ/ö¹Ÿ>Vÿ;Jùª *>ÒãŠËtÅKu]&Y׬€Ñ‚n©éÝ1îÝ ö÷ð!=F>LŠ`ƒ%ýñe,æè‘ž·Û®`Œâ$ÊB"¨çq9†"æÓ?ú •89&Ü'(—â˜3¼µI´ÄØüñiÀL&‰WëÇ£iäWòù±¯±°¾ùÄCLÇm²—ÝÒ^@Ö‰a¾ýo$‡ ‹QxÒoMÞšáEjÔu På1.åûÿ\`‰’ç@òŽvmøü‰\~Ë’Ñ]É¢ 7kž>w “'fo(ÉÇä哘/PÊQ³ì‡\´Å5Xx[Ûp-JjÊ]ê©bWákˆ°øîIÓùŸþLM ŒÞH,îªò×6Í>KÜBîo¤m¥@ð¨b^¤½!á³µ¢–Õ4›:ájYT±m™sø|>·¿¹E×&æ—MÀ½¿hD|Ò ã! ¯Ü¦Ü…Ú.­Oɼtà˜?A¸É+`Œ=Ðc"ñ¥t’ºÜõ …„àeÄ÷WNŽÙIaXèzÝy¬[Vž!)…1Á9|Õ]‹öŸ“°iÁ„‰¢â‹Øà¿&xÆ?Rw{­Ÿ}ÅmqšJÿü¿Lsè¨z ¹lÁkÀäÿ3¾¨#œÓŸ‰ª‡ï'ÚMrZŠa]ÑÏQº. L¸OÔsÂò‰¡ôn¹l*·i£Ûºˆìr=ºeóèîi(ÒfM/£æê±,ÐoýµÆ­+¡ÚòÇpÝ-fäàüh࣠¥~ã/ÄõnhúÖE?¼Hå_RcŽWÿ@¿—–—¦ Î7–¼=®IHq7ºþÃ|VGÌœ˜Ó‡öþw ¤“çX9ˆ’¾]ãÐ/æu¥€è¿äögç)È«òLn²a¯Ø‰Ñ¯1|ä ²ƒÐG±¸'ŸE÷¹„¡‰§¼ý ½ôU¯ø·|«zú1ØDöÄH;ÚO,ÀÇÕ²ÛKwEÉ—mÙâÀšŠÂ$.*"öGŸÏuI½´œËþ­|I™³Û<êÈKí”[Ÿp¼¨4 Þ+_¬2² ®(õ>í|0ßž([*'­þÇ߬m¬ÍÚ‚™¹¹º2ooÞ›ÐtGIU0iºû¯Çšk—oÉ-ï\Åt>ûvö¹ ´ 7óo'æüÙ|ΟZ+ÛFóñÿ»@ð 5e5a600ff111fa37718789912f20cf23./proj/rd/eric/funtools-1.4.5/man/man1/funcen.1funcen!â!find centroid (for binary tables)14“+xœµWïoÛ6ýWÙp;qÚ¤( ¤]‹h“¢î0 APÐms¥D¤ìhýÞ‘´d¹M~X&ŠDÞwï·×ß­š*—ÒJUáÑ[£ ­Œ¥¥ª„mÉ‹¥–nL‹¿nï>-nݦûSõ€)/-?yòFóÖ´Ü>ÐK(å+ziåZ™êÝ}úrsw §ŠÒ¿ß¨q’T)Ö1hXRÕšF…\‰Fû$·ˆ©ÿ2ÆÞè°Û_ŠGªšr‰Wf> oîÀÈ”·…èz·µz”š_a=Ò¡B9úm³,lÜÒýt2›œMÎx£i|ÝxÚJ»4Nù–s…¥·ßß.Þ|¾ Ùvp¥È°¶¥\è¼ÑÂKG~#{Ük¶ˆài§üFUd*I¨Di¬¤¢ã$½k*oŒv±:4zwóe1(o³b×ã'ÇÑ ë`¶OAUœKØ1‰ÿÐɹZæj¥ò€(/(¢=ÆD¹A “DmÍÚŠò87 ¸¸awû]м&yãø³bJðf娒»~‡p‡«4Ôœ™Êo+ùèûÈ2ºé‚ÄC d8 [çÕ *›òÇÄ_+E¾‘1ŒÝ¦Ö÷”Á†RúŠð)ÂŒ®#>l>Ô¦£%t[²r1ëH, ¬Í¾B×@Ô„­Ð ¬&™e„…Ò±‚¾Yt+¹Þ_‚/ë< »nJ¦‚7ƒj¥ §bÑŠið8—Îe´PœnÌŸÊ–—\QàG-r¡[¤ÂDâ'Ϊ:á,+ã©æbx,ëa}ª•©Nÿ•Ödô‡;íµù7 M·Æ§›”FK¡ÀY¹`†)ÅÃ%8œÌMÅÑþÓ(‹0:`bŽ; .·ªöÆfôí­jÝ·¢ú]B½7;”ÙNPõ²Fá‹náHä¹dÚÀŽ›«ÀóÎâÁ&ÄYÉœ¡Ú*AK$/Ñ|B¯åÒŠqp>@ ~2ŠYÆVj£Ûu0© ‹•Ör-tÆ08NÂy«òw©Ö›PJ­Vì<.ß`Rr¡ýÕŠv‚ûÑ£ 1õr+9&òæ›#ný´å˜dÒ¢Ê%1å¢L™ç æJ¤ïbƒ2x‡¼È©²f] íÆé£7k-Ú#‚ »pXê‘㎩dô :¤ä4J]!¼€ÎU X®P úO£N(~ÀÕF)®¹fª:úµŠ®ö³”~'SÇäµÌšïÏØvIHI ôçð[Hçy²Š">Ld½W̔ξÉ>öÌ¢.íÓÝÒ¨;Ÿ¨ÿñib‚Qõž®:hŠW.2Ò0Í$­‚¶¤£˜u—õ:Õb> f!N®VFk³ãŠéür8œZº·äxeláZ÷S žeMr/%Ïèþ *fnıw‚¼'ZàKPÌ ”RZζ„À¨+˽۟^Méï³)>›=ÒìlvÆçÙü¿®²gÉî³ùå4Ú_\>ßÛíÏ–”  Ý/tÞP™÷Ö"'¤ýthº±ͪJ¤‘·’»+°'KhÜI×ðó:‡€Ã(Õ³Ò,·Ê4 Ä4ÂÐ?÷,½ö‰½³É{ ý„‘QH¿òBU1n‡x@á’|‰á˜ÿ&ÛHGqSö˜[4ÜO‹ðýÊÃÖ´hó×ó l¢^s°³n¨j¯wü2Ù ÏÌzœ´£zÓ:Œ„zŒ·Cº`✠…F!üù‡ü‰ÅIA͸ CX‡†`êC@é,!ì:XYS"1.µ,rH Çøî¤f]º³ÏÊç‘$ ý]šÎv Ë DSèÖ«œF!çq¿Ò˜A‘é ê|«ƒõ…Ú\¶\;>…â ‚–`Eˆ³ 3W $“ãËÑ=¨s,ýâó)ÑOýæ¨Yè*V™Ö4á°J‹Ð}òoƒVB.©mÑ¡i™$`$(*ãÝaá:¾³aÞ ¥ˆ ¥ÃoyWT3†ÁÔì ÙeÏGLœGüÎ$ˆ­qWÂù·ZIG¤H€¥ÌßòÆì0f¾ö$… 3YœWeqÔFÿ‡¢ª'>¿ºü£ HÙçHÓ×1%>8WûÛß@C³?L^¥S©»zí9íåþí[ºþ°¸‹WiªUãàKàluáÂÒÍÛ©kªQk·Ÿ!óì‚®k4Íæ:›Îfñ^QÍÆÿI•Ý a6b4242773c1ec68bb818bbbbb3fa6d8//proj/rd/eric/funtools-1.4.5/man/man1/funcnts.1funcnts²“9count photons in specified regions, with bkgd subtraction1µ,úexœí<‹ŽÛƵ¿2UÜ@r%®H½×w¬íujÀµ{û7 ¨‘D˜">¼»úï÷¼f8¤¤µ›¤½½… $K‘ó8sæ¼çœyyù§+¥ÖU¥e¡*ʪ´TûmVfi¡âT{ÅëX¯T®71¼ì«›¸ÜªåûÍJÕ²Ìè„÷êÍ÷/_}÷æù›z´·´Œ¶ºx§þ§Èª<Ò?®ãDøøN½ÅÁè›yæ/4ɤ‚¯¾»~þê% ?Ъ#èÛ}VT¹~ûˆZšŸï:J}¥¸êâ§žzöüú2 T¼ 7ZUEœnÔ. ñ(`ü›ßvü¿>y£Ki±Îò _ÚáËx§£,ÏexóóØðøMáGÍØ&¤¨,W[®t®öaît O)ü…Y6Jþ}¥²ªÜW¥@“Æ0(¬` Kh÷í‰v¿÷ü±mÖÝ…·ñ®Ú©=Ì@ºÆªó6Ê’j—>z§¥ÿþxž×±øý`@9ð^ç1"wWÏGˆ‡«øC¼ªÂÄ,9LWL^BqÐk%æ>¾Õ Уþ S¯ÕM[ Œ…Nqmù‘^©ÎÏà *Wq¬º8[˜n`ë{¸\xN«DÞïáak-†*ªÝÖF ~€m…UÃ^Âÿß!Š<ª×ÂÆh)h¢2\2½][\Q†9bï,_-ëÝúxÐÔàˆ˜ò£Î3æ:TO¯Þ®ólÇëçe«ðÆN©§q±OÂ;ç¼›q%ÕJSg~àŒztÈM' þÅ^:Ï‰»ôé™(ñ 3CÀçë UË<ÞlËT…ê"™ža7@qpœDUÒúÚ4GÈ^ÇyQÂ4›j‡»+$°Ï³ HC»7 % è8%öBé äyŸ¡(¸!)R2ÑÀ80FÁ<Ï×ÀØå*N;(\ì~÷™–p‡\wJùŠçòÔŸ ˜pÛZ¨Ç€Ø÷ºT/³2$9SñwFƒ”:…M/XÕ²)X茼5±O!(Èöø …'èeqáÒƒ(Ô•.¢<Þ—YÎ+K3ó¥¹6ÚÖ´’…ét²Âψr™Ôa3_AQ†ï5Ò¸ÊÖª¼ÉHpØ+½× æãa¦›­&ŽdT[ec<ÚátVbæ–š€"âpAbòäU”Û8w°"l+LY6×bi”¤†,V:ÍJ\‚Ó!²"Ó’'§'Ý!¬Dê#§Ülc ñä>õ_Ã’AH´÷ÔénÙ7³5asSCÕ^ìÒÐl­êÆžöú8J=~GNI×…¹,j%Ivƒ˜ˆ2xÝ d:^+°ò¶ï¬ê)hÛHqÕBÅÝÑcÍ ¡ÍãÝÌÇ{:.ÝŒdöpÅÄ®Ÿ;ÿ’±u8ŠEç½½é—å( †”—ÏU•&1òÑ©•"Ú€¥\[©MmM ag¨÷Ê lÞÄ$N¡ 3‘*n2¨‹ˆ´p¯p$À F,‰ÑkælƒËA{”…ULæ …@pVØQƒ8¸ ¤ßnŸÜ1YÂD†GPìõÕ$8Øšš€(°ª‚”…bŠÃS‘ ¹Ë*…ÒÿP*ÊÚˆµÌúˆpx[xG¯)áˆ.lŽí¬NºÉúM­TÆ :oðY ƒ6=.~„…±¸>žÒSÌn@KåŽr5ËÆV4$ˆ—½ÎQì’±A-o¶`Q°º}/?º=#PVz‚1ÐD‹Ç[–ÃD¦´D B†ÌRoÃ1ê‘W< S*`c%"é³eœ‚à[·ÈÉÖ¥NE謫„”-î¨ØÆ²Xcõ ²ƒ”ÏX"ì‘Ö.jŽ)Ú©¤6%íF[Áù -‹Û6h€ ŒÖcÌÐrž\†ª@šq?jÅits C¬^iîéÄ"ÆÄjKózp;`DמÀÕ³`àHÙIaHØ™ þp(0_ž¹Åy”èîdô'~Ђ^Gud(ûv2ìÃH=×…'U+ªsãƒÈ°üUor­IÊ÷¡7ôdž£e?5šì_•Æ;µFZ· Ã<[mpú†vä`CÚïbC6;õžF5„®l¬d¤•êòG! üÇv¯j¬ Å¿&þ´ÐÕ €ÿèæŸ:òtâõÑ'åü£y0õÆÃÂ0…§é&“‰7YÌ܉·˜ÁJÓùÈ÷sÞ¢ñÐn–Xh*øãR4Æl<â -2Û]òš[ÿíȘ¥-±˜κQ´æ1, *âÔ¡"< w?Aö¿œ„¯RóédJá¿`4A„_aÍM®?ÊKößMD —ý¾6íôÁçÊ騮q•jO©G{Ò14Õ±Âc0DÌ[”y4`ÏUÚ½å<Ûç1jJ LÅ)ÇÄ©[ûÏ^<öÐ(¶Ak”»MAí™!YK£Æ]e¤ÑoÐJªa\ôI¿â0ƒ½â`!J`€(Òq²° ÙØ ¨€F똇±R\Q‚:‹][B€u£«ºGy½ÇrZ ë ?ÃŽ#´#U¬ß¬™A«…Ž•ÃîÊ)ˆdf‹Ž‚X4¸Šš^Èv±²fm¼«³î—cH}kt*P3‚ÛxWÄV]D0‡¨ §P~ÿŒˆÛ{x¿Îþþà¬ÿ`%±Á`Ýhožaç˜=O¥¦\:KV0‰T¤Zóõ´Ù2zûVû†Â²Ô»=…˜<âZ\´–; „d,ŒÖ7¢C؃Ú:ר›Ã†£]7ûÉLÇ<†. .ä)“m­0vIÝý¼ ´W†dñ,ÁÜ’ewµ®„£€a~‰JBÃ'O¯^\÷ˆ2E*³®2]³È¨býTÅEŒh¦EÖó³ÉÙ\JÌXsÓCO±Ä%£ÿJ¶ž1®sU ‚â(âeœÄå[)…Ë-¶kìñvZ$©IA…˜x 8ƒù¼ÜeÇŒVUÔ&©S\HѬƒ[c„¼Ë‘qµƒÆ12|=H~#(u‚Ö§,¦ß!E…´|ø…è¼Q¾Òhô/uy£A;¸äž¶£¾†(JŒhmÉ!\‹ AÔóÀŽvœ ŠfpÀÆ`:8¢«‹Óh§`'Æyï˜Rj”›.¨ŒvÊnëý!!ýôâSX¾~1‡ÿ™ÃþÐ÷†Á‚TÌÔ[ Þ•?‚§«&ß£Þ FóÚ´Eþ¨6‡ñ>Ï‚‰7š‘Þ=? »ÓŸ{Ó€uÙØ›`ïY°˜,¼Å‚{ûõ8ÃY}’¨•u=ÜðF³cÃ÷Çc6¸}TпÞàþuPž6ºk«‰¥qGÍhŠÊ+2 |aË‚,•ýI³#_]]鎄tø ªÀøv*’Sä9 g”Ù‡Be~ˆŠ’”j·#‚1û ó$ܳXŰtø½§ðãÉØÿΡ™&ªôs¨n²¼($”‹H§ag÷ÍÝÐÂ&>^Ú³šw£KÚ 'd[Ê÷°ÝoÛ§h?ÛCBÀ“h6 6Tê]WÔŸ€5Nù x–NA¨v¯û•Âðyz⋎øoÐÃù dõÄèˆÉEÜdnËöÀ-&mÁ:¥©#Àñ/:"À>àú€ð³®™xSJ_tħuÄoªÂÅlBà,æÁ!Oç¾U>(÷†ÂØe ×ÖIÒiß>³TýTG—±¸%+{ŠÎr¾³îHކ§¾ÿ½<Ìl؈»"¬³1MœÄˆÁÆúù×ì8¥r¨‰‘qR$ŽL5'éì$AsÐwª@ƒ3ô+ ónÆ!vá- ¢™¾CtµBæÄ„‹eV™·Ä£â¡¬ö”1„N áÁ·}9£äðLArß"KÜNðˆ)}äû_q ?!SN9j ˜@¶Í¶QÝ}Ìdω8àïlÃý鳃møšGxXoÎÿÄÒMïa·Ë„ŽWnG V+ÉfYäÈD&FEÑ›]’Ñ%ÿ„.QŒìÖ4Ú@ûMVûïUArøãÛ§@à"OOÁ¿@Q}îÓoæô˜G…ú‹¿¨——õøô[¹EðÏÎáϦ'fû¢ÿŠñ´ãôšE^nŽb# Àˆ–¡1;Æ=Vhd÷pT30#ò‹66_ƒoÎVúÃ4ì/ôª›ëh FÈÕëׯ^ŸÛæ¿ ?„q‚ T޾% Ô»ÉÞ¼ªx|õíó—?ÿñêòéÕë ÿ‘zzy}y1|¤ž=qõæ¢Óy¤þöâòñÕ‹‹N•¾Oa%ðæûÖ›(%\ø?#à]õÀWªóUG}ýµzÐÔIü{D¿I=uTOºÐŒêwðÞɯ ùÛéðÍWÀ–‡‰^õÉYãð¼ è³²£UzÜ÷ûOôEžã–û¬IL($ø½¾{¤ðLK «:BžÝß½:?¤¾,¦Ñï–Ž ¡µè!§µ,¢ÑüÎ47@;í¿wÛ+Õ!¢ø¡3€±™ÆGçãóéùì|.IÿÙ-éÉe˜³«°n HðÄ“êÛ’Ðð~[ïúËgˆ?¨Q¡,ú€¥a_u,þ½³^Ìà¿9þðŸ?Ð8x°°þYÈUf†¬{ä6°âÊw"øækû6kU,j.¹Ÿè¿ú/ u‡¦‚U.5ªQM놈kâü­¨Œˆê4ùÐJDL:6¼ç jê·H2BkïZRóz[”F”WNZz"ØÓÍ¢ÿ%BN×¹ú<Ÿb‚6Á<¹ ³™‡=s v½Ó7s”…©F«U,)ÆœÇ*LjºXرAGjÕsÍÇg߃#ƒÕ’qφìˆNw9p§î;±Kÿ’Í$d‡>áU{<ÿOÑóùÜöhÆÞŒ=?àÌòh‚!È?1 †Ö£Û4‚¡ØÞ£8sŸ2¦/ Pßx2óüùHü•…ïf‹élQgGÍì806Áï/Øò9uÁŽ|ðvhNü¯ù Ü™Ål6ñSî®ß3fWipÒº`…þžüùxèÍ'´.áÍæSð"†”1ÿi䎃ŽÖxìO¼ gq-†Þl!®ùlä§ôn#Î' |±ÙÖ5”Þ wœÏò¢›NÆ)•¨ùbTBïG°Ïâ{4†šó‚tFv:ô]¯vÒ¦ŒÁfï8Xx06{#ñާž^!H¦!Lh¨mx@% §™Nˆ Gôö‰\pD¦˜ ðÇþ#гŠ&•€s7ôF ¦ˆ™Œ|¢ÚÀ›²GŽT‹ãLg–j›ãüøá"ÖïórQÐEòáõ/¢1¦¢Åb$.ûpâüä_ˆ¦`,qãrÇØºÏøq"»?F’•8…]œ AÌØfÁ™6w1]Ðû€hs: jg:!¯OhÜ)Ì}:C˜/êf³9ÔnÞã $hejÛ¼¤uÄ;Ê4¶¶†¶®v-ú”:„?¤¶&³iŠžú.Ñx˜™º'¾E£;Åv:ä13ùO`lÄ¥­×áÄx:Ä8Á)“¬¢0Š*Š;õ·j 22Ë©¢!$ªOô-Á¿‹ 4äö(Réõ:ËK2‡É&ËÁ Úq­).^BáxËé}.ä1EÓ™ëÐ&zÖ¯zÞ¨'öLà ó–WªËZ\¢ø[ß®ñÛ•A0Õ#Òê)Z1êŠúƒ9ŠçuAskž>'¨Ûï»p~ôl÷¸&M àÒðÈ÷küÞ5Pöj0¶êò¨£ö>¼ù™uÒ~¿@¼ÔcõPu/£‡×Ñë¨wÖ½\>¼^>¼ZóXÃÖVÿa*_¸±„DбNþ½2%“0ºÔÔ¦ˆÊn²*‘œ§¥¦ù§ðþÏj$³øÈòBIJ[¨Ë(—wdÊÉNqWç R埋&2‡ÛYYdµSUܧV»%Aˆô !mΖWSŒ]ÈEuªÉ“P”骖I½.S߀|¦4Ǿ¼;K¹ -×ÂÌ ’´ÆBoÇJoq²lrŽòQA¥› ¸ÒaRo'ÍF’©*3L…Œ0áÐsÓŒhëÓ‰J·¢"™F)šÇµd ­¤pš)ڡΣNR2p@:ßúDú«u?ê dI»P‡¹Q n2^ðñ‚L§@Ñú³‘6Ø7Ã… ÂÞQ8P®¤ì9¥ÙÇå¤q1û\<å ^¶Ë‹]ª:>"R<æ„{\GwíîÑ‘Á]Rç<›;NZå’QߢŽÐ·‘Þ—–%\…鮜ÃÙԃ½a›ÛîG:PŽ/·nʦMî9Æ•´Ï¸Ñys6­«ùÅôš¢¥öYèÃ&œëcz—‹?›)½œë„×,d ç–R-Í9ÀÇÆ@:&N¨ñaR‚Sé(¸ÉÇç5˜7f#Ým{¹K[’ô<㊺ÒÂص•fídcé›)Ðä[Ù¹1ÿ2¢œé£,Ëa¡(¨R¼¿“W`7ÑÛ> Q®µ_möý{‡#I€>`ÅäÚÔ“꤬î\ŽK¸¬½‰~g³° 5^ ^¢”S—÷Ž˜æš³ïsÄ“N¶Céd;Èñå¥Ö’«NÕÒ StGuµ­t¡º@Ð4áá%(¦`CîPiÔ‡÷L¤¦_*ÁnõÆ&x†þŽè2„ЄŽÚ]:/žÿåêúùŸ®ag½}Åp8ýúv T©Ž#œà·™¦Î)ô-1І‚ɲ“‹@¸¦¥ ºLbñ‹‰°"7C0œËÎ ‰a2ˆ9Ї7¸Ø¡)oE:a6iýÄ0$‰(7ѦzK½+ìÎfëöÏiõH½ÐQîw€É(/ŦucA,†&cë¢Æêû>Z¥ «UÆûh–˜‡”£Äî©áHö#vÕRªTÔVLßÀ‚‚x­±`gR\%WÝ¿¿èa–½ÎIáKV>m•ÝZ%:µbë6,¦~¡.á°_ ‰/Ÿqÿ™Qh ³T²©C’Sƒ“È2Ñä!êô|E¤‚o³]š8Š)Ï{µF‚Ì >l¥kJx‡ÑüÈh•6—‰oà°wg4ŠZBŽ#ÝÉÝ¡…×­© MÙX#KÊÞbø“p…L¥wñ¨³¼M+Á3"` )-wð¨IÖ ÀǪ³ß†þùäþžûCzðýsÒ¹·Ò–$ËÌÞ—×­j5ªä~BöÐ,Ð]xd¾·Ó;u|ê£íöª­ñd[œîü¸‘Q%ЍNL>Á÷N.žq¬Íµ‚æê”OlÕ×_ï㋱Ý0ú9©·~OíæÑ>]»û\ý;RX(-ØÄNÍz•³wd$Ù¹¦¬À2v×äÇaQR š¢‚eŠx‚Rn-¢pÁrHf˜Ã‘±È$-–•<{'„Á¨‚d~™E+(­ÛÃB+¶,qÓ:æ{Ç,Ûé›kö3ѨMéF€F2Æ)NŠ™‘e›»Ïæ¥O*‡gXW©P@o*15‰êVÆ82¤!„°¡ 's{‹S.EÊÇQ•†^­ŽÜf» )%«ŠÖö ùãuaÃÒ¯/K ȵØíKĈ‰ëîx„è'Ü.ÒÍ5MÌ×6ífI—“Ç*!£ó+XL8 ‘€FÛç:cúèY­1 ×(õ²ËµkóT×­ù°È:^éØqk…›4Û sD«¹½/õzE–w£¼&-f@Ç»1*,³€í8¼í¡KwÕKÑ[°É…äØ4‘»?ÐÄ‹¢jwpÕUv£ºÔ»çèI{…‘ Ööt]÷Ö¹^3½•f¤B’Òf×¢[Œs{ …E¸±¨Q!’|Ò¦aWsÀQ[_ÜdœÃ{o´ñÈ$°ñ ÉkIÑÐQó}£+\Þ¨-ùæ,Œ>jˆ¶dösA`‰Š:¥r¤"ÛEð‘[©¨µâD+2äDb_)äC™Œ¶Æx»ð¾n~Y±ëÞ¢¤:¾X/ͤÝñrPéÉ,«Lˆ>ÅÔÍWHÕ[_/ yînú)Û`øK|Öº%-Ö1>pMøÒó3ù/Ëͽ=}&uçî›O€rauR©pL¡I[•ÚZt ùàZuñºDæµ–«Ò°¤ÝLQ ÜU÷¶EÒïøKDÈ9XÛi–»YWóF ð±8ó£Öë'G0רg BÈ2¬½{GÜ {Ïq –šrõ¥Ø±½` ÅÒ*F—’ ­#7ñH½Dµá.¹šñÐïqD·,G_ûHñ¶”ˆñ¡1ùK‘YÀÄ` °A=[Xß' L¶ŽRYâU«:‚Æ·Ï=–»£$² Ô¹©>[v¨RS£a/Á SqkñVw”û„ÜŽ°î˜ æú-0(˜ˆƒb-ÂOy¤´än:8r øm…E¡­Š‘ôÜɨŒ‹¨*Lލœ…Ÿñš$-¿÷¿µ÷Õ 8733e0d4130466d4951aa2af4436b387//proj/rd/eric/funtools-1.4.5/man/man1/funcone.1funcone7ª8cone search of a binary table containing RA, Dec columns1”7¡TxœYmo7þ+„Õ(/ý`ÔĹs/± ËÅ50‚‚Þ¥$¶û¢’»–u¿þž™!w¹kûŠ;$¤]r8/Ï<3Ã\­¿\(µí꼩:Süávù^5[¥Õ½­µ;©Vß—†Þ¶ÚÖ¶Þ©›u¦>šÊ®ª½Ú|½ºþys¹„½÷GÛæ{ãPê=¤Tæõ¾ ŸNßí ÷ ß “ǯN¶ów…S3ü¼ ¢¿©ëŸo/¯¯ ú¬PXŽçç¼E©¿%:(©®¶­WóÂlÏÕÇ‹çÅû~W´ö÷ÆÖ½Â[×Tª´¾U[ ÓÔÙOµ&SM׺Vé²T®9zl*ùµHÀngt¡rS·Æy¥ëB‘IVäh‘¤Î>ÿ¯{úƒY@8¹æÍES«VuÞHäJ[‘õIeˆÄJüszä´›õË>»YŸïÉe,_*ݬûpq•‘CåËÍú£|ùp}uñÛ?/¾’@Rë×ÿcÛSÇ~¼Ø|¸¹ä°+õ)ê`ܶqÙ6‚)<°7d9/Å$øÓåíf„⥺Åò®ÔunÄÏ$@BÐûÐxÛZÞùòð0ÇBOúN¯$9¬W¹.ó®Ô­)–ê†ì8…%¥ñ›´ìTþ`r»µF¢ÞÁ6g‚7–ŠÝZ‡ k·ë*(µ9¸fçtÕï÷ü”m¨:}Tævè:~¤Ó'~ñ—[5ómaëiÖ«’©B·š5alö"+ í ØÍúýÛœ¶¡ÐÿŒýaZuÕ´:úMDžD/óØšÚã âM‘ õÁNoÔb0ÔŠI½eƒÚx3Õ»÷Áˆµ°æèl‹Ó£÷zCFžn÷HµmÓ¹!6vÖ™A) Ïm‚›ˆûñšÚê®l ñ# 2{H'h0¢&ï ³sÆ_¾60>^vr°¤*m,~:ú†Oâþ²ŽØ™ñ¼× SÀ¬˜Qv³ØE¦f{üd-„‹™ÃO‚Ÿ®ýb©6æQ•.UƒI:v‡CãZò3ˆ}OYÖP’9h¯s ЛNléü}%TVTdÆü_{ø¾óôFÖfêP ­ˆŽ]ª[V¾„Ç G‹qêŸ]C鴈ɰ}..,!‡Ä')I,G1I–>è²c„ì,’eäýÛÞÛ‚{¢Pü7OOz?ñguTeë®5â}<“‡!(#m‰F£9ÿ¤n óæ@Ð à’ecJÕŠ^D0&¬’ àQs 8#äÞ>ÂŃg…¨ˆxÏ¡«HY©ø¹\.Ã÷+ر† Ä9É~hODx’¡_8ÕO•ê)f(ÈG ·t"T9ð*ø%ÁË3¬OË¢Ú Èʄ㪃| š\P˜³¨µ.}C¡¡ä‰x.˜Bô­P³›õŒ×̰h&ÌFo{<õ +iÏY!Ž)ï[¬,OËi²ß7p#é@çð¶!ý%jôÅýîfýÞ0¡AºƒßTì½–êš Ò;ôm¨pTd„Õ,¦?¼+`”Ø›R¹(pßdpÑ󆽫ٽp­vP³ó~¶Gcêçm‰Ì—ëÀ—‚p4Vw±Kú6ÁV‹-NU3}Æ%<|…3²¾©êzô·úHHÛ2ÆÜ¤Œs¢Ð;HÁIxºÞ|¸¼Œ®iQÑx2örêŒPMæ½JÈÿXWæƒr ÑNxm.J.p@UÑãÒÖ&)>¤W ýèã>Dð‰-v+iB¤\:ïA;XÇ”ž$Ôìlhð™-ÄûTrØÈ,>95-]Di«š2)c ýCg²mˆ„TŸ ò ìæš’TI¾ñqÁcÂÖiW¨Ë]ƒ¢¿¯HG×\r¦±'Ý›tØ@D2ÖŒ0ÃÎAo;ôA½É=/;y+¾»5uQiiˆ/0Ÿ”ÇØðéc·-¤fᬸET„ʈe’¾F+PNùŸz4N¨Ç˜EX»7å,DÇ£YU‚z[H¤„†u`TlCÓYt¹È~ gAÇ9×­[ÊpN®±n£ÕÁ ãV;ëAÂNGdà¿{¼Ç‘„ó 1%öe*Ö@ó¥yyæ`áqìÈ&Ü»¦N´ÖòSò¥gNÃà"Ús´ˆI„oR“'Å‹ôkJOæhû©·ÁFt2e¦¾¦5¤ Tvü"b@‚ì¤×¢uýÈ4xˆaO>6=ã3.ª®íø(ó˜—@Öƒ =.æ3:Ãn¿ž0ĺ ¶)­¥ÿçžÊ:E ê˜Ù`sG‘?´~œLÎóÛ“`xÔyuQpoœ…^uЕòyP`À:÷‚ýø"¬T4\¹ÃI°ã4>ˆNò#ÏS‹É›ÒA“h‹£xñ«ó!g«¾0xJ†"8ý(hkêƒ$ý¢ ox(û·qMok(@ ì8ØŽ¸Ä@n:Ð.N¨÷=Zh·eêæVQÝr!L©o¯ø}p:õtò"Q?ÂásD7úWH·•-µn‚Q†cí­ÅŸ(ÙT<}c1-¢KõàåÁ¸ŒÖr€mu(mn[È…·|L/‘œ)߈è!]†9+M”Ôi1_’põQb¿Oa7ðÒ€9Ï ã\~*Bð-ÔX7áXq·S§ç$ÐY-Êê6hq›&î_Bð5Ÿ”aXÔ‘Z+‚~^ÒubÃàç,M!:F^ŠÇ2 º,3„dMËQŸ²Ä ~Á L±—‡‘œ4¢Ö2@}6$ùüì× ŒÃeýìó‚‡vòBmŽikQ¨Ÿ6·ë[îL‹§ìŸÜäHÐú"Ó÷¥"ÌbNËuk^‚J,6sÔnÇÃ+#zµˆýAR ÃØá½ïáN̳~Û• ™{yö˜PàzD3•Á88Œ0½¨Õž¢Ìr„Þ¦W ëX&‚¦ÆQéîå…¹5 Âö÷€ÀéΡùÉž}h¬úÛ./÷ŽCÛ(¹£1Ãß=3˜ ^Èž hï™ë¾Åä |òÂúI(“;®Ô& ë§}^Ð5Eu’Ëô‰]«×ço^¯Þ-g|¾V«wjsq¡ÖŸ7×t™eH_8Ïqª°L„wÍãÍ´TàºrV«%"¬ÖgKµz›©×¯Vpšê•›¯ÿªæYš 6bcc18716f3239e8f3797a4579159df4//proj/rd/eric/funtools-1.4.5/man/man1/fundisp.1fundispt$display data in a Funtools data file1¦ ËdxœÍ[ sÛHvþ+®½%Í€/ðÐÄS‘í(5k»,m"Ç5ID“D \’¸[û»ò÷ò®>@‚¶v«RÚÁ¾û½ïÝ|õÇwJ­ê,NÊê*üH£½Š£*RI¦"u]gUž§%­’T«ÛÏï?|¼½¹u¿tWj•Û¨ú žSü“៻ßÔ?'Y´Õ?«/Ë<­·Y©IµKž^Aý‡w7ÞÃ0Ð[ýNPeU$Ù¿ÙÕ¨nŠ Ì×d­µŠJX]š”•ZæY%öª6Z™‰îõ9Pÿvõ+ôϨž©Jåuµ«+µÑQ¬ ¨º†¥ý†Õu©U¹ÓËd•èX-7Q-+hñªÔ;(¬`eg±^]Bëh©ÏaŒ;ì/ÕŠxqQVQ±ˆ`HÙÖY-Üå¹zûîöͧ"#¤l±¤&à³[ØõÍÝ­z÷Té¬L`CQ_À‚nˆ&·zYaa¾BÎaCdX  1³QŸåY—ÚDET…6Eô¨ôƒÎ*êÖSêf^%Ð8*ÖõkªœÖ³+òumíºxÅ4\’pAŽãÈfaž›•ê”Uœd•”n¯“ *´*€]jUä[¦FÛŽŠ˜çê©?-P_ß¾êJ½Ï«ˆv Sñ{^ Fâu•Bú•À©dÒÀw—¬/yi– “e+pamg:vBgšfÈ/ö øÛD$8hä8ÿÄu”ª",iP„µŽ{êš—¡–Q“«(ŽaÖºÄU,d—™ì²̪ËK¥¾”›ß,ž:•.«ž~øR%[Ý=K²êŸ~î Âß:JÝ«Ï _¹‚?7êîÕ¾ÞÞ«·P×åשOÿé¸ÀTƒ¾šñÐð¤ìó´7˜ô±@Ízaß4 Ç9ýSôn6Û¦òCνÁÍ󬥇 ~ºÇôD·ú™tj,JZ)·7þÜë0kë0ÿv‡é‰¶÷iŸç-¹Í³ßÑ|Ïì7;ÑïËû×—¤KŽåñ) ‘ ¾}ÔiŠŸN§ŒR“UR¡’è‘Þ×±Q’+£ðŽ“Ä:/ö=Ððÿ¾Ñ(›8üšèx­'!£wè@Ò%Gq …u¶Ló’ý=TžàÇý¹†žänR¯ÀÙS„(R´ °ésŠ:-áåœK ì2µÖ™.¢”ã°¢Na L; Ux€IQ;ƒIˆu×+1RâXÿE"ÙÑò~ ?”­ÈýôäxQónû=&У=ž”„ÙŸ'ɾ?5læ üæ-C£zªê‚„ÞLÛî¶žµý´N¦æm0=_¢í"YרDp>à ª)IU@´Àü‚ø79ˆè}–`¢ Ñ.M–I•îGÐhå~»ÀØàGš¥{èÄ’°\û,C«‚ÿÐkU§*Y©}^«Çˆ#¶Îk=OQÏiK%GÌ)Y`ÇUWË%©ÞµI°e{ˆsžTGFì0wÍd¥ï¿šÉš{0MJI•t~Tv¬ÆÖ=tDañŸ‘ဪ3#»ª‹½Íù1ž6™-JE™d§$aß·O™Ú%O:uùÀ…?®—ˆÇÇ :}["EZ'˜µ4þÍÖS¯÷@¨UT§U £‚åcQë²iQÅ]#~ÎxkÕ~G‰HRÖì—üQ?è" ]VO¯aóԜ׆-_ß¾¹úõ-òõ¼ûôÁ¤#1=¸Õ”óÁÙÁº–p^:°ô ú*Í£ Ò!dF©’~2—–*˜W9¬¯HâDW¼ÐÌ…¹öÚhW†yLÐx&}«d7¤˜gÁ`Œ†Aß“1o½ÎЧ•Tjz7/`' n‡VÍ(Íëf(a£;M"Eaÿ°¨Õ³Ì Ìå<÷莯­Î)·] øCuYÃ÷= Œ-y†ìá—É_%ÑW`sRÁR1¿ˆ‰vœ òÃò÷‘f îåQÆM•,tš?ž“ív0§äM^v‘æË¯žXó£Ïˆ-Ë|7]€)/ÃËI0¼œ‚'%,â;—LÿØXê‰:‘–ûî£^¢ßÀ!¸}k¶ùqbK¦ô4ºôZ…®¹´›Ú’=/½Vn,ÓnfKæô^z­ÜX¦ÝÜ” úô4¹ôZ¹±¤4Âæzš^z­ìX¦4‚!=9Ÿ…me²h¤¶[SÁxp‘™¬s²EЀk²‹J«`$5¶)òz½AÞscÊÄDô.l¹øÙª¬@šÀrh¡œú1Rf„Î „ÊCÇw?^Ç©°Üû>¶zßçÂ:÷}`Øã¾Â÷}0´–¦›ª3L‹Ÿ«Œ(Ä$l…­b(z¨ ¿yFté‰ÅΞ‰¥,tƒoIÄÕÅðqÓw¤ªëäÔÊ+Ãú0TU ºq{qØ^wùq“€`S€Žëß$‡ ç’±wº@{ZJ¦!çÅò8çHò{Ø‘a©29ƒ¢u†ÃaÑŸöȹ‰,E,=ÏÍ0þØ·°ÐA“…J„ÿˆeiòUSvâ³@öÎÛW/‡ Cƒ•ºyõr¢vÈ’yoE1¡Wµƒw<t[Q;žŽG„Y×+¼E3µn]ˆjN,ÌÇÓó¶Œíí®Ÿž³ëïoû”àš½góÞî³Eà‚W±rÆ;[¥É²ÂMdð½‘dðvt½3C RXÍ9-²O0ÅBç@€´êÜwÌØ’`Ä·N„÷ê 4ð¹5; œ9†©yúÀŒÀ…wÑpÀÚŸ‰¢8×±Ô%¦­Êz¹aðÊ­1ódÊ7"W’]"{ø„Ø-17‚8R¤kФÄû$bð]ÑW+¸„Ñï®w;I;È2¨ñËyi;/Ø‚›€ñ¼—óEb‘2ÄjR•¸¿À÷{Æ%%!j‡…H }Hiô-ðšAçétÿÌ­) ÷Mø3òï€÷àÝ4@-–æhü§ã[™:ÝÚS (˜9 X*8‹‘ˆ…׸ÒGº]Övi „NóGÃPT[bÅŸçb¹`_Ì @"í±"}kòöúI/ksM(Ñ# LG®’tá zÿ_¸„«;¥³‡"Ï(+õ0$Ú>1¬"Ér>?(ÝhG:\xHŽ_ÉÂ=‰Q· ‡dÌåŽí©²gÌ ¾ë4_Ø“4ɼy‰·$k¸QÉþîÚy–¦ÖMx=hr]?¦š8„äÊ\*‚x½a Ö‰5Ø}²HÒ¤"K ã-7 Õb´…‘Áƒ—7Ì t½15wÕ˜Ü î»Óæ[=$˜ƒµ%k&èBWZQ%&(ð'dšƒª¨³%ùg¢#R½‰NVþ⓸¢´) Ó4[C¹P’µŠMÌÊÈrª„j ÐŒãalÁ=\ìÛùôöµ½ÆéÒÀÝ;áÊ9JôÐ!:tËjŸ¶híD¼<‡‚qc½‚ò Ì e'JðᣇÎÝ7´Gj:×Å eàéi“ÎSdœžtiÃŽJ0ø`‡ˆâ Y)èL£~™­BAr1Q‹DˆyḅõvÇ'2òÞrPÎæX üBb¥9ñ¥”V Ž˜ÜÿìvøˆœÚCYá•Oò£ ªäÀ½n†'ÒGbSÆm›AÁ„Y·IFhCÆ<šw„´–Õr¸B³¸Ó-RæÊI‹!Q®ç¹+è§mkh€ˆÀs¼’lë-˜fÆ h«žîÖ጗]zÄÛ¡z‡–—qÇà—Š€¯ÍµOwü}^ñ7]BqÁ©ÿ>0_,LJÝN´øB0¨Ð[P¾1Ÿ¬j:é,4éP¼H6ìo‚KRãÄ¿H±ëÚ âç-×ÃÝIÁ£ ÜÎ}4HW^>Ђ£t›cÖ’Ã!D ªÝ(Žy>ðŽâ¶`Ôœê?× JŠL^ií¡ŸGºÛÜèP‚«JÙ{Ï`öÎ*êŒ4»;T>™<½V20ù²L †ôî €è÷„ýŸùáã/WúxÃ_IRÿ¾ýlÑ<ã¡ñ:®Æ+ C&ð<¥ïÉÑ|>íÃY8OCi5™‡ñag¬™ÛÎãpöÂÙ|<¸Îsó0:ìŒM&næÉhÐëf“É eæ°­sè:çýÞlÓá3:7—=0µ8Ÿ÷gíË~&O‚þ\¨õÃEp±F>·ÀZâ*ðóÿ‚øžÓà˜…HË8|Ï‚ypÌ,ܰe½q¼#¶ðh¡ß, ŽpÔÌLÚ$µô(P{ú»K^½ÀÇ&¢O Ëû¤‰cnï9~øys2& wÐ΀@Þß$úxÒ[º‹ìã)€‰ð-Âgƒé3i? ]ËoR¿?ñ`2Üw꬈Ê·&¹wÈNž¡ö&#!¿ù¹Àî|5ÂýètFÄìŠklô7èXÌÊ‘'Ëʾwhâ(ð~ˆ’”bÊ™K¢’œM:£Ë ø³¾-fWúßàø’¿æ¢–Ôób¯ñî&“\@aPy`—…Æ#Æ|ÉïTìt¢ú â {æYz—?ø’ĵŸõoz«tA FŽ%ãÑãËó˜¯ â½ŠB+uö‡»›sY9`÷ÝÂÜyÀ©Jcg1­BÁIä~>}Ý…°[¿û§‹E’]”‘”ApAê¥÷Ã|»øÏÁ‹å(zü £åÕÏý¿îÀ¬@d•êüí'û¤´óbйì¼þ„Müño1Œ–E²#^×–Ö-Áů2€¿·ýº®’Eï>í©á2ßnÉuc{íYÜUžÓAeç ì oY*Gý¬àoOÈDÞ_Ž ›B<ž=ãÄ7FÃx;Ëþ¼BÜ™wɉ™÷_ÜD0?yi|;“VîbýÊÞœ9f, þöÝ;uõëí¥nµûqÇYv.þ¿I{Û_~pvà­éçÑÏã½q/TWÀ–T ƺŽ|áRv68ÿ_r[øì f0c43d781d86443f8e63f208466b1cab//proj/rd/eric/funtools-1.4.5/man/man1/funhead.1funhead+%#display a header in a Funtools file1)˜_xœÕXmOãHþ+¥ì}€SHfn™Ýì*@ÂFJÌÀhÄ­:v‡X8vÆÝ&ðËöïíSÕí—03«ÕÝ}¸C"„vu½>Uý´ƒÑÕ˜hUfk­bêQœ˜mª^H/è‚’ ß'efó<5´JRM‹OÁìz1]4û>÷Ô=> Xþ¸¼§$™ÚèŸèsÎIóç=Í®Ãé,ÀÖž"üüÐLSÒÏVg&É3oÜ@Ìì‹ü¢µÂ“$3–Mç+zwLK½Ê Mv­)Ó»^šd{­Û»-ôVg1ÅÊ*²/[-*Èæ¤U´&†š¼´Û[z—n›ÿ (â呱ªX*£!n,ÁÚFY:/ÎæS ©I†wÕˆ7“i¸¨R¹Ur`µx/OÍVGÉ*ѱ“Wñ÷‰B<^%l©â¡Üè̲üi[äPToö†ª%{-…ÂïLŸ¦+ê'Y‡Ó($¯`çWE¾q®Y•Ūˆ¾~£ÿ´PÑ£¶äVY®Ô•!ÀšSû‘Ú$*SdYk !øß#Š´13àD¦éKWŒ®J åäú¨H2…ÂH•|#qÉøâtQˆ4Íw°¾dÌVµ‡bÄË3³K,ìGÍϼJ YlìûZWIr‰í>—:îsðºKkX~ÒköÍÅ9 “å–vyñHXóêYYU¤§â\“>ÝÂ|+%+ô&b,Ãd¡-’Èå™;qUڵƒT­@Í·ͳ´îŸR.¶÷7ú¦èAÅZ§[‡¬ªõàB»4„ß z<5-'ì÷³Ýt_î„ëvhêI ÞÁn™A÷®’çýJŸœ¼‚H­ÏwN£»6ë⎡,ƒeÞÓä&øõz4ÿõ&øg0» è€J:ìÖËg³««qÖ£öúåìbz6ºÄrÚ^žáøb<ÇrÒ^^„óipUÓ^EAñÊÞõåøËÏtØÊ)1€Èªeª[ùå¦s©õÉÛ%èž(Ïx8I7ú‘uÄÛ%¯¬LòW›íÞ¼µã¿Ý¼KÔ»xñ®¼'úlÖ÷õÜë¬ò¼¿J¬ùì6ÞwˆîÂq°Àtü@tŠN/qÚ‘k…7ç¼8š"ÿàt^Oïˆ>ûy'²§Î¨@Á莞Jb(!ûÃ)Q„ ŠäÙË jÁá±Þ&1úñâvd“2œøÐ‰¿9>ùщåf ñÊ V»‰ [éúlvÃà¨â6à×±üŠã<÷Ç Ð5€KG? iy`´NVQY¯Vy^«I¡=—«É] QZ‚Õ=P±¢Å(û’Þ¯ü’Ü.uEÐYíÖ º'â{Oþ˜zEÕ¿gĹnöº~#¹£ƒµzb‡qíiX/_>¢<-7Ù¡äÓU[¾*Ãã½®ð\w”õßêBîvTm©÷x!—eŽ´äjŸÊLÖŒY™d¥CuzÄ7j8i­øDü…9îB’A Šš€JÜ5Ø#$Vz{‡ª8ÒÛÎ’#ˆV=êÌ%Wªqøo¹ü¥qg·0Y©ó3¼ž¢}Áµ ¡fë“JKfà0ÀWÆBm’ãÍZ ÿ^2«+%{Á ³sWP`]íSí½-–€g=û–B#í¸m mÖÏ] ´Ù»ÙšC—_LËßÈ=c_RÝÀ (cüþÂCÁUôCáÚÖÎÿGý‚S,(si¼eÛ·¿I•YSç¨#:~ª2âZÌÝš\S%߸.‡eÚæF&‰«7ç[3eŽ$Õây¡uOHtí87hå|íôA«Ñ½þÿ0 ?QËz®})åɯ>lØÁ£•ËqKA!³Õ-G”¹DÃ÷º@L*ÜýhŸÓû{µÜ²ßh WGŽƒIO<ã‚P¹Ø ì.÷·ákâÞ¢´¿ ±éJ¼õR34ŒÓÊ4›åXý õªóÆdE_?QEͨÇó(ÍóGñm2›á¬ûÙÿ½Í\¬Þ»¹Š+ð“˜wÀOqz (Ï?С†õ¡¬±>të|ÚX·¨R0«†2ë@èÔôò.Ê 5§¦'z°ŠÉt§ßçiÍ=¿[ô|âÖ_˜·ã4¯ÙKu=ÖOlÙä({cïµæ^­î~Ñáü^hMgôßöb ¹¿'òÖa%ç´YîþÇÕWKnöׯ¨ê âb<¦Ñåbæ4¯ü[ ÌEÖ¦Üm.×ï‡øÅô<ÀÞ“'oƒþÛþßh¢•Òàm9 $d_øƒÁáï:Ø’X 9986d9b24db7d30c3068bdf27110aa43//proj/rd/eric/funtools-1.4.5/man/man1/funhist.1funhist@XZcreate a 1D histogram of a column (from a FITS binary table or raw event file) or an image1’d«+xœ½Y oÛ8þ+snp°²lù™ú²Ûô`7]\r@Š´w`,ÚâU–´¢äÇ-ö¿ß IQ”ì$>\Q­-rHÎ|óÍCÌíÕ/׫2‰„, Ëœ³‚ƒà=ÐPºÎÙÒŽ,Ó¸Ü$Ð]åé?ÜÜßÁ“HX~€‚=ÅÒr¶¾åI+ó ±Ć­9Ü}ºýøëÝÍ]}Üc?þú÷_௸ц¿ƒG}Êx|ŒÓE$_ðù>þzóñ×âü¼$Í7,ÿá¤lY\â/Ô$â°a‘Μ-#5M§¨U2ãK±:¨A-†»œ…$ž”›'žÓ/:g€åë1.¾×‹Ó²ÈÊ‚Æóði –?1ÉaEšÐE@òŒå¬HsÙƒ÷×w?ýýFé]›¬ñ•ˆ_šð~(6<‘"MXì ­&C´¶‚‡{©¡¿ÞziËV€]t€ñW’&}5Ñò‘µŒš×Þ"Ïå9;xèÀv¹ ­‹ ­e’¼ Ww?ÝÜèó}¸Š ž'¬[ãb2#˵ø…3ž^š`8ño¾,ÈÔ¡/Z¡U`{.}€{X‰ÁCw”R¼H 9ÿ­9µºpR‰}(“"Mc©ì]h#-cÕQ^ Ïšç߬ #‹P$:Èúă ¥8Žª½V  ,‘(Hþ!~ÌÙò+/à6-˜2œl©X©4ã•c¥¶õAD ˆ¤”Ö\+ù2E ‹eê‚áÃMÑÂÂ1Z¢ZHå5O82V$k5o« §!e¦b“P,Yå¡nSÏsw'¹¬P´^€@øö%Úyè `ç`ž>uzÑ>†ˆ·Á¸s©"†5é#”ŽÚC£'P)æ ~zŠ1èKN[júн'Ò I[ÓVõÆ;ǰF1 &æZZÆ…TÌvˆîœŸT.@c“‚‰¤BŽ0Ç4D~Ø{C¦<ÝI¿§ Ä¬ð¡T×àÑÙW¸<¸À¨i<¼Ž ‹Q­_¢Dɪ”(+-9Ñщ­Lìy\EWWÕ*cTÛõ≠j%ËšP*Ãщvðˆ !—:Ni:gÉš›=ŒÂ†ç&à±l»‘tWÊ(-ãÐÆMl(mã² Ûƒ¦î‰}ëÝ*´öjÑÁ0èìôv íUÔ vTÂq#Š¢2ºFÎàªnZ±dñ²Œ±T„À®Êëü÷?ÿrs;Àÿ¯ ÂÔƒÙ¡òvW¨˜EOð=•ãs½­J/zeT»Ä¨xÂ:ºNµ ó´\Gu@7[ÍŽÀP:ø:M%WŸ±ø¤•µ™ï¯î¯ÈNõm-5†zÿƒš'T„.æ_®é®œ…‚˜dí"ʱŽ0˜ˆA¸U «X’¢ T”À¾Ióƒ‰r«Õ…UœêPÈPMÕ!`šsëNO3ü8œP%:Ä)6Œº‘'QäTëC¾b˜§H<]’4_h(Þè0Ý-¹”¨„v6B]Ûüô@îD=Uf4ˆ6qëÑéf «E¤’0KN¨îcF)å¢îx°o(|¾…,š¿†ÃÅ3–˜vbª-Æåú¨ÑPa§t1ôµáêÁ.R5¼îXw¯€6O˜>€IˆÖƒ¡Øn)8Ê EM×Q‡LËi•/u!¿7šhÊíuõQ¾î(Ê4”þq½7â¡YÌ:cªþ©‹d—Ë™fU$Ì8ßÛñ*MTÑOvêsøžm2:1œö±l9„¸S±]”J[et²T±ÛŸûS"}^¹47eôå$A°Ë¶íÆÔg¥>à¹XhjP‰£¨ÖÄÈ™åíFºGÑ3J!ú /ÔÛ <‘þTˆA_}ÌWã—ûyf³ŒFöü¡þÐÓÌyYQ½¨1 ý©ó4¶¢C-:mˆNœ§I%¼Õ¢“†èØyšZÑK-:nˆŽœ§™kÑQC4pžæVT/jLBè<]V¢cc–; à>½mí MQ÷Œ`ØR¶1‹º²Ö_ƒÆ,*æÊZ‡h³ˆ¼+ÛöXc¡we­Ë ³ˆ½+k}føÕ˜pÙölœ‹Ù©X;?Ú^ˆ7åRŠ(ó=ãíu^Ôî{•Ö{¯³¢o/¢öÝ«œ°ñö:%^róbü=þ¾ŽO9ztÊÑãù)ïMN9zœr‰‹³SÝžDõUI×ÞH=×VÕWV´âùk«j¶+|î{z}ƒi¯]?ûɹ>ÿ}üÆèX¢å.Z1è¶µTý ˲˜%ÇXúÔìx–gðᖮך,9É”™ÌÔgÞfÊI¶Lü þ#q÷ì{z¹XªWHb§:/Ûk!'°5 Ë%]¸Æê}cYæ[¢¢lZ«ˆm©û*Q¨wK 90w?Îõ¥ž¨î‰’ö«î‹-¤éñJ¯ª^'ŸRuEjÈŠÊæÖˆuÏ^Òt×úBŒ°3ÁåÄ\A }!˜—tõ>ãÁ8hŽLãoëñ|Öš{oêÍÔ[áüd¹"ôšAq2VrÍH°¥™·YL4Æ'“àÔ¯oÊbÄÈZ&ÎoýqGˆÅãÆÀ‘¸;2>8wG&mñÉ‘¸;2m‹OÄÝ‘Y[|v$îŽÌÛâó#qwäƒyÕaûæå]”7.)ÎŒ õ¦w^\Ô§Xìu+Š£ÈáÁ!ž^,ýçi¾‡ÑbÞ®/²ÝVƒ‡cîñÙ)Ü×bù¦|t>™‰û£áÙd&îoÏ&3q?¸<›ÌÄý`~6™gºXKæ—¾}S—¾»ËgÃ]>i¹|¼è¶Oi©z1º¡^'e§UŠTÝcÑ“¾¤ËÍ•0Åqβȹ̑.Ö— r™‹¬YbƒÇ¨Kzó§¢1e>Âxe—ÿÛŸÁ?/ÞEHZ}`»¯êûÇë¿ÝÜþžåt3Ø‘¼À®ê+?üèg! ,vŸ;ÆÕŸ;zx³'ã8žWª16hXÙ÷¹ÓÿÜÑÄSºç²ó‡>Þœx1öà3ÉŤ1þì%*„úÏ¥þ«pðnòí )ãFïþŒÞº3ri³Á4)Õ•™,MÓg’œÁ˘âÓ‚gn}ß'\I«ÌÝõ5\ý|÷OæœDÔŸÓºIÏ\œÇ´&Gû‡¶ˆÇd˜±%lÉLùÍ\!1¾qc®šwsb7èý˜ÒJ bb091d8854ccdc1797592ea45ba6e80c0/proj/rd/eric/funtools-1.4.5/man/man1/funimage.1funimageL.-create a FITS image from a Funtools data file1˜a±5xœåZkoã6ý+DúÅÆ*Û±Ó©1³@2ñl´™¢Iw§ëÍ´EÇÚÈ¢KÉõ×÷Ü{II~ÌtšÝ6HìXº$ïóÜCÊwWß•š¯³d©ŸŒ:W3gta”Vïoî•\;»¤+묰6ÍU¬ ­æIjÔýÏw~¸¿½oL19×êM’é¥ù«zcå}2MŠU²{›=6ÓcÁ7»™MG»8YæøPÒ‡ÒØàçfZ©*?»ì‡n?ÜAÑs­”úJéÕÊd±*¬2»$/’ìIÙu±Zb˜Î•μùfW˜,Ol†Á)N2L £R –!3›:Éh&2"R%¿ntº6¹RÖñ+µrö?fV(Z’UÖ©RihAÚTþïÝøåoÆ÷ï~¼eõn9Ò`åpÅ•G+Få+3K扉åDgñ+¬{Ëâ÷І.Úyˆ;‘búì”`f³sÖÎé²!­œÞ*³1™8¦£ÔT™'žÒîi½¤;0•„/žœ^VŠæ|UL'ÓÂQcýÉiÌ13yŽunçê,/â$;£àTÆG’±Ú¯Å ÷ðƒv±¬ÕQ?å¦Îòk§gϦPw¶Ðl5–’)½¯9/Ε"‡æ‘w}..ÂgLM*ÆåÞ¸gq±òA"Öú¼«_‚;‡–Ôîáåpsë’ŠV6É´˜ìºT±™ëuZDÍõP&•ôÌÙ7ˆ*O€Ò‡å ™«IK›W÷%.ìüâÁBgIM· ¨1M2® ×ÓÔ´#5…x±€¦3$ÒólŒsICx³(2jE^Ó) º†‹üšsë–#¥B9+Z gdÿë¨w]ô£sú»D$¬ÖHó§ y?[h©|a¬‡–¸Z]ptàß)å¹3äà"Ù˜´ç×vV™Cš©>!Iâ,Ê ÖÇB^ u ,N‹LS‹4ŠUkªs¼Ada·<|¿¦šanKötCàNÄ™“ Ô>+ÕÿA àÊ ódœO’2ÑHu}ÿîê»1/qýÏñÔ³)·ÖÅ9-ać´ÇBì+1ö(]ò™N½œ6øH+Ts‘LlRCSUçso24®#úúipÐÛÏ-Yh«Ë­•Íódš–‚@q2Ÿ# &yò+e[ÇŠÊò™-¾HMgÈ?&>|†yd5ù™Sú…xeTÍEùoQ wh!‘8`»Hf Lö{¹"ÑoÄûÈ“®Y¨«K$œ%™!,d]k¸"‹Š­Upuº^fTÐ(m’¦Tëœõe©þM(`Ƭºhc›J^šÙå’4„#/aºŒ˜?ÛÚEe;8xÄ=k–¹:›[Û1›Éøï㻇û¨M±‹ðR¶Ï|¯XC3ªùPÿA¶*¤v΀àç˜ì¨ãOFEºL2~Ó»Ú?`à×GüD“òX`2ªÚSØW$)’`ˆ`½±,¿ß£®}R±É×bò™œ³è] ac†£÷ Ý /,­#£2þ¢§@ß*Gkõ(˜Ù4 %u{f5š~Š„¸úöæ§SÁ¼[B»Û*ß&°ð˜ÛT3Ф8¹T±ôŠ&yŽ~ûýÕ߯5GÇr-¿žï5"[¸…úO$kÕJ4Ÿo ¼žûc6¶÷Áˆ £äØ/ ÀÌóÜ%Y`²MâlÆü†)“'°to‰$«´Éñ²'–M%},åãÆãœ€°°ã÷Р-m¡©™4‘€”7‰5õF–ú*0<§³°‘ì‘+馈!‡GÔ”N‰~A˜nï ûF‹1uk ÌlZúöa˜Ñ—Šd¶N‰¶“†4¥ø$~Æc¡ÒsA*Y®—¨øA„08·à>DIž6êã½%Ÿë% nÔ<!òa;)íìñ>Oœ|.Ñ {}ÿWÖðŽÇD苜 )×®QyAoø‡w¡ëŒ<WùÆÜß‘ŽPÙP®Ä”ÓÌ4; …+ˆPfÄ—òÂ1mÛïÕ•¿÷€¼Rýóù˜Ï›èÚø³3ooãŸ=«ûƒ®ê»H¼ ñw©pµÓýûæ„S€x›$æã ¶–hf¬Oˆ©“iª³çšëÎWh™¸÷Ž}p.[ª” ÷=Þ±+ ¿`3ñ Á×~î·Wb@ùÚGœ}Y=³å™uYŽ%ƒ–|Šh<‰}~ÎmšÚ-34REvÏÈ*rs±+ÚˆÁnt;êz]¥Êê¿sþS¬þëÒ‡®o9õ|èàh y“ÜE"Ab@S½³¿èŸO‰ßd²3ë|éuH<Ûofˆ×¸NŸ ¯•w“?ÄBÛ^®Š½£©†Í<²ÄKî`±BÕ½M¼¬Ïm¦Ìù¦.ÿ äm(o—üú5½@+õj¸ò¿|ÃT# @WB¡N¾…(‰ úæc^¿`Ì×/sù‚1ÃŒ¼`ÌÅ Æô_0¦GczlÌÁ¶¨ªÄåXç3[~Áû g·¡;ê[»¥…MMØãT"' ©nÔ%äó"`á!i²¤BGsÂõèðÀïí=™í¨ÖÏ@O´¡È.G4ýˆzQ žW†nNÇÆŸQúÐeXeðÜ÷kG]”vC2õ6šˆ<Œ?>øCÏ@ìgÕá©nø¨ŒÉŸaprXEä­öžN ûdh ;ÃÁCdª#K‚Š†Ú´ãÁzV¬uÚ ‰M4“f7!Ý[ À݈ѷÛ~T' îz›Í+î¹Ä+ë‰êë_<™¢°TÜh&)Q|&îbãü 9:óD^]êü9pð(Ù3 –z‰$«rÅÇe*çÚÂZ)Hó’w˜ê-ÀÙ?–à˜ËÑ ©zÐÛŠO‡¥¡d3$¬©œ]xÝò/ B4K\k £A;â#’îõÚÑy¸Þ'×þë„w£Ê¦½˜=TǪÁn•Zûœ£˜ž ³ôÿï^Ó©So½ý1¡×ô~wL¯sy8æ”nc†/3xÁ˜‹ØÓßz4>}Š€UÕÔ «Ç…þé"ï°¤”eïZ?e¬Ol«‡’²©î„CŒ•ž&iâ¶µîYN“¦Ø;…óÞîò Ô,ÔŒ×oºe¯-»³9â{û B­‘ ï#L ÕSÕWBøíóë¿øuÈå÷‚_ü:äò;à×!ÿ#¿Ãð{%¼>_YÏánÎí=]+î³þ\B›PÂh3§6oЈéSÈ›¼Ÿ¼’øøf#[ë›Ý½›½êf÷øæU#³‰åsÊopWÆÑJžsùNÆÔ(<7©XÊÞ†s…iB‚ÈcOU#°t†ÿ­wkKOLº¯Wú?f'¹×ñ7ŽE§ùþØ€Oû% Ço&"÷xšÅÊg¨NeБ¯\Þ nAïã´jh«s†>Ït94‚ZÍL I4 æÛþq‹KÞÞ}æû5‡Ï4 >É/º&/:f#ïÂJnä¤õð{…Åaòð:¯¿ÂñÉõêÏüŠ“þèut1ú:ê?ž}ÆŸüÓ÷¦“NøJ:­/8Ó†]z˜òW..ƒ/ê~QˆA“ün6K#kmH ! ðUl@¨|ÈyUÌ;¾íà?ÌP1Cbï‰2Ìb•Ô%Ø ÕâÀ O08:d»˜í6Æúótmþ“ü}šßýš…ÆLδìòJ ™‹]Ð *ÖiÝœ3\ûµ¸R…˜Æ%–ÕìTyx딦HÀ‹–á…ïô¸ÝE¹ðc`®ƒÌF…³ù‡à¡¦âŠì#Z¦-f7Ìæ …•9G !v@´Êý½m’€£ÃAˆÆEP¦ ˆ—lM¹ñ1ÊþÁ8ý»i1”ð`õ…î?¶ÍÞª™\˜óž£§³.ƒ/1Õ¦m"ÈÖõ <Œ•^” ¶ö¨yÞuZþ[ÍШaÅ=¤s©’YŸa+Ó,^‚†£Hé 7Ù5–B’OÊdõj°zÌZ½Ì+W²òJV¦!î§NV'újõÕÕ¿#]çku×v#£É7*ê¶è†N¶¬ ªîh.=9®8:ç`W f2fá غ¦G?6¸”ú¶–¡¢8ƒrÀó1—±X›ƒ0ÿŽ¢›†ÐÖ˜|.ïúãI¶±ä­Ìj‚}Þb(™ÌÛœMž¥f⡇«ÊĆx×s*ïɹ?²êdp`ÅqD7°ªE±äádC“ž$”£ÖQJU“,ÅÅ HŽüÄš~(ëý—[n!(Ãj^9 ª}’—bΕ#¡]…ÔßâÅž»ûÍ–=ƒÒÎÐ1[>lá}:ÖmÓÖv1õçN#¿öÕšë9‚®àjºJkx‹àµ¯ä#ƒž›mtá¡ÈßHøfwX{–ÞÊhÞ¹íoL%dH‘x|ør£'ÏÐàõ:{!c ”/u ZÄ8ŽùºÒWHä$!ä÷×ú࢔ÏDWô­îÀN‹~™Wò×H/ؾ^cy¢_ý46› yZËè„¶Û­Æ'Zê%¢^É茒ÏUžŸ£d–eDÊ-R9£'Ÿå¼2'F8±['ìꌰÄÍ ÚOŒVhþI©Ï݈A^–EeX]°‰ý± #~áMtÙ‰©,&­ðfuÙyQö‰é o®póJJI#'´ƒ°EdhT¥/ÓaëêôÐbþl¢'ó|ƒ¶u~Ëý+ýJ§½-ýùçŸg7×Ñ“'Ÿîr¥09†ÐÑ ¿®*ïiýyR˜èüywßÏ|¹¼žl؉Ý5È¢ & Ì0¼ÐïÊTgô[}´ K¤TZ¥xòƒ‰„ÅÅ&¯b0JËD L®³4µz¦˜ ¡!®Ý¶>y5£ÛYè…»—«©ôÚ_„Z%ˆ»æ€¹ÎÍfÔqî¹ñ•rŽøQI¯…¿ý‘þÇG²O®d ./}d{ þ$¿ìÕQ:ôy1LE¹á{ˆ .]ødbBò”Bxèp(â‚Ù¯Kÿ!@È='!ÿûúóH¬Æ¸zV Yà+_ÿ&d.žœ0y@ú̃Úçt‚à_h› •Þ6zû‡Å–ß-åøóÍ™Zñ…Rlü[_¤J _&þ’Nt†ÎYy¢ùã•R˜¦©ùsEo^?¼!z°ò˜üšsQNý‰~8æè~çÙÚ|‡™fƒLæÆŽéY.®OèfWg9-¯fà°Ô°÷ø|±œþ÷°É 44686640ae2327ea61ae72128f9166710/proj/rd/eric/funtools-1.4.5/man/man1/funmerge.1funmerge—&merge one or more Funtools table files1‹*Žxxœ•W]oÛ8ü+ ÷ŵz/E¯hÒ:€Ô)jmQô”DÛ¼P¤¤bëßw–”d9éÝáøK$—³³³CfyõaN´©M%ÝVÒ¥OkðrTY'é¦6ÁZí)ˆ\KÚ(-=­¾-ï>®«ÁZú~q ‹ãºØÐ÷Âj#*ùƒ^+þœ½i¿\¾!ʲŒ^[þõ†î>®wK„Á"ü=#[‡}H"Ô•!¿—…Ú4Êlãδq¶¢ÃN; ;åI>H¨@0Ä8¤¢ü«ööÖ« ¬¡¡k`®=GùònEÊl,¦ÿÏtaJòâ¼è²›ò~¾z÷iSß=Ý,Ö+*E ó¥ÀÓ˜ä8u‡JÃj­$÷6íÄCpïäFéæóòfqÛ‰4ýz1ë¿]NI†"úK·ÖÞr9†áÜí/$RJ_8•A.µ=@@½ ím,wkñBgó-¯gnÏ:ÇwU²1äùN•_7Cø)î#ºZ¦ötóƒ¤ð™+cbÍ»Ì1lýiE rxBÞÄu˜Žÿ{›ë”-|üuúmÂ0WÔ:ÀžÖ–öÒ1Þ]ht!·ê´Ï¦× ±xª«¿HF–£Ò<•{‡sí3DòþdÌ©¢™Ï5……dR’ê(ò÷ F¬ƒlDMÁÕíÁD\ƒß \Õö~Þ ÃE)r TýìY›c—È4ö=èŒ-:ˆ–ãâ‚öè}–i ¡Éø(“©ŽVè:œØþÝb[Þ;Å9Åa Xß~X,Ÿãýê+ÝËæ€@>B³¯58U<²“ÐÇ }a>Ú »ëÈ`ËÆÖQßñb]È©-'Ýçå»ÄþÄŸôŽfó©8:'F“®³p6Ý–ØA&ív¸8m/r·©j¯UßO‡I<ùÎtBMˆãéЫ`ž¯sl0>Ÿ¤Õû"7_w%l=ftwûþÏ ú(€IúWD¢+„ƒmo I%Xà¥;'0œ|.y*3ÔÛ®v:  5öÁºæ#œ£ÚưÎs»œÜw¿û1¸‰oº€AúɇøyÉ_Ò=_žä“v}¤âuX†Îø€ãòéqãŸ:þ’õ.ÝHâ}Ôôd~ïù|{t£”çéî›PgôErõe¼¨5¸B²ˆ$£çc¥ìäX$œMÜùd´šÏéêvu‡«£”Œ3^CÇf’îx8KÑSPoAÝI½Ç¹Äws¸_Di–½Ì~£+4¬¦ÙË)]¾˜ÍøŸ‚.ëñlòÑw“ 24a592d8bf1de84a0278973a0b6bffdd./proj/rd/eric/funtools-1.4.5/man/man1/funsky.1funsky7î)convert between image and sky coordinates1‘.¥(xœåYmo7þ+÷‹Ȳ%ÛImô>ø' ±‹ÈE-9€Ú¥¬Ev—{$WŽþ}Ÿá˾(’›^m3ÚH»$‡Ã™gž™¡î®ßß­êÒ|ÞÒ1%ªÜHmi)í³”%e…x’$Ê”x7Wu™Yó*ôåã´¸ÿùav[§D¼¥ÈŸÅÖPm$$[ù$5Ù¼À~ÞÀ&S% „¡Ô\Rª¤b©öK£ ¾Œ¶dUÇ+Qçöª˜‚™¼^ùõY™äu*I­VFZ¯¤]K*ö9Y¡Ÿð¾R&³N h%tbdÂB6^Hš™*l–ª¶´y —‹Ü¨Ž"qŽª-OReîÔxðÂÛVétI+¥ aið|²–"•zdÅ’R™gEfa–!½½™¿ù0sæ$ºõ¾ '6A›]$P†l ‘Þ0³ÉIlw1„O²òÉYä×7sˆô*±%°Y 'C[ž`*™d« /ngsZe¹Ó\B예( ·ZI-KKŒ¤1ÑZehÓØ1ÓØž¬ ž’™ˆ8VÛ›©QÙYÈ–%ÃnyÈ ‡²OÞQcºSPÑ®á=^• +"¶°»ÛŸ¥² útLÿÜR@ÊÈ-¨´zÒ¢Øuæ‡kÇ..ÐÌ`ŸG÷rÑø ’wÔÓlժ㣒L°áŸ3»&áÏïààð}-4Ã[-þÅïK\ÂMþ˼/“zB«õÖd@G#—š1lYÖîˆ8öȱ  4£ËÈ!lš¬±Z•Š&h) ^ßb.J;:yã¶€âiŽléÀX:õSÇt#’5Ȭ”áì5“ hÁñÙ¹ÜXždÀƒì,µbøàxŒaù¤eÁG~î–9¢|¥ò\=cƒå– ™¿3}Ñ™>vدM ›¶\±nS áÈÛŸp/½uàE•Ë+æ¥Ö .Œ"J™Øë¢t,oœo<ÉÓG³þ³„)õX‚"§ÓñåÓW—Ìu?Ž_¾º˜žyö ¨¬AgŽ—|þ¢‹Ééøô4~“éëFÄëWgç­LœÆùqþä5/õó'çg§“Þü3ž>èßoyLâðH˜(ÁÞêsG@ìý.­´HX¢ðÞa>éã0b™‹a‹ºqà,^Á”’9 ³˜’®çof3JœÚC¸v#̯öŠ#x÷Ö Ž)Øë¢·d>h­Ÿ²°5²ªˆÎŒÜ5+ýÉa|ä7+¿8Ê.jÃ¥R§O:úp}4¢£·7oð%ùqqÄYÌe¡&ßðñý7&÷&e1‰Z2ßÛl#ómÃ2þè¬-¢;$C¿ Ʉē`póBõ®'\õ¢J²ñÁ‡ÏžøF¼' ùu:æ *ðo@ÇñßtÅÃ!óžX Zİ¡ökøêâ´‰ÿÊuæ­üœùäxïÏgÎéÒ³eC‘qÎÈ')»(’Ó¿ fÖ0þGtènZ)Õs¨~¶iÁr"ÀcƧiuª<Ž;£gØÂ_€B®¡]Q}õqM)éOà °éPŸZ<vŠX…5{Á#ÿ¼¹7 ቯÓ#âø_ªl"ÍëÈ~ìíeg¦I<×KdÚNvÓ¯HÏ>);2œsbRwØèø¾¿µðpãaÕqVËØ <åXÓ¹œÍbÙÀÁyŸéÛ`+-¬¯Tå@»?ÅO²´ž#¹–{%¯¢†_3Àû…ã€÷‹¿Šœ~ûŸ¾›þ€}ö±búGlrv~>~}~z~6Ý1Š8›\¶§VqÓ‹‹o5ËUêuÀçOQ·ï5M°Jw×=[·<ÐZ)+¾O“]AÍ …އÇñßÿÒ·Üç[Ϋõ¾R;ò¡c—ñ]Âpõ ?îãÈ[KøxUv@ôýq劌¿;_áÅK݃šf=`ÔŽIw;Üx²Š›‡ÜnÜÕH[k:˸›¤¯Ê'r®>+.z½<®,8' éð5‚¡Jh—oq³–œU؆oPþÛÉ °ÕRµíd¼{ði=´òÆÝ+ÈUužr)\iy\¡‹ð©KÆRg·¯ú?ÀwV›—79€¯ÎÞíÃÐu”jÕ:€Ä޶•gš:X¸q«)Vè¥0±ûà®lÙ·½;~ ›Ñ¹†p ( ë\ äÊN`?!("/® 5$2Eb€‹!Ç ÍåZ(Á¢É#Rèˆë Ó¦Ýšbs”j²ÓG TÚ¹ëÈ´,2lµUu ¹†d†W›I¿Î+Q³†8¡B¥rÇÕ/»úÑ}ÑÁµƒvÿ©çø}¸Û½»îªý¢Ê¿Ðhv;{wCÿ Ð…6'RgÉ _êÄ;LáÚS|0ûç©{vQ¿Ü¡kç)iû8÷aùc|à‘u«9þû&¾ôÔg‘n¼õÍ}8ìúçísNŸº1ØwWÿ©©,\( oHÍeCÉš¥ä³ÿ)Àÿbà.lüïÞÏî\èàÛõc¼fäF»)­@išëQ¾ut7*.Ý”¾¡5R®1å¥,"l¶Ê•ph¥°ïW{>ÇÈÝùrº&$¥ÎÜu{Õ€ÇeÍwÖ‰ÒÝl£.Xƒ4C¸ËJ”ÉÖ³ˆ·@› ;‡ÝQ‘5Ag&}O„ˆ—é6Üð¨r•g‰Wø«ÚÖI!¶K¾¼¿¹¡ëwó{¢¹äÁÒ*•›A9ô&õ¿æÀ$·a<”W`¡'è·™ŒÏÇt]é,§Éùˆ¦§“àÞÁdøZA> 36daa9bc67c8b9bf76b30d1e889fd2f70/proj/rd/eric/funtools-1.4.5/man/man1/funtable.1funtableF7>copy selected rows from a Funtools file to a FITS binary table1—n¬CxœÍYën7~B  •I¶³MÛp§5е‹Øí6‚€š¡$nf†rƲòbûz{.$‡#ËNŠìuK’‡çòë\œþóLˆU[5rY(1™©w©BeÊ…5['VÖ”BŠW°É˜þÖ°³1øèüúJ,u%íN0«7—¿__%4ßNä;ø¥Åä~–øËÁ=…{'~„³¥úIühøó-¿¼:)àç!ëZU9Þ«nµktµ¦mê¶a~¤~øBuÛ¨ÊiSÁa͇WÆ ]ʵ¹läX˜ªØ‰µª”• ”ß9+»cDÓÅÖjØ*A7µ¤St-îP2Û«Ö|£ 3Óét$MXÛn4lœ± ìüto,Õ'eÍäF-˜¡Ö· ÿòìêç×礘D¿l,—تÙÀÓZez¥á0é,êdس*b$Ì*…l0zeª -X¹êFUß‚#•8¸Î8Å×߃ <2ç…3b«‹BdVIÒçÝx5\àµÌHº^Z+wž–¸Þ Y뀦]·%2—£äµ5k+˨GOéöE î?_‰kr] „v2Çd#Ø ò*™'ên@!ÒæBW`¼©ø4æ…•ÙÕˆ ÓÈm€ ’;æ+"Ö±b‘‹FYçåt*3ð4 ªY$”(YÇ6¬ìóuÐS5ìA#ÂíA{Q¦4_ìD®V²-`-½¢$°÷AP ħ–x(Pº a%ÒÈÀÊ˸­uèÕðÈÔ¨&Y mSÁ+¢ S~/ÈÏ€Ê\„Op9ÿýbàœ$€‚}¾ïÑ[Çœ²õƒÝU1s×ôý›mõÐsUƒYÛ×^Eã½Âèp+Ëa¶3-ÉK–P?ÌÑò^ýe¯­‘XÊZŠ~¨ ke‰] ±E:PË[·y× >m¦êæm½‘ÏŸÏ?®5|ÌÞ ãD nÅŒ€uP̵«_@h|ƒQJüþë)ü:‡¨Å?÷}Â71§b>Ãoðûÿ÷Áu”2ÀZb*ôçwGwˆ3 ´üìîÝÈÖ1//æOï,£LžóÅÑñ¾\“À§{qr´¿ü«²œ)ÙQ·ºÙ„LS+L•2 ñ ­E©‘rbmœ¦€OyOóQ0›©TŸÍÆ*<HÐ@}<†èñs?HªÛ¬hså“‚ €|åc¦(uÕBÀ×kÜ ’qÊ þ›ÀLbà ;Š  2¼ü‹¿¿|óôR´aŠBo²Iq2=™ÑúŒxô–àÇ~ïÈœxü˜ÂÞ(f¼1`tâ‘ üF>Ñ:ñ˜ Ð…~#ˆ¸xˆáßÈ"‚£á€"±µx­-ETÓ!"ÄáßÈN“¬(SuÃÐD0û°ØGæy)¶…™ Yô„ÙpÏ¡p˜$OÂ@ ùAõ ù•Çvºc¯x©zµÇ²e÷ÏQi ¾â/Uù´®>mì—Ðéö¤Ñûn›Ö’S‡+Pü/ë‹ÄQ?`9äD!¡èͤ£êM–K½nMKµH´­Ø¥n,Ô/l/™çz¯öLM‚í¿.t¦›b7î4aÍíÊ%²ßÒ-“‘BýT²gr•šl ɸâªkÕB¯¨"ÚJ®Üã¼7&a¾Â«v‘¢-¶£+N³ÌØ¥ñU'ÁÑK°ƒ€w+žâ€­.si2—õe[œ/êߊH«'z‚NèE· þ–è¿—Ȭ´µÜ-{±0¨’FƒÞ­QÇB7Ð\– =—t+§-2Tx’9õ°÷÷y¼ ½ñsLbPr_ÎIÂ)ÈAT…Ûº®ÜWñIã€û¦ýj¹‰ý]¨p—ª0[ÖŠëôvöçÙÅu:ìByuRËΆS$q"¬—ìnÕürû¿ŸØü ö{O\e1WÒ]W©{tðèïœû6ŽJÈÐtþüN…¾û@ïëÃF¼’bDeÜÛOS½‚cA3­€÷L±5EÅÉ!T¦ÁêÅiЮvE!Å£dÈUˆ×ö¤Ð•¢¦ R9õmG#èþ+×@ËLì[î›-ÔÔrG”ü<€Û˜ü•Lûý¨8šx¿~t‘#T¯â<øk0ƒ7þöÇÙÀÃKyVSª¼%,hÌ!†dÆ^ÖÝÖ•…@Ÿ)¿$!ýBqˆÎu9ç8£ËE°Gh§ÉîÄÂÃèc?-à=Ã1^¥”‰V ED¦â_Èœð9;Šm« -(—Æ~ói-¸ž} ½XÍ“çÜCÄX½ÖX {{ˆO´4„Š·²P1=ôJ¿3­HñA…‚!£î]œ1/޽©ø¾éÁ¾gÕxàî[pöÏQ@N…l©-VöÆûi£ÖÊêO p¦ÈÚÇák†5ttXMŽ©Z†kŸÚÀQš8~«Õ L;Fµ@µæxjÐÎV±/øä|Ñ|ŽNWmM[äb#A¸¥M» à“D¯ÿáå ´ÖZG¡ƒs0gÁÞµC-1@ÏØàÞØÈþíx»V~¢‰é¨3²£.Ída S½Ë#÷›;„’NÞ^ •RI9ÞÜS¤9Fûµ£ªCuвœ"™LÒvGpº†-ZX¯¥wf âX ÏC=¥úa†Iv-žÅÛ`5‡ ¡ÔqpÅ2Ž|"]ÉLºÁÎû=Ñ ³ª¡'àCËÊ 8IÌÊ,S>Rßh‰¬Y ÙøTªG_M€ø DÓÖ~:ë:Óì'”‡Þa$G3¯`ŒÇœ¤)ÚLG!#7RWIòNGÖk&9¯©Ë&koé¨[Dë§Ä»À ×ûÕ>çq–꟥W¿](_¼Nˆ¬5y›ÁªlNRâ1fWk€§”*•\$òÝ™>Ñ ”×4ô’»<·;œÉ,àÙ¼Óð²×‰¯±€ÔS#¸À=³Nå<§0õ°FQ¡ñ«ÀÓH\ÞÑT/ø¢Ã­LÅ™ó]Ý©xTíA!íà ¯A1¨¸N–¡k5‚u'>¶¦á tßàˆ\©¹o rñ´ÅGè_àO>²äj¨Úr ‚Þ¯õ¤ðü>}VúiþJ7Ö´žÌcü?ý@.fcü?A¤{’¯Œ™®yÿ¨âC{ÎDžFRæqëŒwѱÈJ‰!<ÐD®AJh¼ùØ~£q¤4÷”ˆŠ®À}3O j~ž\ÜpÛT“¥¢/„Ø:®ÚØ–üzäc«mßz”S‰=v}ô£*”žû¥@ß‚¹ëB¢?&ó.0 Cn›w×›Ö}…Qeê¦ùëκ_gÜyBèmy×âá]ÑAÙ•!=¥‰¸çûññAKpØu«ÿK•£pïA¶Ï¨·Ì¾RÓHcþ’qÃâ3úÅ,ÓË­ÐeYiW¢'@õKYUc¸Áöu…êêcˆô­Íø¥°—•' Á} ·¦]sß;÷ß׉Jm»7„4V â2íÄgÞ²GÅ–9)祲Ù(ê"Õ â+üŽ5zÿâüâúôÅogé…]䡸±ÿÖ“Ë YàûØN˜ü…¾IôšßƒólKß‚ü;x(ºyÖT} ¼À³Am÷*§hÖ…G§âry£MëxÖ†Œ0K¹QÌ@)?`¹R9…ÝH•BÃÏ(І÷´Wggâô·«K|ͪb±8¬F<—µh«î­4ÄÞ@´†ën”¥ÉÌ|z<=§µÕ…˜Åb6§ùwðÞá|ô_Ûᤠ7b21e227ac6a42b780d0f23e9a8fa292./proj/rd/eric/funtools-1.4.5/man/man1/funtbl.1funtbl!_*extract a table from Funtools ASCII output1Œ”xœåWmoÛ6þ+‡ì‹SÄJä—Ä.¶Y×¶¤˜ EW´tŽ¹Ê”@Rqòï÷)ɲç´À°}š_îîyî…ÇÛë_ß­jã— ‰Ÿ¼U™'E^- ¦•-7ô«eY8º^¼¹¹¡²öUíiñáöîýâfO‡Ý‡eØø £µü3QŒ +ªlù #GŽ«Oô½6jÃ?ÒÏoo~»yswKôñö§×t¿Ö.ì¶jCkåhÉl(çÊr¦<ç¤ ­Ôci©\‘_sc—‡ñr,cç´y WWUi}ØÝ HèCYS¦ ™rKÛUi7²škWQ¹Û¸u¥ v4pgzõ,²EkÄ\]K°ö…=ÄzåuiNÉ—™a£#erzêqÉ'Ln‰w™Õ•o`+E]`£šÁVû5Ì š×¬r¶A`Vn6l¼;®R_Aöo­ö°E¤XvuáÅPùrËÊæÍ‰¤±O['¨ÌÐÁ€lMÊ>Ô¢´ëQ¯M§DœJ4Ð 'Q®zä¼3Cl„…,>ky¸ÜŸû,9Mèf•A\Ug04‡G1gÁB¬Dœ5æµûm×ß yg½ø)ö½%ä¼RB† ê9®c Èi8A·êtt•Êx˜s¡7Z¢³‰Ìèj2õfÉ6È,fòYs’Ò˜¦'´ÕEqLëÚ2S™çÃ(„ó.~¾bµ‚¬½m’q‡ô×p¥¬òÈ#çmˆê’ÄKÈ7¿•”{I0c;ˆ Ð%ëcJ”ïh€'ab¸È¡€TžÇLVm8Ú0V’ÌË•W¢­ Èß{UI˜4§CÉàŠ Ä¶Žªº*ÒFoQ”[GôŒ*°MB#1Hm¿ ý…»X¶5âÌ8m¥iIÄð‚Òuéü°œ…ÃdΞíxrËZ³×>m¸ºo Žo’c‡ÙÍ—$µ §C*‘ä?¸ -*Wƒ¹dÝParåÖŒì Ù.‡‚ÌÆ•­ÏaØòY¢Úµ&­¹¨ö¬ª^lƒVwêAàK¥ZJ¬´<Õ²Âß!ŒøImª‚Ï Í8- ¦~î‡Ø.Å !c%E æ¾Fýw¸7Úé¡Cd›ð#(chšŽÂßÍÉü0>!úŽ\YÛŒeD¨T Š¿sXùç¹ÍÏe鼑ö*›9ÎÎ+ýÄEÜ>“…%Êøƒ-k!R¶ FOª¨ƒÜ‹ä"üd½!¿6Ö6bYuÚ£ŽW¯FqÍÕvõyiu·. Ïmbk¿²ÉÕ(ùyÏÔ¡«—!õ1‹:¬©+D°aÿ9ÙÀrá%ÚC)Ù§Åö•;SP©ð ÿÚ½0}tD©(N'WI`ÃQ’Ž&ÁÈ‹v®¥—2Œ3óQ·…ËÑ´=³‘s9¿ºÜÉÙ­Aï8˜3µgÆWÉüê{Òé||TÎh?‚ŽºÅòÃÿÄ+“«Yç•4™]Ž_3÷¼2›z…figÏh–Lg/É™Í/{ö¤ÝÚX¼²_wš¢!²G:ªPUi¦h‹»•¥$ÅÍŸá8ôu4Z{äFâŽT§èêÁ«Cµq!Ë7Y3‡!¦ÿ‘7ý5šö?åëÀ³I/[Ò‹ù!Ãé䢗£É<Ü£ AújÛ¶²¸¡üºw5ßï÷L…’Èà"xnÚm~â¬öü÷ ÿß½L Mo‹àzCàlAâÀ€ÛÇv[zŽ=JïšêÞ–‡ñ–üueÜXšâù ýé®TG¬pyÆK¡¹°MCŒá²vݵmÛ¶DF-iZv4Eí¥žâ}>ÙÝ¢ãæÂ¥Á–7B£¤k†ÂA¹éÛºÓÑ=¡•…N¤ ÎÂÙ“?¼ÜÑ!Ú$è"?Ý…ê.dwÁÚÕô1õ<Øè;i|jëazuè= Ô GÆHè4»JŽp.“RšñøHÙtï!áýi¹ô*4pè“"=ðy oÀnÄÿ'ðoßÒõ/‹;¢s÷ààщ`ÊöÒ½ÛCoW¡Osôˆ§‚Òd’LéM^Ág4ºHcÉl° ÒÓ¿×Ы 674a8881522e4c8b8c9d3f8498903d3b0/proj/rd/eric/funtools-1.4.5/man/man3/funclose.3funclose¡close a Funtools data file3ƒ‚1xœmRK‹Û0þ+ôâ@Ö4íöV a›…@›,õ^zTåÑz@–„Éúßwd§Ù°Ô™ÑÌ÷Ò¶?wÀcqÖ'Âô|ªZÊÞÛ„^eÖÐý>Ÿº}|`§mé _Í¥­¾'Ïý«‘Èõ ßwÝïýÓóþxžzkY!ú’ÙÑB›„7D:±/ÉNw>£þ?JÖ0‘ˆÝ ´w9z‹”cѹDJ-öæV~$C‘œ& Êõâ⬂JI³G^ä…JÔhe-ŒRæt¡’)°¦0aôâYÙäg”H³aZFTÆeFPÝ­Ëe„|†©¤‘FÅ®z ×L.±wÂý8ß² %/©_DJN×R#zÞu¥\ÑEt mÕJÌ%­q®<Ú#‰ eÏjJsÒ•öôÖ õ‡Ä½#hfk3E§2ŸÈNkL¾H`n M mIƒ˜¥×`Ys¶“èèv;ltG #¿mid+jf –S†7o²AÞçE–áD±Æ‚M{ß~Á6D¶ØÜ¯ñéãfùm^›æóê/’òöñ ecc967237a20e6f87cf2ba0649e8cd519/proj/rd/eric/funtools-1.4.5/man/man3/funcolumnactivate.3funcolumnactivate79activate Funtools columns3z¤oxœíYmo¹þ+S9¤DZ[–d[Ns€'89;89hŒ4(è]®ÄÞjW w% ‡þ®þ½›’û"­¯2ýP ‚_Öç…3Ï<Žo¯~úð±HßgI±L¯Â\­E.aÂ?â‡y–%B^b`öp{÷yv38Ri˜‘„¿ÄnQ°ø`©h_gß\ׇp!4¼6þa•(“÷àúÃìýÏ7Ÿïoînî²ECtVä*•É\ê%>Ø,T¸(ë™C±‚Çm%?“‰ ón¯E’«%jJ¶°QI´ˆ4:Î4l´Ês™Ý¢‰Xàú>\èÕç ‘ƒÐ ë”F¥ó}[¼ÈÇ0 š;´m*)yTT›g:…,ŽñÛ«R½f%C«ÐûåôÇJro^,ešƒ"Ù*,p‡ :dL*ò÷Ÿ/ðc\CCMUF†Y5t 4+B9ˆd¢–ŠtPâj¢ät  g$þÏÞ»5+-C¡0f¨ó¦ÓŒ%¢ÔV_):»¸¦ãzƒ¡qäc*–noSÖ~ d”ÝC%I»ÔÒH½F “kL£Î+-çä{¯R`›>%åî„M¨áÊ…J 9§"A„‚Õk‘’Uêlcÿê“qÔ Ž}hÏ .à#îA>‰å*A)EvÚë67„J‡E"¼UCvH¡ÐbD…æ|9TزF]’ãÖ·&]0¹>œ´hw€²CŠèiÓ°’iD¦q¶Ýf¹FhŸ4©Ré¶P?Ù(w^m;íQ&?ÃBkà£Jy£%Lï…ápð*—…믬òúÁi}ó; .¾™¼úNœ)³‚8Ë‚Xåæ®ÄEæ]÷úkÿú¡÷ÈDºã0ÇGËÓ@µºÀí•^pÄBâ ü¨…ưÆnpI)*èrµ·Aòñ7c¤¬Z™=ÖŠ¦oÝ# žIعZ¡0‡e¸B×Ê|†UŒh!ð½ÜšòûÖç­£ÿqV¾/âæ„áRü‚äŽUkŸlâq‘Îå¾§L7qƒ§=,Äš•gðKŠˆdGêˆaà›F‰!0þ H7+«…<0dèudƒ`S/´”5sö0a·¤S0@ R1p:ŽØþ#ºÕ„K«´¶¦½m|Ó“†tçexHqx £ÿv:Þì*1¸[ªñ˜í*½l·U¦p׆ Si4QàÛ%³ÿgq<Á`Ûy±Š‡¬àS³0²žÔ:øˆÂôk™é¨`a•†U H#âe…¹QÊvyÉ »9òý³ëK21©ä¾!'ÃdxÊßÁ©ä+z Ÿ¼Â­~¾±Qƒû껀˜ îuÈCãÕ²Ž óË>œÑã9~MÇÓÑtzŒ'“ñø|“ó \t>Þ¹ Ç©OÎ'Áäb: YdJ"£=‘ XSlål4 NFggÃÊʤ]dâDN§'ÁÅÙätx~ú;"uÇFãÑipr2ž\4;ÂÌln8«6YØQØÌn‰ä¶ ¡:<‡*xlñë ʰ‰ä×W÷³m_˜YÊ0%ÓhyhIg¦Æå×>\X ”yj¦ö9ñ‘˜ÚØsöÓüœø¤nýìÙ”$Þ@L#ý/rþŠÛD£æ)Áϙİ”b§Ÿ­.H™ír¶Ž<»ü³ þb¹Ù;‰jx«N¡å¥E¨•Ut„ôLJªÃkn{Õü`l:Z}ÓÀ¤ç‚ß#trþ‹`thŸøUôÓF—0—´q_ñí`,:Ü´[Œ¥ÔAâ{`<Øùû¶Cì8’µ å•ÔØ>ÑM§qX¹Î¦êz½&w‰ã¦™Z+·ÇîR=Qôù‚Õµ|­»3uä÷™;·OÛCÕY^ÄázKœQcfË%~¼s©Á6Ó(ÏÑq–$Ù ¥Q¤³ÞѾ´Ê£½ì ëáUÃáØ?÷@xäϧþá%H¯l½àûR‡àºááßÊ™„O'…À¶Rø“oS|tzFElëÝ‹¬‰ ±y§°€o\-úyÖáÒñw·mµÝf|»d{ŠïÉ‘Šñ*GÍXg––W:{Ø S«¹ñt¿¸&‚—á÷Bþ_#äý:zöfP}£K7P;¥ã~WXÌi¤¢c,¸ß®M ð2Þ6÷Ä  àön~¹Æðq`g„ݹK³»1T¢¹ûÚÏ#b^M¨Îõ²ºúïr²Úò„äö˧OoŽ_C¶r#•RÙ~¼¹ŸÙÉÒëcwáO]Ô ïhww¸¶‹‡ÒúÛð;ÆV‡È¤©×ƒÀ\jé®É‘õ5~fEq :Qg‚´_ŸÍßS"«­g¡‰¦»Llj˜ó¾vOESz†²!üðÆhv…N²ºÑ÷·-£ñ®aã:çôÛr¶ËûêÙÁº`#築;ÛRj£]ÏŽ¿íLÉA-ÛX ˆ žAQÂt–ì Ä[FÞÕ¸µ«ô­4úáà¦àn¬b7Knõš¸¹„ +Ø&äÄ4BÃ_;³¶‹ˆ ¥1å eg‚Bý v7TNèÿïk´é­GT>…r•»³††mqk4yÇIâ®Ò‚2Ç“¯ÚPK¦k¥³”Çàk¡ûôñËí?Þß}úòÓí¬Œ«Ÿ_¢KkìfPá<Á#$ñ_ÓLÛ ?ärz-…á)*æH–I.§irM ±óŠ Ñ¥{ENÿ ‘>WvàÓ£L›œþáA‚fˆž”;7b{ùǪç×gËÅÕSU1ÿ‚Ù‡põiv0C?ýÿºiíUTWΩ2Y!ÏÍ‘×Rj…‡Á8˜ÀÕJ«†ã>œž ‡ÀÀ±^z wG½ßÓEØ dfb23d07f6c6c0f7aa3a1f8e4f3f82817/proj/rd/eric/funtools-1.4.5/man/man3/funcolumnlookup.3funcolumnlookup`lookup a Funtools column3‡Z‰2xœ}VánÛ6~•[ Vªvêƒ;lpÐà%ít(0` %Ê"J“IEq_¬¯×;’Šew™ØïîãÝÇ»O¾›ýµ¸mÔ\Ëf¯–Zij¸ŒLNki!÷°þ|wÿ°ÎÖ? •˦àð[}†ÕïB¹s¼>:¥WÌÀ¥M½W[‰¼J!n^*¶çÁpéu·Üë—a­ËÒr *þ¶¢pU7‹õ|•=l²û;€MÅÈ!£'Ã]c”ÅðR›=sB+`[4b¹”DmÐZðg^$±ða@-…±ègvÍžãé‚ gAÅT!90ku.˜C”V¸ ÍèƒYƒ.#’z$Ës­Š (ò¥u¤ÜiÐÔ˜DVÂѯ|÷¸\¦Þô²ë*æ ÔRêÖvø_¹ÑW[f1?_!‘¨û§1cØá,ä)ÜÖ g¶Ò,`Û1Ê‹H’âϧ1¨5žÃ ÕÂâ…§²RâAÊ1¡ü¡ÿÁA ¬ƒ´ýÊp—‡²‹Âpk¹¥Pj'&nCá(r QBíNjñIô*™|dq sÌ/—í³)ÌÖó,ó%±+´Áðq ²b‡PðëÕV¸P´·eSˆ–ñ{o¢d½å±Õ³ ”v`63Üf›uüÿ|Az{}Šô©‡Ô³½Š´˜vn¥Ô,‚ÜLáýä|“r a“íÌ5öH M%É9šß/ÿÍ7Ù'úŒ©#ºfËx¢aùãè›}|¼…ø¹îùÆî0¬ÅeÓJ×Ò‹{جº°Iÿˆ“Þ‹ýÝ [-f7!j4Qœá¬ðUâˆJžŸ&÷÷*Û„:F×Þ»5ÂñWÝW‹‡ål¾@MFa™m9u¡áµd9^ÓöÅ4{eÁC¶ŽÇ¢Á:Óäñ:°U³ßb^&æc †|ˆ½ñշ즥M<žïã½|Nƒ+Úé$f¯ç˜•/šSt›üYXgƒâœ++qn^-a:¾ã&ަ6HP ºSM÷yH§X^¦ÞŒ_ªQùI¶-³¨—9uÕ0ñ¹“4Z⌰€ŽïdƒjÖXIÿ^žDÂ|ƒŽ¤ tP‚#Ò–å_¼8z=êé á-nóg¶¯%Ž ˆr?¿’ü+ñ¢®˜½Ha”†<ƒŽ÷¿QèÀŠ£ÍÀºcWã4"O@X‘‡ÔEò[HÉÃÿ¼ñˆˆ®MhíB¿ a½XÀl¹¾XsÝ[~ _3‰@/ÿ*.käfÇ ÃX:f<œ ßÁ¬6BÂx’Âõh<öóƒp!ÑðWcð6ùwÞ· b6b46c363dc1068ad1257cb7efc963cf7/proj/rd/eric/funtools-1.4.5/man/man3/funcolumnselect.3funcolumnselect’÷select Funtools columns3® âixœå\ér#Ç‘~•ZìÕÄ5–0’bH‰³‚BâLˆ£µ¼4c£€.½Óèn÷Avø¹öõœW] €yå뉣ëÈÊÌÊüòÀÜ\þx­Ô›®ø¦Ì»Mqkr³hÕ©jø ¡]×Ïú§vðä4¸ VºÎHsS¬@xƒ¼ ,·ɉ¨kí?d®‚¬YaYvµßmªÔÿ(¥ðJN‰8|g%'ëѼ¦<"Õ­¦½aHo›¶¬™!‡u@ ‹²=¼^V ê¢ÖŽX×–Ž}sÝd ?£¡+„ë® z*§¹œªËÛof32*zÑšºáWSÕ#VPöùéÈ%³CÏfS%OÎ_Ò#4:ôäç`VðŒд N…7mÄã¿w+}:‰Wú`¥àÙÑ•®§vØ2/µ,òíT½¼¿¤ë¸+ZýÈWol¶Ér8(t»†1|ÑR³Å7ôý›·?ý¨*àÏÆƒPPd,B+HW]£™H@% И¸_›ÊÀ—:ï@ö`k*€I -KrtlOT# ÎÏfµ1º í†û— ä}~¦šuY`—ÁµÆnõ în‘1¦'Ê´ Ðù›²5¼z …LYÈX—œfÂ]x0u˶ƒî³˜®4PEÝxÝDëŽöy¾CKù9óS¹ýw®¨¸S—r„4[Õè€ÎÚ¬@”¤±Y{ kç)\µ[ÜHçJ£§ËIK‹Ø®MAá4±öÖdˆhd)&q8øe\¹ À’mJ4ïùVï°èf_lN6"6»ƒúEņŽösÓ¡ýe'ÀŒ%ã´éò6«rº°Ÿ;û“¿[ñf¾šU §B憄>ßµ¨[oà“nÐç#ø$rþÌW¸÷ðæ“ß^|ž ³àæßXvìpˆË` M2`Fà\©YÀ%éY)1O @¼®k½#Z¬^ã"ð ‡ðë=/À½Ì æž(ác’…‚ëXÁ~”zÝ$­ä­+½@'5["äiZмx¬]e͸ \"RV‹‰GHüãcè|U‚î¬7䱬FÅÜ$éÄÃa*S€ôÊbχû‹AFç%¬(ÁˆjÈÐ"pF$ -I{À à€†IOhApJ{5#Þ«.à>qpœL§à5LJ«ž6[]UÀŽ‹¡,œJøÄ"ï…ô £Äïˆ~M¯ˆhÃÊ $ÐE» ~‰Tðõ¢ûÓÈõ¯L RÚ°5ÂC M°§ÿ$1@ ä1©ºÿG \0‚¡Ö&¯&}0¢¹Ñµ¸ÆÙÒ«(…líùË_‚­Özá¡V“+¾´ñÝä>Hïš¡8<4œºùÉã߆ ó™½ÎüZšÜÄߊ¤ï-IOƒ qJúT8P€7|n–!ço­¨5ì„"wãôC™ÁMm7„7|Ì2ú2ùžzNÖ:¤h'$`¸éñ(PÌÀƒßèÀ€ þ‘g>g?*60§-ŸUËÀll 6¯Q„ˆ»\,ºú7¢é"”ÃE(Àà‹ÙÉtEŠHnƒ‰bö®ÞØ2b­–;i|Ho)ù¤…ÁX—`aiá¾-4Fèe6ˆÊ ÐX—Ê¢`Ù^á< /Ù¢Ûèæ¾º“ù †#gQ‰(ŠQåºÅ}Ç÷ ½®NÓŒxO¡~ë7d0W&™¿Šc$ !,7[½âi:n$L‡¥8€ ä:௠o )FRw¯ïïŠû/ñÓ×www€î«r¹¼¿¿›Þµ9Èçn /úñn `躇ÿ Š€èAÚàõÀ²©ªÉ?[ÜŠ®/:|›¿[~:XL\·Áè­*’ÕB³DÕš|)‡ƒ?Ê¡GuRÅáNÃYp(€é§<tŽŒFiJˆ·b?h¥AupÑsŒøqv“àËå/ Iôjvs;ûOÞ±/¨ŸpÊzÙýªzÙšÚi¨¬A·„p Óp]€‡@tÐt`¿„nÏrTÓŒùÙ4xoØ9 V!¥„ ÝœsË;RŒ –š›(­asœ s˜ZèBXâR§”aN²ÛŸM]!Å8A؉pC´enVYQPŒ÷ž†N‚‚$<0=—KàJi‰¬«0Œ½ûìÞE€“³S‚‚öô},JêìãhÔ:æ=˜Ìx*ê ±²›c* ŒÙž­.ÚÑZE»1§L’#·ÅÃZÄ(:åèI¢H8’¡Q0`ÜÆ«±º»zéOù(µÃ“ÐÎÅé·M¬:žÅl€P@wÀ(¡8ÀLÿ7x$qHÔíÕó=ÁXìqæ’a{–ƒônÇQ—Ø÷9³aG^²ñ±ø]adJqL$kºXà\¯g€-üœ»3œ¦²{%5E½$Ø~6ò&­ðz*çã˸‹NLbC0èb•ÁëÉ œé g¢–Ù˜ÅãÞ‰y ·Ç£ÜZ*fŧª¢ÓN9·ÕÆ—×·ôæ/Jðç#yöÝV¯”ú«:¹Æ„s¢èå'³€/_œÐ…î*Úi>"Ýbæ`ä2¨'/öjCNÉKöÔ®6J(—Ÿ(5˜dxÁ73øƒo[xyóóͽ}óæöúýP(yñð šØž¯ÛI…£ÝO†s»ñ0Š'ùˆÕ¼Ãìî‹')ò3æ“3Úcvw59Ã9GgÌG¶îøÕ}k8µâ­_,x†\“lªÚmd¹¨`}+ãc´¥r©Šÿ/k—™pöõÓš¡â†·A4øìŠ.<÷‹† p&:??së&Š“a&WæÏ»6¸ð&o Ù‚ÄÂØ”/ ¦¸Ól¹„GEÛã Jz CÀ™ ZpyòÉ~пÚÅ“Ë}&÷úesO,Y}1uùDàŽ·8çüÌ/ôÌ: nGB¸8ÉË’S{«ÙübÄ.€Ã,Êå„àƒQé ákîLÙÍÕT ™Ëº\æÝ DGì^¡m›gyÖö‡P‹JL²óž‘e“QD IX¬“ÁÁÀï‚EU"k êØ°‚šÅ‰0:K2HÀ„9«˜ÿ4 ‚S5¨m^¸ŸïµÉY®‰a—ÐRnÈßÒÅ?¾²-¸E55.§]ˆˆåÞ XE1K›mŒœ†e;Ýrq* Þ´¯ŽûE0®}v ®#VlÐ åøfÆ8;¹ Æ~Oɪ’¥é_«ÐÀ“/ù¦¢,Äö/¸h!™%jfaú]ArJÇ ¼F!áé)˜³6êsÁíºLF €7r3TC3ï–ê+2êù]º¬÷?^þòÓÛßÛOÿ¶*ÛÑHþB{ ]Ä`¢WT1̾:{¥²/a0¼|ò‰NèB4,ƒ¿DÎ1@’óIö ?~]eH¿ûdüÙÈ~½ÖþûSþþ¯û×xDì#w2w.Ç;Üâ<îÀÙ¾ ‰R–è ­²Ns]÷ŠKîÄ „‚uà1ˆPóB:zv‚l\N„ÆÖ2ÐÁ6§r±öJü\uqѻϠÆapcYsš¿ÓfþÃmåöï°•çïˆé4½ý¼%õÖLö‹Ý¶m²,š#Ã5úé|Ñå!$–ôVÜq 'ëõ4±£d‹m–ÔndlÏ• Ã9r)ÁÉ-M²[×>ê‚}¾³I€ sŠÈ~ ‡ÅëÀ9ÃÒÕNl|¸ìÂt½ø@Ëž&ÂŽ 5³S‘O¡¤™Å ÃþNb›Ç*Ï6ÐÀ„âjŠr[pe„Ʀ*ëÉô¾Ÿ¨ýêoö½k°Æ¨º|ÈÒ@LÔíÌ!¾¸ÄƒS[¸J+ŠøuùûóH'(°%bXYxÌ)ˆ›¤¤&½™—P¾$ðÈq›Ö¬»Éé\«}ßoZÏjÛË£›k¾·ÆýD&ÙY‚iÌjüÉÓ@•žõ³X»>ˆˆ–Üô¶PpèVUC¹367Mˆ8Þ'd”û‹Ö&ØD `w"ÐÓF@l:ÐZxiÎeXaK ].`YU˜m$[)IпŽy£Û ÑÃÎ(%c)ç‡F6-]åzñä>2¤W¨Æ'‡·}úLV¸±Aäõ‡x‘ 1Q¹j1¸™¯9%\–©ÍþвÎV”¦“ ͦO¨aqG#PÂ-æ‡  £°s¨H§l-³ŸÒ’Ž3ÝhC, AO01–Œ° i-›î^GBÏ”HßÔžŸp ë–ÒÞgaÖø»&j ov‚úƒ”²ƒåÜ$>Aàþœx¤mÝ|¨©‹²XÙ›skòk ¯vhQž%7Î_G{‹³w|¶Ê÷ÁPà´¯ï*#ß…yÛˆ½ÞSËyD‡.Î~‹6×-q¬s=Ú láé‘Ðß\x/ipëÐû &R–èÇYv±;ÖGr=G„gäúj¬*¶ËudluU Û¥„ÂRû£8}n$?ùA¢ö#IćÆk^‘#ãÒ]è\lkÖܬõCÆ9K]­‹fÉuËž {¥¸'T] Ñ2&©ìªû?}Ë|£=uÛÉö»Ûà&T¦F£“sß(6÷IÑkÕ¼ìk;ÂNTÀ¬Ù¸´†Ö|©רdš5© þt“Ðu[º,¥×+NàÆX†àˆošM• *RM<¾“ƒEˆ2ZZ•oçCþ‰pqm&l¡+Mµl`ReeCQŽˆÓòŸÀ(‡bJj Q ×[vÀmùÂT®E€‚±)F’€Äð®­5ÈJ‰‘ãÞ+©:c)³µ8’@T­ ÈÅ-±Êhºú$;EØ¢ 6[ueìû™ª²¾QföEÀKÂ*¡kqT$¸ÆUÛ´‘&›ð”¼jˆôñÏuV_ñºåRêoC=Ÿ×æ!“þQêQä˜Ðû¿.|ìãƒÁ´L¹<µ¿åeƒ~v/ýk£ãÉéÈu—šE*?•¬oÙå)™gö«Â±äø°â 6/t)ÂfÇ=Ü ¡?0Ççt…jà´†°w?Û³øêWå|9£òíôü þpt/OËÍK»» óB.‘txl/)ôÜhI áÙyüù·ONÀazç¶›7æOHoÒïcÀ ‹½&Ag¨_Bí°¨´Œ»5þ¼°í—´á)»sŠ#/Ü!¾) M±M˜rOö•GÑž;® ÝZd¿‚•ƒ§¬Uþ0w.20ø´íùzùñúvin GX­{J.c¥{vh sV‡Œ±¶9];<º¯jq½“pg¿}{:ç14GBý Wôßr¶U¶Èwý¶(Q ×n5)Ýåæ™`ŠTV›©/J¿Øí aahc¾ËQU±§ Õž‚žôíÛ ¸káNÐÄD6îĹwÈãw¯vïbµ‹|ià¿01Üö(FdO²´+9µ}ý„2¾ëéí³cCÅ}ýý“tĪûÜàžò¾v–òðø¾ú~GÝ‹¨’€ŸðLjö‡~»a›uÖÆMy}¬³(oFRlóù5 bÃß¾Rf¯Uxú>œ»ÇAs¥°Ž¿‰R'¿®¸þ*È1r4’fYŠ'Á´×Òàz8óÅî=ÔÂ-¨‡Àbo߃ÐÛƒnùôhŸjøØK`ËøË ŒF»6-ÜÀµƒO–låo*ÿ_,ÝßÉùøóåñ P±ÿ1¡—]"‰mà7©|«M^·ÂÏek‚µµŸT¿l¬.v¡ºZÎ ¯”ƒ“u­}Há×ëùÕûéýbz7XT¸Oí(—6®ëG(ÜLóC0€©µrAçm­\:@® ,‘~ê Pe@tM‘;•Ú ­¢Îéè7i½6+ÄB-k|o»û6$é&mÀº‚1Œ¢Ý¦¥ kº‹ÇUíÁá¿­v”—6涬k 8`_Ö6˜À4"oÁW¶­‹'hé œª·‚’ã'ݨBDKH§|aZ×v3¼R%¤Á–Ï?":‰"ˆ8è N2®ªj£FÉ”[µ a©ÀÇrk‚Ò†/-‰F@ë 4j\`­ˆÖn;ªßÅFÕ-î#{Ö¯´1õqTWv8F¹]o/6´FZŒˆUÑS%_vʃ]£¡tatX¢C“#ÈŽ ºJçUÆb†Ö‘%Ž”?“¼¶8‘RH mØsT·;ÚO%o,ù^4ä £|ÄÜGW£4ãífï縇ÍÌA%ÖŽ+#¾ckì²{(m²îyQr¯·Á¢"YŒu ùˆ\3تU ="{ò)¤’QÖµ³9zöY2¨x×µ)«Ü{Rªù¤ö\DŠ'uèe[n9ÀUm=ö–¢ *’Û£„­m!ç )Ø’ë3ðü£xZœglƒŒ]¹­4·önüLVÊu¨·´¦¦ YÚ£‰™¨)¸<»Âä9F¸iЭxMq+’vUùwÛá݀ūŸƒp>G©Ÿe¨Dq‡ãÒ±y$6ÞR¹5Õ~oŠ8êxS ÛŒ‹ù¬Zä^N|PYÑï Ç00èAоԱ™tùÿú)*r¬Õ¾{Ì0\_öjƒôB0Ú7ìÅ.t¢±¢¥ÜŠÚrÇDtà§ ¹Â{WGÔè(á4·(™ ÆeE©ÑÔJfÚkÛe2&ӉαbËÇî”Ü<8Y²£ëËÕC;ð ¹Ø/”‹]­`I›MÍ“yðØË…ü àÍÉ@PåÕSìqÐÁÉ`œ ­\œžÃ9ý¾~~‘+ä†êN·rį©­C™„e[f0zå?¾*>2~l>ž}ÊøLz.Q˜ù“ôã1ªã—›a†qSÈø·£ 'N¤Ë¾I4}&\ ¶Ïé(ÝìÃímšB °t¨bÂF=D9ޱ D+z‰NË/QSZ~ZùD¹ù0û{Jÿ2øN˃ӞÑÐáy™þi©§X%dÅØ…{FžéÜóûë7 >‰1G.®gsúð!j§‘å[Ù@éfiÞ¬OßMg‹Ëw·×£”µâžªP:ÄÄ3°]ÿGô;ºßç1çæüjÕ¦Eºü €µÇ/G>:$'L&ô'{¿Âüú.oçwqLß|‰Iû&ñbe.É TX¯i°­¨·ilŠ@g“·“á’œUÃÙÛ ¾?=;cÚM>ö’Òÿ÷¡  a668d775f8ba9feab686710d3da6bc783/proj/rd/eric/funtools-1.4.5/man/man3/funimageget.3 funimageget0¥get an image or image section3’Oœ`xœÅXmoÛÈþ+S=­DNœ¸@^ìƒÐDN¾"ÖÔÊÚšâª\Ò²îÐßÕ¿×gf–/’“^pýP°irvv^žyfv§¯ÞŸ7åden춦#ºÁoS’ã7䫸l^;_ÒìÓôâÃl2#ú£+ó¢™[z¹hÊÚû"Œ–!ºónN‡• ž "YütÝ,2Ê—¦¢ÃuáBÒÛ³Ù›'.'S¢Ë¥”¤Tù¦v¥¥ÊÖMU6îÚ•¥GÓLU™-ùÕXÖ6w ‡­Åø`X£˜HsSZ¸ÂŽˆ&ºÄ•ë¦Ö¦‚º¢²f® ·k«›d"©;¹€•¶25v¹Þ’½¯+ƒ½Ê›= v#gÊ9±€ZÏÒÎs_Íe©ß[ )Z@¯¯¾jjîËÚ8‰ôó Sm©6×…d®2²w¶¬Åau¡ò› kca¿Î}ѬÛÁö[ù1| §tk·˜JIØ\³^W~]9ævaš¢¦N‹ TÚ܆sҌ̢¶m–._ªâÒûªÆA{#F4A´|½¤ÜÔñ90MíW¦v¹)Š-‡âÎVœ‘EåWt>¹œqHKÜYZø ¢¹EoØH±¶pU@ª›fÅ‘‚âZ¨xY¼¢Åž†ß.Ö¶LÒ¨Žxö¡Yì¨1´ö®dÏa‡Q³!³ÐÈH1â´Nz÷ŽÅ»Èg;õ¸ Yøœ#Ýiˆhf!¸_ê™Öhn‘«Œ¶¾ŽÙÚX×yÇ–µº%ÛªýÚæ¦ v¬¹ƒ[é jÑ5g¾­\U¹“\FJ‡°ÕŠS]`E \½t”%ndG­MeV¬˜”vêŠ5FØ«rAúÊWq‡£¹-ÜÊ1"bOïLÑØ^sàrª¨’½€›sƒ†_1¯ÉÖŒ (äµêµ»ïªA2Xbuh·S‡$ î«—êÀÇ¢>&³Ã˜†0"1Àj.¨/.ñ•»AÑ‘´Ì™³CO_\þx%1dˆÐÓÊžWÇFKð÷ÛßâDRÉJ½©X¡Õê 'Dÿ&¢ï©ÔnX“´ y9~Na‰µúßÓcñKžðÏ¢ð¦ý÷ù3šû†)Îá·½7«uaO¨o?/ˆ¶´­û·d­¾ï~±˜#¡?$\ã§;íI×°þNSJ í¡ª|•„zއŒrßsà¤.=¡?…¿— ¥)NaÔn­ Ÿ `ÖÊÆÕsÂéŽ MøMèE„.µìEçÒðrß—ì^“àç?Mž½¹üùõäòÃä#iñÄ ÙúráwÚr*FJ_cÊ@(7®F5„NHébc°ÔÚˆ—¬ÁÇnk¤…©|±›£]æúVQpô?^|èôy4¢;C/hè‡|Ýs:#úN-ÊèIªh < {^¼žÓ…ïùáz4&‰*M%I}ïs58Ùs6—®1‰Ü¾ˆÒãçQüvЀÚXùYŽíI—¡&G%hp¿ÚOÞNÞ#ßi‡oõíqß` ï׈ºêÍ’à-BlÿÜz¤ ”6 ƒdÀeðisf `gâNŸ¼ ÷’7;T̸G¸ÙpÃ+÷™^ž’²þ~#µ†î®®`VQ9õ”…ä «‚ZÒqÎ×¢ ÁçNF¨JâcŒF4EàḣNÄN\Ù¸‡ÑN¡¡'ºf„sHÏ•ÇïÎv7:ºwlhâà¤Ä OTxä5+ ÛÛHBBÂk\|$Á(!Œ]t¦”ÕÍÃ!žiÖÛå‘|Ú=ñó¦×–3×2ïpºÍøþÁ Nêû¸ÞøîD_/MÝuq>æåøm{!‡:èkB#çO&Y™ýžÿvTå‘\„Óä>Û¦íÔˆRÊËh[x?²wWg;›^βöF"ÁxrŸá×6ý|Ïò ä’mé¶»½h§îšPÝ鸺ç†}uR‹å¹?¹Âgœ¦?ã'»Ú>¸:éÀ7˜*í,"”‘e-õA°ß>ìÍà‘ñâ…Pß”¸3¸p¢ŒŽTwú8*$J„2y•ŽÒP~cÕ#ËLho¸‹èÄ-|›åúìÁeˆâòÝûÉ4ã?¯>êªË·¯'SZZî¹¹RY_ÆÛ4¶SlÌý.ž-@;jáq´¿¢bñ¢Ø™“¸©—› î °cÈõ·{7+Šxp Æ ©ßk;ôY¢Ð^gI{Ë Ÿ+aà [?P ã¶zkµ¯×•­Zs¯%÷pHþB•dƒ{‡Ø#G¬‡WoÀ \C ¹ ]¼lyç*_ÊìÎ@œcÊQÆ)gúæâÝŒ’x-À/þzö)e6äÞ¾¯é Ïà͇ÏÎE?|L9-ÿ5#:ÇYB«Þ…lw“–e¸Ôætðñ@ÂvðIÿ:©ev1æ¨-0lÍ¿¢bp7$ñÄi c›†åí*âŸGi]{Ú9b*v¤pšZ‡e·§ŠUÁî¼PAQgt ›6 æù+NzmZÁ-›B› YC»Š£1ãñJm§v°¸§5Ãáàè°­‡l*’QÆÏyç#/1ó­õ:ÀàÆ6Y_óFý–£ÙQ ïÞ|: sN7‚i§½lºÇÉΘ§R;:¸M× ¬‡”þDˆJ™À‡Î.h½—µä"›ô<çÖ`¥+OÌ¡EÁ‘ŸXž˜$ì)ÓÁ½¡ ÜD’Œ&RPÚº¶;ò-çºÜGlØ–‚ñCJb3©ŠKÖ(·îŒ€Ú·€æÅ¡Q_µ_Ðè;î-_ô€GÑ$ïšSnb$aßò‰ûh9GÆ#b¡"t©œPóÌìP® ­ª;öωþ&¢Á;¯7’ÚØñãâùʺÞ_ÄÆ‰Ïgx)k«†×gO¨°Ý¢_*p µ¹Uxýhw©s´ï+œ«º†“RN½e3¤m¬u^q~³á™~ž¶ ¢óßfyf t ·u¼Õ¶óõ~\™ݯµ“AÎ'´,ÉØ0ƒ; ½×·}ûóe:b¹ÿÚ~Ÿö±®—¶ñºi¥ÓœÝ8ÕÈö v*ð !él£7U ÚÚ;ªõGpÏ“ôé4ÊÛåÓ„M%OXèË1-ÀõQyEeAä’ÔÁ晜ʱ©×°-³tn2ÁÎó)ÙVB©Å;6“ô¶ÊI¢>·í`d>ªÆÓôèÊŒ¾Ëà‡v›·Ÿ_fô`÷`Fן޿ŸLhBß9ë2P^‡ÕÜvu!NDxžÓþ7ƒó½5 JeúòÑ Ò/aaA?|8ù“h>ŸËÑ:%@Þ诣Ø<´OÖl'[×»)¹s ÆIç4Öq÷`)m=EIE©6Š~—4Lð8á"½vêD_©™÷ü{}ˆBªTaÏAüh³ÃË•4tÁ¥êê08‘È‚ºC¶ú<ð=ÌAahsÑO粫%Â½í¢ Ñ,2ªaF¤q‹?L–m{«A:é6›³÷rR‡b¨zÝ‹=(Sª÷Ÿ&dýè2B+æžçëZ™;¨’Š”Ûbœ€âQ@*ï1r 1„ õIìa5*¯ä”E$±YNûC»Sm›ŒDk½9“» "ïÏ"-†%,ê´5‹|CŸ¥D°b·ìΜ. w§TOkð9\~®U{þBw¼ßYW pã•.Ñ—(>û š÷3j(H©ö•t˜Êq”ËŒ@éP Kè÷¶î|…‰6\D–Ò]å Ú­ô¢xzgw  ÃLñ±ÏÇZønˆ¸ÁOêõIŒY\6±fßßö–ç7ÃL:ªòêêŠ^½_ݤr·åÌLú‰ó€v9\¬¸nw‚h¼›-æOæOé]M H×Å£ÅBLÅØ –ÙãÉ?#ë  42a20fe48d394fa0d9b5a5ff19fd00216/proj/rd/eric/funtools-1.4.5/man/man3/funimagerowget.3funimagerowgetSget row(s) of an image3‰8ŠQxœ•VaoÛ6ý+·$×Që4-†&´É` qŠ8VlCAK”ÍL"’Šã û]û{{GJrìaV %ïÞ½ÇËüâæ’èªÕ³Z¬äÙü$=Ó ÿ[³I\J¦$¡IñgZ|ß~^ÌD/”Ϋ¶t^¶ÚS¹lý#Ñ£QöÓ%x$D»¯Ë¶“Ò8Àyaý°6͘(_ K£¦RΧôérññnöù~v;'º_ËœI Œ­WZ’•¾µÚ‘ÁÚXª•dTᨴ¦&®‘¹*•,ÈÉÜ+£Cyœ7Ô@…ð‚JUÉŒfeØ¡tÓúø^ )Âý¶é’C„°VlI9¦¥É—[’OÞ ¡W?ƒ%tÁ5ÑRiÝ…Ö$òÜØ"<šƒÍˆ£iÍè?æF{Np’FiØ!ì–¼XV+6$%(ç2c ö2 l-ü:7U[ƒÔgÇoÄᛛÒïr»TJZÇpEÓXÓX¨¥h+OCáHKYÈ"“(½´´Y«|Kœô-aZv…FdH]AuP*èïWmÍ•€{Õ»¸F†ªE„o·ÔIÚeÀY†i˽4‚9¨‘TÄ”ñ«‚0æ_®¯9|`fg 66v'¸1Ê/JÓ7êiPft‰ÆöRëåú¼sìÞËŒDWìÒwm‹*íÄæ–5Í뇫V½hÎh5Íà ÂÄ««ÙýbÏ¥ngí®šH£n£ þèÁ}&h ‰œÔXnH€ã†<îÑßDôµÚ©g wtx9yOn½ñéíI(*¬ñPVFôïO©0-ßAt…¢å“¨›J"w÷vT@Çgañ¬À*Ë22°l Ï…Gz= “©¿( í9¬^Ç)¦Kà ã†%½¸üxÿíÓì¢ÿá“ý·'ñ-~½IÏBúÁ³LPÅ£Å43ò ’¦T‡¨„óØ¿¦Lbi—¥7cp)¼žKçH H0êÓ$ƒ+AÒ$ ù¡‡DM'g¤è|Êå`ùêUú'‘*úî`þ…*fhø9êºRJ lY‹œÎXà;›ÊŒÑô² —îW}Óh({¨ã~”A&Œäƒ|8Ÿ2XDˆÜ¢¾XFõËÃñä·Ø¸¿ÂOXÞj6#÷¯ÛźÛ‚ïÕ›Qr¿Æs/ßCv×y¡ŠÝ%­Çåâº{$”"<ÎÌÒ&04¢w'ÒÜx> í‰ÓR+xÀÁÒåV-‘T, :ÍVî/)nj?ÑûñÇîQ9ÆÚ–aþe“Ñâò’.®·D )©ÿ++Ñi8J„ 8\ÜÃÔ“UƒBW0 w 2ÉN³wtQSÑätL'o& ÿ/p6ÁQÉÛô!µh’ 790043ce5ac48ea7c151662276a0e2076/proj/rd/eric/funtools-1.4.5/man/man3/funimagerowput.3funimagerowput÷put row(s) of an image3ˆ‡DxœUoÛ6ý*· $×vj7 †¦¤ñf M‚:Ý0lCA›”EL"U’²ã ý\ýz{GJ±ì†Í_:¾÷îÝéæâýѬ5óZ¬Õ»½k¨Á¯³ÛÌçd †4oÓâ·›Û»Å|Aô­6«ª•ŠÞ­ ÖV~\þH´±ZÒài¸ S©a·»l‹!iƒ |.<Žm3¤8–ºž ûÑ4–:4úaH«R84•ö!§wW‹Ëó»ûùí Ñ}©žñÈrphƒ6жNåÉbhÕÖ©ŽHz –žöZéB+I³ùý¢;PèJSôB% ·nkHÚǧf*…‘"ªÐ:ƒ ËïÝ6ÊdyÁ«•5Øi‹'a5$•ë‘IŸ,”ƒ.Û8â^(µ“H‰¤Â¶.”‘|G`—Ȱ¶Ú¬ãIe${²Q @úETHH\݈ª…@NæìlM>Ù%`¬ÆÃJG Gñ´ìHqºø>{&”"bUá±C`8¦Œ×Öø!X)—ÐÊ:§|y"D#´ŸÐcÜÿÚžŽãýÉ{A£pa×(¶.ߘÉ¡Vpr)6IÈ„uát ˜‘Ò&)Þ}%¢¨Ø5ç3Z/.NNÉ—Ö…4{=ã&EeE?==!iÛ%RG3O=ˆº©bw« UÏb¦ÁÏóñxLΉöóqJÇZ«À Pï@G§6…ýI…,š}¼ù´¸º¼ÿônþÕô]*ªÃÕiZÅß«ü,†d%‚ŠuRqÝxÚZößÀPéœêx*ãx¯ÿV¶È™¼‹‚pZm’â³+å=)±*!S×W(ÛÛ3Ð$ñ ë2}>9#MoÏcÖ1|ù2ÿ]¡È蛃â~dɘàÏø=JF8‡èG9嵜CL$Øçìzæ ½ôÂÿaŽR#j•w è±Gâ1Ïqp“áŒ=rz2¤›××ÿb<a{_ŽTeìjjÞÃç’«` o›èe#‚†â5Tæ´AÊÂr¶ºªH´ÁbA¯»?æ·¢iº z=âþ\±íuÏꂌbúÂí"”þR¡x4|Ì$Ån”9-%ŒºÕ° CA‡Ãr8ÿ=¸HDåÕŸô—ÚÁH²‡û75‰š(Ž=·è+®¿ç²²^áæÌWH›íŽ,ns4?¾í;y’4¾CWWtq½¸%Z(Eýk339KŽw@Ô-kÿBQU¼k4åR§Éødü=]4NW4ͦ¯&ŠÄ‹áCYö:ÿ.¡* 5e06fa0caa9ab977bec42fb409ece14d2/proj/rd/eric/funtools-1.4.5/man/man3/funinfoget.3 funinfogetAG$get information from Funtools struct3—¨,xœ­YmoÛFþ+‹PH®ªØn8´ÉŠ-§Bɰœ¦éá¬È•´ŠËÛ%-«‡ûï÷Ìì’\RJššŠLÍû˳³ÃùäÍTˆ›*ŸåkóJ•â[±Á§Æ_v'Kmr±¶fG¥1™®´URŠåûùân9[ ñ'Y•*ñ|hÆÛ¿ H(#±|ø}ÄÏËC¡F"ÙJ+ÎdšÚ‘ÇCq=]^ÝÏîf‹¹[ó…5U©s%¬*+›»Ž‰I•e*õ––ž1¶¶²jì%®µu¥vSí Ñ®&[™§™ò"ö[l; ˆÐˆk·Z=ª”â±—hÕ¿+maB,zm²ÌìñpuRÕü%õªÛrp³C¬–~%2Ë¥ðÅùÑAh•o Žœø2ÀIj1Šíg O¾öä£^¥àoüFUÒûå²ù…¾§3c ؃¸o úIe>…%Ð%«PÜh¨.)÷ü”ÍDŒúÅùB?'g$|óÍð?B¸½.“íÀ›IØ÷¿!z= ÒòýOñü…XyÉÃæ±˜â¿BÌ+¢N!<Ò#¤¨ÂÔ·kWüÚbÍDÞg¿j¼Ã>ñ•7ûEþé-¤s\Ì]H+wŒ/C8V!8{dG{sÆ„A÷ìd×HMÝ5–ëÄØ”ˆ"¨%†ªH=PúJa7`ÂRÌÝ­2™¬% uÔÐ;˜G- $$Q0eæ G¥ƒdeÕW¦0>‹åÁ•jwÜŸ:›gPàD{µ·ze¥=4@ÉÐo4ìG*—“Ũ>1]„álx0xCÅ–È ƒ†Ö[Xó/4Ås£reeV»¼6І… ë¡`Q¨<št®K-3ý;Ù¾7lwãœó×0Ź€Ó—!ò¦N"Ðg†&È þ0ó'Ë -'ãj 'ÑÕS'Šò$Ψ¥÷I”…çßcbÒ¤ÒÕÄœ¹˜b{pp%‹%Õ‡DKÁ<²ZKYdï²û0aAYæä&÷+P\é’óMj+>uÝ#7Fе‘r2?8¤Íá ©Jˆ ?ã1‰ g²‡îÖ¿º4Ñ˨ŠW÷@†!ì% T9Yü¨léÏÁ#“<¸Us4pv ¿Öš†òßû4S“‡ ªÎS¶¼7UD·«0+à˜­¬já®0NûÒZ)CNhÙTr¦?*ÂöKJ©ô½Ý±>?•õŠ‚t‘ã‰ð?°t'£ôù˜Œ q"‡] 9ÈWÎ&³éÖ$*|=UhŒ5!†è«i—݆i“ÔÔ Ð´Û§ÒCQof‡ÙuÔÂë3ŸÓV\ðóCî[6F¢=4„ªnÏ ª5ÔæíAÆÑ š|ZÑíßb´h‘Óσíio¿Þ 6N›Ìð1z¢‘à@O( |3nx (@û#u¹ù6ÌÂyo]¥þNME…ÛÇÁLÌO<*ºåŸ×cDÄxÆÆœ‘5õ~¼×*!ŽTm¬óÀû*2·ÇÿP[ÎËí(CÖÜÇC ö‡8yIç$GF° âÀŸì‰à87Ö.ÉþÌ(…ÀWûÌ.ö¸$˜sÅ÷Óq¥ž;ó†ÚsBI®ètƒ— ¦)g-zI i/zУ(ÅdƒZ‰¢=¢Âî¢Î_ŒühoôX(îc¼$@jQ‹1-th ž²š:;P¾9 ¬˜7&·Û˲* õ-bZÌ n18ž7³ÐiCcK]a0àƒ»‹A¥ñƒ]<è4N^žÔWU¾Íæ…­®PWªæþÚ¹zGCGj{ŽcSø ñ3 ‰oëí×èá—üó#ÂÍœ—9B„Õ WÇŽÕÖ“Ä«ÙBøüîSÚÔ‡|Môótr=½'¢›ÙÃòg…ÅK+ü‰³;taÍòðþÎko.ªï?iwð…¢e™üzÌ"Ÿ>Ë2›_~FËåi-Ç,­–S,~k³4—ôÖ¸ˆøòˆ/âéüz6™ÇÄç/2]–:õâÅJo0¤¤Z¶Û†›ÙíƒÏzTA®¢¹˜Ök:+ÃMˆgøð¦tJ„ÇŒúFTÏ¡bbÖócVGeŠ37„G˜¸Â5!7á‚ÛlŽXˆ=>Å=×Ĩ©Ä&FÍš£™±£øßNç݆]³! >”1ËÝäºËRÈ4åE‰¡˜«z*C^®ÅËÛÉüuÄEˆ¿~T‡=§Íš†‘ŸÚ¶,-“¿“#žµY]Mn§×¢/žO”g«ß•5'¤3ñ„£ûÎBíò€)›Þ{܈)YjKHå~´À«%Ìïï–OÚ¡5{×4ù ç26œÄ8ûmq:`:ñaê²ÄÜÇ¢—³ùÕâvÙ+äB%z­ùVžó=&1YµËÛ¼.~™ÞßÜ.ÞµŠPˆvM;Z£%46§•%Ö â§Úoi­<œô{ùzv×-_L<é‚ÜöÌQ“µÍ¶ì„HZ„üz—,™H Çfarr“ÈXólõ—°¼?¡æòxŽÕüËËÛÅÕë6¿d•™ä£Xˤ4¶GÏM^Ó ‡ëfáHà¦{Ò†Îú6 Ùîï_/þŸUퟹ©m%wœè¢TŸá~òîåÛ›6Ç`+÷Ü Ñ>5°õz‡ª¯i šËªðãêâó!N÷1:K|º›¦ `Óð…†¼D»2YÔ6=Î`Dÿº­BÂóEûöÆÛ‚g«òå¢èrÝŠ#!÷0;~YöïD˜“á4«æŠ.³ùÁïtçÕ­ÚÑ[ô³jXéÆ7bڡҽܞOõ¨ëê‘T=æ8v:[EÜès¯5ûJ‰©!:I½o¢€®ÞtÓºsÕÛÂòݺJxDeée ÇíÌ]á6s=-ŽÕH±’e²­tû—P­êµ±'tê·Z‹²›fÊo<ˆ$®$€$lþà /Ÿš‚ ׌þfÞ„EHyñepa+“ú `j”_»àÿØXšIz-È%9qâÀí4 E¼g¡ˆcÈé:&p÷ÑYO)Q’°q¼È.£à; ^¸k5Ú½ ]ò¾…Mé{ÂN†NÈZ–²Ï[ WJËïM¸÷ž™k«Ùs º¾³WÎÑ[¾Ã(\šRåw%¦ÑI(Ã;JL{ôꑉ œtN)ñ+BçL¢y­Î‰l#ZÔX\áæk½2¿$BÓ+ŸKšº­y_Dùsü†ÕæÔ¸cñNñít‹?•[•â`*±·ºäjܶ=(ë*á×ÀÚÑ}|9ŠÉírá7ÿµ¦A> íP_›Êðøx1þ~üW1),yñýH\ž_àx…,òg£ÊÁwÃÿ·— c857ea8c2616ea648fa720e637f6d84e2/proj/rd/eric/funtools-1.4.5/man/man3/funinfoput.3 funinfoput½&put information into a Funtools struct3‹8‘xœVÛnã6ý•A ñÂU’vû²7ÀØÚhŠl²ˆ³(ö© %Ú"J‰*IÙq¬¿×3CI–¤-úbÈä\Ïœ™áíìÓœhÑÖ×õÚ}n#}G ~ þùJEãj|GGŠe¢s6Pˆ¾Í#-¿ÞÞ}^^/‰¾1unÛBÓ»u'“•ˆõF†ÏñI¸ŸÊyÜ7zJy©<½REá§”eÙ„~š/?Þ_~¸¾»%z(õXBÞµÑÔš ÿ!ÂÖë,YY")¿i+ ç&PL¶©Tua!à]E»Òäå±]:Ziò:z£·º€ÁÙ:j¸Lv½þ£5^¹«t@@[åZÁ¾Õõ&–d ÄÝšEâ¯^%d4WðÎ7P¯$ƒHvz—^7^›z# 0ˆ,3ñ†è¼†b!BŒ®b‹ÿÖz÷¼¼©å>A— l‡ð9nCûÊÔ*"×Õù]vøö…L­¯ºT·Õ Qsº ”ÊÙ] F{v.HJiZk\ÔV+OªPè{³bŒWn«ig€f|Íl,]»)© :%}øÔÎ9‹TݶFÁ*j¤ Ç‚Uã|T¨g0±í™ÖÓ$RcÕ>p/WEY”ÏÇ7´óFjDUk£iŽ~Œ5e„©×8FDŒÍÚXfêÂyØÇÁôYE…È]ý\YËN€À]£k¤ÄH3‰¥.¿Æ»œcæ¿–º&yV¼ˆ×0夨 Ó·ë’\ÃXªH{×x”kǘÀtg—Ūžoµd¯ÓÙy ‚@íR«¤N ~´“ä79JÓ€¥q*ApüÚœ›mþª6#3ÄÆ s†ù¯cÏ¥4>¼^ƒuÞãÝ÷Î(:ÖPº+î+»—ÈPž“€Þ]¼JQ«®îéÕ¦%fãû>ä¸j×S:ógSºýrs3™ÐDlTêw=´ñ¨Ì܃§A3N£fG£ôÌãÅ—Ûß®ñ3¥o\NÞÝcÔD¡qí¨éõýCø»+%©~î÷¾ÁF1ãX&Ê®ÑÀzCuºA"æÊsHsër, f‚\d/ªØwlgþáJ̶aÚÁõéúâ.:c/KÂîî”[§œD?2º>Õ ´Ô¼ÌÏ ÙyøçÑiYþ)~ÌÝ\ÕÇTüèl[ÕKma¾ç#§æ“Ë µLqu-̦Ž]©N”†ì»ý|?_¼?Ë.¬Yy—•±²ßp8Hïv°uöŠüÿÞíDÁÓ º‚ÉÖTl¨¨L7éŸôtZ§Ç¤ f`V¥e5 ×>ü…mC™Ò—†×q(ïÚ Ï뱚»b “>WZkâž¹‘T»õ¦·€tPÈ]Ñ?rÐÒ3EíÆ!Ó²‚*úö/¢Ô¸§¬ä äx¯=m§ÙÍòŽh©õ°˜Ïëô>TÃ[{ J©mƒþØ€Û[ ovt•½Î~¤Y㥫×SúþòêŠØ?Ëáýü‡Éß É 93e963ebb8819471fe0cd4ab14c6f4ce./proj/rd/eric/funtools-1.4.5/man/man3/funlib.3funlib__*FunLib: the Funtools Programming Interface3¡&¼xœÅZnÉ‘~•†¤M,ewxãŠ,%<Ø–a*g/Á¢9Ó${5œž›ÒÜCžë^/_Uu÷ôÐ’í v‘ kgº«ªë÷«j¾¹|}­ÔM_½²ËçªÛzîœ+[õ¶qëFo·¶Z«yÕ™f¥s£?¼¹}»˜/”ºT…ióÆÖu•r«ñîÒ.Ý2õòzqõnþön~ûFÆ}Î[:÷5 ÕSyctg”Öêº.m®‰ÎL\¯*c ¢h«¼ì ÔW~u¶¨+[YZÞª•- ÖѶFå®0Ï•ú]Ø÷§aÓŸ•ú”A©R¹.Ë{Û/×w¶2¤*ˆQ.´!ÎsÓ¶ÃâBw:Ã1 ÐÖµ²ÛÚ5®:5ÐhH†ÿWl‰ÛÚTϕßéYè°d^­Ü_M÷\­ èáJ/A ²€º^åÕéeºƒ^ó–Æt5;ãW’tãUïÜþÑ…Ë„Þ׿í±Üë¾ûÍG–Q¼re¿­¦49–·ü7lD/[²™öçZá„^Ñaë}øDx‡ò·[×§‚ñj²áÑÚ«Òµ0QN}j•È‘jñ^µíaã¥AT÷pI½Ö¶ÂòGÄDô."d¦téàñ{ÛmxÕVã!†¹ÍÊ•¥ÛSXÈkK.S¶NmízÃÌó¿½mÀÎy·nmg¶Þ©N±6¿‡«œ–U[²îü‹¶¯Éò¢Ä_ô¹8TzksU:]_uƒ—æ£ÞÖ¥™­®„$­ç¤ú–Ö­ó|†G~‰ØÕ=ýA^Ž%êÔá#ÿ—áePʱ ,Ði¹UêöQŽáå¯Ì8ð|e«þã¯|ÆáPHo¹«VvÝ7Fmt«–½-Æêµ¾7ì[Ážu©;f;c®ÑÜ'æc×è“Ä/&ºµHcìñà2SûÍ7p—½> ‚Ú¸wJYGµµÉíÊ‚‚«ÛèN\ºU×îÞ]þøjþ—…Ú2EC6ö‚¾*LãDxo‘"‘e R@cê”D—e>A—ROG¤–·ÇÏø?O6]W??;Ûï÷Ùúg[g®YŸÑг)'æ—®_«×d™V½¿Z|²¯+òSÚ»Ñ NYd¦èÏZ·êöÐÍÙ>oY˜³)¤›w¤¼Êu¨4”vˆ % HÕšÄn”¸Ù/Ø12T5)2¤Š6!D!'ÎuL‹lDùå'Ø(ÑR(Z šwŽòÅÃåô®ÇW«Ë¨e*2“i,\t6¸4WÐPyæw tFeE7Fª¢¬«½WH­•ø ¬}öD6‘l¶"•ÄÍ|4ToÎ"OΔ²` Ã,ò 8œ4'3õæï¯^M¿“óyyLoß ’Wë›RQ‘°]"¯&ŽîaŽ{p$aˆã%l±¼xcN¥´ÚpRˆO¯5´iK`¨iÚ*8H¬™¶%¡Rî¨mµnƒ]ƒj‚}6‹õ\4Š„nÖý–ëOBRùxlÆP»ÚÛWTøw&“=”UÁD¹ è% P2Ë,ÄR[³/Z!ó£²ô«d1 çš¼c­/½+r ow"" bó j#àQ,€âÅà°ÄÒvµýøâô'dŒ¹ É ¨º iŠ6CéžN„¿…„gÕÖ-ÇÒRùM-%Õt è@¦*'=¡’†(Äxðé¶ë›JÎÚjÀ.EÆ“Ä9æÓÙ žtKê>æ2†¸€ŒfŽÔ'†Ü»¾,ö*Ó°Çm‘Nˆ¬È: B1lA^Џ—UXœ¯etê…© [}€+)- y ¼r °Os6v)Eä„VÑÏÛç"&ê]\Þ‰‡ @·[rJSÊ!¹ðŽ™Â|ô@ÈË|®4BŠ‹ò #çF×¶(‘†¤êBÌå!,¿àå3eºœkI猓ÂÉLÉ ²R/ûž]ázÂ{¥s5@Ìöù/ôÛÄ ¼êæïo~\\_Ýýørþú|¦~Og¿½·øë@j›Øçß+û§ôOŸNÿO>üD~âô ¨nǬÿ3™ØÓóéZ3}:ù ÏÿÚúOþ¿kþCgzFgšÐb’íbOv|;È{C^GƦ à¤¬o|<¶})É–Ž\Þ¶÷¾„&}Édú|Ô§Ð!.8]Ì”ˆ.¢â¸Cùyã˜NRõ8ßwˆ>Ê@ GõÒ¹ûÓ{cjNóº½oƒźGÞïk–x¾Tke·DÙ„CΈbÀ×Â3åÀ ÿ(Óû2D%¸(†×IYâÆE–M}I@žf¤BøMzÕqõF”Œòˆ¯1Œå–fhÃ:AÒ^ {|7ËÉsÜ·á ÷(:É+I„Tg¾ªw&Ž’j #RE¯Ú®éAÙìä.ä#·CfúžÒkÇ8Ñ“ëÝL]ïÞ™üûOºKqèÖþlÜjÂk¦! Ô ‘>àÿ¼ôO' aööÛ››ÅõÝ„ÈÓÒiØs–þWxà-í¹ MÁ箼¦öj0C…ÚºÂ$*@aÄðCÃR*Ù–ÀLf²YÔy°àç´N$w¦éYzµë¨50bþVI]ŽrqQmMd¼ÓeoZÁ$"LæšÈ@Õ­V-:._“† (æ®)¼‘ÑeÇšyL#¤gQyÑH!‚¨½TA+ûZò#ÞÍ}·£Ò,¸ P5Ì¿ÆYbkš5<l°ŠïbbY‹Ä蘆*Éh.‘ùŽ‘ðV'yB6qãHÅ;!iŽç 1A&³’Ét”O¯. éôz§ 'P³XH3(ÞrzªJÓ%š6@%Æ‚@¥™¨‰‘B„x˜ ”Ô£×—ÞݾÿúýÚuÓ©¢Â¾1Á¤ÌŸ¨'õ‹c¡åÎÀÚâOž;ѳƒ$ÎS+'âð$x&ˆ‹â€ñ‹Oÿ,ß!;(N'áÍÓì[ß½ˆJŽ>SAØÈšR‘ÓHàìüYÆEóŸLE â¸Á„,KÝ¡ªÀì|ÖèHÔ"ˆ#0á#ƒI½›@ ñ©Ø zAqµ[«Æ°Ù%ú¥M›°JÔ”?²µ¼hwñX, E]ð²"¶boHËî/݆a„‡Ú‚Ͱ K,ÇÌqW#þN´Ùo_Œãjüž"ìïý–á `´«Ì®¡Qãy£€y™9ò¬‰§õFV}=N‹/èß’’I)´q©[›3úOxÇ–š`çó†&DÔ®G„@î0RL.ÙâèZÒ:˜ù¹8„Ü ,%í£¥¤7HÕ”{'F#O­VÔ{ƒH3Peø†“Q§ÞcP7ÙOWeßnx  ÿÊmk[¿²Õ=.¿|€Œêg>s kðâRñ n"éÏß(ò¨ض¿Î”X ÈÕ;™Û[íÊ:R"õÇ;Ø‚Üãyñô«g—hyi¡oa“è„:À„¤Á%)~äEäà%1)þ‘ž,B­õÆ'cøi(M_R†DF ?Ù[ Ȥ8æ“–ÔÔz‡Oçb±\ yߦƒ\QEëg狾: 3æo³ò’‡žgïLñ7'P|›}‡ÿþÖ¼4¹º,ë>»]Üœ«ÿþ&|xf‰óÍÝÙÕa Žê<{æyýu~67ÿðÝ7ê»ì[K-6/íº¡¨%˜QA¢pù¤nÊAäSÌ=T¥›+á[¸ñüì6tÂq´˜ñå–Lh¬‰"SÝs} ‰R\›<Î18jà 4˜c•w< ‰Ô¯Õ+r0ÊX²&à:ÔBÄp„zæ#¬eÁáôѹ,§Ì0X·…Ñ´AŒŽtB©\\igl5yÌ: ²i2õáà§EK™X‹Xµe„qJdu©µEîÄ’hëÄ-÷2ÂÕšôyo|m…„o)7ÑÄLÆ%8!J•oøâ†qÁ,j˜ŠÀFïXBG,Hã™;"™Vù-GWQÉttHÛÒÓÍ’H3*ÒÉ}·é¸qßlàs_ù;²0Êv_&nƒsV.^ÒŠ¯ÉeâC°IUè¦ð¤ðõ7”H*·ã*j£wQ›xËÊ$Óoi'¾RÀ¢œûÇ8ƒðJQñãi°[¾=HÇcãHV•ÉéÅy"#Û±¾^'Ž*NÊ%–èƒw|vÅŽ9PžÌÑÃaÒ$Õ_X¢_À…øÒά«Ã`T?<£Pµy¸‘»»¡ð@ÔœmµÅQ¾dfô ìYQ$Õ'QÆ>~¢*¨;!cˆðÎÜÕV”¤«Ñ<~g5Ý<ô]†@¡ ÏgŸ\ÈÜݬ\cb"7¾™šÄ"â?Áÿ_Àû –§tèò¼gÜFò_Êí™îâå” {ÔïÈ—Ú _t|XB~$0¹#;s"_;WH Iœ[Lß2ÝÜ9[$9ƒLT 1N§Ä€¸ì€aÃz'æÑŽONФ/“#fSQÀ\òNì&ÔZâ'86¥†ña¸(3¿ÌïÞÎ?$ms:½ž…âxtgAÓ²½„[í´yòãÒ†‹}"ëùÄч Ÿì·vÈ®?à‘±2Foä*jÊ– tÜ*ð”!'„òzƒ‡?ìâ+5<âàï‰\Éf y%éBõ•àŽÐÌ¢Ùï[A—Van¾2õ7·aÉ$äëÊþìùøÒÊ €ÝŽë=ßgät§½gæ!+ÐÄ_Ñuˆ#´¹Ñå*D¤9¥›h$¨wÀº šÔË*]^‹lŒ‰%\è´¤/$¿|—)ùÍÙŸ±+ ;S(Òšîo Gâáô”6 žä@%úu˜¤  ky:€¶ î+3“‘ÀÝë^‡¦ëèw"$,„ ÿ-DÉIsÅì¬/e$ 2|Ó´lWXãà#ó“n©Í¼_¹¾ŠÃ=ª'¦¥Îm¯¤?ùeXaÁÐ.{¢ÆgK 0‡ÞZ©òCÅÒ>¾iîG—qC^mcÅ -¢šØˆß•6_‰ÌŽªB–?·Ÿað5”ûµ9õ`XK˜ÃYx„îЃ{hîgh?$ó?´‰Åá­ßW!ñð6]ÙÕ2Q#Ω”gW<£ µv»,uuO‹ùgD‚Áü˜“»lúÓ}ÃÆA™¼Q·ùÅÊv|$?ú¥œ/SCt+‹«ùÜÿð‰n(¤Ó#ýD#õÃw1¾ÖUO¿3x¤ýÅîIe*%×ñòLã]î%)±¢ôpy{’úÆóAùÄ-ÙË×¹S¹H±ëC;hÜÿø§ y’Û¯cвñè÷qÒ€ŠÏ®þ2¹Ï‰ù¹_&½×Çhœ™ÑGºmšÑ\4n½DºÝÁ+‡Í²¥ý,ÃWÎÝ÷õ{hÔðÎ;½"ÐÅ%øQ. ü?¼ðOö¶è6©«¤“ä#¥RÜʶ­þØÐjtj¡‹÷Ã!ÒYê£Ä*³“[<¦}†€hy¬‰áÐþ@…Y!ˆ½04ïþ„†ýwhø[²„LñY2~ý”dqB¨ý,!yõ…SA½_Ö ç¶ð•ZyÚdèg"Ç¿¬¦_Hð«æiÒK€ƒüë©¿Rà€¦GQ.!%¬9öñº“É7JgqþìMÕâúZ]¾ZÜ*µ0Ãìt‚/2eáߤccÊÇå …‰‡&çÙ7Ù·ê²nl©Î¿™©‹gççr' zè„&˜þ 2P 48e8534542b197c8b3b70c778d9d86cc//proj/rd/eric/funtools-1.4.5/man/man3/funopen.3funopen*™open a Funtools data file3ŽešYxœåXmo7þ+S¤TVj_û%} Ÿ3³ƒ:iQôúÚåjy¡–{$׊Zô¿÷™á¾J²¯-ú­A“J»äpžgfžêîòß×D7Mu_ëŠÎÈñÿ?ˆÎÙ@¹ŠŠ c5=üpwÿæáöècSe¶É5}U´ËVå7b¤34ÏJåéE¥¶zIéóÖåøÌk¼._Ò?¯®¾½}óööþŽèm©û­ ò®‰¦ÒâK8íLá<ì¨ÜTÂGUc)Yò· o¢æ•ÞÑÍíÛ‡aÓÎØÞ¬äHö”ß4[]E µÎLa°1vï\!ŸO8¸·¢\C™ª¨ šn¿½¼9 q÷k¯²÷:Rå¢:#ŠÆU¼'±,ÞÀXXÒõ‡¬X„ϪÊùqÔ>¬ˆ.)èZyÂ1ÖR(]csZkÚ*„@«¬„uÆA¹) íŠ`ÖM2à"Ët:•â„À}Imd CÅ·Õ Ç™bNÍñš¾î#bRg~¶¤»w¯_/´ø…¨¨½©b11×Þã}&žqŸO¦ª›(„½¢OÂ*cˆ?Ü3q~Ο~%º-ˆ„=•c˜uá˜gCž8ª½cLœX@vS3Çk½1Èá(Fº æ+º›’@sA) ˜Š}¤]i@l¦U1q¢òy‹çñþÕÔñÝã)±§ )wÈ,&ÀC”Dm‘1˜è›*“Õ£,ï”]+z3€†O>†¨ ®¤ŠÞ‹QšQ]ÏBÄûc"©õi û¶ú“°ÿ8÷_ëITß—Sñ;‘]d¦¢£`G?×»ïV÷V w\•™¦®ØÁç>5U’œXøÙéƒÄÙힸ¯ ×ÿ^Š9—!ygb)›SbN]%øÛ¨Žc…ʹ>6pOô„·%EþÒRÄÏ6÷;:ÇAwd'wj¿[•r°©J Êäå¼/Á•ˆýP¶­f©£Â»íIN¬–üÏE'R/_¤>5¬¤/OkØ|üñü§õ"à½óP»Zc¬Y #Ð"ºf«6zÙÁæLˆ-¼dsâëÅ¡³ì,K ^þ^_G´O½gß–MX¦`¡O¬Ý#*êƒÚÖV/¬!Ð~OQ­­>GnAm%Žb÷tBNÌ$}MŒŸ(-± ž©eƒëJ•´ÕŸž9Ûl14ÌÍ *Kèžeü­:¨zTÿÛvù+Yú Ö†Ad1äæA1 pÙ…\ª±±;iE©t·ê½æhÒaßM PûI• *¡É0Š(U,Ô9ͤD-³Ãa})ß*œL1a²%® øÈ+º/°¤ñÇ2YÚRÇSË<5ÐÈETÆ:J'a”9ÍÑŠn+Έh²Æ*d©©íoµßhV ²L5 ÕAÂtÇB•¹„àA'Ôú1Ùäp*ìâlŽ}^s‹ÕynÚMaªìG9ŲÖÔµmUMÆQ–ÝOí5ë.GNŠÎù!ÓÓ¹3O+±q¦ah[kQ”©:_Œ&?À­¥=aú8YÚf‚ÿƒ¢æ­A,-D!­öj9½Fu¢NÈLˆÞÉÃ{v Ã'N‡û±T‘r*‘ ÚÚgvcçÑ..\½³è×{ °ø6»š±7³lÖ™–ñ$D?šˆ¦!íž&Þ§ ¦ ‡ŽÛˆeuì3¥,Ê7tùY&`\gÉa>‹fΙ¹hOÊfmlž=¤µn’ã\MðûQNÞ3Ö1+µmà¾ÙT4û´'fÈ0 Z‘èî+-Øäœ»§‰Ì_(! >rcƒ@(k~†Ð1J×¼yLÚÊÍA]‹Ä¸¢÷óT­¼:ÙÚÏÎx±Û%ÀÙSÉñ;&€ìï>ôÁc­s<`k#<¦Zf¹Ýr5[h4Çãã–ðʦä½þîúnr·¤,àòßžáâWúñÇ´p™ŸY=ÿâübÉÏ?[ü4C=8,é_¾~=äó?}Þä» ·ög¥~Ë2†^;ʵaØ_kT­>ÖQú—ÛéGÝw8X‘­î! íÔmR¦'šsi°<]ÍÓº›¼R•©,6ÊŽ=“Tã͹¶jÏ}¹BáÑ›€¾SDíµÇ²„0þ4 ¤òÁÝÝý?EŽ2¿ÔVeÜøIOª\¸õ{™ ÜÁEû ‘uÓÐíã£ÚÞÆÍmÊ¿ªötûò^€;þMèp¦a^µ #t2¯_pò$õêa²J „fX<«qÓí.K)Upk¢ÛB ÓÕk-?Ü\YÌ‘h"­ PžñÛIúŒç/ºäßu*X|Ôv/9ÔÞþÀÁÄþ¬(x9_,i j£ø× ¹qaâÆ-ñt‡({h¡¢wµ“!“[ùøg6ßýÀÖß3%yS+J³iÏR|&Cî=ÆEV¥¤©ébÍuŽ)íúeýpO2¯u?ÎqñKóšÅ}ŸƒÐÛ,µ­¡“@BqI,ÎWŸ¯¾ Kdª¥óÏ—tñÙù9ñ˜cdó,~k3 be8340953f3e9f5685f6678d4b7bd8083/proj/rd/eric/funtools-1.4.5/man/man3/funparamget.3 funparamget&>get a Funtools param value3—%xœ½Xo7þWžŠ6%DéÆ$)@ÑÚ¤jŠ(Ú&äÜ9‰ÅÅ>Ù¾¦ÙÄÿ¾ïÙw—ËJÙ´U¢M|öçïýúÞ;ƃó!Ñ/…¾V¬ÞHO]Zà·à5oLæ(ç't#²BÒôÃxr1M‰(dE*éçy¹±·|A¤´o¢ÍZøBØÑ¡d),=Ôb%;a—ŽR9tüüpa|ûCýŒÔ³L6aÒ;aÊýGâæ»(.â¼N_]Ž.®F“1ÑÕRÒÜ–¬)¼ÒÒíú¬ÝÙµ÷{Êß…Ni‡Ö¬ô…Õä£eæÇÑÕ”–R¤ÒÆPJOÂáÑ a“":±rA„vÞ*½`H—ËÄ«™mzv|RÞ%Sšmöxrì•È2“v$&ß0æUòˆôÂEKSd@?¬ÄæõRjÒ†2£ب±&Ó^é1e2Ó.Š•„_qCr0–€Bô„s&QÂ3ŽòËø¸aþL2u‘$Ò9FË47&7À~GÞz©2ìdáic 2¹ÔÕ>P™àk«Ý£·f-o¤í„=‰ÐT¸@u¤çæ¢ðp“7ľUó •”*'åV­„Ý”„z4Ò8¯’"@TóêP¥Ø»ñÇ‹ËÑùàòÃÛáàõð²eÜqŒÓG€ÙR°J‘‰È‡,kfGäƒÂVY#Ÿp Á÷ê÷蜓·b•gòi¬Zl{F»¹êäd<¸MO:̦ߡï¹"°1ü< ¤°–ZÒb”ç§§rW@9°H¡Êú 0‡H$KfØëõ¾ ÚsÓ]?܃mêÿK›f"ùtÃŽ’Úwò C µˆ¥½›¦{Y…RN¬á‹Ë´¨óÄ¡hÍêXj¡BåÒv·95N¹§_&~zhï3?B}·7l‰2Zû‹pb2~ùtÇN¤w*s+®|¸xäaú'ª$jé"33±S(0˜o%jHBPEÚøðOä¹5¸`¡ÂüÒò½)?È¸N¼µ 7QÕJËÍ]'æ²Gï%Ê.1+¨^Zq9’2E¤_˲ÚjUZ\²=˜PÉèDy^*¼èT‘ðqÝ0:ÛPnœSÜ5·:±Ý±¶Êãz†e#È®`µ%œšg"‘Ñ|_‹;ß…—ÕñRùÌ÷}éçÆ[‹fSô"ýò°_*›’®OÕFwÿ”Öt‚ÞkV/É 'èzˆ#Z’HC¼¸Uºb>W·µCê˘B¸01Y”')܆·r¬pT±B¢£™œ‘*ê…BZŠîM îØ*k8xCf; °œqTäA´ƒ2‡Öquv>‡ãÓà:$ð{b²bÅ&rËWš#éEhõªGeâ@K=GÅ `X€ñç©GÚgf÷€Üoêî Ÿ­€öœZp[ûHA*(@õˆE¶×¨éq{7Îàú(Îçí…ÆÇ­ƒüÀ²(2_v/¸®œÔ~ʤ.䢕·Êy ¼Œ©`8)ý&/sM50h†šÏe¨Úã±±«¤)U¨Óë•£Œß…iŒ3UÒõczR9w¯‘~°RC&÷µ*z•Ü%UÏgá8F±µ+ÅnpùñÝø×ñäý˜ZTP»S/¿šœŸÇWXNšËg“7£Wƒ3,gÍåÑøjøÓF‹Tsyzu9¿Áªk®^€åµæ}gÃk¬ßR;«“Û‘øØ8ÛИÚÜu••×aônàÕñsQçÀÔ~«'žæ([¿ß2¸¾ÜTl:ûƒr¼+¦j‰¼c(—ºå °{M•€µ Û†kzÒïò[‰HØè0Ç&Ѝ´óp 7º¯˜—ƒ÷ˆØàü`¶ŒÃeÄ[‰Zåño_™+÷g“2~%ráÈp#Å¥(Ç×°zØÝ±šÝа¼Q[/Tãßñߎÿÿ,pÿQ`+}Ü/ÒTùðº]<“ܧŒeï¸Äª›037ÑïUéî‡;ø¢QÍOú!utêÍïPu”Zñª¶Æ›4Ë#·HÄh[ñ¹ñ»³³`—æGN'Ð^ÿdKb'^‚íbzhó‘¯v±W.p\7\ÇØð´vÖÕÅ:;­óYÙ6Õ¼E-‡·ã’Ðܘ.r»ú[›B¯ —Ì[Χaz:ù®÷¤ï~×h„.ôPNË•]PfNâÌ 9ò)®|¦épHƒ³é„h*·‰ÔÒíøªGä®Lœ˜bK™åHe._ÈK0ö´÷¸÷ @%£ÓÇx©èŸž2THøÚÙí¿»:ç 0367d01b1eb56995c68ad7c25d32f9da3/proj/rd/eric/funtools-1.4.5/man/man3/funparamput.3 funparamput%Êput a Funtools param value3Ž~•Uxœ­X oÛÈý+ZH­“ÜEï.„œÓˆeÃÒ ‡bM.¥­É]Þ.iY-úßûf–¤(Y—E8ÖÇî|¼yófèåüö†èCcï•Wå}SÓUø_ñgµsE Š¿¡gU4šV_–w÷«ÅŠècÓ¢É4ý·'Û¿[­=Žð†p"¡t«<]ZUêDNÙøKìvߦ®,“hDU•¶Ùø•Eó·˜}ÕbæšÇBwFùÃÊë&‡ö¿f>|Õ|üè?…üãÍêýÃâ~½¸[­·šr×xòpXŽ'Çp¿Ïø½²Ùq„ølgŠ‚‚®©Þ¶Ù’Ë™‹õжZeÚG&è¯TÀW¨ºVõ¨h<ÔÞØMB^‡J§µyÖÅ~ÒFn|@b~Ó”š ¢-ni‚Kªu†˜êmüzÄ£†iRiªCÐÙ„–Ηª(ö‰œlÁìoÚÑ/µ¶Á8‹TM{×ÌÝ9„r‡·£ñ„>º~Ö>‘3©²Ô uasÜFcªq†&ßS´Æ'€;«¼)•ß·!MhaÀÚ¤M¡`Óäb¶ƒüÃOË¿Ý?,nç_>Þ̼y  /3IÏž1̹ÂkN .(â J¡?M1¨+. 0ì×ÑtBpO¿¨²*ôwÔuÐ÷tÌ"áïÅrþy±š]$4Mh†ŸåOŸ>áÕ§ñïJ﹪mdlèÝ,šê0C¯’Mè÷8 »½©€b¤[q2™üOÁœÀD£/€[Áõ¥dH2Íý,4DE¥J½KØ} bj Ü»ò\…Ç‘áA§=pJqnûž1d6bbÀ‰ó™²©nIÈD 5:Bù,Dj ÑT!†½¿»½½Y®¥Ý>.V뻇/ ·åNƒøýX(ûÏâs×MÍÂÎæñR,^¼£‹Ž63@T0–RW4¥ ôg±>›¶­[oÏÈö™ ‡­³WÿÐŒ÷œeþè s–»ADå=eÀWD#4yn^Ø# $Rñ3¥zB†¦&­Âžr±pÕ0G©p®â+ïN+³UÏ,‚Ãí«;ËšK]ZwEÔÀ!гþt»XJÖx5ÿ,=¥x!ap {ÆrÕk%z7д.ŒÌ»é÷d~ظ¿Þ¼ÿ“Ž8ÒW\½æ ÷vQû³ù%¡?᫲¯GwÑ’ú¼ùç õr°¡^ÎØø×a|€e™ÎñÝ+¦FFDˆX_k«)í¢jEõ¾j©Ì5ÜÎLžkQ€¸(&†áL¡T‰…ÇÝ«øC~‰´a–EÒàÄé8‚¶Ö¡ [jʱô#Çr–2Kž2¾YÊüÜm5œúFrnÂÛ–«ÜæÌÌÌáž»ô‹ @i‘S«¨ªo‰ni\>Xï[CÂú/½°›ÎÏ4K¬9[ìÙ¤LœÀ:a7š›R®3Cá9)lÜsX Çv»8YпUå|¢ÙÚ+¹r€Uåu‹dŒl – qqœuC3ªhçrÇ≙[w}<Ü¿øæ|õ~±aºÁÌö\XºžN~f+¿0íJ%,Š(Œ‚aM½žÊn¥RQ VCÐÏÕ&EyáT„ÇÉZÖ”Z„ex̺•;œß…ï¸.¯¢Š ‹ëI ,PÀØbÐÎ>m¼V ÅpþµA <à§——£ëéÕõULeÜüßõÉé×Ù™‰ž$R€¥ÉÀdâ,zÝ1¥wÊy0‘L - cí‡×A9«µoXâ 0<ŠŒYÆ4|Ô°öyÓ×KT‘3Ãhܰî.Ø[BÛn—ª\†Ï°®WÐ}²rž£kK«ÎÏ6Ï~¢ÃÑ#àçNi¥]¨wèTV tH\ñ]éÚ9ÿºjܨO¶í™v|æ¦*hýõŸlÛ•žâ1'uÆó6’ÄëÌ =óúÃPGð9ÚUG°C¯‰,oyìkp†aÂŽ›ƒ"ù"¾P)tŸžk‚¨Žó2èŸy—^»îM<ž´!Äeb ^[Ûäo®72Qv[7˜±¼¥G¥ŠuýG”ÒöCeœôb¡$¹–Ãg[YÏ µ‰ódek²S2qŸ?°C< x–s²N5ý)ò~ž—&ê3OT›ñÃä6CØ-öWqöÀVýƒV>ÝvË;òðº*|v¼°`±øöRj ¥Ø 9üNìe³’‹è³‚©Áö÷ó‡Y—âå·tüÌ'DÜ™1J.äð¿X®oþŠÇ9yѮ䲃#†´×7ŽWˆ×Ú^sC<¸]¿æKåÑûØ„Ä {ZkC‹`€ÜJ×wºØ¿ºbûZ¿Cù¡m¯rê 8^xz;žÉèšc8¦Jÿ(íuÝx^òf]ã÷ìÈ¡‘‡¼)$yES´åÊ×ágs©þŽ2@QŸÂËödì™öÙ33™P¨ÛGO÷”3+…8?n´ÎJ'`‘« j-+Ìêæ†æŸVwD+­©û³ÍÈŽ#û¨àh®þ/?[]Tð±.nѳÉÛÉi~4{ ,§³›’H £?Œÿ Ø:¢ f55f023c147c3a17eb558863852de9da./proj/rd/eric/funtools-1.4.5/man/man3/funref.3funref,¤%FunRef: the Funtools Reference Handle3W›Xxœ½XmoÛFþ+SrF±}í—9ÀçÚW‰mDÊ]‹\P¬È¥´E²Ü¥]Ñÿ~ÏÌ.Å7ÇmïC‹Ô –³óòÌÌ3³¾»z{Ct[çïtúŠÜVó¿]Qd–p¢+Çš¾Wy’iZþxwÿ°\,‰®(Ñ6®LéL‘S‘Ò¶8+¨¶šT«¡:iØz ‰‹<ױ늙¼¬¥Æ ((¬]s2§ïn–×ï«ÅýѪëàH}ÐmŸPÞ~è![ tå¨T•Úi§+KÓ¢"½×9¶$ôg§s‹híŒb¸¸fk¥Ñ ¥U±àŠ\LÈ?ñ£šÓª ú¤å(ø Qæà;@”óŽ¿ÆÂ!ka#¨MM®2RÕ¦ÞéÜñ• é¾Ôù”Ë2Já¸øÐÆ÷ŠÈ¤SújjÒ:§×§дÿpþ1¢I5‰èîý›7³͈6ºªŠjj]‚àk\ÔYByáš›/_Ñ3ûŸ׃²Ùec¬xÄØ;@š=ù½Æz‘t­]ˆµ…£¤ÐV®ì”Cö3$ÓKÕû Tº—ô691ÔLé$bÁÃVsÆ#,ùZT†èœÓ¿·ðªƒ±Ù©æ‹k$¨:’SkŸ¾CeàO޾0ù†ãY°äCí,ˆã`Ţ?Ca©²¬Š²2Êi¢­V ‡cWT\£.5•uŽÝ¶[²Ã‚ôŸ¢œÓ} ™º²øç{•™¤{½±Ré]±g=ÞŠžo术ŽJÃÖ‹5ÜÄr(‹T{Þ—öF_ àÙ®­ã-)K«Ûûwo#Z½¿[¬`ÖÅó‘wœâ¶óšf›s¢÷Vò­ÆÄ 2t8š£8X0WªêÌâ¯Q5P²Ö>ë'É ú*N¾0úb­CQ>ó’ˆS$f¨B`I”S¾cC¾)Á¤ÉçÁ1;H jÝûJÜc‹æG|‰´:¬Güó"skãJóyN·RàjWJûÿfß_ŠÌÅû•Û2ë:õ"‚Ñ?µ›âƒWÑ*šÏ‘¹ªˆµµ Á€{ð²ÁˆUFtÖüittJõXÔˆœëþ ÀzÈÄF¿Ñ£Ýy©5gE0lÁfèÛL®ôî0nÁAôå\¦ tì¹²i\ýsmºöö„{ .ˆÿÙhògÄzúzûþî§åÍõê§ïo‘ù¿úèž^øSüÕÿc±zXü€¾>€õÿ™©n½5ºWÒùeX×aÚ£7¾¼GMÉYP´1û–â‡CÑófrŒ‚ïÊ â&çº~ùu;as}hÉîË&³‘¾~I]í>TÆmL@´í#DüI0î£Öa[êØ€aŽ0jµ³#3Ã:UñâÃŽ†O'Áæ[4¶ÙZ‚cyOÀæô#šƒ÷O"¸½ÓŒ¹±;¾Ýäv^1e6 ¼ÉVœAÇ›¬ç3|dv–>ÙkÄÆ3²É·ˆ‘û »æø‹˜g2š‡Ä„²Ò>*·‹Õ²MŽß&žì§?²ºüÆ6‡Ô´â„ôã‰àê*ÏÚ_^Ÿ]Ò%þ~þ|ö‹(`~êWc΃¯XŒöÜ¥S'Í4yf?¶ÛSÄw‚‚‹qôâO߃æv‹{ReuC´l(Cµ}ÚFP6sHWðúgì´N 9Ô.(%JD¿É‰&ÏOÀ 8Êøî_W*þ„ê Áz÷zÜík VúªØ`W' æÌüW‹÷Õ‹V“ÏAxj˺¬‘¿¤Ñˆ’Á†å}Š³ÒÆŒañ—PJyæ¡»ù×Í&EÅvû÷Ö©‰s½ÿà£ØTq¦§ßž_DüÿùÙìãÙ( rR~õæMè§5>Z¥, ­wMþ[TÚmxT¥ý[$Th1Äk!ã “ Š]­2,ÃÞšlÄhòji_À^pñò¾G'ckÍv¢÷(²-*V34BŒ3ÏŒ,Ñ÷Y4zä—âPð†ùi´œtª|Ì ÕesÜ”iìµ–Víszh‰óô69>Ö÷ªëP¬ùê0‹}Ž .]‡§³2²!u4æÚû?ø•‘wçÍûuÅó(P§Ìtý™™Á8fÙÞ&ì‡`à­ÓãsÂõõúä o¬{Õ›ÑHŒâU†“£ÉyË‹üd”>ô¹&U»‚ßZ±§ü@9ƒDû9ïQEzn¿éñ#ûXYXNxBÐk茇9ô ö€G" ‚k~hûÝI„àqp1<¯5êÀ{Öú~¸4Z!.³¬»S,on@Ë{¢¥ö´ÈÏ‚i> ÏN—^ûÂÑY‰gªDSIeÏ¿™KWØ3:ÿ&¢‹³ós’ÿ iú·ÙÿBgnÛ dd7d9195a153d495abfa34c8537f01366/proj/rd/eric/funtools-1.4.5/man/man3/funtablerowget.3funtablerowgetÆget Funtools rows3‹LpxœuWmoÛ6þ+‡l¤Äv’®ûÔ,è²!@›uŠm)‰¶¹H¤FRvÜaÿ}ÏEÇv²~p$ê^Ÿ»{޽½útMôë`ïUÕê/nó›Ž4¥%~qky· 4ÿóöîóüfNô±u;4šÞ.F‰Ùê=ÑÚ™†N-x%HMƯliBÆFêÔ#^&T¯”§Ó¾5!NH¾œZ|(é—ëù‡/7Ÿïoîn‰îWú(Æ¢DXC4V“×ѽÖc  ï:ROÑWÆ*¿¥Èºä—Clj›”*gCÀE…àj£ØõÆÄ>S,F‚F|MùØÔ‹Ù'l6+S¯R6‡P¸j[ªð!:¯›Ý,èöëÇl´GDº™ˆ^.´ˆgÐb„_W#n@…2)v hFÅ=¿Œ «ÞõˆoT2ÎrȽCœÚÉÜXÒ ñ¦Ы áäç“,— «Hµé½ÔFƒcz€íÖ!²¸R‘ílÝ i9fE5ã9©°rCÛZYë”NÊnÆ.“ZDÝ”oD]¶!êNÚ€k+f¸ÇÆš°z*ë^©¸³2ÕN`, åSqsû¥ã«é†ŽìÐU€a´À]XÉÞrïWCÜä+—b,‘ âD¤œ(ôQ«šfƒù¦ÇXNùÙ- ½N)sC»Á#áƒfT€Ø«ŽätT> ÞC Ý¦†zÐÛó͹Ì"Œ§“N…‡wÑ+ ¨Yö„­…¡ï äX®C‡°|³ $®ž:7+HE‘žDa˜[Êë…ÍQP¯¹—IwdùVEÖ3\g;eGÌ7ç§r’$¦SÐTÜE¿Û>iMmƨOω²ÕÕ° wT\¯Ë£ Œ\‹ØÇ„>]ýñåî÷üöÃÒŲ¤òqý¬êlSX˜woȼ…0þœeqÎ=chð+a±Ž^#DsfÞˆ$ÁÚ%àp]¾÷ÌHÇz6ÊOßk«ýrËñó[oÎäÏJ•ç¯fðNã+¦ãc>4»3v÷¯xÜx¨]¢ÌJEŒlnv¹‡ÐçAz5á'„,'t‘*Sü²óEÔÍ¢`i*ÓVÄc™|_Þ4 HåÖ˜+PcÊ7'ægÙaÏ®—Ç]mõ#6ŠŽ»ˆå¢)0Û~H·IÂ¥Ó´Oµ^¨4}6Ó³Ã;M¥Y&`_=p_þ=  †ç«5ts~7˜H–}ÂN®œ#y½îPô¶~T]ïµkÒHQ‡¡Á;óQààFò,aY L4U‚C»æÛr¡‰˜çµáÛ;À=ª2­‰¸mͯ¯éêãüŽ$¼ü¿ƒÂ–cP²ßîn¾ÒmFZ\|“×åìõì'ºê=p¼|=¡W——$ÿØ d1Åå*Õks ed48bd478dc59bab656911623dc5c2ab6/proj/rd/eric/funtools-1.4.5/man/man3/funtablerowput.3funtablerowput-0put Funtools rows3eœxœåXQo¹þ+óThY±¯w/½Ëƒ›:­œÄ)r‡¢”v¤%²Zî‘\ÉBqÿ½ß É]IqÒ®êËÖ’3Ão¾™ù¸w×?Þ½º÷fÙò;·;Dº ¿ñet® äÝ>ÐÃÏw÷onˆlÏ6Ìð/­‡nN;gkz&溮ã]úÃÖsZ5ÆÓ³¾µ!Vô—›‡Wïnß¾¿½¿#zßð¹Í ~‡h;¦½·‘sÑ‘¡×·ïhi;ãeËm·!ÜIôkï¶d:2Þ›¹5 =…è‡ÖÄÆDZ¹.Ûá³¶íL;ÀMà–W‘kZàª÷¼³n´2m+Þå+]ÿ ëfÕ‚è¡l9µd<“¢» ÚšhÅÂAœîØËb°ÃƒSm¢¡µóX§Nä€Çß™(W޼Hp­­xà7Ö`9”‚Héê®Cp+kÄÕÞÆ­‚¨†³‘Àˆ§NО›ú rŽ ¼P0êkêÄì¸?ô¼²kËÉL7l—ØŸ?`®äQÓšãSmrz’Œzèk°)D㣤Xaí[<×þ4eb½ äsƒzŸœÍv5?J0qDÒ›}¦Žø-ñ {uÑʄװçt€1 Eg9¬×øŒ/Y¢Ü²ßLÀ³õgöWÕžǡÍ˾ÖíÁ¦;9ñS&Ñ+Ÿ$ôFxàbs!U¸‘ k7úP»9 ÛM‡¿0·Qbc0¼Z59IºU—SGî’U)'àï9ô ‰<ž5¶®¹«ô8Ø¥PRík:¸ù25Êæ4Ûs”‘öНíeYË_]N´|)¤")1œÛu+¦'žò¤xÃê\¿KÐÀà7´`Ó埈nvÄ€cN¼ûžèÅ3ÚpL¹»¸ VÿN¤ƒ[¡H$æ?{&6¶åÍĽ¤ÙÍ®:jSå8Ó¶w÷÷7oæôãõOïî?”ÿþ°q±ª¨ú—ú.È5±ŽâžÙ——ß“ý‹ññüyYî¤i"¿JVüÖ¸dóÜâT‹ð«nIX ŒÊ›¥dwJÀˆæÈ–„¦˜Áê¬U §ŒãÔž^§$Nr¯`Z’úœ/ƒ^ vL5£šq“¶hø_¯«o×Y¨?½äî( ÜË }-9öÜ·Èšé¨ÿ™Æ…ŠRµžÏ„Í©Lšî£ç–|Œ&tð¨Ì€÷eý…Œ> @óìÚ)ýnATLXgó\e8—‚Z1Œ|IÚgnUÌlÑA›Pª–<´-,ÚµÝ?RÐ1Ÿ„g¸ãŠvk°u p…ï€C1騷,Ç7fk…´V=\°ç’¯YØ©m2¦DWuí|#™FÞŒ³«“‘lY(X`õîñêV<3tиÄ;æR³úS2e3ø R%s‡ÔÁ‰Ká‚ 97méS·V——³ªÓ——óÏ$ð„É­2ÂHt_o¥Ñˆ†Ýßð­ì®ÝŽ·ìsÈk½j´že- ì7Aˆ°1ÔÚ×†Ç³Ó ŸŸ&£»Àãùi…ÏÏÕùä;ÈŽ þ^µ1æ§š»XD¦K”ÉU$@…ªz=@†ÃD"%«¿$$¶‘Cw+¯6BÂfPÐ&[Û&ÐÆãµ?hª7ßBäÌ.Î-Dªí×)^9s9^}—qBú½Ê‘8@³-b¹Õ.Ñ©é¾ !ü°vÉ4”¢6ú/ƒdN>ònߢ>r)o©4R~©!¯!„zíà¢7áÜ? ÙÆ¸]î’É ÓßH•–î„vø¯–ãlTZ¸/Ù¨òñ—f€Jn…Ä0Øp–iŒwbkr`l&hâ\ ÿ Ý\j¥ÿK PºmÌÐù…Fu—<÷fò‰²P;“6/#jqó swBRÀ*u¤ߪtÈÃ"ÚPM´ÑOˆ&»û~ͼ¨F &/WG»±-3®ïUéÅɧûw…ž!éÏ…(ÏQuÏ2Pv´iŒ'¨šÌfÓùæÑ¦QNh¥1—GŸT13¢}:‡†ÿ¢WÌü?IäbBó5[(Ýõ›ý~ÿAD¯óT’\³g} èÿ3ꇒœ=,¨£Ã˜‡ªbˆèæ©“±n1š‚´ãfš¹¬í‰”p2á¢gsù¹ö•KFvØ7¥Äb8 0YpÅµÜ ÀX21L?KE r"óLÎm wŽ} ½ouÈóà"o…ïRx€6t~„îvl°’{ÄšMGµŸís™*¢x¦ôŽc¾á  ŒS‘W1Ùìï G€dpo‚ɽ:·èR°xjñÆçq”ïAF×è…CátµÅÍ ]ýºx Z0Ó Ô±ä›ž"Ó߯n gf ÌÆ,¯ÙôlzNWº!ÍÎ*šŸÎveÀÚ?q±Û 660f237aeb0d1f8858ba54f973dc5084./proj/rd/eric/funtools-1.4.5/man/mann/funds9.nfunds9M&FunDS9: Funtools and DS9 Image Displayn&XxœmW]oÛ6ý+YâÁv–¢{hH›d5Ð&AaÝ#-Q6JÔHÊŽúëwî%%dEÛy?Ï9÷æáæÛÑ}×Ü.?\ógtÎRMIxB‹Z­5ÝšÐZÕÓòŸ‡Ç§åbIt«CáÍJÚ¸UõB5´Òdš¨×^E]òWGq£© è¦Q¶&P­›nN·wËÏßOϋǢåÍ£8»d·†# ¢w«M¡,¼4ÍZ"+UT´5¡SÖüTÑ8œm[‹sò½ p¼êÇûÚÜwnr$;çm9'É.sv!¶òå±ßûÅóRœëT••i”ï)ª•ÕaJ«.’²ÁÑF ]Û:©r~°Ê!{µ#àá£2r+l”GŒµ®Ž™ÉoR]t5B¶'¯£7z‹K[£èþùIŽy~~B&Ë!r4¢à îBµje¬‰¶LSØ®ÔTw6šÖjª¼ª5‚¯*gJ…³Îת£^¯¹ŠµjLÛY)i Oúa@PÒ »v3"oâ¦s©(/·ª)i¥UìüûgßéÏì*7žK­ÛÓh"ŽÑ“ q Œµ‘ZÁ].Qn—«R[¨vA™îŸÑÜÖ; ¯¦}3ÆsÑX1r¶Âç ¾žÁ _™è¹¡?«§ä]—óÓpöñÉk¬2[P˜}Cú†~Þ³7©xJÑ^<|ºF5^x@±8Ú€¥£ˆÿgw©Ðêƒ'¤*äÊð‹§ÑÍ'©y¬ aÔ?œpšÈÆù¢[°•ÖŒPÌ{` ¤{™aŽ 7²óù(ù 0Ù Ìžô †'…À¦$È<8±žDàÛTë^âs£ Ÿ¤ “·Ë I`S$1s  uØ‚’²I\¤¡~°\ âR ÀÅW†\`„#ZYyT!µh9™R&FÀvœ¨˜z“k®¹Hg-_oºpÞñNú“»•\óZ!;Ù>T”ù{.웢µæU'Ña6îÙ’ )!æ».-e-+y*ö‹Ç~ÜBÈÞÝÝ|]>’à _Í$m´P› »ÄHò¶-àÆ% òq5?ÿn°½[ºz?¥w¿]]‘üƒ=!¬ý]„9 d0be5f311f329730e3705cbe9844f2fc./proj/rd/eric/funtools-1.4.5/man/mann/funenv.nfunenv:£&FunEnv: Funtools Environment Variablesn“l¥LxœÍYmoÛ8þ+<²ÇW÷Ú½Ýû!mÝ»Ü5/ˆÝ·+Š‚–h›[IÔ‘TßÛ¿·Ï I[rí4í¢À-°"‘œ™gžyc.Ï.&B¼lªIu{J?½1…øM[S•ªòâ´ZÎ åÄôýåÕõô|*Ä å2«çxçWJ¨ÖêÛíêõJg+‘ÉJÌ•hœÊ…7ÂK]˻̭²²(vB[njċÉôùÍùõìüêRˆ–/LQ˜µ®–GÄI«„kêÚXQóÍöÜS!~°ñ|6ý4y7»d‹éÄΛC‡ W«L/t43W Ùž÷ uçUå´©D%KcUE¯jUõB;^P ¤XhVÈì3©/Emu)íFàߥA—Æ …p 'Þvµê]NÞNÞô„Xk % ±1 !™Eì¢DÈ!)€]û•i|Ô}Cù¡+¶b ÷ÜB!•êLzX3â|!*ÓUc ì º‚a²Êƒó»@ÈÂZV/jéÈíQðAy°Ûtm|ÙVpFÆ|†ç­pò¤ÍÅ»+7BÝ’Ÿ<ëÔUÀ‰ÞäÍär6í lëMg/&of=Ñ_+bÈPÈ…W–²á8é<|oÊXZÓÔBz±RÒú¿ F{äy}±Ç¼øÔiÊ9´ùäZÿÖà“©££»jéy€S´0ªÿPbm|v~ùüêÕ”œµ}EàºÃå¤s]U¤Ðgµa¦0ÄxIù˜ ÇÊud <VÑy^ߪbC0b{ÌU”˜N¬ÎsàѸd,ŽÌ`ݯ*y§ÝxÈ?$¹kc™åò N@ôÑçV -„’È‘­ àl©--ËLYÊ“\ºÔ”Þ ISV°BUYabÕ 8üüðEÎeD"Bý¿©;YÖ"A/˜kI‘dhÑ!WþŽÃÆÒhÄyâgžvÙ–<×ëÓÖ!m a‘>V-TÊ8”ežG »ô Œy‡âRƌڻ ú–„:Í®ÏßuÙÄo¾‡L¾ÖwÑ=-ì~ «Hà¯Xâ%“©x xJ¦ÑªÍNôŽþíñð„þÿéÉà>Ú$t4=Ч‘Ì*éå­ÂÀµär‹{ØWw?iXÉoá ‹c#UÎnnÎÞÀÂã7Ђkžf™€þd“Bfæœ=EÕÓØÜîhFÛªPãž®Ý Éz!+çÚ\šê„=uöå  $ÿÏ'X§óƒš¸@J·sN©çÆÆOõ¶Øú!ªù‘Ds­b~§¾à˜™xqßND’¢=Dw°8>ÿ'vƒwÏ‘Çý%ßçȰäO:c?šâɃº|áʸªwwú¯Óñ£ÇO†›ôPëÓóa½’ø×kxàÅ0¿;„oÛ§èzuû!Ùõ£\¿ñªÍÚÃ$xJ¼ªT8¿wvx5›Ü|ºž½¿Þέ7_!á íØFyèç Qð¶å®Y¥DmœÓ´µTh·ò$¼¶&SÎQ;[GëøîMYë"vã…®>ÓãRêÊyF}‘JH¡QDP»úa*+›°Þ2ÊŒ„°øHbcõ¯tµÌÆndÔÊ›Œ½+$Žß—V–£ÀŒøé¸ Ø)ÌØn[E.½ TùÆVN$›P?«.v‹ùäÐíËE™á©* þÿ…¤«[Á£hÝç¿aÙ0NÁPÕ0ç¡)¸­T‚Š”G™UYC$”ä®™ÇÒ:ýIhǵWŽ ë ‹ØEšJÈÊLåÙ> ¯;êC8Ú¨$ŸZÅ,¶ÀÌ£h—©i9’@ ‚èPÉá /dèIc‚$†wjIñ™\óL&:™â ›Ž³,yð¡ôê²kIº§›u‚ƒÝN´~m† E&©•Ž)™’Ð4|~Ž O°‘?Fóƒ8ƒ€è$n¿NdAY´Ç¥¤-r÷K"MnxŠ^‘ݘÇB¸‰öq¿uhx LÚ:$Xsíj~È@(~Q_|Ý’§d{|[œ—£øÎyƈñh›ïƒŒyXVKu}|¨òQ§¯}þ¼ÓÔâ׌U©D´ošÂ»ÐLÄZ±7â¼G˜òqÆ}GPòˆÀ_E+͉z¹"À!bC…,RÔä­ÔEØ|EûÖ2D–µ‡¹Öš6 “w³›³áÍW°@…³R˜š;­8ôð„@êø/´AdÍJ+Í—*”½Újº¦Û$|/š\¥Ë%Ú½…Ý¡BÁu1Eì4Cs…<’0¡n GÛ=cg×/Îo:ÖÆWp½W%ú=êжÍ0»¿cpôÐî*[ª\Ó›q„Q:™ˆÇÝl6êt6õe½u¥<ªM×ÖO&×KùÅWì\¯ThWê #ÈÈÐÏ„‚þy¢±Y0°í%4ý<ªAË-I2O‡hM1ÔUùÑ~…ï-•ê Û©Èí©”š+K; Ìüù>)d‹¦`?åjÞ,1Õ,ÑÜ¢ÏxüÝêGmê/åªÓ!}zš Lø{ÅöÔç“`”ŠÉDœ½š^ 1U»Fµ_ X²»7Ûc¥Š-È žóŸÆ£'£§â ñQˆñ“¡xüh<ü΃ßpÚCF e15bf6096d840d94fa15d3e5a2c52e990/proj/rd/eric/funtools-1.4.5/man/mann/funfiles.nfunfiles¨$FunFiles: Funtools Data Filesn·OíFxœµß®uV©….çE2ƒÕJ«NXµ̋u\•ª{=™Þ*.Šx¨"~Rúæ•=—êI§)þÆ©4«ÚoR÷þÏd¨2Ÿ?è*Pºš‡=Un7›¼¨ôBÍöÃP]^ݼý4ù8|x¯â2¸T¸ºJÖñ=€3˜›dq±WU<ƒMþ£%msžgUœdIvÏ(«î*_ç÷:Óùp¦ýåïÞéJõ·¡R“O×Geµ‡ýÌŠ÷kZśΰ*·;ÎâµÆ¿Ëž'˽zŒ‹`©‡$[”*_ª$cJ&y¦T¦µÌŸ¯b «'jV2íÇŠ Þê]3êâÓ§‹¯Ýžºú|õ~zÓí¥ž#¨»[³Ë;…Ûù¾I›ó´Ò…†ÅþWñ\•ð!Ú ‡´9C ežü­³÷äÆàÒόٮgºàQ¹ÏSΈ‰—Ì…J8Ìà.ãø¼ZÆÉÖÌÂÄ)öaËx!g¹qª }ï‘—ˆ¯T·ÈŸzv¨º±œËò$’ስ*â50>Á<¶À'EºG6L`¢"Ñ¥fžë`Þœ%+tãjrÁÏŸ• CvàNO8g²ä* uT›çóxMŒ<8ó<Ý®³£Y\"Ó#ÈØ/™¯è Œ‚È’¸÷4)+Z‹©‰'VNª’€B1Ä)M&qaBžs ÆLN(ÇÎóõš×Íà4KÜý¡ZD+Fá9Õ€òœçá2A~áÿ~P9ŒåS[èe¼M+OT7šp;¼k›ãÆþ0Tr$<že¦9‰ŸúKÐ釤2X˨?õšñá¨r…\ËLãV„é"¥»1 öô+ C%0ð$k¢=ž¢Rïó $Fm¥€Ê{õ{–ì`°&Àê:¼5/W,‘ð¡X‚–j½pd:›§92ù×@–H|Å ¤ŸÁ*ïe‘¯<¾ŸëÏ3É™8ãò†ù~*BôÇ i¾Í>ÀN@á†`Ï"y}JªU¾ÊX†0|TlNå|gz?&Èy„dšç(ì0ñ1N#Ù ³Þ¦€?_.ÏéY<+a¿ ¶hVàÔÐS¬P äL}Tœ5E½PPFU,\8ÜL/¯>OA¨—Àû´›#½C‘ Å]hnÄèY^­gÈGïxÏÍøÇtâÍ¿¼yÍISÆdùžÝ?ðl>y“Ë6Þ%¥/€e·vÔÕ—éÕûtÞV:Æ#Ù€Ò]£=@¢Ä (=Rý)«cðô®@ 6Í…>_}:€ŽÒk-( ;u¤òÚÆààJäETc•ŠBnÁÏY`` ¤" Šg‹"|ÖÿV°l;“áVBge[åh—æÀÆ{tp>`H̾Ѷ;•%èyÃd%8CXdà’FeUlçÕ¶Ð … 4E“~üŠÄèÚ˜B/ Ù!€MƒŒ|袰Q—„Ìl¸$ÑòYu}`úë&žÅX<PNvÊ-vã°!˜wí¹šÆhЈ#œ‡–§ù¶gœTåÆy‘*ˆÙw†{aÏD; D8>È7H ª˜ýd-þ±Žaj’a<{‚ù-¿ß‚ç áS7ÍÔ¸·Jà`{i—ßÎé> £áKZóÐc Ôl‹æpžnÀO92UƒY&÷ÈŽX)P¸'õYõ³7êèÈ;;šfCׇßN𭼋Nè%0¿ûÕ{7Ôßý·÷îdTw…ïdÂ2Ícy|‰e¬÷ø÷~M>×ÞúX\dÞÉ\܃ø³zȌ׶)ô2Ù9¯ ‰Äâµ@§_œ :Q9`?ê€ÃÎ"°ð5²Â.^oRßgsμ›I'ZmËñèWdO°‰à–jG'²Ç8Øí®4ÖÆãÕ‘·Oíëmg ,L*{« 8Õíµ-"J<»X¡·cÅìgâb°‡ëçˆûœhö†wÙ®³­ÕÉÓw¿MÞ¿‚Ÿ_ÔƒÞ?±˜°ðàlo “joÙI,Y`q+È)B¥<]mMôóéâ/ã_Çø”ýúü›¼£sì)[ª± '¥D ªØfâF´T¿õÍX¼€Bÿk›¤ERŒn"jTÐ2µÐ@ˆÇzŸ´nHx£i“òTÀ3˜‰~áÓ*›òV9Ò»¬À¤pZ`‘<&‹-…ŸOXà܃ÝÆðÈ8»Uü 3fmQ£l@eG€, gp4…C|4}.Ø…G¯ÍyZ™¤Žµ±¥&õ(uPñ¼¦Ó¯¯"¥^+õÅê•zÏtJœäKAiM¯?|úÇEo UµÁÈd<˜þ‹`ào ì"ÇT4"tƒ¢>ŠwAˆÞ€}ý&zƒ¿‚ÞÀ¡7x=7(ŠžEoHƒ>þrñM‡ß‹ ‚1ØÉ7¡òÀè×ï‚zLƒ§Ì:~..¿ î ¾ü6ñÀèê›PñN¾‡‡N¾‡‡N¿o3Ñé_ÁïÔá7|?7(´áÖÒæfÙ•õœ7èJtîÉ9zÊ·°:Drú9S2¶¸/ã ¨Üà+üŒ£(Cøq2þ5@_—_ÆW8äò+üŽ£AO¡-ÈòV%î[RU¶ 0Z”–Mû±Sšs=oñJQ¤Ü¥³Ç¤È32ú˜“E­6Æt!¸êfPÇÛüúÆÖ¢~çÀÙ~ÈX;ÚܹõÙ[#LÎ{õ‹µ&k±´ 8½FÖ„ÂPà4œv¢hë{Áy0̶³ù‚ˆ]2Þ˜kÌÅ7®’G“ak6i\á3 óx¹Å¤œfk „+µsYëù‘™žÇ[´èh¸ vG-˜fg†PÏ­üfËÙàƒ©àÁ }C³ØÎ9C«›-˜Ú¼x(%‡îsA¶ß¾K²íN}|K©Aò.À†ªÙ¾ÒGåæêÀý€˜n®a cœ&U•ê&ҵЦ¶œC9&s¯©¬ SÔÈ&Q6Q<)æÁ¾™üãêýåäâ=>—gò ‡ËƒøZ LH€£E¸Û‘˜¶C9‡­w€+uWè,ã´Ô?¯´a1X²Ót(b¤8ò^eSl} ~|tw¯ÁÝí¸|H6w·|èwþ24 dö þu9¶%FÂR'Á |W"4ÎhCü#ï¶Þ;;·9(ÁA.t“§E°´O)ì•ç í‡Ã=–\ÜÜ¡3!'p看’7íKD4’çÞ³3û2͉¯C S¥,>3uÇSÖ«a]·- ÔXkWAÝ…Æh+õ=ã˜a‹𠔆@Zõg[¤0…S‹cð^¼:œÝ&Ù½>ˆâ¯á5 }h™Žú}3ÿ…Ù# aÛgßõþÙãÁÙYŸª//ÎF–yCÛà¤ßMÑÃl¬ŽeÚwj(uš }× ToXQ)Žò 7\æ¹þ€¦<öò¸T/…è¶Lf˜ì?ÈCS€;Ó:kªú ³ã]#=L8WœEo”xê‚b»%DñóªQ†öZŒsçUpÕ]°¾N¸Äi22@ š½³4Ÿ? !–ñ¼Ê)ßÖ%ݳ`bb”gŠ[ç÷ ˜tÒBª•X~#’Õ÷…Z(Ï¢ÉZ{M‡•ž"ßV˜ Ý"QôûK5yÔTÖøºlƒo`vûþx·Ú³o\vð< àíó/<|ñãs3ÜX¶.”ËÂ3‘¡¡%÷Ðú±CJO”b¨.Ð¥¼JâŸ/¼´€ÿÌËSúåP{¬˜¦„óL\ºÏKdZPŠx^‘Ñpj4/½Öl/I:Rè«Äc½ 9‹Ës¬Î(Lœï9(™û‡…üó¦(Á?ïáSíTè)¾?xÕ2óðŒà•›m_;âÖºblåÔ舒u@º…~Eë(b3l^؇TÜ{½ÛÈã@U­ÁÖ‘²RÿÓär—”ÄGŒ^4¿`µ!TG_íe¬¬KÃÙH&3͉×DÇ6´=ÿ£³ñÑi@?7wíσ¾¹°‹4x`Y2Û·t:Ù 6»"I|6NãÊV EOSün¦x®J]ÓQq5B•`ÝoѲFÛB§(I » ¬žC¨×®Kq€¤¨.sâÕå–¢ÁýÊÆàÎûãÇÿ4ªNÎUe±j2°tž-êåe[@ªˆþ‡ø§ª! š0‡Åd`t[Mí„Myn7$¶VkÓ4QiŘy[®Ç¦4®ÿ²gв› y­`RÌgº¼|†Pwõ?*[ûà(Ó§×6¹íå³/Ü£7I–Ùjw=ƒZÆ’õâðò¹æˆØE†Ìab2&0%#‰A?A .夤C‡ÍÙímf]ŒH{/¶WP¥î)—R‚Y‹XÔT™f¼Õ é÷xe1a=S»òå¹ÖÀ›RzllSN#â„U‡òu÷vìr;®Òu’ѯx7¾…·eòçüÜîÞߎÝûžò@T¹‡{Ç¥gØT) *›pSµÚz&™ênŠ`Š`Û¶V€ïÇ&àô5¦œÔ¥|ʘü ÊRû²=ÏÁyaI<ëL¬êdn¥šº-µòr A&¹oýÉ>RYøÀ£ƒù_e XÅ4¼óOà´·ÞÝx‰Wó¤-s`ªø)µèP6Õ"×\fÇ´ãiB&®Ÿº½„N³®‡Ë&#K"ň¼K2ù¶æŠ›üˆöpÙh^2'…CÑcÊûÈqdüv(±Ïîo?~ºº†h¹PøáK×ÓqA K2¿/Š*8z1¸CDÀöká^ÅÎfrÕùÚaÐùö~UÏIrµˆô2ßfÀÏó…ö´¿X¯†9µ´«À"ÒXŽG9Në\^MÍ(þhÀšÐÒå&ü:: Šäæ¡ ª™Aé­‡pCÅðú@>w‘`.ƒ–L+s‘? "ïFs4=jTÊkíP›d§SµØf%°å†$Œ7M ¶X?Úô—l¡*ˆ]ˆ{6 <[Ä«p9Á%Ãe ;À*v%\ ›Ô¯äkj÷)b'v›͵n% †qîÈ#ùõ-ü ž-éã'ˆ #/¹˜*yÄMfrP~²ÝH]$sA8Ã[¿ RVߌ›îLlŒ¿‡¸¸ ñdŒ×«Ò'bX· Läåú~-xØ©ËÁØën¬Ç#0õ{ù­Çà1Ѫñ‹ãüL[ûøŸà_CÅÿÔÿBX¯ýy#ük*%éwc~C¢œ„e‘nD=¬næV|g´•­Fñðd¡©\æt}bΊAð¿yÿ–øæñN±¡¡£g~'„Q8EMy˜GŒ(Öæ¸ÁÈç µ‚²ü &Ia×·¦Oà ï©¶,8#?á×jÐ;±ÝŒ…‡¯Õˆ¯fQó@²Æà'6ÖƒY•÷ƒ¥NÊ€ú´i:ô5·lŠ©’²EQw·Ä³5¨‚di­ÔNqZoÌô×bIá^/p1Œ °jVyLÛ.HL«WªKMXš2.=òËÏüúž÷¡–ãŽ{òMá$ØÁsØgð¶<÷‹þü{¾Õÿ›ãuÛ+-~ÆršëP¶DL…0{üx„8̪ªÇtÊŒKü³@ÛM¬)Þ$•En³»Žqõ¬sÖVЍ«ŒqýjPK@¸º æ¼éü°ñi#4t¡&·_ïý çŸ"\‡sÍM—E‡/ÞB $š_ð½ÈŽPN42=â¼O?N¾ÐêÖy§'íž0g*ÖÎEù›ü0mIz0ž1Zá’ðÆØÇ4ºtE“ÿ1©ü4§K2Ö-$%ËîqÍŸ1‡wËãjˈQ¿±sCcSh7(M—o»ôJeÆ“½æd³;Äu¦!†~Ýi¦9w˜§‘[p7Ú£žö=×JT ÐÀ¥&Ú!r€âfĨôåöZcq‡o¯s::gÓþå)ìuÂU,s=3ö:‚gƼ­×€sµ§YØ*Q`g•?›6]-8ãj€`rÍ^pw6žÝ“ThÎo̱eÅôõx“S†©ÎîÑ€ñ}<8² ݃siYj‘ÀdGYbfƒT×<ßìÍÕ,æ"ª"&ö ‚ÛˆÄ ¬QËlZ¶´»åPŠ µÇưœîo&qŠòÂJ½‘;·ŸøÎíµ¹ck³ dÖl)ËN¹°¦@åµÂ\ÈlÖe«bi\þ•˾¡Égù÷„ãô ûd6iŒ}Lœo>,lzÌPö¶‹â …œ)ƒs.W¥J¡uå^$kPŽè4¦ûöÒè_¹%þÝ“þ[âÿÎÝnÊpµ þÏÝ<ñªx•›rêß¾'n‹ðœÐÍ7Éœ=?Ës5^ã,Íù1f…÷ o»ÍYl®ípzØ*Aôö¯L_Û+Ó(_æ.¯ã5¥{DÜ8d¹’Žq[n)µÇ‡"ÁÖ^Ù{Ø¡_c~Ń’¹ nÅ°ÈØL²Í¶ò†×/Êm3¼Í€µV‹qê›:95lq¨Cj™IÏñ*0BÈ7=Ú !‰ð0Äš–0 µÔÂü§X Yñå©&Ô'·"WGÝÐí7s9^c‹*{6‡]{¤nqj[70§c#LíP¾UWªEyz‡\`“€²‚“ü|*uðË= ²AÂ7¬=⳨ÝÏeª6=ZŠ;¶;GÕ]í7`Fzvïö^ÊZÓ$ÉøÂÊ–áþx¹Mƒ"¿·Î Öe35y5•ï1áj)•¿8cJJšçOq…dL^ÉžIPµ¬ùР‘7ºG£Á™Óã%û“WüèÒ4u9^Q@O`i¦ fP¨Öc6ÏMþ©Ù~êJý@iã7úìYÁ’b <ÒÞ>Àä Iï†ih] šËþ9² $׸€øoƒËHC&Ìí€oWÅåCLÆßlòV rØZÄ{c‚:pƒ8‰ÄwŒÒZÏWq–”k©›¿®LðŒ(¦Ú¿Ù/Gm˜º#& zuç§R4W›GÇbÜc·Õ¦Ûº%¸·3 Ôë±Ö¢X0úÁÿjùþ LyJ{YCÓ?ÃïŽqp[®b´k îó¾¹ËÕz|›,ÔÏ "°‹6ùSscDmb©ïÍÅHg$?‚$iˆÂ±wA¾-Y˜îöús@/ùÛ¶*îÀý›”ŒøÙêgå2ß=£ëðžtK¬û ¿FÅ´•47rMù¡8³IÛWÓ…¥æô=!f©q})ÉÒbôý •Wa`w¶±Þö¯×f‡î›8–véøÈ ,YèzºËèÙ§Ÿ:^»G㜌âåÈ’Š¨xÒô&Ñ—6„ª;©˜sÌðBS ´~¤Tã\›‚3š—¿P#ì™oÀŒšéÜna˜™¦Ø‘1 ”¿sÛùc›ˆªµÉ<¡>YØX”¿p ¶á5¹Ø‚éiaõk"33.î#†!~kÄíÎâ4˜D«kr2æ›8¼V.J¸Ä¨èÞÃïÿpŽ7%¤=ÈCƒ¾cAŠ×19(óï¼BvÀ~At}ÄÚp;hDP±³%R³Ú×=Ì“Ba‹,þ ñ&ŒeÅúmPš<à¦îó|ߊ+馩01HõÎ|£ŽtŠXÅ1ŽÑ 1{çöÛwâÒ¥Äw<<œ2¦×ýвô=.r& L|*Z뇑 ‚¢b#}±onoÓé”òô¾qÌ ÷vÂEz qЛЀó|@rD…mZe/¤¾xt X{wñœÃg]¦‡ƒÊŸlhÙóOWˆc°ÁCíÂø/Ân‹š¼Šü‡¯:tÉö«ÜµW;ù6&ÝÄ ŠGòß÷|¨ý×2ŽXþã'øñþ?ÏÏOÃÑñÙñhtz¬ŽOÁÄŸŽ¦œáÇsž2:>=ÏÎGȦœã”áÁ”cÅKÑ*'Ã(ìÏNN"·Êqû”c™28ï‡g'ǃètð±áh8ûýóóþY±ÈL‰ê«œb磓Á ®‚m겊?%ê+ºüËSNÏúáI¿ß?99µSWá:™¡ØÉ NÁ“gWás9‘UýaØŽO¢³«OéG§!ç~¿°J ±!Plt<<>ŽN_Xå\1 pÊàäì8<õÁá£)‘e˜g‰|zÚ? O£ÁùÙð¥½ÔŽò4:‡£ŒNúƒ]ˆ|qc›’Ë&‡J>~Ì“…Qꉵã›;Vc‰¶ÂxÕ&¶œÊš:#ás¶‡!æk¬œ>øJ68‡Ú£®>ê6¡]}„ª›«+uñîæƒMÅ’Úï‚iåv9£ëÝ—GètÊ¿%눀hEá(RYlƒF¿»›Æîkí½™ãeåšåŠÝ‡sg$R.S¥¦A´6õk“Ù…ÅʆÕ¬ÒÙƒ©Uéj]“Œ^¯M9'ÍŽ‡Sê´×6×µV3CkÃ~f~ª°¿K¶öÖ+=™Œ_¾\ÛÉäø£R—5m«sïÔÚÁ :¶ãM±M±, õªhp3x.G¼Í•^wH¥yªMÉ¢íl¡—“sàÙ‚µ'ê‘,ñ b"zLÇ##‚R?Ý~UQйjNŽ´QÿUŠ ÿ@ÿ£µIÐO?üòëãï&½,©L¤˜Œ £ Ykçr/ÙO ©à»(Õôövú>Qÿº¸ºOÔ»Ëû»Þ 8?²ˆƒ'YYÑnµë'\)4à>ênCv:…ª_ÃQ:oï›ïTrÑ>ìD¡Á‡LPw&: ®ÏxŽoκØóø¯‹’]svb À‚@]DYt 'MþQo‘ä×]DO;yF¼ÈŸþ§ðë`¨Tn59¤²ËJ΋j.›Øä$XR½À²™­-¨ ©AÃ^زñ‡ ¾Têëƒm¾‚-_«×u¦Î&o&õâðéËȸéð0ÿŽÌ0Îc@‡’*’d4ü¤äË—½ƒžÝ”TµÏ)˜x裰Ó(g&Qvt6ÕrË7ÈyáD‰Ð¹]È&Q¡¿Qt!4 æl¬ZÅð&éU~<ä#ɫדc\è'z•ȳáÙä8=QÈYJRë]—Ó!¾©õXÒRã‘;M¹x)ÏBf?³¨§Ï8Ò?Œ.Y ¯ $ÏÔH!ò)öi˜žúWOñ;Ú9°ˆN` Ÿl|²ï­<v IÒ‰æE&×Fª+༸óÕþî„__ªñÉÜù’?_´G‰eF㿱Ðh<êÄä ±ÐÓB„žz]tàXd6Æ‘šG£É„c3_n+R[Œ¸2…Š´u w R‚ö Tè©xAÜÛ$m§Pó]‚"ø»ömKƒêc—%×V.\±Ü‚µ•Î÷•’ï¨=£ÚÑîJVÿåË¿ OÔÄxi“€™`)ö?Ô\ˆ µBÊ€¯¶–@"®61‘ ­UfêÓmÓPp]…ãNÇ£ïUd#î…äºåб™á˜Ži5ȱ&bDTÄÆCê_@~b¹ö”d°®9¸¨J‹+Ò÷ß  $Ý#TAv¹ýëÆ=z-Ä©À»pØ~ªCLKžxK¨£–Æ¡ÐS=õ+½6ÂVÛ:'å/Ôz¨‘TpKs¾ä¦îÙ!7‹Ö8xMHw¼[9^7ÿ “K&28%ú<…®{~8EÚÁd¬B8 Ÿ7Ö5žXqÑäµ]?ÇdžG™ŽE÷46Ùe‡Ì ÇJóxÄ<:d÷ªº¥Žýûv½£þ”+½¤Lë»éÕÛžiRÛÒÔŽz.&ö ~/ìûÐlKK-Ëw±31! ùd2NÖvr|úŠÆÊüÖX¤üÚ ²CD }mà4Gx=ytÿpEIÃ1Ê–š•†K9)}4z²‹ø$uaÝHiwz÷ZÒèu* Ä`E®ñìЭSB.ñ³\×µˆVêú6åîõœƒe}Ó+ý`;Žè:Ú–VÏœdŸ'H/7Bbô ™7[IÅÊð †&T/S¾e„ü‘1¢†) ißÛ¢ßxJ>……~` Hþ½¼¾;òõ–ˆ>+ÏY9<€«m+QÍR2&eøW]µ ÓÏÈdD1kË›Ä3¶'ºA „]h\Iìt¹ÝGsÃ0K˜ÎvÄ øJ^F”ag¨ßlTW±ø ?B<Ëò uº/öúY±ÍætWììbc(<îEñ€4vŠ£%ä=èð uíôê ƒø»Ôæf+ŽmºrÆÑþ¶èNQuº.Sïø®Œ»¤@—l ZïÜ>S¥–”mÁ“.í’¨?í…û‡™© ñ½G×uX‡÷#ÑsöÊÃaýùUB0CÃ¥O?oVævÍËÅ– î »Bwš5uŸ2¡É] 23NcÊÛÒé7É·§ß%ãÑéó˜©É·„h,> ƒwyæÒ¥ƒt·GìÿÂto}¸ïÚWÏ+Ïfš\}ÈíÚ°ÝXƒ^g™Pl€TžÉ¸ff"¾Ø-ëPGzÝ7Í`ïº5Lwñº°ýl·…„óý~–˜-¨J—a:Ľ~î:yYÂT4•nY‚V‘‰­2E¥mG½W›ÂLHК¶OW2òåC7†åvV!œ»˜³r˜hJÝZÂÔ¸‡_(l‚Õa‹¢õjØðlpüB¿èwy ïãIB¾¿: £Un[äédB ÆA|a~k_ȃ¹Ý´ÎF¡Lµî ăðVÝT0 ;(tÙ0·e13]RjáKjPìK:ËÜ5trêã-§ˆ@ùü’žÀkþDP¹'ð¶ÚÀããÑÅÑø$ݳ‡le{ðƒóÕÁ³„Éek㕾R‚%(6[;£ÝFi÷éýͨG@šoÚDî×ø„C§LUQñgÌàýÚ¡N9®)<¡!­aj(såäM÷q¡mFü˜¸jXËCÄ~TùLMå;X;›ïgh{9h¯ˆsp¼Ão*É<@ÿA úöKTB\gS;vóq_Øß{<ä’QM[Ö­Öð’ëÈÁ¼Û«Áî°Û£ôlh²"i!ʆ!(öUw/§A,t‹JîDBÞóu{<7ø—/†Ú[(é§Ÿñ€p" çŽ?‚UòÉ!гÝA€8JFsM÷9(äðý%}¼¥”!¿ô?¾_t¨î©›ËßÈøVîm´æíûp¨îêÚ—ô¤e«2ë‘8ã×ÿ¼¹¾…;„%µ^eû­ó¼‡þûƒµ®P6ÏA{xÎÉAÀÐŒ»F>F®§ Ew ôKüÙ÷qå`MŽäÞ¨ˆ†ÛŒ×¡~ŸüþÊP@:ª ¥“}= 5àZ—ô\¨ô€$»ðÈþñá|Ú‡â /ÅzAmJÀL.úâBM¼»–¯Á‹ð5xP™¨k1.꾯L¾FYÂA¨©Ì^Æé«ôDMQ;r5~•ÀQcxgÑýƒhûkçœ 70d700b958da3900f03042704e1d1a16./proj/rd/eric/funtools-1.4.5/man/mann/funidx.nfunidx9€/Funidx: Using Indexes to Filter Rows in a Tablen‘¦kxœíY Oä8þ+¥•fRoH¿hh‰“˜öZÚ…°/Í;q'Nœµnú~ýU•~3wšÕÜVƒPCb»žŸ«ì¯¯Ï¼¸jk•?Mág§êfu.Ÿ¤oàJi/-Üš•Uƒ€{1×î~¿¾ùénvp_*¹ÉÚJÖ2S{¡j‡][U®Á,À—Z‡bTÂ"“°0,›Ú(~®jZâI‡ƒ•ò%¾e[¸¸¼{w;ûé~vsÍözc´‹æ\m$ ­I–ÝØË²È“¹'µÌ¼Ìa.~šš-[ Ý¢6´ÓÔЮÊX‰žè¶ªYMB ¼•™@?ø…È|+tôgç0™©¥·²zÝåih)Ñ3¹X¨La¤ø»YI|×ãPð ¶@"Ñœƒ²­s+s6ìÇ9ÙÅãö°’Lžüe%ÁùÔXéœBÕø+EV’Õ 4E<¢Å  ­P•L0mÒJÔ,QK×6±Þ…˜G;Ⱥ‹¬J…R…åtæ Zo*´#è¯!o9Û¬bÐѳ[±Ç6×m5G›Ñ7²±sÈ`ÀDˆ±•Ì&­‘¨JÕ™•˜5¶'`"ßQENb‚ñÓØ<È­DQ+ßæ›”ö —¬sšÓãÔ?ePr7ªÄˆ„4Öh:nÁ@ùa€cü*XĈ¸2”Q5 ÀˆQ[Iä©" QâÈ(ÛB& å1öñ)lMیВ° WJëòk¡äÙJp“£¿–’ }‰E.(¯„ÆÀälÛ~zvТy ðØúB&Ó_ôhëξ²f œŒ(ï¡Ìð6 Ô\áFa•“?1I;zÐV-H¤/ á¥ðÝ$ZÁÞQÄÉÕíJÑ<Âw‹ÏˆtA !=:ÏÜñ$ Q¼k… neA¶n š×»±iëwo'݈(çL¦X<—;®5A)ÏJ™=ÆL¶Ä$bôökƒ6/…Ò\ô87P¨%ÚôÅx #…¬¥ºG38\µÎSh:•«9á7‰Üzô v’Âh…·-F¿ìjÜ* ®6õwÝæ}Ej ç×°² +îýî9¬±Ç5A~eðÃîÅœ„퀻–!ç[© ¶¸µ0ÎT’•à㶬„Ú“qœcýq Ë a³öh‹¤Ø"r)Š›”bÞ(ÑQ ̹v†^ÉOi©I‚_7¡ï¼Üˆn}ô‰4“¤ŠÊ75œ‹RUFØ+,TY¹ø¶uÊ(£)ƘjA M+¸Ocšp’Ì?†QP3÷öQtè— ÜÔ¸qÂŒDó.Æ|mf¿Ìï³­@¸Ø *YfÍRòq‚Ã)pž6.É2¸’ÀËſͺr;‰Ø‹'d.ñ¼Àëº4¶ +—Âf%Ÿ+ ßÏÃFkù½ ¹ë$0̹1,övùASŠC(í`–rjħ\¹þ;ý=–é<`¨%†³´G¹œ·ÅY¿‡’ÎÃÑÉ·ßfÊÂ(MÓðÑÿ$ä›'XÎùký¬Ãz ðÝægçßÝÿ†§§§Éè„×äd4 Hë×á¿Üðh [è“tâàxŠÏ'§ô8yóŸc´ÿßÅ(*“Láýìúâòê?ÓÂáéu Oïoo~…“t8IãéI:Iûƒ“°æ×ãÉxr|<žŽ'§ƒáx°Y{Ð?œ‹C©¿=ÜÜ>ÜÝÜÞÇq­yüÙÈÿqR¿á~2·&CÜ'ýiÿ49IaŒÞtêgg€ØvzñøÏ›–¯,Ü7øÑ5 Ïo êl2I?¹éÔË=Ç÷‡?Ó•~þË c8N±/àŸ¡ƒÉtp‚ÿÐãðóûÂhl 8Ûy<žŽ&Cì=çMƒ§ƒÁ(…³¿áîqxGþ|Á³%-=ª¤-äô£j^¶^p0~Ñ`‚„ÏkAÿ{ü|þÃýäxÂ-(uN£dr “äôMà­*eE¦»kâ3Šì€I|M-‰ocë0 éšä7d[¼½D"+\‚:ÊŒ—tL  ´)SnÚƒƒ%á…Q ‚÷÷ƒÈ§Îh_b%}irVÜÖTXJ¼o¦GG«Õ*ñs+Ö‰±Å‘© ƒvQ£=¤é} ðw08zËR™][•(¢°Xz­‘=Öf¥e^Äë$ÞpE.“ÃÈUTRÔñ L®~uÃB…Æ=—ÞÇ—‘™xñMà©ñÂëd$x]ñwä÷â*:0_ÓÛ^#eÃéà,Š))`ª^½”ù! ÝK·ÙËÍ*+”Ž—ïM’.pµD”EjÁD^OvL|¸».$ÞqeíBfMëP¹ë¨®ÞÇùÔ~JA¤äzF$«:Êm—ÌÙ¬ÄKöÍ•·–øš5þETj) ¸·%å?rhyà*°P38w?ûåüþ^*kjFúKq´ªÐf.ôîÄÃ.¨9llë›s\š=–‘‰ßÀð™6'Fq{ˆ¥c€ëÀ¯9åÀ¾æ-Ÿölëþ¯ŸvõâòíÏßÔÏþ§ý„w­µ’X»×ÏÌâÊØÇÈœ]Íîïž}Å0+>±ûކyÜš2pž´<²¸òi3ƒ+ :å­ ŒX¥Š’Y6‹p^^Ð"tè¦kBw——pþÃÝ ÀÜVP*°ÖÕÊñîØ|VJÝ@ƒ¿jbŒ’1œ7Vièz¸‘ûýÐLü}Jûó*  cfa3241d92a0cddd6f2950fd6bdc640c2/proj/rd/eric/funtools-1.4.5/man/mann/funregions.n funregionsŽ&!Regions: Spatial Region Filteringn®oÜkxœÅ\‹oךÿWN¹’ê˜âdW–J'å^ǶŒ³M·Ê^ p€s3̰sf Ü¿~¿×yãG[i×jˆÃœç÷ü}éõàÓ¥RwznŠÜž©Ñ*­LšÉêƒÉ*]š|®F¿]ßÜŽ†#¥îƪi1©—:¯Ô¤È«ÔäV¥ÊÖËeZnU1SÕB«ÚêR™æÏÒ‰V³¢TVV/yõ™_Ý,Ó¹†5ò©ªÒq¦mW½¿]Ü oï‡7×Êë`bšeÅ7_•żL—ª*”Õ™žT2ÖâqÒœwPp†Çãw¼“jëî¼›¨/ÇeºUúîd;¸ ,8ÑÖÂ5pk–+<×ÅRW¥™(»HWrâqQd¶˜˱Éá ²+é*õëBçá @=>¿ž&ªÈ³­R+³Ñ|]Ô°ÜÚT “# ­öÛ”ÚHO»² \àp=ºâ‹{œ¸È²Îà~éîºÊŒ]h¸þV-áúteY®ôÄÌÌ„i[ Ÿ ðXc+šZäÄže§“Áz³*á¸F¢Ö 3YÐÙ÷™0áá(x®rŠG¢ ª²Æ#ÃòŽIi6×ã2í:™ß;+<·…š7I°‘«(èL‚¬˜¤Ù󬽄†¸ÝÔ” ræØ}¿]ÁrY¶MšéA—¯àÐ,`p¦É7]©¼¨˜6éj¥ó)<—«[tž.µS¯iZ¥j¬q®g晞ݙ©ìïSN2Ý~Ýë'ø§wrÒùªÔ°"þá%Wœ…½®š9šm¦d ·g)@Ù[¥ ;§Jí_!>ÍÏËm6ø*ʰ#j"‘)Þ iE Ç^¦y®ËÄmìl‡¯T½Ri]K˜BÄѹ?#Ž*€ ($p ³¯˜Lê/Tõ|­ßU·lW"Á»P™ó‚ÕÜ‘’´‹¿Hpf&¦Ê¶Aà.ƒT+õ©²ð¤ÌˆªìkJro¬ÂU€æs"«ê¼2™)ÂY8R)]¥¾éítåü!Íj½÷/Õíva¤ªŒ§ïÛ`ák“O²z*4(Ðþ’­ "3ÁåSm'¥YUpVõ3=‡ÙŽz†÷#1ˆ)Úïej¿©6иbãØz©†—Κwh©ÊòLXO§`ìEpKbó¬^¥eZ±¹ÁïðGýÎSÿ¦ö¾& ßöá[¤JãÆñnø@¡€e &-6~Ä58 ÎÙÌ SV‹b…üO³ÉdX龇Eç9œåûã¯t¿v^/U¢øöí¨›Û_¾tnnûò-=lÝ~b££hþPÊ¥¡$©:¶`ÒªGên~| ¿$x c!SŠJ̨Œ¶O^v8?/†Nè°eV”çà Ôà/Ò1|¹¿!¤À"—ì Ü-…ïr½>&åKp¨ÕKsŒG@ow‰äc; ïÃoT iÀÉì±R( 賩”@j»ÒØ`×R¯VEY!`]e»@#Δü¤åœ`>` ü¸Ç/üÙ¾¾þ|õy$ó6XOmåoƒ¶úŸe:55°®Â?Ô»›/ê‘Y›µ™‚ÎoÚÌ•j§¨<Àÿ‹áÝÅÕåc³Ü—WWÃÛÑå\ûÃðòê½[:G.©«áuج§¶=µé«m_©Ûᣇ åzü޼^ßï®ß]ýöñìÁ¨›\mA«‡àû§SƒŒNöŒ¬ƒ´€sôª¢¿26eÊnÁàm›wYsø¥ìÝcp3Å{ò7ŸŸÏŸœ÷¸Tä翃Âuù5È!d  Ùˆ¶ª­l‹<°óñÉY#ácX~ƒhÓ&Q;¸5\Xîš ÁM"üAkçu†RøÔtèxó+7¬IóŸ"Ä“ó_F 'îOË:Õ‘_NÝ/¯;ìg^¸J8@'VŸGÔ亨I¤é£ÝX#ÄbܶðfR«-9îh'«ê}è-M!“mrøu)à| ÜŸý‚?Bp»J‹ÇØ WF3¸™šÙ œøM1àmDàZ+t-Ú¾u Ã×ïÕ€ÝêpÜKuj·{ 1P*p£ ì½ùo0ü‘ÊßÂ6æ± ™C꫹d+âQ‘ !àÆüXSR`!Øö@Ý™£Ì“\*œ”WóX<:Í9Ïns8ë"ï/Éosñm¤4IYÀ€öí/ƒävØ9—4=ÃïßIÞÃ1øô}šŒOH98‰8Ï 3ÐPòjï‰÷”ËÕÕÂ醕\€*tqjUÌ5ef˜ïâ8\o´]Ž‹Ì™×zBªO?ŸÑÅû¿ç^¬(õÛ3Gòs¹q9*#) gºŒu|TG¨ÍGGÎGåS7{(.J¦#C 0Yº-™tøAMp?m[4|ü­[- ¥ Á¹™ÿí&éMó¤x4ŒÁxö6¥?ÌþÎå IøÔÕ8æ‘4³i¨lE9E‹CÆCã„TRÂ`‰1Éä­”™Jòs™÷8Þ€†ªïòÌ 9@ddFª2=……±ž¤’þ+5As ‡-`ãuQ~£ÓÂ6€¾Þ¬"‚’e|‚ß‚³wIö c ß–†·;œ:£t4Lo<·Hüˆó=C PqpÜ›3X…VFj¤ ø–¢¶ˆû—`øÌª)ÙgmEìBŠê0Ùô\¶‰ê¶Æâˆ›Œ†Ý’`Çã’H7w^?Éî ‚q O´7œÎäXeXºž¨:ÏÌ7í3ڔȯ-›Ä `ÀJ)?)É Ã²m°ÉeEùbTÇ^æØü;¿çÒ¶1¹Hye$‚@kØ~Sì,»’‡}²œ–ïNONüÓ§âÈ /Æ*žjzpðn¤LâLJ>ÁÐnl2SmYÈf”fŽé5¼|øbÙÅ'd÷$ÈÆ¼;Z"mÈÒLR‹ “Â#ÒS´štó)A ÷­‰Ý•HCeÝ`Ép1Olô֛̔"Rx_"£ÑƤ¾âÙAí©<ú ý–Ó‚Ü:žl]šJ{ççG˜°=yÝuÊ+ºcµˆP2™u†¸¹NÁ›b ’O ð ÆÂOaPû¬„Ó‚=éJ w%Ðíð!!"‹©k,a#`3à ÉðÁ¦”¤–nƒX©Äô3£„Ž×x ‚&[GNí{.ḑ„Kæ×`(\tæÜÈXÏ€"¯öY##Ù kˆ3å¦õªå"‹,­¨*jÉQ“GRrejX‹·p6ÍpxÊ^áhä¥-í#˜7wqÖÒäÀnB†rx7áL«Úœô9„ù”|t@øãÞiã3F"ø\œÊ…PºÖàêÊ3ì7°A %m·‹+ÔEª ÷“¨³æU´B N<‚D\ƒùˆÁþš¬­6¤K¸xé·)xO%0›Í@¸}ô˜sÊ ¢ªµ¾k Ç(ªÃ7I«½½X8eX€A,—¥¶ Ü»2vyÒÝâ:H.†ÏØ…+î^Aà%KŒƒ——$ÚðFZœ¤×VúøtÐ]‘Š0~¯CÚÁîlJx™A1>xß®ãÅÆ‡%Y = >­ËÆu–ø´yq:« *mv¨SÏÀÀŸááW,i2Ù9™Ô4ä;°pzSù ˆ2,(a$xîhV‘öî{$Å(Æ3~>"Þ¢VÆMHyqÅ\¸+°@˜ÖïxýÞÑþÕÿÚRP†!Ôf£hó£#Þ ‡ÁWø{{Ddæã•Š'ÒŽIØð‰‰I˜÷.øŸ6t)CîW0y=‹-¥vÄóHb*R=¡v“,ÚaŠ\ø—ÝK£ŒžRÿž4TkŶ¡…–’ ý鄯ú'ô¿ׇw\§L'J¸wRµ}´Ñ‘´méƒl€(1€è5Až€TN“ 0“¢D-u ƒ§Dœµ‘Q |"pŸ_n0Æúí†Ë5\¯ãïöó1 v8…ñF! È9&LjxßoËh£á íÇ×ê<¶Ø½Ç ŽtÄžt…îŠá¼Ò¶ !BÀ†S¢÷ØVÛ,º*‡ÃÁŒÆrøõÇã1À˜Ü{C¿…¯®GvìEù èB:ÜÃVi sÁ… H± 8‚9ΉûˆçÎ#ÙòuÞ®ö_ºMŽŠ$»Èȯâ™ëyͦá”ÕB;F~›÷н›ô€C±8c=$ý†õGrçñµ];%°¡BOµïÐEkà ˜Èg<´0ór.Z†Éåêw’õM`‰LSß&æiK6ì *¢Á‡,ð´§!gXnfåZKĹL« c|kþ­÷ÊmîÌk’6ªxrÛØ!g§ûT®ˆCQmN&F#(«ÓÁÂ`L]òøö{N.Í·ò4(qá’ÓÔ Q 6€#QŠ(LšíJ‡žrʵt3Y>eâÛÓžÙÃä®ÕÚ­g.€‹z%ñ>V=XL޽»ÔÀÑ$ N(V;Ù¾Û=¤Ìš ôQÞgjì .áÙÛ:rH#zâ¼n~déÖôÜS™Z0“užǰkdW²o}º.D éWGoC; ,/o1° œÚ·^¨éþbŒÂƨÒjQpOmÔWèîM…€øÁs"îßü0+µ@*pØÕ¤«F82šyãõxºí ¾Õu@ú‡;Ñ.ëtw"iÒUh6G¢ BK(··¡k8è¢Ü-§ÅýîE”Z¥TÊŽ%>ó½ÄQç¥ ÙÞ €Ø¤ò,}L±$¯:Ô›Œ£ÇÔf,O_Á£“äT\;#6¦t½6² >^>6Sø-ñÿ‡Â|×{ûúÄ·ß¶‡|@^þãu¢þÞ?9yväÇÁÕàâ~xñܸˋ+|éÙqË;×SI«ë”#aƒêÀ7¼ z¦¥ZO,‰Š|ëÁ§Û«á‡ahY65“gè;ú¾ï/ï//îoþØì÷0û=αÀãw·" a#$qpî8!åohvÙ«?ϲ"­ÈIJË‹uöœ‚*·ƒWihÚç”d_ î¢%ùè¾zÁÕðj÷ø^ËB‡mƒ"ì ùs*¡ö?~õ¼gå>žjzd¸m5–hAC;2Ö—¬]£íkÒÔ˜»¯W^I[K9&ÏüظÇRuÏ΢O³X²QÅtÚL‘æyS7±Ü£ô¹¤O"¯ç î,·t îÂöo‡Eϰ©Árý ž´Üà´œˆ{²{Ëà̤VžcÿŒ”·[‘Ô·$‰ùñPVg¹³d‰ÔT1óÜ))êU*¡ ˜w3œü`RÙPœa—åSà[)5¬èã7^þ2LùCØâ¹äC ò–TJ{ #€ †  Hý¿âV¿CH¼k`üý0îd%ë†/QöÕ¯E™Mñ¹7bLC Š±Û²”WB— н©<<Œ¯•¹b¾¥ l–¬1 îV½p ‘ôá;Ú¡SGB«¶/uw¨È8œÍcê+â®÷‡ŠÔ?)~q=„ab@½OpAÑ›×pß·¯ú'ªÂsÏïæ“k@^ôî7+ ëôn[[U«~½¹»z‘Ć;RezâÓ<òž$²×ÄŽCR6ÏF¾ƒ$ìîÐ;9ƒÿðgý>üýê0CöÔà¿©±ê„ÐW5åÖH¢@`'{—ó-ͦI'¥Ð›TR=o8@G ò§I¢SëÞu—·¼BÏ45yÂ=]»{gLTÙƒ?ýDÉ[;ãb#Ö‰Zø¯¹;ÎõP—:ãì¦xÆ`_|#z-ìÛ¢75èÏæ‹Óçû'¯ý„bÎìÛéO®C4àõÛ³ÓWÝ·?‚ùþõg§¯Ïúoºoû d+Q½7øùŠêx u3yì%©ç¸ë*Ž¢Î õ›ž¾½^ÿlj:MîŸÈú„ù)‹Ø8w̹æF1uôðÝw”)’à ÑX¯bØsOb@.É{`z•|Ý*2Ð’m~€”¬œaµVú->Ê«4É^3µÿ÷E,øx(ùþþß8ÀÃ#7G——jp5ºá—t\fªw¼Gàœ¤ëƒW ­@¢PPLáz½îi÷µ¬J“©Þ)’¸×ÃN”\L¬ö¿à=ç e0eb7d99645199cd844cc7882139b4e3//proj/rd/eric/funtools-1.4.5/man/mann/funtext.nfuntext(,Funtext: Support for Column-based Text Filesn¯GÚ#xœÍ\ oÛF¶þ+³j H{ŲÓ×€÷ÂMœÆÛ$.l·7©ë (Š’fC‘Zi[ùcû÷îw3Êrâ^×@ügΜ9ïóöøÍ‰1/Û²ÉïšCsÑ®×UݘyU›çUÑ®Ê'ÓÔå3s‰Çæ¥-rg.Þ¿=ûùâô˜˥ufVeí*/“Ue“ÚÒ™Ô¸vµJë©æ¦Yæ¦Z7¶Â‚º®«,wΖ lˆ óÍœ›'ÏÏO¾<={+¸UUáÌ­- “¶MµJ›¥E±1./]nÒræÁškðgZÏ7©3–ñÚ˜Û¼ÎÍËÓË 3µ%!ܤSZrk›eÕ6€¼1Ù2-¹±e‡‰Ûà¦wcsZšuZ™¶HëÄlªÖdiIÇ4yÙò}‰.]废Ùqø¡1ó¶œY·½ªq W™­Í·“}þ7ž\w+ž\†EãßêÙ”Ÿ2¬Àz™M'{I i²G°dnGÜÄ[»ÆäwéjítD‘nˆ£r'ÒåEž;‰¹iwÉ1ïw9¤`à›¼n\¼Ð4èjÎ_ü ûxc³´õÎ}_<˜áݧ#Áí@lI W™ifZÌN»JÁ`HТNWŽÙÚdgáêªU°àÆÎr:¥$v‚õ`&sf˜ŠÌ˜:½5ù iŸ;J"Öc_FÇ}Ì7·.ëÖyfç6¯Áq}v4¼º+ôê°)V¶äéÝá;ûé_ÉÕæþ‚«Ã°%S:Š(eeCªW™«pÊDaÿY²á#l¤eäb’aÊ£ÉÞÀ˜ U§ØtF"¾Lor¾æ¼*Šê–õ{ e uÐìcÎØ¤˜¼b»QØû¡·°;Lį¶N‹´ü¨ËÒš¥Ã$ ÃÉŽãRM 6‰,ó e‡Ã25HŽC˜‘×#EÆ Ÿc+Ç¢V@yž”°qµÍÔ¨âšF‡ú=miܨ$çíbÏÜxa)‹Äƒ€f©[æñ"mR%”\12¿€ªÔ {9$[L×u+ÚŒ<à‡àâl=é©€˱AfyaW–Uµْ»ušA‹ÀŽ„¹•&Ðä•}xU™0.Ó”ˆÌ’˜|eÈŒ±r“àNøû>¢ŸúW~‚/ÿ}ûç„~5ûcÞfx¾îðeH¼éÙž<<Ø“g|ÑÙ«¶h¬Z!س¶±ìÛ%®Åwa”•/‚#ǘ´‰î¡C¸ô` øx6SHÈè„6‘ìói Fß9m’prx¨ AMöäõY½Ê~ô&-Ú/0!‚õ±  ãŸälg$n=Jܧ0î'{ÉÌÏòy òBXКêc^ÆR+*SÛ±è8• é!GAáÝÆûæ·Æ_°ÎŽ ’Á`‹ï,16-óªuØ ¥ÅæÔí,ÂÌÎç°/0N·pÎ3<ǯlx©¢îƒ§0Ø Ò·”%?ä=Uÿ„°Ü„öÀ¹µ$J䨩ñ $1òêqlš7·9ˆ gGÀÑF°‚‚ÖŒ® &˜±n«^L¼˜Øå4äÃõôÄØ1|麰d§#¤Í0/ÆÁãGsLö¶yëYEÈV%k,G7mͱ¤Š1ã¾5"+†ë™ººr,ÞyŠíj¦á”„QÚf³¦áMU“Ó‚åå£ ˆ5Ã1;Õ²ºÅýÂ3uˆp)ª\¦Íý›8A‰oЙR–uÅØ,@¶’Ågl†P à¡1mB;€Éí:EZT æE#tG&ÇÂÀ±II2ZL¢éL™ç³|ÿÎz:@ÁÖá!®*N°Ø€§óÈž#˜ï @ˆ @.ÆÅ;»h:$üs?ó&Ãv jØEI䨖gN=‰áÀ‰1…ó5]p…'/„.1ëðŒ¢+„9=Ý0èÞÄÀ¤¬ñ‘Þ¿s+扈¬Š'|­T×ã8àP½uBz(«gU;•°¶%ŽuS:­ ób¹˜Ï]X¡‘s?–7Wdmÿö-iggb6é·}úvþ¼&_ѯOv~Ú[à ¯ÚÞ=ùºçãžû¨é¹ÄÙÄ©W"?SPë¢%"oˆ2–””Íb´Ý[/•¡(.&:zQ½­m4œWi| Á1H$!8D¿6Æ5¢0뻢CÇ—jQÚOù ôŒ9öÂk»uŽ‚ß9ìkaH>Íàh¬'qËÇálÙNÑoqæ Øf3x:`{v¾ O‡hƹÉÉ?ê–Ñ-½ ¯+g%ó%´Y­JÈ9(ÉIF:›ñã$„ŠU ÏD*¬ÞÁü«­˜¼š¯jE#ã8ÞO¶¤NÅÍìl‰8΢ÌoÏAlöüŸüù´uõÓ¢‚Ùy _æŸìãÉ`ëÑS«ûsà—d÷¡ô—ÊÓú³ìàŸ²M„zÕÆ¼iÄ‹Êó©>©°bÆ”~ÄX6«s2ø”í í³êt%ÙBaà7Ç »¯2kM„Ê"!„˜×ÕŠ(2N©÷Sôd^Öyþø­:!&ƒå¹êÒ&xo8rR³¼ÿ¬Hk2KF Q~ƆÑ‹¦>)s½"ÀÞ§n¼Íc`êýË*&[xhÊÊEés¹¬zH“º³t-Û‡ʵ•Èrl<Ù!™øxÿ1b‰u@$±ùGäQ0œîÆq²øH,'÷@|Ïɳì˰wkEƒÒÉA0SžyNú-¢<âíÉ€EÛò Tóé×:•¥9Èwg©$ ¶/* —¶J Qâ­˜FÐ#Ò ¸5Ùé{-ÉI­e£ö‘VwQd€ZØ|Ö•qKl›¯x­àd¼•RÚÈy_R\€Òb—Õv-«ÌŸ_^J±¥æBLÐKÎyà -G5ÄBž 4R=®¨©‰çÌ|âò¨×ÁÔü㵆€ G}ÝËAUbªTÏÎÈ^ÞZDZSïY\gÀe~ëé4$!Æ… 'ýº‰Ñf ÝøÆŸ/óVJE] cô‘©©÷UŽù2-GÊ]ü§òàÌñÅóÓÓ`¸k>G$ÎI-p™ªÇ¥ˆP ŒG,2ü8–›PÊróƒf â6e¨øi…±(u"“WÍ‘7­Ûb"Bâ"YM9à%4V ¹>ÆÑ¹“ÉHÄ€kO´ØK\Ÿ³¢ gË3Íœ°gŠ{|Ì iµ ÅSè˜ Ä·ƒÖýkÉÝ{q¯ˆŽ†¹bÎ¥ô«"¢±x‡§å,¿ó¬Tú@Ä -«Hjí¬ uÛ„|§ZÁbÙ©-l³LO¶ ‰ò> ­7TÎvGP²yyòîr82¾ÞŠôS¯~|~~üHRN~=y{y?B]V’*éJxšÖ5ñ¸«ó\®¨sÚEÉ0ep¾кÜN9WgÑpß5²&’‰#‰D|‹DS(ÍÜ(›7ùjÝl|ÅD¥ˆC Ķ» l#uÑ|× @Y»ÕYØâ²l¹–Œ®ƒ zBf™“^œà ¡HÏ$²"Ôõì@E_1”œŒ#ŽD Ãb—"µèœ{2˜0Øñx<ºö n²ôLp„Pflã“øØI²ÊÔW%+VÖèÆÖ9w—d×™m¤JÔUÉ@œ-š{ø_íZMåu`ù“Æ_g*rÕà&)Þb‰ë‰‚xrIn¹ÔE²­xÈK„œÌoúlUá#»"'“–/‡Káðhp%¿\SKÀûÒíâ””£¨ý™Öà©´¶¢Š]¯nä³DÆŸÔCûy‘‰»bܱx ÿ2]qÑïÍ7¼Œ®¾“Y§Ëù_ãëù·3ýc6ÑÜ ²°±-òáÁïå «sDÅZik¹|˜þ]}Ë÷-CÑfØ–RdÕb0Zض)+©ÈóÐu»«ýv.è²BMÉUN 2¾³TzúáUWmKr/P×vF™øü°ë)ù³®Bœ@(ÆÔ û<©ï8N¤(.2‹¯ÿÜ]éVw‡§ÉÿrÐw‹o]å‡/’ÙÝáI2ÛæL-wi¼Ð©…f‚¨biܤËÝ‘Ï)k²ŽÔ|²½Há°Ô?y2:|ÛGàIhžÑÛZ£/1º]²%”ÕåγÔÞ<ò4ŠQWø.KE/ÄÑ, £ñk; q]µ×…Bò?^KŤ.æ@È}äÖKyû‚EƒÕ2ïÅŒßòa¼7ºƆh½ëP†`]S¨´ù2¿—?¿9ù_`"îÁ{³xQmÀP©Ð{¯É©:+œh(¯'ª•z8Ôÿl¯ÄaÙ¢VÀ„|´œ”<®ž¡ Þ"j@ÖÉlL(1´„¹ênd2v׊ÅîÔTµO·²Ç$¨|IodÔû×u%-Ò”5=ç %$;MVëÇYÜ'c²)‘ê 'Œ¿ŒÄˆ3Š C½ÏAdíŽ ¶÷´t ŸpT©¥ãñ^«¸ÁÁ}eÄqGWåuGsg?1¦›F ®$L̆pà®Á¾”Wè¹½怾 Pš!èfûT΢{å ÞkÜëB`&ß >‘ÌHÂpt5hê÷ÌáóAt%÷º@üŽð¸U@?ZJƒÀˆëÏØâwÇí5·¬Ú‚âÙ®°µ…'Eè5÷ƒÈiÔãë|ĽEW¨}Ä-\ Ù##AU1Ú(Íçùš‘÷µŒRÆÃ‘?lºëÀ,%++øð™"ì÷º¢Ù#¸ºA"©¯¶øÚ§4¡XEl"{$±NÝÍÑôL9ÓÖtÅê-—Fû(1~NC+ã’Òƒ9à¬b­‡¢¶ªª{E+á16æ,ß61«<ÕI‹PZö ½M”ý\ñ¤u€‹¦2N‘øÙŠ[µÎ£ ®DA—´°By@³#”ù޼Iû‰”zA] ÝW`üÉ `÷绋DÐVrÙyQqq’ÚK”Ý;iT¦]ÅNÌh4sH6ùÀ´"ÙkjnÂ@BçÝø@K™®T°[8H˜ý²‰E‘'Ñ)ï=¸§+À’Îotp¹@$Ô#Òi3IÆF"Í]]1ПÔqÂYJÅih¡nËŒ3Wó/®•®1ù>ü6%V{„tÊ@± áH(QÄ…ÑŽZ‘C3Cê1lŒÌAöjµ^›¶˜2‡üŠb›-îÓt™Ùß!>Q’(ލÔ/H{$ á7 Ea9LEå™”BvU5ã.0IKÛ×>aîz›cŸ%tM¢ºåîäDÒg¯ \˜ÜÊÛ`ª´k^•Oâé‚ß§ùB‡ùdó•íFxÚ6’UúP#=íùìÆvßW|‹0dG“œ²Ò™VÉÕ_f`‘~ÚìààÞ hé`+²â»&#ÑÔc3B4íQPªðÀ)¿ËÈÑñ˜ë}µo]ØÌR*!~L±ÐcoC30Œ;G·Äî*ËÚ:Ž`}*“ÒŒé 02Ò.©q³­ )‰< ^‰Õ$-úñ2“-óìcWùà©ìËQàt[ú£eê£oV:wè=ñ霽]×–vg+ë@ŽlÙëúuc1ÚÏÓÄ»ç~HôGŽˆ¹Añh=¼b `/¦k< SI<%èLo2‰ýÜŒ*ãðý@'Œf ‘62:ô.šòrú¾ošû›úƒû{|éº{ÆŸ|‹ïÎÞѯ|÷€s¦ǃϲ§ß¹˜þVü±Œ´yÈ/²L¶îØûjßú 4äEž´²EZ›@]ËäÚAã˜ÒûFK‚æSŠ õgüx¢&œä—Ë ëÃÉ 9LC­Þ¬›ÿΣQ¡qò©Û’fvðÁi(cÔR,0™àPsÊ•{5dÅÆ lZ}® Æ«0½ÌþULáõŸÚí üj?Ùü³¡š–•¥½~Z5Ëø¼í|˜ºõòòˆÉ?ü´Bäc†/¿CÌ ?~XÁåÀ-ÌO¸8Ž2XГʩˆnòšŽ´ ŸaýU›ÍŽNÎÏÏί; çóbA’5<&øYÏ>à£ÓÖRÚøû«Ÿ‚—&†ßy`ç'/OÎ?ßüu0Ú67t/59žéÒb^±ØÅÅ"²[N»i"ûÐèÛi†o†D@¤¯º±/@ ã@¶ <‹ “ÐÜÁW¥3ßüÕɢݫÜP®*dV¼  «Æf@äiÇ=Æ¡GMÝÒl×SJŸwã:Wà}[GssAßä•"r¥³V(kZ™9ã’++w&»Ð˜=—Ú–*Öp–‹”ÿØÅr©¦DÔè1*QÉæÛ Ii}Ý„ßÇ‹´д…5‘b§TÁèY¨ÜqE§8Øxªâ\Í-z…ºÕËæ »E^’lúñp#ˆ=|‰Ê+ˆ¦7@DÊGÕ¼Ê9+iW¦Q´C‡zôÞd½¢ œþû¾ò^Tô©•B*ìG_ŠßLó20¸¯T @%¢‘Z5j{5£j4”˃ˆ;ScßBž¶‹Iä áç ™è"•Y[ëKvNÇOÊ%‹è¯im¥²Øûø&|,¹Õ©t).­H|Ä vƒZ÷Õ:IÞ„w?}§º Í^ì[Ñu'Ù#ÐÛr|èG®´oÍ£É~˜R¾òˆ†Io]³sÖÛw€õ‹Nÿ'{úæ¢ëaGžŸ½yþêøüÂè{a½G¯yóö‚›}½·JO¡÷ñÛ_^¿žH¡÷ùñë“·áÅøÁ§oqÆEaãg¯ðäåœsžËÌ´ FCù~®+Ђnx¼û5J1æ?`€³j½é¦~ܨß@äÂO”Ó×ù­Îð>š7–Ò$ŸH°ÝLùmiöh @N7*BöK0¢j†‡i0üKƘ^q e<ñÍmt[gíŠt2Ó·N¦<Ò}#Ä8TÁ„],ýÜx5§‘ùeº^“UcÚlEéá\*Ñ›;¸kAïxœ•ú.•5µõ ^ni]g€âÛ±·_ä/Íyt±—¾ààc¯T§Î½áì tµJ¢p%l”WŸyEä¹·öýav?Äï—~_Ÿ>}ÚýàdB²œ¦)/›N§Ð‡,£ u_^ œÍfqÀð¾ÐýJ²¯kK»gù 'v&„T‰>ªÉJ8};Zg`¤½[ÃøwÑê¼×jð¯À8o„âàu»• ºóîÝ;Qµ÷ïßãûo¿ýöàK$Û/ŒLDç™RL¦Éwß}ÿìÛï¿ÿO¡Ó‹‰uÏkúÂodöðY-å4ÕˆU«£µRxMo*;Ó1VØã.-§À.¼h#%ªÓ¯M÷^ññsŸêî½õ‚©æ3뉬¥àÈ Ëò–˜ö‚õÇ‹Þ4|Qô®Üòú3Œô¬¼ÇÌϳ3ð3È>Ÿ¯˜ ÆáýcHÊ/±@¨sxpì ¨ÃXL{йMšÿWt ‰ÓR|¦ø¡Öµë„ûx‚hJ˦lçUuNˆ‰IïðÒóð ¥Ñÿ[:Ѳεú.ºçì.†¢©!Èâ^®ÿãOy"Ä5d÷p[zÏк¬uNÆæONÌñë‹3ÓÑ>v–#£÷óŽáÿkXæÅ¶tb«k6“ñ³ñ·æx]ÛÂLž%fO¯9—ÿÙÐþÊÃ4™ 9f440598e0a91c6d4018063e2fe74f4b0/proj/rd/eric/funtools-1.4.5/man/mann/funtools.nfuntools)XFuntools: FITS Users Need Toolsn2˜1xœXÛnë6ýâ<%@âÓÌtê7ÇIZç$Aì¶} %Úb-‘IÙq¬¿7koR·Øž™‡Ä–¸¯k_éçÙ÷G!ž¬-ýT<-VKñ«W΋g¥r±¢×bùïç—×åb)ĪÐ^ä6k*e‚À÷P(±’ëR »skÞ{±±®:ËùÛâuµxyîuÝ·_*mt%K±nŽ·Ú|‰”zí¤; irÑ]êpµÌvr«D®öª´5Œ“ÕÓß/z[ˆG£Üö(f>8[G¯3/ô^{m ™·œ½LàêlèôÔÎîu®¼ðºªK½Ñ$=Ë”‡ƒVp(¤sòHr6î†c­˜°Q:“Ö[!Œ­tØx¶…Trc­ i „œwòŽNá`-µ ¡÷ô"ñæÙr¾XˆÌ–MeD.ƒœˆ™ðpÐ`¶S[r6å´Ùv>^e¶ªeЫƒ…ÈýO׉Î-MêOÜkà¤$à«•“p/@¸k –m•­Tp:¾5ù固¶.ˆƒueK­ËáZ #²I½,½m©ñ”ï¥É`~&k¹¦€kŠF“ʃ®ô_8&Ÿ…WÒeYmÔ&W$¸’ÆY„ …aÄé?UD!É ×¶…8“qœ‹”ÓNE݄ء@f8ä}–IÊ0°]­›ëœ¶¿†ó9è`ÑZ¨n@§nN3¾¾^|QÒÉÀí ÐJ ñp*¤0â–i„QAT¨¹âËDü®àÓyé(y)k‘¢¤š±X#Áªžë¿¶p°ŽŒÓ8ŸPÜhç»"‡Ç!^ Ý:YyÎ) ÿwÆH|ÅÁ[Ó+"D½OÔä¦#ƒ±l‰ƒzÎHÒL3i”p %!¾U¨k$.¨%©C&–ŽJÊx6ƒ¢ŸÌö*³ÀKsí¶ùH¢%åƒ,’ùñv#+¸$˜ýÕh$Ì’ÿ@ß×*,P4G»& ±8˜Ò‡\[´¹ãÚ*Hw7¤ÖqÃ_Ô„Ùƒ¥G{ç¶ÜÅ´êƒ*ž&X+ú®>àrÐ}(¨õp¥Â-£bÀÛ¤8°¡Tí%ÊYH„ 'šÖBÐÆÙŠ™7–ÌŠ‘¨Ñ0§Bü-ú.ͳ@¼¶1æ³McÐà²iODM)‚uEõºkñž8®î®ÿèE(3EÔÈRd ³:¿Ì«Ì˜#f Ç ^Ô… Ô‘P­2nݱúÈ â1·5ЏJD ]¾ÍnăÊRkMœ qæÚ×SAÿK nEP+{øO‡÷D>â/v=¿ô tÇ2:v:³#5`8’7 Å݃ 7Nëv.¼'Ú3÷÷w?žb.\ô‚iÆ¢¨Ýö¢Lê¿Öô&°KÃHFQD7õ§ÕÈúÏeƒðW-•%Iïã;Œ1dVXà)Šr'µu0ZÄó‚E0éH†ß9EP›¡v-ª-G[œC¿Ï©ÙØQr#ù=Jia;HO}D*–K”»öàOB7ÛÊY6UE>LØ«þW9«½…¦Ô ùL, êïz‹Î7=ékÇ4¢ÿâZøG|s´G4hš)ðï›6;ú~B6ÚßÔF9…v$~S‚þ2ùОõ»4 i}}©©b¦ot0ÂfAQøY¡8Z¼hÀ§ÀPÕv‹‘tÊöÚ€-ÅûÞŸ2½ÙÃEuX(®½<œU tŸ‘ðÙ ¾]œX1,“OupÆŠVÆÐ –À5uÊÿÙ†97œ%×è4Õj×…¸Ù¥C¯I÷†8A˜‚ÉÏÈ›eAïÑ@¦à‰ß.ɤ…åëÁé r[¦3’¿Y»k0«JþŒM)®b<ôÏhéÅFžqÁÏðס0Ù6E˜8ló{’xÇàsüÿ ŸCð*QK©«Öô’YøÛg­ÌÓ©=ÏóYÏSÙø› }ˆÅ×—Kã™ ÆÐ—جÐÎéã, ŸüN÷ø!ioó§½EíG“ö¼6޼~e<ïq|úlÍ-S¼áêüÈå¨e|:ã[úà$VÄí—¯\¬èÊtÅ“ïzHDÆ…øM«_µWH¸‰‰%ª˜Í!ëîK›íºw¯¡¶à>bšqg܉ÙÚïÒ3¾ÐEb€ƒ±¢_.€œîøqøpýô/út½Œi‰+Ýgʸ¾,h=KQÓùÇ fô³fÖ[üia¬!íÚ=u¢ú9þ4€ Šô;Áñ„jVn®×L$ã÷šy¿i1o^§ ïqÈ¥Ó‰jMª½I#Ø‹û´Ñ= wœÅÛì)ÉŠrpôüXP,¼Œ0zÄ2¤mùD¦z¾ïÚgªD))Û|Žâ£Ùkg ÿ–öLCb”ÙŸY­æ…4[õÍnSÞuî&?Nþ%fµÓ¥¸ûñFüㇻ;1ØÞ ä?ëñö 8d5ce92208f4f4fc963d98500dfd093c//proj/rd/eric/funtools-1.4.5/man/mann/funview.nfunviewh#)Funview: Database View Support for Tablesn£SÂuxœµ[nÉ‘~•o jdÉ^`pG¾°¶7–Ö‹ÀXšÃ¦ØÙa7w~H1‡ËkåõòUUwOÏ\{ƒœÙ§§»þ뫪ֻ۷wJ½éÜΚý\ýI·z¡£>âWõÐm·¾nÕÊ×êQ/*Ó¨‡¿¼{ÿÝÃýƒRkÛ¨¥/»q­*½kµuÒªé6]”_©vm”ß¶ÖãmÒµ¶²³îI-ÃA—xgkk³ä~‰O*ÔŸî^¸ÿîñþý;5$¬QêÞ¥-ÔVוv¥™áp¦{iVÖ¢e²³uÛéJ6Ì”-LAë–¦)kˤљµß+í–W ±ôU·qª1•)ùñÊV­©5]t­ÚÛv­œW[So´#ΛÖ×úɨf«K£tUùR·fyQ¨ÖÆ©®oÖ©mEq”Z±rPòj¶¦´+‹7ˆ¢fHDXûòÛÔjãk£jYƒ¼D2ÆÑ¯êà;Õzlnðöf[Y&Še^ ¢´låíŒ³Ä ´´Ñm횘i¼*µS #|hÖ¯)»Ú¶µ1åZ;Ûlfjq-M[[ˆ ÚÅâZé²4MÃT[eb$2FLJ}z0f®Ôºm·ó««ý~_”MÑ9»ð…m¯þ^ZleõÕë÷ßx¸{¸úp÷€Ÿ^㧇?ûØAþVWWÍÏU¹þºX·Ŷ¦Õ“÷àØ6e×4AÏxAäTüÈVßz_5°X¶s’·2Ï[^Æ!‚å=+wWéZD9}sÿø:SµÞ«…udüñ#ì¥n^ßßG»‚5™Æ‘—ÝÉnöQkÛÚ\6¦U;]uFN&ëCLÒÔDߌŸD¹â] ì ë ™Ø‡å‚^Õ´]ûîiÍ/Uº¥í¬°ê­…yU§L˪̦ýáP r[û]µc¿ÑÙˆù¹ÃŠL ĵkÐÀ>PVJ)a¾Ëܳgj¿†€øT½°¼›q+„ Y5vcI xÚïUŽW{˜'Ñ^ê­lbÉ?†"W·-Ì. ’Õíè™%;oÍsËêŠÁ¶Ì½/¸•'Ýñy¢˜rSeÔ%…ÿÎ|)EqX9½áíù¡Í’‡àÜÀ¯¡iõsÊ>T²6¢¢@£òï£naõW…–¶Óu ñºBxueÕ-£Ýô¼ØanUHÒØMt-„b -]kã õ½üœ„–ÕfeXëº+,vù$ÐËž¦¦~±³¾kªƒ²+å â·©{êðV4ñÈi?bñ/불ý®²Ù[ÈÆ™¶ 1¾óx1‘*KFÝ‚0E†RDU³p¢„‰ |d3°L§PÓûV‚0HÚz9…vâ}»?DóeS‡gždæÏñŸ9Èà“µßÚ!oa`¼ úN—ë(€µÄyû7 ¸»ìõ‹›W ñ¾†ñ0mê dgž5nˆ×Àýë‘GðADË\åÆyíVâ çïåòs‹Æ€ŒƒŒX£^.‚Ú…Á[8NèÂ$›,rÂVV²ëà_’a u ?ÂÏ6fTαYN À± àŠ°ü*¼Ö–qÔYzä÷pR~ hkÅ«)B0œÎ½R?w¾•ÌÄë í¸'r„GŽuCÙb¶žPäy~9ƒ=áûš¾5þyqÁñRbZ\Çh•1±Yé®Ji?Ešª:$ L e„ÔÃVÖ̘۽ïª%óŒå /Ÿ…h”¼’ˆÀ#¢€ÛzÇÁ›vž¥ u*Jå´ú õN$¤%[Ã~c6…Á®eV¡DÝãš­n×1ãµdAÂËÕQn×µ1Cy™(­HB¡ÀHð™b¤;„(·QJ'ÄÂ`+Eûk0‚õÇi† R\= ¢ªñ=ó€$ •@wŠèÓæBí §“ßÈ8˜É9>UÁ£[þ»Ajä]`ÎR„û0QÉ€FtÊÜ ‹Œ˜-aÄ÷.ˆ£ÄŒ[!£¬{@À%U/ØA¹Î0¢éÓo² ÀBò!ªh§DÓ# ò¨{·ó?ÑÎz̦Æw©’rXH‰ù ξ€ô|ðõÁ;​”2 YoM°ùÉn>¡OVöYÅÇ{ÕN÷kÒÎ Ð?蚎*‡ Ež‘÷"¸ÚÍ)5õ¢L¦’Ž]Ròš²œ(æöÇã’ìÉ6™Œu“ÁшçL5QY12G›‚¾~gfâ~ä¯9lÏxP—+5áÔ39™š> ³Š,5éS΄,œcõl繺dÆãI 5•ð,<+×yu@Ü%Ù HÇàF×RðzÚ0€VU Ûð¥Ú<õå=U¹\ûº‰÷mŒ::ŠnÒeÑgƵ)ý“‚‚ïë|£ër*êØ+Ša• ±¶°¾¨ÿÜÕájˆ¿Nvò×/yié›ïßýÏÇû»ÞÜ{^4ngk︧¶Óµeˆ3¹ŒEqWÅ*0UìºðêÚ.—ƅܱ[»úŠê6FЬÎÓ«6T3™e¾=Q‚mû2ðÁxÛ®h%a ÚÓPQE½ÅQG¾¥&ˆÆ 8‡€¥7*-½»\TÚý¤w£w†¡5q@fG[¢Nq&J " °ë(Ý `g˜«^lëQIç܈Üp¯ˆRó Óeî$í«ø 5 2/¾Yô.OÉÎÔd݃¯Ï!ä·ǧ…”?´ä‡½XÞK‹àÑz ¯ií=™YHx³9îdÐë´|h¶ƒlË·,YèSÖ!J>ä.†'vY}!t CCMÞ<柕×zÇaÖ§ÆÄ‘ø¤, ûàBûäl¤×q°9âkJçbÌÞ\jô³õr¨l?Sq›¡mS7“ΈÄÖ%* †ºI„"±þÙÖ õÞ•ÁggÝïÈûúÒé³>¯y)^ºO:õžtîF¤ñ…¡œÂã> cµ’ÏW#Ü7ŽJ±d~¼Dêï{ݲ±ˆgçî[SF=U~± åS*“5a%nz›gòJZz14ƒýÉÒ˜ˆvuO› òdØ÷ŒðÊäø4¬Hð9Þœ|*ŠâG<®µ{B’…õ*ž‘ ö:ÄÏèÄYXþWe˜$Šy_Ç£OìÞ#%±@ý]sœ7’´]í¨>Po¹}ìNš9p(‹g‡“ß"%["œ×Ú¡,˜t)IP°È‚X O©m–¾2óœ‘u½¬´AÕ(kB7TGNmülöÀS.H3<7¶0›¼;pÁq„+ÉX:%‹gÑÊY}FUÙIY7fÐû”¦ñHû´¦® ðBý@V)|JyÝ—;C0“JCí»…{š‚H0e¥ìð±+•2L@*ý`¤Iž÷GJ=ƒ\ŒÝÍ((ŸŽ#~Éõr”C†vVóë‡F’Qã%Mm¢Ñl²´iظV¥V‚IùSøP™¶,²ÉAˆÄ¤ûvïÕGÀ¨¨NX ¤® ¤Ä–ŸªùÎÈÏ]¸)‚¥3¹çgIö½H{b}ì†Zêíæszzñ¯ŒÜ< Ñ@l?ɆÜD3Á/jþH(XÄêå÷!é§MP …˜†Ú| êö¦‚'uOÇ#É/pÖùó õðb?^ò|“Œ)¹/-š²ØUߨÒyëK.ØÃ©G-³-ßÕG­Ö‹SíÕâ*ë¯7QÇ-T*A6&u&ÃììV¨[Í2®EåñþʈïëÙóµÞj“Œ»!örãÎ’W’¤“w&‡ýƒzfÀ36¤L¶ùBEHkñSG\vKX¸uqê=ºŒ±bßNADFœ%œ@uØbº´UÍ]šsÛã¼ÃÙ€.RYJŸý¥¿·jq™ºÛlù£X‹Çº ƒ·GÙ)1!øZS=ÁÒ?žù:AÂ×ÇTá‰_áçDÑâ0 %•)qlw.=œ8øü,#Ó²n–ú{Ezó‘¡LfÓi φ13kŠ®-yQ¼H¡wÞ.Ã~2iEìýõŒÕéf‚~PU‡øæ{“ˉ܅KÊ;o§—®É)Aù“ùo'Ò¯OüË•®3dQôˆ‰lIýY‡¾AÖ©ˆYÏ£ÈÚѽÇ&^â æNE·ø+b·h×TVÓ¦•Y­q*?ä ÊYDÛJ²O$ÄÚò'Eз£IF0E¼yYœê–ñÐC‡tæpÁ6ØþGohÀiîMÆ%âU@­1=Ù‚µlR:¨Œgù¿z0G 7ç¨_8ž› G ¿4ž¾¡€ÙëÀ-ÓÍñ嵦¯´£fâ¥%nä˜/ †ë±,ÃÔ+§:ï§ç隬´N-”>Ðw±c3Ïz.Výú°d¬Ì£ÉX¶ovu­¿Î0š.¤xŸÅá›®æ`ødl:>z0ƒ£1Wºl§UJ;|¡Ñ¯úëOq‹ í—жX%o!@§;HZlËeYúQ(ßi˜eXxùsÒ7·½™êržº;H×»Y IôIîQ"ä‚§&¢Ÿ’Л6}ÒèñH”3u ”|½ö‚L“W0/6º1[3%Ê4ͽ˪֡j !»Ÿ"*m³¹cxM¬þCõs»w|yþ1k$ð'' æ<¼da#Ís«L)Bï±óYÊžÍxHžõq&Ñ'|¨ncÍV ™’^È€«ó­”Œ­ØLõ?(Þ :£O¾†Ö7ùQ†ŠÙ}„Âþµ–Ä/´cþÿû1šG’SWä1C¶‰ÕÐѶÐí‡x/߇÷]í!® ‘ÿ}‡ï³}ô"5D…všÏDþëE,5CFݱX+Î,ÿ*"œÉHl*ö's4–оsekV,ˆFGÉf`W€7ÚTAÿíI@É•¿1Õèž‚¡ú–ŠÑn»¤X4W·ÝS‡ß‘ëo^¼ø]šŠ\¯Š¯Õí¶¶•º~E¯¯åªüÝÌÔ]üÔÅ 3d53b106edc02421ded7c946db987f782/proj/rd/eric/funtools-1.4.5/man/mann/regalgebra.n regalgebraL#.RegAlgebra: Boolean Algebra on Spatial RegionsnŽQ¼xœíšÝoÛ6Àÿ•kŠP Ë_Iü–v) KŠ:C×—´t¶‰R¢&ÊMüßü)É%°í¡¨ìõy¼#uGžn¿øŒË[µÄy)¦ðNk…"_:‡Y!*)cRçf_?ÍîgO+i ÕÉ:ü‚MRÊ9¨Vs_‘(eµÊ°’  ™c ]Bi+|)J4†ëíÁow³÷Ÿï?=Ý?>|Yaîîù„¿!ƒß±$iÌJÔTBMÌ ÑÙÜV¾6Ì×­ë‚àÊUOââÑ]á­¤’2ÅôH¢S̼˜Ì6Ù\+ðÇ£¿­>¿5F'’Zø.« À¥=ê‹——Íç¾ðU]žëªþYÊ媂JƒÂ¾©ËEžÖ?í" Õåø’(êüw„xGl}Èü,ú®à‹È …p9$%Š É™0ßHß¹‘¦b]³Î(Q.Y& á™lNe&J‘RIë/Ü9ÌôwL©>³ÉÈ d.úeŒë$ÿ±>¶ö!¼¿ÿüþãÝÛ8Žø;¾ µ¼z÷ø§/F“ w/×B£i­¬XVLÉ÷ǃáh<¹º¾éwÿ:²PÇAuNãÆ£wr Øa { ŒÚØ`ÀNZÙcà*€½`o¦û׺ٸÇ!ð †À£¸Ýz pˆùâvûõNáv6À7#yЙNAs¯eò² §G¦hA-<"ø˜ndOí¯³¨…'Ó¶‹ ðU|ßÀÃ~‡ÀƒxBàqbÁaˆ‡!†XpbÁ[r¶%âåßkQVäá½ß÷ÑXè‰=ï=èGôûÖ{º¯ Wýh8é{®´þF™¡Q)ýüß9ïïiÐè Qw2ôBF^ÈÀ w!Ã.vñ‰åº<бéÚ¾Öy· '¸uÞðõ:½‹uÞìmw|ßÀƒ~7½†Ã:ïxBàf ¶À“ƱÑ_…ÀÇS°>™ƒð/ç}ÿìÎûéYÓ;¿”9¹nƒ‰].£R²0»•L¤Dh»¬6"C¿C>ùîãÇ­?çÿ7ì¿m)­È}ñÿîÒž?Í×<¯l×XÑG’¸ ž.8#ôì*Á™ikRŸPFïö÷ØNT¸ÎüT4wÂT¿—‹®£øb{zM§WV*û{B+‡A¯`0êGÃ~wG<æR:aCÁ&p×pý½2¸ìüp½Î„Û“ÁÁg‡ §À‵¨!€Ï"ý³²Üvèðê>í“‚Úºk‰«³uLÎÊ1>Û™ÑYâ¼ZçmsÖÀºÂ탪íh÷nÎlÎDm;:#?ílu„{ía?î~0LÖG÷°p­‘»I#š|—~RÓ3îèIcELùìÚ9ó°%v”JæÌ”ÛÞþœÛ+ù5éþ•Ig‰ë³]îœt–ø™&Ý“Ÿjõ›!û®…Â/Y¢ 8óJlcï[ù®zJlý¬©ßû(qÁqœ­ÆA),JíyÒÌîîàöãì`†ä"×yEQ…y›_Ø7’8P3»Âþ ØÈ¨Kj‡æÇÈ÷F½1ÜÓhh¥ÇüfËR¸¦¨¶_HŒ add3d37d6340ef15ca2b186e4a87134c1/proj/rd/eric/funtools-1.4.5/man/mann/regbounds.n regbounds.¶RegBounds: Region Boundariesn’ ›"xœ­XmoÛÈþ+ƒô‹ Ð:KVlÙmP$9`àÎ â ×CpVäJÚzÉe¹KËêëß»gf—/’í -ê8´DîÎë3ÏÌòîý/7D_ôæƒk«Â_óGã*’¯ª1ÚÓýowŸ>ßßÞý¨}Þ˜îmÝŽ|­‚Q–š¸c5ìP¦­ª «‹)ýxsÿñËí篷Ÿîˆ¾n5mœ-tEMk5­]s,gmlЩ6´SßHWm•tA«=ý¬±ìoªº¯õ~Õ8?©hvµ¼¸&ºQù–ê­ X³3ÖÒJSÓx¯«r £Ê½¶¦t0>ÀzY=e“§R«Êóí@;Me ›x]·–|]öU&Àí?ÁCý¤ÊÚBµY“¢Ü49\‡T, ÊTÐ ûÿV­m=ù>ˆ²€x™ªÒ 5ª0xäÖr¯[i¼|õªÄ½øùpaT–ñç*¹ŒgU”>˜,)»S{ÏŽ)ï͆í ‹5ÁæpiRž¦ D/²©jËžAk§Ä0$Â6-÷Q…þg‹L‹ÉmÙÙøâ^ÍyLêÖ{]«°{„õW8DFÖ–¦*¢ */¨*4P„¤­ËÕà°)ÕFSmž´ïÔ )i€jÆîØ}ÕÁ ½–t­´u;Xq+RFÈ¿–ð+k÷§~_–:4&'¿U5žMº\HòLFÚZS{}A-êÑŸEã<ŒwyÔ@gCâ¯7…o{oØ6Så¶-¸â"d•õ°¾®-ÛU¹êôU˦ô+£C¥p ª€Û<Ø}ÄË .†:.Ž¡*±%´…п‰"^ZÔ[éýGÊ©pb^èìàO¾÷’b |_Ò$ÅI'Êʺ­"`òl\m;†RªšuãJ:ã¼Ï²¤{‡¤lÐ1Ä‚Ùdk Ñ©î´=£Ø¡’:ZãÜÕf³]¹ÆK®´ïp«+ßFö ŒÙ*âœ3U£œeBaÑ3ξ+MzÔa§±s´¡+ÀŽ÷†M¹U¦Œœv®[ÈÕ%xìHøÀ9xªü|ø p1(PÞ!ÿ wPÓε¶@W¨k]Å¿‚I ÅQ` ³^#ÿ’Ã2_¹§SÖÙ›3ÀÞ “ØS;/¼ §TñÅêNUBn}MýïúÀÐgA Iíì~ƒ¸elŒöÿ÷r~^Íß©äÿ²”c%½â`ÄøÚ!¨7Œ‰Wr,æÐ©múMó±ƒY½– ÍQÿˆŽȨ޺Ñ.êK#áßA88.h]°#äucU Y_@Ý'÷•²û?bL†¹¢'û„à>VªÑMuÝeËõS®ë0ôfš·V1¨88ìp!…c“â/AN¼1ñ >°AûZç1øGö¤±Ï§§n`ýV=‚+ æ/ôµŒÖÖA)|¦ PÜ!èãèHq'ÓþµlÐ7»WðÇåÉ ®!f-èÑDð_áð¨l«ÓŒÃÆÆ¸°òÆ<SûÀÌô¨G±Í˜‰‰Gd‹O£A®ã³äÇ«óÛ«ÖÇæ~4£ŽBa‡ÑB3樵s;hxZ£ºq›F•>ŽŽ#‰I»á«omð‘¾Gëð4 ¹°  # #$ºŒ¯ÀßI$³6‹¨Ãáhv%Ê>åzÜœ*0-Ÿ»Y9c)‰JëüszbÌ lY³?yéürXg×ô¹A¢¹^é£$5R à‰ß\#书Ñg¤< '.¹VU¾ï;VÓVRëÅNFâ•©‘15Iûh-G¬+7‰°,ÚÅñp¸„Û†ñ<,ëÖ΂ ãK'5hfÓ5°ÿæ¨}²˜Ï®²óåò2»À¿³“ßß`:Ù_–Ë«s¢óùÙl±¤óË·óåâ‚è^ ½¶“(š£Y¶ZA±CŸÿç¡€¬Y?K Ô˜±¢ÚzÄz´p`¼¶:/VÜó¶zT•IŠñI ’UyÂf)Ì%‚+Lþaà%sYBt„$»$­ï À¡U 6YÐe ‘@ šeçHê›z»÷ ³?ÓK& ߦÓ)LcDãr #Lm¨,<ûèO‡™0Û&ñÈJ囆q X”5(œ ØqvÀÌJ‹cýN¸ËŸý€‹¿k$ñfâá*ÏŸºÙTö‰aáårq9=;;ÃÇó Žpfg‹ELó$¶“#Ô dÁIîà8A%tŽ=c­Œeö-qØâ 6lͶË#ö'øF+äå\ŸÀ( 7¿x¤8Ö“¤8id•†îçÝ¥ßG‚–ËÛóå|yuvD<]u Iuc3•sûÓ;:]ðÈ´ÇÒ¦gËÁ ¦æQ°Ž˜œ{áÐŽL5Ì* kñtñ¢w2dÄ™dàݱS³ËŒ¯K¹^ñu~&×Y–\Þ{º|›ñõB®—r]Êõ*Kq¸sA÷%_t–u§þÂ4 1™"Aš2­M:¦ôÉ–ùrFof^Nžþnî.9G€ïä0oûû£,~þßw÷ék—¼ƒ<gÿ>½™DéÌCÆÍ0¾,â‰LÒ7½ð–ŠM™ÏaÊ‹™>Ïû’M’Ñ õ·ó¸KhÁÈ˪DÙ|ê§“—9P§M|Á]»™á2>ϤW]ãrïlⱘÔä¨|ôJãÛm`Á¶×SͦeÆé§p×0bºWzÖ”Ü3xnïçä8&s¹*ðHÏ:Û$2òôíA)ã«s¼ÝoÇ)^à}ÔOÓ‹¨ `FЉŒ×ÝÛ8©- m.çÀàä~ÜqX”Ý c†m)29´’óSöv\ðÞÅHtm3ž´e.eÙ2ŠwÃgNã\/çu6¼‹ýž•Qß•ùl¸².àLøè/­õþæ†Þÿ|ÿ #–'8gý¤:‰†#^ÚòOé Æ[“ž)A5ŒþÙ”£ü¾nЄf‹Œ0KqÛƒ¥2‚³´?ñ±Ûø 98cf90baf564850c0ce8e145e907309e1/proj/rd/eric/funtools-1.4.5/man/mann/regcoords.n regcoords8%RegCoords: Spatial Region Coordinatesn“X¢_xœ½Y[oÛÈþ+?,l@a$ÙJ6ò Uä]µŽmXF‹¢#r$M3¼t†´¬þú~gn$mz´@…XˆÉ3gÎå;WßÌ¿.»»EYêÌ\²uÅkÉ=’eÁìcYðZ¶þãæön½Z3ö°—†eeÚ䢨Y&Lªåõ^0S‰Tne 68_nYY0s4µÈ͈ñ"³Ä²¨…®´¨‡¨¹jˆ·¥W'–vbm¥ÂAYìöe¹^ܯîV·7ŒÝÉ'¡n$‘ÝòFÕ/ßÛ+kàÚÝo¬W‹ùõˆö2ݳ\ð‚´ãu *´"“&Fþ;H˸¬æßdÔen•,µÜá6Å2^ó„Þ”¸Ø2«ÉŽøÇYºçÅN œYÝϯÞßÝß®™Ì+%ÈàÖV#ØÎKGôlõuþër@³wnñº'g,jס†êÀêm…fuÉ*kÉ ¦aPµ'—Ì9ä=m œ`…d×_­5®þƾ‰ãðt–0ö»¬÷ƒwB…-T7¢î;Þ yDµÆÇ÷æŸ"­Iú%tµzX.ÄÈÁç¢Çó •òŒ-E—×ÑñȬG‘½ôt¹Û  ­ú¦ÓäG®%G4HÝ*ÓodHƒ5aƒžÜêìºeΖ0‡xäS|qÇRxBBÉA˺ÆKx‡³B,Ó„ ÝPH©z_6»=ÞY(’NÖ‰Þ© Ù FÄ„tð‹GΈˆåüØ1 }áñcÃÙ‚â%Jˆb§Ê ÌC@?ü§Òe%tM®NË<~ƒ•ež/K¥N•`³ÉÔþLÆcבÜ2ð±ä°3ê\©îV«m©Ty°á®„=èÄû>–e¡Ž–/½ö Bæ¹È$ˆì+â@µÀ÷mÍü³ÉxzᾦN_ áÇÅéhi™•‹f¾)OœR‹‘–PØkŒ¿¥ë‘Þe§A-ºlÔ—ZeòÁÖ!¯¶¯½d!vÎà!IÍe(N^J õl#Q® ˆ ™¤†SMI§€P#7䯒Âùèk‡C¤œoÇ—ª$lÝTU©kŠ:/¬,RÕd~+([ø+x•“½Ã'¼x×~:iÖª¶6Ù°™Ë*äDC}OùÓ§óWN¦ÖTxíAvõ׋ûeòi6ôƒê¢œØ_£7)_Ï«Å[tËÅ5•Þ7éV‹ûu ñÒ£6£>y‘®W7Ëù} Sp×ì"qŽ´@pZÁ<ˤ+…õ¡dyi¸L‡nßóG 2gàb£¡©¥¢ÂMÀ:¥z„Î\-óÌBû¯ü?ÿzw½ºZ-£F] _EÀ˜¾,–‹‡Û;ý§¿Ðéùc³ã„ãÈ$O©¨jfIcLôº^×µû†›ÂÓßv{DŽÃ‰¦Åfï·Éør:¾<'6±OÆÎ#t Ìk0bçcÖÕbbê®êí½8íåùÓóS¨ÿÊùýtœ·, ÈúôoÝšd:ŽÁE¿µ¶–¹T\«£NSÈÚ&Ëç#Z¨7 ø¶(Bk¥á3¡OÍãuÍÓ½Zî&ß 'Yf½\òF>¬?œON1×ikzãmöLBWÀƒo"ÿÞ4âÎý§A3Š6(Š·'Ý×Á$íë¬û:`2®†î'³h•=W[ÔÎ>(¨EP‘žûº3Üíø6{ Fú.íݦ|b“³dv‘åÉx2™}Ȭ²ôólDðÝQ%1 |ü”Ì>âÌ4ÁÉ1;ÿ0fÅç öÓOÈZE£óŒäœ1  ™AƒÚBí"³btGØ Ìý|ÔèËr¥m KLB8RÐt~)Ÿì JSk¸aƬÌýœ\÷s/1Ï4?ۆö2¡[¯~Bn¢¾`ÿj8è)à(CϜƇ‹9ÃÍëç$Y¨~CG;r†aüAMèM>¯o‡@‰9Ik™!2Cʈ=‘ŸM‚ÔT‘pÅÍ/—v6ý*xáw ÏM"†Íñÿ… z¶%Rt©ìw7ýŸTDëÎ ;• æ|jâÈeƒæ3”Ò´ ÀQÓPQŽ3W{"ÞÏHþ¶eâ¦Sô¨]¢lF”y¾s¹(®~|Šzž:[ †v9!ûîD!4WδºQT¾sLÞÝ|sN«-ÛÎÙt–L…X¶[·Z3ÏÀØF½DQû-4êØš ïî–ÖJáh¹1Èa¡É“œCN¥mMBÕ YÝÍmÐ8þÅ&»§7!—yv yôA1ŠÛ‰89•ôŽø~>àã=ØD짨×oõx¥Ñn;ܰ-j· Ök)!ß ÊƒU¯©'ÜÐ.an÷—¥FÖãú8 ,$Çw¤4P;b»gCš.vö‚د/¢Ø©k˜ü,núÁÊMÈÁÿ„C·ˆî>uJ|_–¾›‡ c‡™{ˆîžxøQ1 ân°Q3É8ìvÙ@^²×Ò%Š·â9M¦#ú™ŒQê…R²‚RÓ1ÒäÅùÏÓŒ]|L&?O>PJ¦Ül¿ñ¸ÝâQ¤ÂÕ«6Ð6zVv·VŠ›`É耨˜ÏÚ¥X­U–OlÙ*R3ÇÌv$›îÊÖÑÖ4CÖ{^$?o¿Í:U©?sÌýðÂç ÔŸ‚ªNâ¢,¬µ—5ןØ^À«E~¨Fö G“Y5š’G~üѵkÚC¥‹æ ù6LaVˆsOã êû oŒ°oC lÌÙÆn÷â!u“¦RüØþI&vií&ÙâcÌ:aëå’ͯ׷˜Ð>o›¢.KeN‹3—Y‘èŒÖ®ü¶ªB§AÛTJtT÷&ÉE2cóJKÅ&ÔM&Ô)‹»Üþm- 4c6db9fddd8ac83bec7884e558a0f1b4//proj/rd/eric/funtools-1.4.5/man/mann/regdiff.nregdiff 5RegDiff:Differences Between Funtools and IRAF Regionsn†n‡xœmUÑnÛFü•E P+v4@ÔZ$²`%(úx$—Ò"Ç;âî(Yý±þ^g¤(A:îÍÎÎή6˯+¢Þ?J]ÖìJŽô§³£§Î%ïm$ã*Z¿,Ÿ4Z¼‹´û{ó¼Ý­wDË n¥Su…Rü„ò¾Š¿QQ/xÛ#¿ß¾<ïÆ§sz\íþ|Yo¿­Ÿ7D1Ì‘)aÜòÔ˜<‘!Kß´&Ia™N’ /ÚÀƒNôaö™ž| (M‹[×܆£Ø82vÏE0—š†Ð™& Lñà;R09¥Á%\+M'O´a—À3g§oxBµ·ÖŸÄíI¬ÄD¾~#¦r7–(V’\I<à&ú—ˆÖ5@Zye«x¥?äΙš.åò+4б¯gj9Nö®ïjcâ:Û±ÒÒ“ZBp`Ò *Éð+gÏåá‡7v¥6AŽ“Ì•‡Z(ôNAk«Žâ»©£â.ég Dt2=¡ÒÄ©ÉäƒìÅKo;‹ä(¿AûRÞ«ïŠkÁwÍlMÛªð?¥Q¡+zx:H™³é¤ï!´'9ë<«>è±QÙëÎÚó¨ •­ŒÆ¡¯Ù9:XG½3b\{¤@ ¼É4$á¾µônìg×¾Ë=[kRâ0ï .ÆíY)¸ì{Ù†ö#´‹¹‡¾MÒÈ?8¯Åân±Ù–3’9ϯ¬à*I“ÊSÉQªbŠ!J¬.ø@IJ…7Ï{CªÉ·ËÍãr,ÿ`´É­5%Ok w/ž!Øë¤¸¡ízEæ±L‚ ê°-.ªb6h¹Ù|ÿò}÷&°‹ÚX¤O6o>ÜÍð¾›->ÎÜï·ô‹æ¹œÞºÃñý-e¦E?ñÝâŒ1ËÕ¼ ¿ïÁÕ—{UŒ2ÖÙuƒ­“wq®šSISPR•þ•tWQmc¸®)àNºéû¤h¾KØ"âSl¹”ZpKÃũҚ Ï«Ü-¤/T¯ hÿw…g f03efdbe8ed213426d085ebced5d9a223/proj/rd/eric/funtools-1.4.5/man/mann/reggeometry.n reggeometryWù9RegGeometry: Geometric Shapes in Spatial Region Filteringn‚”xœí]msÛ8’þ+(OÝ–¼§pDJòK¦æƒ'›ìº*›äÆ™ÛÛšº¢(Hf…"5$[ûë¯_ AZÜ­Ëeö̙زøÑxyÐÝ@¿»ùók!~”Û?Êb'ëòøR¨Oi"îî㽬Dš‹»}\§q†À´ÈÅ›4«e™æ[q÷×wï?ÜÝÞ ññ>­ÄºH;™×b-«¤LWðt}/ÅV%.Š()‰JÄŸã4‹W™›¢•Ê`Ó¤ ¹ÞþxóæÛ?¾¿qgÇ*­ñ‡×w¯~¼ýðñöý;aµâ¢Š;ùY–ŽÎÒÜŠK)Ä¡’kQ¢)ŸÐå à¤øgéÚzâ¥à?à7_q¹¥¬à›xé/N¼„¸y÷î§·?Ý©çHM–â¨~§y.Ëÿ.ãuz¨Dq¨Íâ‡÷ÿ%zžz|H×õ½8ÞËt{_‹Iœo3y.Ä«Û_½}Ý÷”NøõÛ··î^LûÍíë·ÐIçEuùööÉ,ÇPÉãCQ®¹š“¸’/Ò¼’9W¼Ý›C‰)cjS*.?Ö©5|ÈD/¹Ë8Á6wÈÓ_PÀÕª”ŸSzILÞ^>Æ»}‰b{Æä´P)‘¤erÈâÒŒb8œmŠ"ؤuõ³êoË0â³ïà›I] ø7áìü;Hbr±œMñ_4;ÿåLˆÉŠjo+s¼ 1róýõ–Ü÷%’šê›³V#ؾ†BSsZI”6±>ùÕýSž>BíÈ,Cùb C}å‡ û½ÜDSa•º™N÷NHG@+Övª{íT<¤0&Ð`Er¦‘Š”TLJhUet¸5Ú |Ñÿ_BmØ9C]ë‚5yCÖÑ2˜ñÊPœ©!7ïaà–)ß g¸©ªÃ«fMî!… -dâÅyj[—&ºÚžÅ¦ÐPà{H õ\hÆr}Î0®<ø@³ < hÖŸ0ã*ý;Tëbö¸˜MEZs¾YQ|YúIÒãÐnÂh¾X^\^]φ?™]³—Á‰—óë1à«1àË1à‹1àåð õå‚ç>pzÐŽºàн,p8Ü•`ؾpÔ‘ pÐîHÐI­îHЭÜ‘à¸#Á!pG‚CàŽ‡À ÕFG‚CõèØß=X郡¿ö€½}°ìéƒý`OìEÇ ¢cÆÐ1Cè˜tŒðÆÈnŒèFIn ΪxTs³Ã.  ŒÅ¶È‰`eŠ$cà©C8ºTGÏ缚ê•P nkMÒ* ‡Ò^ !I¹¯9ï=rLZßnÅ(R»fÕ €ã1ߦ¼Ì_îeΔOßá[È9 ǘeÈ93r¬€ÐSŠ«D›EI5nUÒ[­&“¢?—Ù¼ªµàúÇ^ä–W2œn#̸إ5dLlm-7ñ!Éxfêí‘ùgÒS|ã„wW´´tÛ ¯+š†£rºžî+Ov¹¾õT†Ä–ùµ/àc½ Ó_g2ßÂ÷+|_X ÂöÜSÅ7}üýï£ocø!þ]ñó ?/`9þ80׬W\Ä’q=7ðbÐÎëbŠ‹IUŒ”œ–z«Ày7KÚX(#åü°[Á3PeJتRš^@b?îöÁ°¯ö‚½}°ÜÓýàgb¯±ÏÄž±H€dë'‰çúRb⥤%%®tµÏ‡ê@Ôß ù¸ÏÒ$­³ãT¬µQåíô÷¬d´¶Fù[Z´eÊ”(­¦ø>P©'dŠêC(S~²4 Ú¼ŠÒAÃô®ÔÐZ×®PghW9Â¥ùþP£’š^±Ž?I|«qܧ^Ò„—ÔÖr½•:»Ò†é¤JœŸ&Ò½’õƒT«“ú¡°*•­ê ËX²ž•[ ~Š åø’§4ñ¨š«RF»32 SáÕL(ÒfZ§w›…CAÀ¦i ƒ©Òº.cX Dºv^Åe-«*oŸÅ¹dîºN+ø‹ì˜D–›\V_‚†žËßc€Ž__Ž_Œ/Ç€cÀó1àh 8#ÁhŒ£1ŒÆH0#ÁhŒ£1ŒÆH0#ÁhŒ=Êݾ˯Üíá~ånx ‹xVîÚàgÈØ¯…Ávæ¨aºÏâ#©ã:d¢¢²w ³’),˜ã‘ÄlYߤeUkå`ü0_[w+™ùšŠqÀ ¹G¬c ƒº¸˜ Ëç)Ư˜a¨ì‰…·T."!ú)ÐÄ4“NŠÜ¼¢I²ï)“ÐÎÄä¸+r©ïËâ°½‡îÕÜš4lè<`å°´UQß+*é7&râ¸ÄˆÙ{GÓU’ˆRÆù‘‰oÁÕ­ø»wP%²¼Kš¾ gò ð½œÉ7ôr¦°ÆõÍ2½œ©ìŸqýZ—/Í™|ذ3y aØÃ™|P{9“ú9“Jà®ýPw%؃ }œ©JàŽ{ nK°Jà¶{±a—3õB ìJ°ŠàðºöC ìHpgrÀ½PÛ‚¸§úÁþ>Øö÷Á°Ÿõö€ý¬·Ü?ŠvÁ½ƒ¨Û;†z°}C¨Û7‚ú°c„7FvcD7Jr#°.gÚ¬!õ¥ "P >0ïÒZ¤u%ª¤ØË)=¬Ug¨‡ª”k(ð.²1’oœr™ž*­H¥¬¢Ê®\ ÙuU™$“¸,IåUbr¬f%³âúqv/³=*Wâl+We|ÔD|€¢|å¦(wä`Š\…˜XÚxE*ÿGb:鎌ŒðÕ¾(•ý]½;Ù¡Õ»§»xK^¤kR¶okE"ù·§¨ùJâC%™Ù4Ú¶”õEN:ÃMš§µÔVBpPíU…Š7ªOr—Mî%0tD<вx¨È/1Í“ ê Mþ“CN‰+Zé§J·Hæ\Zã4œÄ:©’]Bbò²>ˆ·²<ˆžÉŸey„–Q< GD.²¸Üªú@[yŽ®½uJ¯Æ‹ŸûóO¯þÄ®¼êa²ï²3p¾ŽuäœÖ‹UŒZU%!#wx5Ý\6‡<ÉkäŸÁGa ߨE1p¢”–J¯´ªôg²^‘³ÄíF‹W)>È©^àÖô¢Eo ¯ r×Ômñw¿C]p‰ ‡<ÉÚ,ã Õ‡EÉÞž©E~y—t„5I½;vÐdÈUW>BðJUž•jCÕ!#ýò§¼xÄ]ŠÍßEµ¬FYÕªŽ¨²©©Õd˜ôæ¿Â°€]CÚvmXU­*À¶Üà€bZ4ù×ãøÃŽèÖħ¦6LÚpE©*ŸFMwÎPµ ÆÝ ²VÏ·+ÙÊAM˜Tµ—¸dO»RÕÏãU†›UÞ´;{¼‚!T!ljÒ½CÍé’û ©ÛI5/‡õ-“{Ú;ñõa®ùn/^ÔÁæØ‹gKèÔâ ú2ô/˜änÓ”¬`±÷À×/´·>{#ãúPò€´£ÝJ Œ[[©Íx›ÞfSŽÓ ØBˆÏ6§|uëê­t,¨—mï´]+ƒö©ž…‰'m¬£ ¥û(³Šgi½Óä1œÃs*Úä1š£s%šê×'É‹?;v®—jcÕd9½˜Âúo-Ï…6E©-(ÏG üìqdƒ¿J£'Àc$ØÝJ /Ÿ«OŸOð8Àv=ް£~lŸµÉï­Õ³•À‹õ[›z°~£¬ÏÚÔ‹õX›ú±]kÓ¶cm¶­MƒØ–µiëZ›žÀÚÖ¦§ –µéI¨±6= m¬M'@ÿ?X›Š–-ýÐ.n²úžŒ-È=&Óã¹½ý˜ö³¯3\ÞöYÃ;‰Õ>d½kY{n'E «º}Á†)*;uóŸÒ"TÛȳ5žÞ©¡|´&Îi»k³±4?-Ñ¿J÷@l´L·)êPp[>ùHI¤]1{YËø<,n±8ìê[ ?•4™}¨ u`ÀŽ™`½«í´³DÅ?4¿„ÚXKXïUѺ¥qßß@WjT)(¢—B}N×Z×  :ŽC´ÍœtÑiNq°ÂÿÈ ¦óÙ¹rîÆ—qÖÊž·¡Ò¡‡vpsýß9k¶žIš?“4|Š ü¯EÒ|à1ì#i~ð úIZØ+Á¹üì䀿ˆKPô$ø·éôLÒ˜¤eÇ-ÌÇݽyúiìðt—4ïQ#Pƒ)L¼óóÀI µ—YV 瘗ē`R?dl,2§ƒH6+Ð2Š’f?F'ïÊø!/Ì{iÊEgÒ É$º†|ÅÕßm ¼IÄOÓrv&mW]¦Ê{©M=ô:ä:3æ³<¢»}!²â³8Û`‡¬ bÛdeÛ&+ƒØ6YĶÉÊ ¶MV±m²2ˆm“•Al›¬ bÛdeÛ&+ƒØ6YĶÉÊ ¶MV±m²2ˆm“•Al›¬ b;¥§ÔOއ°¿]²rö_™¬˜ójg-ÌVÂÌýV5™õØivWÉì3jF6ì§“Ñ<Ÿ”EUòû·f>׺‹ÈÌïQ£ÃØ—šHi'X)cc}Eó¼& Õ”§ÿÕ½6ÙQ ×xÖc €{ÌàÿZ¡ÁÏz ü5ë1zÀ.5è|h]jàþî€[ÔÀúå·©Aÿ4î£CܧK ÀjÐöQƒ^°—ôŸ©ckÔࣳ¾7>GÊSR¹'‘ÃØ!Ô9ÅÔMw8#«3²šœ¡OìÍ»?ˆö ;;gÕÛWâªÙŸ4ÛÎñ|¢8Ã:”§}ô±ïÔckîþݨ£}iË8î¡¢#}#‘Çè V¢‹þÈñ‡ߘ“TÅ«îñž|üñ!+Äñ~<ñOðƒ£ŒÏ!1<{J¼þçÓѱ*‰ÜÝ&PÕ"=wOªÕçQ'tN’WæÆƒZìâò“,+}¨Š]lÑ­Oö†u¢{5ï¿*ô1RÍ^w×#µRfAÕ˜ø Zu—rh¤&Ù8ËÒÛh·¦}ê8yk'cã L¾¡ÊõO)ËÚoi».*Ï1íù7Å‚î±E~–x,. È—®Ñ‡OzâQÇw¯8#å@X‘`•C¤Úe'd ¢e¦`е»,;ɳ®­Mæ2Q”{6_À?ü.§ àÜ’x,ñÜøÝ·Ž´…‡¢™ë*K/¼h\åã¬*<ÏÊ3YËN8K‡Qs.ÅDù†± .z_Ã4IgÍÅPwÍ1ÈÕù3—7à/Çåæê‚ÝÉhá^m°3]]  ].uÅà9^]¸Ãå¯è𛫅v¸ØÆÚàk·sã] hAÛ\ž±ÖeÝëpù¨‡Ë÷!ÿÕ¹¼v´ÒÓq‹µÛnCzÇ–½cF (7©ê°Ç=l´§bÓÑP븎ÍV¶s:ªOÞÐF2Ú’Â$?@cˆor†ÝµDš—TNnz;R%¥Ú‘goÉÀŽWUb3'³šÁ &ðËK ÏùšópÉAOàw¨q†aÒŠþè38q'eûl¿´ÀϧëÛà¯ût}æ§®ùÁþÓõ{ÀþÓõ{ÀþÓõ{À=§ë+p«6ÚŒBƒ~ât}$„ýly[{ìm-o«h|Ù;ps¯ãmµÑ^zÁ>'¦¶³Õ´­¤ ‚~hGI 5‡—ÛVR> ~VR2ö·FlŒý²ÙüÛ8 ãQC%ï o¶¨ó6и\¥u ¤8U•nsÖyÅäLåì²§„~bDteRljÉú‹µæ.1ë^J3ô R›¯«FAe¶rã†r³OãÏxcf4 ŸÇ=ï;ýÛæûî”T%tèæ¨½ué””7¸W2E¯ûw?Öä|ò±Æ0Uø*ê¨Ú€nÅ Óg:ñIRx¸Å™£1±,­jVþÅ%ÐÀšv(ÕQ¤>û̪fZGÑŒX“6ê8~u4}sd<ï‰GM¹¨LJ|ïMŸ‚Þ^Z]èÀ‡ÃQ>?WúÃ’}TOMÅàܤØ0ь浉oጒt¾1Žƒ0pg)í‹çã0¤ÑÙ[ø µÔ]\Y/ô1z(%UþN¼>w'’ÈÑa}óùu. @Þ©t“™ay÷"ÔEᤠ’A{›Zãh7džH>P·(²Ç;ŒÜ(tôj¨ ç (ÕkLJ'@§"ð"ç ¨"åk³Ò¦ão̪澽sª'ª-œá/”aÁ9ñõ68ošÑVŸµàØÈÌ Š€Ç€@†¥Æ^´Ï0 þ€Ì 7ß øvé½Ákøî .°ï¿ŽâTéWï‹´´¯Ø¡¨ËöÕ[µuáÎ*ß‹µÐÖ*¿jÁÍ*¿¹c™Zèf•ïÚp Žlð¢}µÀÄT{ ®À(Á¬…V«|ܲu8` ÛAó*ßÂÎÝËB«Uþò$ð’WùýX7iZå°BXf”¹ žwÀ¶]¤ŽÚ`Ç.Ò‡0/ò=àÙ0¬òG€¯F”Vù§×Fx1¢žÃ1 #Ú.óOnu¸Ì?¹=Ó2ÿÔžŽéƒ×#:÷ÕˆQãrÄpt1bœ3€.ÆŒÌ#†ühÄ\Ž˜¤_ÀêO9v¨¥.ç7ÊnmGè2K$;&b\Í®¨&Òª0//W² òˆ÷:ÆîÔ ÑÖÁÿ]–EûpíÂÁ h$ƒNº&»A„ßa¤.'Ƽy-AaÌ ÎV¦|¿F^1 þÖÝÕÀº[ØN/Xõ‹öÈçsÇè “tÃ+<#p®y…µð]ð¬GöåAkëAÌð6øJƒ-ݰ­­ Xk‘}hm=è€×€^Ú`[óÝA7Ölltc=PI­·…¶À‘ ŽBÇŠâ&m¬V9 Ú-ˆ±XåèKÚXzËÙà+«ñ—ö´K¶Ëa[ÁØ& ¼t:ì]ç.:jmôpãk›L»6ÍÚwÍž£Á­Qt 7vÍýýÜc>Ѓ†…ÔµìBçKa}æ/´ß|Ð…™ZȯÊ| ”´ú,Bö®l´P¸ù¹Ôgó¡|x­k% %­ ®¦U ì³eº'[ª v‰…é^©¿l÷¥zЪ›îRy7Çô•̤¯ø‰„§ÝYà«v·í…»D¢ÛúçîÌâ!}è"á‡{ˆD{(°;X‹Hø†™yÓs=DƒÖ`/‘èÀ%8€µÐŠH8`wˆvÁ A?¶ƒf"aaC÷rFS"ó“Às&ýX7i"j"4..xÞ«¦àGmpÓÊ<àp x6 Dbøêt0ðˆÓ+#¼QÍᆋMyÄÉyÄÉÍ™xÄ©%Ó¯Gôí«ƒÆåˆÑèbÄ07fü\Œ˜GŒø؃ôðˆ^$bopãÃ†Ž¢3¶&c2f'Š=©LJ&‚eUj›9|É4&µ“£±Y†,.Ts§±¡§h‘²b`úLR*Ym’2©èèS¤éÚ¤øeŒAʳҴLRô@Àö(~øÁE!¬"ü½7@—,]:–(yߘâ¿E§§w."L'bC"L'bC"L'bC"L'bC"L}£X azj0N·'aC"LOC¦éö,‡8âéö,‡.Øžo±¡!LOcÃ6a††0yÐa<ï·±¡!LtÂÔw±¡!L-´Âä‚}ØÐ&íÅr¨Ø c²Ð=ØÐ0&îÆcÒè^,rÀýXeOžXeOµO€gx8~Öµ‹#cr±CA¼.ÛØè`lSÛ¢láÁúÁȘ<ؾ8i^¬ŒŒÉ‹õkûh“’aÇ>í©ˆPµ—\Ž®Mi^ÿ¢œäH3à’ÈÛTÕ3ê<ɸöRW&~n]žP†/Örîy}n™”€°B wØïµjȸ!)U o¦=Ô•ÈoA`q9}1DȪ8äëã´•€ªé—´-YÉ!7•§ã§»°*ÈÒ6œŒ&eN*wçìñ™²›(í­Iß,«Ñ}ù<Š8")–H¥ésVjÌlÛ û‘æ*ÿ~.†]|Úª®Û ‡ÝÐÂTîœ*Jcc½œeýê2Õ³áuèÈCs 6F²Ï•qo@رÞEÔØí´07Z{GAuºÙš…)qÒ˜ g׸aµ‘ƒ¬'CáaæâOgªZ’ôSq–¥ øÄySsläÚ&ü¶\ñ3—œž Èç6¦À2•ŽÓê¤ê¼r Ǫ÷sÅÙþ>^É:MÌ.p#ŒR8ûþŒ4¢ðãûùTüÈ: ôÑ”V‹Á%ŽyãE¸é1S“Ý«økêxJÛÌ!ºL‹7µÚBæ¾Ð°ÙwFß FÔº]ƒ¯²öêÔº£nŒÏXÙø lëÚí%îüºµÖïÇ7:Ûyûòƒ/_ú°>¸ÒÙú°]8ëlÍmâ?}h^‚ØHuùàj ÒÁF®.¥G½Ô¸ÖK?én¡õ¤E1ýèf ÒÖCùÐí%ˆ5uwÑÍÄÇF º_ô‚Ûèf â`?ºY‚X`γ…Và¹ÜQh>m#ƒNÒOêlí¤Ùø;¶“fãïIå˜kãïiåPÆ_©Mí5`ŸùÞ_ÕÚøÛJÚ/ÅÆøÛEwŸ1þö¡]pd_=­º‡Ž®r¨ÃØÆ_·“[P¾n¸‘çÒØ«¶b³Ú2þνèyƒ½ð)A=Ðy×ø;Ÿ;xó§Ïø;÷_ßøÛí1þz¡½Æ_°?J­ùèw¼²I€æ+еh ô,’ä¤-CM.ÅVkb•àfª=îߙĨȴ‚ç¹”ÃÏNpóÒGŒ¼’'/j{/¾>ÊÈX¢y“T­‰!Ñ]¶ú {do*"‚L»…,˜¸§tª&Ù‘‡7œæqûî?oÞÞþˆ©­ë¢;dpêyEÖâï—¼3ä·Ö¦¨ê qE¤j©eÓãžû}¾D.IQ§*D"ªgÚÛÞÈe"ü¾ì&j}a²°¾Ô¹}´ƒÉL0šÌy+œŒ9.@…Z¥ÕÆ~©)0VZV•ÔÛ¶¦xj)F×Ý£™QÀÅ5×}Rä¦K{F0’-ÔþCQÒê…Z]ÉõZÊÅ?L‘ß¾û᥸±÷Ãìâ£sZC'þ±UÖ64äDÃ)þi &›†*>a³b $7X\Y%>ÃÀ ÿ‰eZ”¼¡×xP¢¸ñ“´·°ÑεûX;KNËÕÖá‰ãâ8Ql ]«5¬Ð%¾¯Èù 1É%Ç×à£ci•cö4ZvØŽyTuãˆÏ3£ IØ piÂGáÆ•>Ÿ‚êÒiTËy…gââRãÂËAy§:0°³[ ºÒG”Y[@±ž×i•‡2Þò‚^s­ðÃ:¨²¿fðE›óÚ ™Õ¤[¨éu(ÎqjHü|“ev*•pNä¢WÑa+¡ÕBÂæØ5JJ…Ñf7Ü©HøÚ„¼<Ãô¿‡.fÔ µ"¥òÐMšÓÅòã±_:í3ÝÖ0Ž'Æ¡ý,fÈóçîA¿œ ¡”ž¨¾ß~»µw”5‘˜ñà:¸MU‘ŽÍºÇ¨ÜeJ Fö„áNWLBm;on?Þ™§ÖéŽ7ÖÂBêq1Ó*ˆàq÷úµ¸y{÷^‘Mß™äçJq€j1…7ºWÑA&{ r±(Í0XKq%Ê€áQkaˆÜÊb'ëò©ýÜQ6 4aec34e9222832066c4d05d9aa07e91dfuntools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/sman/fun4.index.version000066400000000000000000000000431256243640000255670ustar00rootroot00000000000000SMAN_DATA_VERSION 1.2 VERSION 1.01 funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/sman/fun8.index000066400000000000000000042255221256243640000241260ustar00rootroot00000000000000¬&VM§rø Mì R® _ˆ gw mÛ s yh |O ‚ „€ †ù ˆ9 ˆa œE ¦% ¹. ÆÇ Ó ôƒ øq ý; „ ã $  F #Ê +8 7Á 9 Fª \¦ k~ pD ud zÌ 1 ‚B ‚¾) Mì I8 =x Mì R® _ˆ gw mÛ s yh |O ‚ „€ †ù ä ˆ9 ˆa œE ¦% ¹. ÆÇ Ó ôƒ øq ý; „ ã $  F #Ê +8 9 Fª \¦ k~ pD ud zÌ 1 ‚B Õ ޤ ì, ȯ p/ È~ ÈØ žw Žº h¦ Lð É  ÉÑ Ê… Ëz ËŽ `t ËK Ì[ xj #Ü Bî Ï× Ò C t t, `à XP ÕÌ € Ö Ö5 Ö` Uª Öt 4¤ ¦e Ö› Öó ÛŒ Û  Ùñ Ûx ÌÇ ÛÉ Ü Q Q× Sã Vm W‡ Xá Yv Z' Zò [É \‹ ]e ^T R2 `Š b% bž d- d± eI ep Rs ࢠ_ _ _( _; _N h' hÕ i1 iÍ jë k) k _u f´ fÇ fÚ fí g= n¾ o‰ gd qM qª r¼ mƒ tE x† s1 sD z3 z¬ z¿ რ{£ á }§ }Î ~ £ ^S |( ‚d ƒ ƒ „ Z± „Ð ÿ · †^ †¢ <Û „) ˆ ‡a „m †µ ‡Œ ·› ÿ¯ ï7 z; ÿÆ ææ µ · Í õ õÕ jg õé õý û( ”® µ6 ”à ¤ öS • • •, •A ám •V •‚ •Ë Æï öÓ |ö ýŠ •à ûl Nl ®; ëµ ø øH +J Xô ˜ qý Õˆ Eè €M øƒ ˆs ˆ† ˆ™ ù1 ‰ œW œ€ œ§ œº œþ ‰K ŠF Œ Ø3 ³ –„ ˜ ™å šÊ žd £ óV ùˆ ùœ ¥t ¨š ( w ÇQ ú{ »! –Þ Ãþ Äæ Ô­ ÆW ÇÓ Çû Èk Ì´ Öˆ ú €x (` õ ýw ón ÷ï ýž é7 ú£ – © Ò å þ ÿH ô ¼ ;   d û³ CÕ Ô ) n È ü_ Žù –ô ‹ à  % ¤ $ê &E &Õ 'ß 6 -‰ ü‰ /ˆ ã; 9 9( üË 9 ;Ù ;ì <* D •— Dç Dú E F— Lš QV US k \ý ^ ^+ ù aô pV pi p‘ k· nª or ” zÞ { {F {t tý {‡ u÷ vd Y l |O }! —4 }y }õ ~   ˆ j “Û ‘ç ‘þ ’ ’, ’C ’Z  Á` ýò Zç ›Ç ÿ[ lú ÿo ùÅ  aØ  ¼ z{ f „ Ü o ®Ñ ®è N ¯ w ¯, ý ™G ˜ô ™ ™ ^! á? á ÑÜ \¸ éœ €è Äù NT s8 Ïv ÈT •k Ç{ < Õq Ú‘ uá P ÓÔ l ¨Á #g Ÿ) ¿ RÔ 5s l% !É S‡ Í " >É Ç µN šK "P ½¬ Ç 9‡ µf ¢ $Õ o ¡¢ mÙ å ;ÿ Þ ¸Ö äï ›œ E8 û› ~ EM ò– EÓ h“ èt d ô U ¡ 3 ôÆ `û Çæ j² ¾ó a %   : ” « . å? @9 È? Sö T!  )å å ù oE ê T¨ TÕ ; g { U6 Ì Ï_ Qê dJ D € 3 ´ )Ï ³b Î  H K+  %± Ÿ Ç Èà ûÇ lë ûó b± µ– W  ü ,æ Æ= %Ü W “< Dº ü5 « üJ Ç zñ ‰í Ïí T ’ |¤  åÏ Þ 6 ©7 FÕ XÌ Qí WÞ !L !u !  "} ÛJ ìI I, Xp ´· #S \? VB (ì 9i ¤6 o- ‚§ SI U’ ¿ â! oœ £H é žè $Á  $ý _Ö Ñf % jþ »¡ f bÈ éi éì ëT %ñ xœ &m & &è &ü Y M rO 'k 'ò Mâ (ª Mv ‚ J‰ ){ ) )£ +$ ‹ q  Q J h Ëç +a +Ÿ q 0Z -³ ` -ò .¬ þ .ñ ü¶ Û ·³ /0 /Å 0 —ò 0þ Z› ëÎ ò  2 ~u 2ˆ Ü¿ 34 51 YÍ l Ò “ô 7­ v4 ½  v¸ îƒ Ø˜ µ~ ð´ qÕ ðÑ ðî F+ ñ ëý B¥ »¹ †q i¿ rf .| ZR “h ô! Z„ Ð ¯° mñ LU § óŸ “ ÷? ;y ;Å ï× Ÿ < > >q >µ ÷U ¡¹ ìf Kp ÖÅ ^7 y# E¿ RJ A ´ì  î Fƒ ÍÌ Íç › Ñ} ŸD É [H G GA W & L H} IB IV IÖ JÍ KÌ N´ NÌ L† ŸZ N@ O O Ñ” rÜ P0 üß ‚$ úI à ZÎ Î Qi Dd 6 Tó æ ‚9 U~ gN 3 u Ÿ‡ ¡ ¶ Y£ Yý Z ¥^ ø Z´ ï¿ ] µÉ ãí ^i ^ô W _ aà … bG &0 d§ w¤ f7 ßÐ fu Ä f¶ fû g gf [1 ¤ h nÓ P² µ jE q Pá yi \ ÑÄ &X íÍ k£ Ù y™ A y¯ –U &• …Ð +   : v z” kà sO Éz PD m– ߣ o PZ ÷k ¢p oš p n ß6 ˆÝ ÷™ ]ó }I … ­ ² ¢† ? q| Ø É£ ɺ Q’ † b sÀ >B > ž ¹@ { ^ u u< uP `V € ³I J¡ -œ {Û r­ u¤ u¸ e ¯ Uf v \þ ' z '% ÊA £ g¦ wi wð / ÛÝ Š¹ š° _½ å aD 2Ñ ôR ú w\ žO – À ó Ü3 û Ë6 yÅ }] àÏ íy ªÊ «Ü Aþ { –l ŸÍ ~† œj ïð r0 kî ä¢ }· —{ à4 ©• ~I ~] ž ~² F ~Æ “Ä ´# sì ( t }b ±¹ MJ €ß šx €ó  ¾Â Us ž¼ ] žþ i© α â; ÿ —© ° î \u ß Šq Šˆ ‚  % ä ¤® b1 Ýu ) ÚG Ú^ ÁÀ ƒ0 ⇠óÔ ©­ ©ò R ÐH ]Á ‚“ P† ° g Já 7ì @ž ’É d hO B xN ™r J÷ Rw m Ì ˜  >› Q& ŠÓ XÆ Ù 3 Æ% ð7 ¸( s’ tÉ ?š s© È  ¢ A¸ Fë [Q N fà Ì ¡Š l> Ò i i i6 iM id i{ i’ -@ G §: –; tX ƒ é€ , Gm h ¿» jÊ ‚ò ³Ã TÛ X7 “– Pp Ó *0 ­: Ûó xZ *¦ G‚ Ñõ b[ !‰ ¡ €¤ ƒ¥ ƒº b† ÚÉ bâ ¢ß c à ç 'Æ ñ¸ Y/ ª[ tn 6 jœ & M 2² R n} / H X¯ s¥ Úå €Æ YG tB 7– B× ä9 ‚- ý$ sÕ Ñ« Ê™ Ũ R Ô6  lÕ £Œ g YL ^g Ìž Ï t¸ ¬» ò Í< Îé ¡Ð Æ K÷ Q ™¡ 6ñ æC ý± ‘ ‘& à Ϧ ÖÝ êº ó' ýÆ ýÜ Ij ¬£ I I” J IÁ ‹4 ¿u Ð{ J Y³ ÷Ù u‚ [Ð eò 3 JE tÍ “® Jt J¸ u™ KY ⢠⻠KD Ð’ Kˆ *\ G)   T å™ 6Ø Z< £ ‹L TM N ˜ ^Ú L% Ð  þ ±B xp \ ^¬ j ¼ ÑQ rw K w £ uï 3Õ Ò) „ 0Ð cS ci w } © í cÁ c î. Õž ‚ ?K ¶ˆ 4Ž € K´ ÿ3 ” îJ \Ï b ]x Í™ ªq ©Ã Î m v HN zQ î  Ôë =æ 5‹ I ¾ ¨ éÓ M âÔ ÿƒ Ma {Y äU ¢õ ƒ £3 Y4 N‚ Šî ¹ ÿÝ ™‰ Ü ’‰ +³ £w 3 MŒ M¡ ¼- M¶ m‚  % ¡G O* ˜Ÿ ‹¼ ó· OU §Ñ =O /q . OÁ ·û Œ âU 20 Âm ‚w ~S U í– © × ×2 ×H ×^ C Ê × @Ó ÞÓ G bÞ . w: œÍ 4î 5 '• ¬5 P t[ P ¿H €¨ C } ƒ^ ¸W ¸m º•  “ =… è 9Џ ÂÐ Š ^ì n hè \( ¸ƒ Ò¹ ÒÐ ã +u Ó Z `Î ÙM Ù— P Ex ä» ø s E y , ,» - - -+ .M Щ ÐÙ Ç SÞ +â µ T ; ,, ½ c× èï Ý /D .” T6 E Ù­ ,Ð *E l¡ }. C2 ª‡ ²¼ ª n6 S ò AÐ c ­h ª  75 l¼ ÔÖ ‚T C gì ¯C ç Õ ”# _® Õ. ‹ `D Õ\ üõ Q} ¼b †. Æ— ýa © ¤ h7 ÀÅ Êm Âè [„ ¯à \ž QØ R5 Ë ·' cU d4 ²Õ Rb {Ë æ{ {) ß àv S† 8 à¶ ú¶ z \^ ˜ 8 N* e K 6’  -Ç j 8{ îg ` `ÿ 5E a[ ap a… aà hÚ aš ƒ ˜  ¦ m­ ÙÄ _ ã" õG ý H ' îß Uÿ f  ›q N‡ ‡t ëå ñç N Sp S› ng SÈ T­ öç iD U¦ ˜µ + ÞZ O? Ï q¾ Õà ®r ®ÿ ` T^ ¨× fÊ ¯… ” C¾ ; c, ¾~ K \q /› /° Ty ô ì Ú Ú Ú1 ¥ú Û4 d‘ úÍ bœ / ¡1 ‚N «S •° c‡ < ©d ­ ­• Cî ­Ä cr èX ®‹ òõ ó cé lM ~" ¬ì Ÿp ‰Ò | b UÁ V3 n” ú  j÷ k k# Û °S kh »Ò ±£ ² 8‘ Wd ì} ì– /Ù sÔ m* †È ìý [è u8 0/ [ø Ó5 =ÿ ÿ ‹é ²î Y_ Aç ‚i Mú ã» Ë m g² b v B uv <ò A 4Õ ƒ ™ øÁ xû dÄ Z† ­ô uÌ ÌD › ‹ ­ ß jÐ ¿ Yt 1Ô ` õ 83 t† õ B ´Ð ¶r g8 ‹Ó {ï 9 × ×Õ O ÅÒ Ù‚ ­ Ü šñ P ñÏ  Ûc ü [^ «™ 0é / [Ü ÆÙ CI ‡ Á Ë [ „’ «¯ t¡ 1k ¬K % x™ „» ™\ ” J © 1€ › Ð ê À+ øî ‚ gÓ D 8À ´T 1•  ÿò na ú D 1ª ‚~ Lp $P 1ê eš e¯ 8 (v ': B. ¶ qy 0‰ ›E w© Ó” í0 eÝ 5 – ¾5 z vw  i ­« pÓ Z: .6 Û´ o- AG Pø v£ n’ N' NV Nl w¾ N³ NÉ Nß vÎ O O O6 .e Ob OL A^ Ox OŽ O¤ ¾Q §% §P {Å vo S1 Oº OÐ Oæ Oü ¢È ­ §§ §¼ Ê+ §ë ¨ ¤O ¨W —¿ 5 he þ. 1¿ ~Ú gz \W )I cþ õ tŠ 2H P& i P< PR 2s Ù/ [£ ¨… (¾ Û BE nw g € Mþ P PÖ Q/ %% G® cí GÄ q c' QW M ‘ ÜÕ Qk ?² PÉ Qà ¦ » ÎÒ ŠY vã Y· 1T ¸ vø lp  n¨ ƒÏ –« ·o M1 Hö ·… œ x R RÀ S 9; ·Ï Tc UK U_ Ph … VÚ WI W] z U¼ Uë V X V. Xž X² ª ¥ã O• O« Y Yb P~ Y‰ Þ( Þs Þ¾ Z 1 Ü~ ZÊ Ì† [= [¡ P” Y oî ZÞ ßd Pª \ê ] [µ PÀ ßy ߎ ^Ä ^Ø ‡ ùô (Õ Ó« àJ Ô| xE  © ƒþ ·å  g¼ 3H 4y 2] R  1( ž /[ x‡ TŽ xÍ ÒV ía _š _Þ _ò ` `0 a0 a¯ 6 6} xâ 7 x÷ q` cA Au nL d@ dl dð e! e5 æ” e\ Ða Z% fN fb fv R† þq ¿, Rš ©O X Zo GU ìá ÷' Æ r e -Ü ]Ü eS ;¨ Nä bÊ vW g‰ gý l hQ h| i i[ i¹ ià iô eÅ k k< k _a mo |w …· ò o´ ºÜ ã [ ¾• Éb g g) á ê mí ní tr ³ ö gP q½ áX qé š ¡å xÊ rc tô ôò \æ r¨ 2œ E¦ Y ]$ 0q $8 Ñ; ]— d ©Ý ]¬ s‘ tµ tà u$ t1 u° uÄ v  ¦ v/ ]î 7 vC yÛ v† vš v® mÇ S _Š w w wH w| w Vv wÖ x& x: X ëk ÎY I© † «Æ #: ­Ú `ª ?Ñ 1> ªâ B¾ €; eƒ ¯É yÛ T½ z † 5¾ «õ ¹Û R òw ^ zé aò YÎ Â sW Í$ 8 h z® sk {ã ,\ Z™ mU Ùc UÖ 3] ¸ V 3t ¿ ò] VH p¤ |‘ |Õ O |é yz y, ^> á— áÖ ¥¯ ò0 yï —‘ }º y@ ˹ ¯ ¹ñ yT |ý ]h åï ‹ é 5í mi ® k” œ gâ i »‹ ×t ÖI V^ y; ‚Ž ö| OÖ ¼í ’q š` bø |; vŒ è¤ r ±] úä Ñ V­ «i ê; µ $i X »a d€ ð ^˜ * = ^ ^­ „§ kô _ „ú _1 në _] °' ‰! …S ô• ` »ê V€ ¼ VÄ ˆ¬ W! Ô V S v  3§ hÀ ½k 3¾ fŠ =8 Œm y ص q ûT ‡M ,¤ ¢ å ú ¼¼ ø  =  Ca Ãz =· —Ø Éþ Ø÷ Ͻ ¿¤ · ¼ œ œ/ )b Á¦ ¼K ­ êŸ é¹ ë8 Vó ê^ ¬ W * b b °š f‰ dd bq bµ c> 8ë _F ë p p' c¬ ]× | ' ¬ ¬y ¬Ž ®¼ ¯[ ¯p d| ­S ¯› ° °> ³ ˆ ¶Ï ˆ% ½ ¶ø p½ ·Z w0 íH €‚ d» dÐ c´ 6 e) e> æÆ Yæ ~Û *ð õ c y  ½– Ó wò Œ° %Æ då zý …g H! ¤Ù ^” `è  Ã ŒÜ Ž ¼Ô % µá µù ­ WN kQ ¶ ¶) Î; L Yâ ~— k« þ¥ $! pê Þ¥ 0 x³ Ò£ õ0 ¢° ò¶ `Y N # |8 ÓL Ʊ B‹ ŒÆ ÙÚ ¿Ô ;L þ‹ |º [s r“  ei e€ e— e®  ? ʰ ê~ 9Ü Õõ l R ?2 eÄ Gó ”= Iê Zg ?í ÊÇ 3‹ Ö °æ |¿ éO VÙ þÁ °ý ± ¾ \ ðg ó† =Î 6ª ö& ÊÝ 6Á [! Êó ÿ ª³ ì X | kP õ¥ 7 Ë ¶Ÿ H¨ F¼ hð sº ì g ½Å Ô ôÝ ZT ¸­ {š ½Û ¶· gÍ  º# ½ñ ¾ ¸î „ã ¨ï ¦­  ËÏ º; (H n 'P ±Ó g# ±ë §y {¶ ² u$ m ßè ’ø R£ ô +ø °i Ε âí  Ç¥ à c• "ù 3ë ¹ « ±+ ±u Ǽ )3  nÑ  p| I 𠱌 `r ûÜ zŽ _ Ÿ¶ ²1 ²H oÍ T? b  $ $• T” +É w Ö Ÿ æ­ :9 ¥0 ¾h § Œó Cy W C‘ üs W Y‹ ܧ RE w äÔ Å š‘ ˆK °Ì ð q Wq W7 Æ Ób ˜J JZ os ø× ŠŸ R\ h« q¨ t “ å_ #ó ( ª \º He .À oä D3 ùr 4b ~ /î °´ å# Ëc ª: ¢8 Vî J. Sœ & = 7M \Ò D£ 8 ØÖ 4 42 h eÛ eò F@ f f å 4J [ÿ z û „< ¶A óï z# @ Rû S/ ¾¬ Xk SE uO ‡â Ô Òç Îw $« Ä iÖ i Û -q ¿_ t Q’ Ý Þ= ³ô ‹b Þ n yP Yû ºS GÚ ç# çA 8J ãÔ S[ £» Ã- ö à Š ÏF Š/ ”m |b Ÿã § Sq rñ ‚ ä x Œ êÚ ‡8 wØ Œ #$ º€ vL Å* @! a L; X › ‰s îþ , ^ 7Á Ï ¹„ š4 %i % %™ W0 r1 #– dÙ Xþ 0D ¦7 v -X ¦N ×£ ‚¢ Pÿ R DÐ _r 5£ ö¾ le – n Ý“ r{ sê Ný k9 Î öþ N fK X n jµ }v å} í 6 ; ø/ È ª W½ *u dT !ß ã£ »L ò R ¼§ WÔ Tê ¼} ¼’ RÝ N= a f Eþ Â9 ÀÜ ¿í À H7 "f W° ‰‹  WÇ {. >+ Bt Xä ¥ þD …Ÿ ¦ bk ]P £ë :Å ð û= Œ˜ kÊ j ´ ò È Í² ¤—  4 ÷¯ @X @{ Ý« '¬ ÷Ä {÷ Q? ?f ü mP —I Ú  " U" Ý / —` Ì Ì. }ö 4½ HÞ 8Ö ÂS µ¯ wQ ( @ íü ,w Kà UÐ ;c : n #~ Àt à ÉK *Ž *À Žu T V« m Á ÁK ? <= <€  j à Ýà }Œ {Z V 9ó Î ç_ Ý ÕC ùÜ ç} ç™ çµ çÑ €Â |a XW 5 |¥ Ðð 8c & n½ Q ÔÀ ×ê ÌÞ j Çd â p¼ pÓ Wó 0¶ 2é Î ³ Wë ÜJ X— Áy h¿ ÝÛ Àò ”ƒ å³ =" }Ë H‘ Í} êû 9 uØ zq }à z Û ˜4 Ô ˜a Á3 ÁÜ Ýó ãV 61 Ž Ž ]/ 6J DJ Wš _£ ×» zF Oí } L Ìô >[ ( ´m ‰^ è‹ !` ]9 ‰© : :" ­ !´ !ù "; ù Ë¢ ä ä H  ³“ Š :O ŽH úû 7d pí –% ¨? `à \/ :f X… [ yÅ E "‘ ð˜ Ó|  º Z · >… "¦ ¸> ÍQ Íg ‚Ú 6c å Îþ s Tà [i Ú­ .× d ŒX Œƒ ø\ ᬠ%; Uì ½6 àè %R û ÄR *Ø ½N Ä¥ ĺ ¡^ æ+ ` "» Tw ìÉ ïQ ~4 òÕ ²x f "Ð ÀC p `: m7 ‘Q £¢ î ’ Œ' X M ão ›[ U< ƒE S ô« 7Ö ðQ €6 [ 1 9° j‚ ¬Ó ‡Ë þ× kÖ Oj ‡ú ) žÑ bT Ï+ ÅB ) Üì b8 [¹  ú Ôg g Fl S± ÅW ¤ð Sö ¥ è n1 ¨l à_ &¿ Â Ø rÄ ]L ïl €b ® ~q ®# y àþ ®Z õ] õu ~ è½ É á) :Ü }¡ V Üe ;" ;7 zÒ 9P è: u j6 f" ‡Ÿ   ÷ à j _ð q9 áë }á î¿ ¿ $ @ë 0Ÿ ~ñ è þ jL sd < £` ÃÔ m˜ mÄ w$ 𠇵 äp ä‰ …# ³{ dû ™¸ qÑ n 5[ ø— vÚ ’à ø¬ ÄÏ vñ ›± nL $ <« Ä ù Åè 8 ùE ØR Øu ° •õ ¦| q4 ÐÀ « AŒ @ ñD ña þî ñ~ ñ› ùZ ö“ Á œ“ ` A¢ –Ç Ìo  ¦ñ U }E ]€ oG õ¾ æ^  Æ ë wÀ ‘ ¤i ‘¨ ‘½ »4 ‘Ò ¬e ®¨ ²¨ ú ¶ä oû p> pS ph ]¬ p} p’ p§ ú # òE ¸™ ú4 ¸Â ¹ \F ¥Ç ïˆ ! !6 cÌ o® r ³0 Éå «: oÙ » :} :• »w ½‚ À èÕ :­ `² à À‰ À À± ´ Á Áò Ô @· [ Eb  ô: Ú :ñ Ãê  ³Û Ä* Ä> Äg Ä{ ]Ä Èì Ål Å€ Å” ž ñ U‹ ó>9BLuxAc“›¥È˃¥Ößé$'9×9ù:*:3:=:w:zDµD×EEEEAEDXhXŠX»XÄXÎXóXöa#aEavaa‰aåaèkPkrk¤k®k¸kçkêxOxqx£x­x·xìxï|>|`|‘|š|¤|Þ|áˆWˆyˆ«ˆµˆ¿ˆçˆêŽ˜ŽºŽêŽòŽü'*—Ü—þ˜0˜:˜D˜„˜‡¤y¤›¤Ë¤Ó¤Ý¥ ¥ ««4«f«p«z«–«™­3­U­­£­­­È­Ë¶I¶k¶¤¶µ¶¿¶Ù¶ÜºººÜ»»&»0»I»LÒ]ÒÒ±Ò»ÒÅÒàÒã׳×ÕØ ØØ!Ø@ØCá–á¸áíáúââ%â(ç¬çÎèèè è8è;ì÷ííQíaíkíƒí†ñ ñÂñöòò ò2ò5ýÓýõþ)þ5þ?þgþj&Hx€Š¶¹c…¶¿ÉäçPr§´¾ÚÝ$x$š$Ï$Ü$æ%%,‡,©,Ù,á,ë--4ð55J5Z5d5w5z;J;l;¤;´;¾;Ñ;ÔC½CßDDD)DYD\HîII@IHIRIzI}P'PIPyPP‹P³P¶Z¦ZÈZú[[[-[0ww%wYwewow–w™„þ… …P…X…b…“…–Ž.ŽPŽ„ŽŽš޽ŽÀ¦3¦U¦†¦¦™¦Ç¦Ê¾•¾·¾é¾ó¾ý¿¿!Æ×ÆùÇ*Ç3Ç=ÇhÇkÙBÙd٘٤ٮÙÞÙáá6áXá‹á–á á¾áÁêÎêðë#ë.ë8ë_ëbõ>õ`õ‘õšõ¤õÛõÞùPùrù§ù´ù¾ùùùü# SWISH format: 2.4.5# Swish-e format: 2.4.5 fun8.index C/²î2011-04-14 18:19:40 EDT format=1.2;   (.0123456789:_abcdefghijklmnopqrstuvwxyz  ('0123456789:_abcdefghijklmnopqrstuvwxyz'0123456789:_abcdefghijklmnopqrstuvwxyzƒ‚  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~‚‚o swishdefaultd swishreccount*d swishrank*d swishfilenum*d swishdbfile&d swishdocpathd swishtitleFd swishdocsize d swishlastmodified d desc d sec d swishtitle d manpage d digestd descFd secFd manpageFd digestFd refentrytitle d refentrytitleFd manvolnum d manvolnumFd refpurpose d refpurposeFd _/ª%Š ²N’@¢+Œ‘#˜k„K”VˆM–4‰?g …:¯†c‡_†>„x‘Wˆp3W‹'Œaˆ/Ž9†zˆj‘(³T–gªªg‹  L‹2Ž+„:¨I 0 ‚¾0.0·0.00y’0.000«§0.000000–0.001«ë0.002¬ 0.00222222<¸0.003¬Q0.004¬k0.008¬}0.009¬0.01y¢0.010­0.013­0.015­/0.01d­y0.022­i0.02d­™0.040­©0.047­½0.089°V0.090°f0.091°x0.092°ˆ0.1·20.129´Ë0.130´ø0.148µ 0.30sÀ´0.33sÂ/0.36sÃÃ0.37sÄ10.38sÄ…0.5·B0.50z 0.50000000ˆS0.5rz80.8·^010¸$017¸<020¸Â03 Éó 0367d01b1eb56995c68ad7c25d32f9dae040¸ö0: Ê0:05.87qº0:24.76$ç0:35.08ˆo0b Ø80b1000Sa0b1111Uã0x f; Úv0x8 f Óp0xfÓÂ1 †¢1.0¾ï1.00g¼1.0000¦Ú 1.00000000h1.1¿1.2.3bR1.204bŒ1.4.5g1.472j`1.50h­ 1.50000000Z1.55up´1.67uvÐ10 Ê10.0p810.00-10.2pH10.20d^³10.50/X100¿í100.10¿{ 100095.98Ì>100:q100:109ð¡1024q" 1024x1024R1031.508n}1032.610Fv1044qŠ109Àz10:ÀŒ10:10:0H 10:20:30.0)`10:50xw10dÁ& 10d20m30.0›‡10eÁ> 10h20m30.0vP10iÁN10pÁz10th€˜10x10 ï11 Ì"11.00O11.087º11.099Ü11.2fw111ÀÖ112.001Yï1120u1140uð1144.000„€115Àò11:Á11:15TÅ12 Ì[12.00¬-12.124º12.12sò12.3zÙ12.63s§120Áf(1234567890123456789012345678901234567890Óê1241.000¢1245Ç1263.000µä128Á12:Áª 12:30:15.5`13 ÌÃ13.07s êš13.7‡Ê135 136.971<¤13752%©13:Â14 Ü“ ÌÝ140Â?141.8ÃÓ 141055.97*k1428‘1442.0003Â147.000fb14:ÂÓ15 ÎÊ150.985ª1513›= 154.99000000:=1564›y159.657óS15936.00 ãœ15:ÃO15pÄ16 Ï7 16.00000000ب 16.50000000?U160ã1600.00Ô 1667457792»x 168.99000000iú16:ó16xÄc17 ßP Ïä 17.00000000Ÿ‚17.1600…þ175.54dÜõ176.00Lò179.57d€„ 179775.96´V 179967.96{¦18 ×¼ 18.00000000j$18.1600Wb18.1700[ 180ÄA 183.99000000ðw184ÄS 184.00000000«õ1840.851ÊÒ19 ×â 19.000000007_19.1600]19.1700Ø19.1800(^19.786ÔÏ1950 ~¹é19520.00 1986:`z 199.99000000¥w1: Ø1:03.50%¹1:10í&1:100:51 1:19.800Î1:5Ä÷1:6Å1:6:3L¤1b ÚÚ1d Úê1e ÛT1i Ûf1j ÛŒ1st×Í1x mB Ý2 ‹ž2.0ÌÍ2.00c[ 2.00000000È2.1Í2.2Í2.395Þ$2.4Í+2.5Í;2.50cà 2.500000005C2.87u ÁÓ20 ØH20.0o­ 20.00000000$Ò 20.01156d +ŠPß20.11f120.2oÇ 20.20000000ü200ÍK200.20ó„2000oï2003oÿ2007p200xq°201Ík2011p 202.44382 x/[‘ 202.44382dòi20:22:07M21 Ùh 21.00000000Å´21.863Åf21.8f’Ç 216.99000000€à22 ÙŒ22.11ftð22.4dƒ9 22.981700H? 22.982127B 22.982695.È2204{*222Ѹ 22:59:43.985k 23.4Ü23.45~23.45d`À230.390 B\+§ 234.99000000!J2348€023572´v23872.00åU24 ÙÚ240Ñò248.675~249Ò 24a592d8bf1de84a0278973a0b6bffdd‚25 Ú25.0‹[25.000…250 |vÒ 253.99000000Ô¥255ÒH256Òb27 ÚH270Ò‚28 ÚX28.583ï¿2809§ª2812§º2873.4609ç2880©]2880.999*ã29.345tl2993.000Ò¼2: àŽ Ú†2:4Ó02:6Ó@2:7ÓT2:7:2 ñ2:8Ó€2b Ý]2d Ým2e ݧ2i Ý·2i2Ù&2i2:Çv2i:Ù62j ÝÑ2ndÚf2p Þ3 3.0ÕÎ3.00B 3.00000000ˆî3.50C´ 3.50000000ý23.7Õà3.710M30 Û¤30.885å 300Ö300.30³È305Ö30760›w3087.015 ¿ò30:12¨g31 Ûø 31.00000000Lâ3101.029d”315Ö.32 Ü32.321xg320ÖB320148 <–ᜠ320831.94FÖ3238.000=32: ÖR33 ÜÕ330Ö»337ÖË34.121Ÿj34.295§M34.56Òª 344.725500Ô´ 344.731900 æ‹ 344.740432Ä 345.182“e 345.284038Œr 345.286480’–35 Üå35.423ƒ356×}36 Üõ360× 36daa9bc67c8b9bf76b30d1e889fd2f7@37 Ý37.231ú|37.9743ê373×µ3752846Ä’3776.817ú3826.403Õô388.0419‡3884uL3884.08€„3884.5‰m3885u\3886un3887u~3888u˜3889u¨3890u¸3890.5Yb3975.000ˆÞ3999.48„†3: Ý/ 3:4:6:7:8óc3:7×Ý3d Þ‡ 3d53b106edc02421ded7c946db987f78ás3rdëà4 “4.0ÙÌ4.00×á 4.00000000f: 4.10000000ɪ4.50ÙŽ4.500¥ú 4.50000000¶´4.66u«—4.914¼Ò40 Ýá 40.99000000NF400ÙÜ400.40q>4000ó4000.47ª]4025.492pÁ4096ü940x40U—41 Þ 418.625T4185.149Øv42.36uOÏ42.60uW–4216Œ4216.44216.5#4217œ4218®4219¾4220è4221ø42224222.4§}4222.5§4234.0004$ 42a20fe48d394fa0d9b5a5ff19fd0021Œ‘4382.000Ü›44 Þ+4415.540Ѩ 44686640ae2327ea61ae72128f916671¨:45 Þ;451Ú€457.183×Ñ465Ýü4681.000 êº 47.181656ˆ 47.181656dú478.000oa480ÞW 48e8534542b197c8b3b70c778d9d86cc1h496Þ£4: ÞY 4aec34e9222832066c4d05d9aa07e91dpÄ 4c6db9fddd8ac83bec7884e558a0f1b4»^4d ßI4j ßg4thòÇ4x4ó!5 ”À5.0ç^5.00"g 5.00000000Aí5.50#· 5.50000000‹*5.672VÞ5.972dô5.xçð50 ÞÅ50000ˆ50000.0  500799.90”#5013--502çn504.43ð505ç¼505.00Þg5057.000Òš508çÖ508.00…È509.65bž 51.00000000€È510.00*“510.50,G511è512è>512.00ªÜ512p2o513ê˜513.50Þ¬520êÄ531ë\5376.00Õ¾54.722¯©546ë˜548ë´550ëÐ555.5977Å56.922Ø/56.954Ùl573ìa574ì£574.325)Á575ìÑ5757665:5792352õ578í579ík 58.606523Ø 58.607634 N¬- 58.614301P 58.870920/Ä 58.874587€ü580î 581î! 58:45:26.92  59.99000000 ¯5: ß 5e06fa0caa9ab977bec42fb409ece14d¢ 5e5a600ff111fa37718789912f20cf23ÞM 5e633a3aca58c05045ba152dcc276f47‹Q5mböT5th  ÷â5x5ùÔ6 –¹6.00ö< 6.00000000  6.16666667áÙ6.173¶6.5ð…6.50÷X 6.50000000]6.xð±60 ßw 60.00000000¬u60159.99Œb6026.000\9625.000 &ªÞê63 ß•64 ߥ65.254Ò`650òW65000T66.465øÐ 660f237aeb0d1f8858ba54f973dc5084lR 674a8881522e4c8b8c9d3f8498903d3bŸÞ6976.00v6: à+6:10FÞ6:42.89l26:8ó1 6bcc18716f3239e8f3797a4579159df4”Œ6d ã6thX7 ˜ 7.00¢k 7.00000000Ò07.5õ»7.50¢¯ 7.500000007!7.9õÑ7.x ïõõ 70d700b958da3900f03042704e1d1a16ùä71.972_G725.375ßC7289.000øe72959.99Œˆ755.959¬•77 â|770÷Ž78 âŒ7825Óª7847.000—Â79 ⢠790043ce5ac48ea7c151662276a0e207€–79487708.71298325Ff79488017.99730176‘79488203.015618253Ú79488631.09462625é!79488769.94469174743.v79488769.94469175¥¼79488780.60006675o—79492685.94014275¥V79493290.86521725ÀN79493290.86521725357o‡79493432.00990875éS79493432.00990875065%Ù79493631.03866174817{þ79493631.03866175¶æ79493719.00160225ï¯79493997.45854474604yö79493997.45854475)á79494332.45355175]79494546.56818075"’79494546.56818075478aÿ79494562.35474326ý¤79494575.58943174779—79494575.58943175t79679.98‰798ùu7: âµ7:28.63¨* 7b21e227ac6a42b780d0f23e9a8fa2927£7p ãÆ8 ˜ê8.00µ«8.50·º8.699}­80 ã80.109FV800þ98037025:8070128ˆ?809.343‰817.000ºâ823.000¨84 ã<85 ãN85.0…8656.000Ã2 8733e0d4130466d4951aa2af4436b387KÜ88.00<~8891m8893}89.73u¼â895.818yæ8960.00Æ8: ã`8d äJ 8d5ce92208f4f4fc963d98500dfd093c];8x äz9 š;9.00¡x9.299.50¢š90 ã¬90.790D>915i9320ÀÄ93e963ebb8819471fe0cd4ab14c6f4c×m94094730250f9473025:9492240éA9492240’™96831.98ØP969.000Þ 96e4661c09c6774ac40eba44ad9728b4vÆ9820ðÁ98cf90baf564850c0ce8e145e907309d/99 ãæ 9986d9b24db7d30c3068bdf27110aa43šë9: ãö9e äŠ 9f440598e0a91c6d4018063e2fe74f4b…: ›:0:512Å-:1428o÷:16x@:2d _:3 äj:binsizwr:d äž:sizeÒÎ:skip×=:tlmaxÄL:tlmax:b²:tlminÄÀ:v1 ¶]'c:vv(b_ œ3_sortTa œCa1 ëBa2 ëYa3 ëm a668d775f8ba9feab686710d3da6bc78‡ a6b4242773c1ec68bb818bbbbb3fa6d8è÷a: ìa:255aaaáéab í!abbr­abbreviƒM abbreviation:Ìabil­¿ablâ ablerowget€Àaboutvùabov±uabsenci˜absentiÜac í3acceler¹£acceptÄaccessø accessed:UÕ accompanióD accomplishBaccord<Øaccountúaccumuc³accumul*+accur/@achievfaci㦠acknowledg ÞˆŠäactã¶actionATactiv”Øactual†Dad íGaddãÜ add3d37d6340ef15ca2b186e4a87134cÁáaddi»Âaddit 1addr»Òaddress“3adher/Úadjac6"adjoin1;adjustQradvanchÝaeväaevrec©o aevstruct3²affect¼afterJäagain¡¶againstdaakeyÝøakey:Pžakey:xxx|akey_2«Õakey_3«åalenåMalgebra²•algo ’¡ñÕ algorithmaliaózalias ¿align ¿Ìallåaalliú™alloc'1allot)~allow)Žalmost{alonûïalone: alongm,alphao» alpha_j2000>alphabetUU alphanumer°alreadi¦alsoüöalternu«althoughì¼alway¯2ambigu7­amount2¼amplifi‘’an îanalog'®analysi^ analysis: ³”3analyt(7analyz(]ancé0 ancillariÁZandé@and: ª÷ûangñ¹ang1ùang2anglIangle1Wangle2W¸angle3Wáangle4Wùangle5Xangle:X)angles:ÿ[angular=Þaniñãannòòannuli ÊannulusØCanothGDanticipVîanythyÎanywhervapió¢appear›Mappend °append:Pappli+KapplicülappropriW%approxim‘úapril5 arbitraric0 arbitrarili:arcôˆarcaniìarcsec¨­areôÄare: æõarea çiarea:v`argúyarg1 èarg2 è(arg3 è9argc èGargn èuargstrbÁargu è…argument@N arguments:}Íargv è¥aris ê arithmetÜ{around©array³ array.filxarray:Ýèarrayoføäas òas:ô asc2fits.c:¼òascensÞDascii asid '¹askú©assign³assoUdassoci•Õ associativ—assumúRassumpt÷~astro‹astronom³w astronomiÙ astrophys_at ö7at2p êªat2p4«Lat2p4:Uwat2p:«fat:ú‰atbúïatb20ADatb20:x‰ateúÿatmûatof`Hatoi`Xatol`jatp ›û=atp9`8atp9:¢°attach attempt=sattent'ñattribut׿atvû‡au ÷ au1ú¹au2úËau3úÝaugust„<autoiautomatÿkautomatiÿOautomatically:Tq auxiliarióTav ÷°av1û+av1:dž:av2ûSav2:d¤av3ûuav3:d¨æavailÂÃaveragvªavgûÓavg:lÊavg:dÙ|avoidXáawküaxeüaaxiü…axis1axis2¤b §üb1 ì·b1950ùÆb2 ìÍb20Þb3 ìÝb6 ìñ b6b46c363dc1068ad1257cb7efc963cfH€b: íbackÞT background£(backwardªùbadbalancE¢bar†barycentpÎbaseé}basici½basis:–ñbatchn? bb091d8854ccdc1797592ea45ba6e80cübbb˜bcolõ0be ÷À be8340953f3e9f5685f6678d4b7bd808 ¿Âbe:ábearZbecausÅbecom‚-been†befor£? beforehandg™begin®qbegun´{behalf€°behav¸>behaviorP²believOwbelowøôbelow:j(berñberror÷òbestÁbetterÞŒbetween‹bfile©åbigbigenL bigendianÆybiliti1+binLbinari«)bincolÙµbindKbins:}‘binsiz@Cbintabl¿bitÎbitmask³bitpixj´bitwis¥bkgd'q bkgd_exposurÞ< bkgd_filej- bkgd_regionŒ bkgd_timecorrYá bkgd_valuuÌblackâblankê6bleblemish4 blimit°šblinkrblock<blue/0bn þbook<booleanhboolopÔìboth>?bound%9boundariÁj boundaries:iboxÒ boxerrorbar’ïbpanda çÃbracket*kbracket:€Ê brackets:³+breakÏbregionÚfbright“Úbscaleñbuf ^buffer0ŽbuildÇÌbuiltÉ„but  butterfliQ6buy bvalu¹lby þ€by:bye-bynars:÷0 bynars:1428 ¤bypassÁÏbyte|Nbzeros'c ¨sc1:bv1‡@c1:bvl‡Óc2:bv2 ÅZ c53ab038566f310f7689ea4d08579d60Ü‘c857ea8c2616ea648fa720e637f6d84DÜcalcalculÞª calculation:Qbcall­Ýcallijcame¯‹cancannotFpcapabl›écard°Âcare°ê cartesian ëAÆcase±Fcase:;lcast³ catcatalog´°caus³;caveats:ɺcbufµ^ccFccc?cdelte­celestiz¦centerDNcentralF–centroid3^certainzycessÓÒ cfa3241d92a0cddd6f2950fd6bdc640c~"chandraû chang changelog7“charåmchar:þcharacta characterÁ¾characteristics:YÑcheck¬chipx7choos_gchose_‰chosen?·ciacciaø•ciatïŽcir circlK*circularªcircumst"/claim}½clarifiìclassicÜ»clearŸclear:¡Œclockî‰clockwisø£closeñ#cntsÛcode$*code:J code_misc¢Jcolècol1$Úcol2%col:dim)³col_act&tcol_ibufÄ<col_ptr€ col_read2 col_replacem°²col_writÜcoln&©colnam`Ðcolon~,color~~colormap©õcols2Ì cols:unitî±column‹}column1ËWcolumn:Ë™column:blank_v ê>columnnÌ“columns:z( columnselect€com©com1%Mcom11:_jcom12:_zcom13zbcom13:_øcom14c`com14c:bàcom2%]com3%mcom4czÜcoma&Ãcoma.fit››combinïÏ combined:jcomcharq&come&Ócomeotõcomm&ùcomma‚bcommandITcommand: . commands:†commentXö comments:T‘common:çcommun;Jcommut;ZcomparLh comparison0ŽcompassšcompatL€compilN´complƒ> complaintýÿcompletEÈcomplexFDcomplicFöcompoƒNcomponO‡composO¿compoundÞDcompressÀ8comz4ct”con·concentr_wconceptukØcondi†šcondit§ßcone' cone_key!üconfigurí†conflictrñconform×wconfus±Mconjunctu connect¸consecut'3consequf consid%Jconsiderü×consist€4constant¥~ construct¬öcontact a?ÎcontainUcontain:× containing:”‚contamin«content å9content:W©context ç9contiguimcontinuiýcontour”¨contrariu contribut™ïcontrolºYconveni1ºconvent1Èconvers2convert2È conviction:]Ecoor'scoord”šcoordi5<coordin@coordsiC|copi'ƒcor|core)‡ corollari1correctj¬ correspond5cost)±could½count½Œcounter ÿ˜ ä´ counterpartKcours¿CcoverÆcpandaEÕcpref ²vˆcreatcriteria¸qcrossKæcrotaKöcrpixMcshâcullC*cur~currentk÷curvD&cut [cygwin=0d ©f d0be5f311f329730e3705cbe9844f2fcí d: þ`d:10:10„"dardz dashzHdatazˆdata:ñœdatabasù… database:·datamaxCâdataminE‚datatypf„date%dbufš dceceafa5608652666787563d988fe2dLdd.inzh dd7d9195a153d495abfa34c8537f0136؆ddd#ddeÈdeactiv9deal´debug^dec#Ðdec:dýtdec_cenƒdecalphašÛdeccol:ƒ0decid'decimadeclarA declarations:?Zdeclin/ decompositddeembdeeprdef:Ždefault ºdefault:1a defaults:ÿKdefin(rdefined:]˜definit½z definitions:¾ßdefval pdeg$edegre/degrees:i£delayB-deletCPdelimCòdelimit:ædelinD delta_j2000©demand­ÍdenotQFdepend{:deprecظderivbbdescribÿ•descript ² descriptions:o/ descriptorÓà descriptor:ÓªdesignJŽdesirdÌdestroy*;detailõ-detect!detector]determin6Bdetidetx<dev$„develop¥ dfb23d07f6c6c0f7aa3a1f8e4f3f8281À§dian›çdid%die%,dif%:differh¢digit digress¨dim&dim1Ìdim1and«vdim2žudim2.fitX{dimen¨WdimensŸê dimension! dimensions:mdinat«Šdir&5directÊ" directives:ò· directly:ú directori™ÁdisallowFFdiscardì$ discouragìúdiscrepLUdiscretLmdiscussiÑdiskŸ~displayµÔdisplay:idistanc‰ distinguisht| distributQdiv&IdividÔzdivisÔ¦divviÔüdms'do™documentÙädoe'Gdon( done¾$dot(<dou(Ndoublc>doug¾ïdown¿dowritÙ\drHdramatb dramatic:Tadrand48ÈdrawņdrowǦds9(xdtm)dtv)dtype$×due)8dummi dureÚ\dxjdx:eà&dx:e:10â dx:e:1024u®dyïdy:eÿødy:e:10Ôu dy:e:3:12d9dynam5àe ªe.g.:Ÿ’ e0eb7d99645199cd844cc7882139b4e3 é$ e15bf6096d840d94fa15d3e5a2c52e99vÝe:†e_kmag§]eachbÒeasii)easierJ¸easiliL²ebgebufnßecy ecc967237a20e6f87cf2ba0649e8cd51bechop$ecliptb¥ed ed48bd478dc59bab656911623dc5c2ab ¿ edg ¿(edittHeee ¿ª efcb7f4e11db4639115ecd84d2674f3c(neffectÏefficiäÍeitherœ elementØÖelifáGell À4ellipsëielliptëõels ÀTelsewher"emphasçemptiGçenabl±0enamò•enclosencountiÁend ÀÌendian$“energi8ëensur:kenter>çentir?eentri@aenuncijženvi÷Ûenviron ÁãenvronYÁeof Áeot Á§epanda°ÖequaløequivalDô equivalent:Œ.eric Cerron—!error—1error:‘‚eso ŸespeciÞTessentiÃcetc.:%Éevªev.fit ɱevalu§(evcol¬½ evcols.c:hÍevcols:ò×even&Íeven:¸event¸‘ event_file:ªŽeventrec7o events.ev“Ê events.fil® events.fit®events:‹€events_bigendian§Í events_bincol3š events_bitpixîS events_endianc events_vcolJˆeventsandmore.ev[eventu¹“ever'Qeveri»Fevmergƒú evmerge.c:Åvevmerge:iÌevnextqª evnext.c:b•evolv]evread(‹ evread.c:evrec ÃPevstructwŒexact¤exam0JexamplqRexample:* examples:Ò˜exceed*Kexcept,µexcludUÜexclude:Ü«exclusVNexecut¢Éexecute:Ê executing:©existäœexit12expand‚§expect®Sexperi´Ãexpertis Ö¯#ãexplainÝexplicit`ì explicitly:vexposurÓexpr2™expressÅ expression:Ì^ expressions:äåext Æexten4nextendMextensM: extension:bö extensions:/¬externP¹extnam†extra5° extra_libUeextract¶‰extran©extverÅóf ªó f03efdbe8ed213426d085ebced5d9a22e“ f0c43d781d86443f8e63f208466b1cab«\ f55f023c147c3a17eb558863852de9da$÷f6.3Çf f6ddd0952239f2e3a078fc0388797621Æaf: ÅýVfacil¤=factb9factor8|failcfailur ¾ðfalsckfamiliar Šfastcãfastere?favor êÊ fbacceler5fbu Ä fbv Ä2fearzfeatur9_fed ÄTfeedz‚feq Äfferentý”few Äxfff Ķfiyfie Åsfield#ófields:¥gfifth(›fil Å‹file•Ëfile1F¦file2 i†F¾file3Fæfile:Föfileinfoý‚filenGÿfilenam‡á filename:¬Wfillœ¿filter¤efilter:ëQ filter_ccÊ¢filter_express î filter_expression1ÜIfilter_expression2ÜY filter_extra”–filter_idx_activ /filter_idx_debug[U filter_keepÿ filter_ptypp filter_tmpdirµ8finalQ5final_region1:ósfindfind:Rfinish^Ófirsts[first:62fit Åífits0|fits1|.fits2|>fits3cKfits4c] fits_bincol‚ fits_binkeyeW fits_bitpix»ˆ fits_extnam fits_extnum" fits_vcol«<fitsheadd¨fitsi|Àfitsimagfivež¢fix É™fk4 Å£fk5 ÅÇflagª1fli ÉÍflictó4floatìflush=›fmt ÉÛfollowõ‡ following:¨follows:ÑéfontÃ7foo Îffoo.arrSAfoo.c‘%foo.ev¸‚ foo.evt.fitŤfoo.fitefoo.goo_vP foo.goo_0.fitkD foo.goo_1.fit ›1ûe foo.goo_2.fit+foo.lst‰òfoo.out”Zfoo.rdbŸÀfoo.tab¨wfoo.txt«š foo0.evt.fitf*foo1ÂQ foo1.evt.fiteúfoo1.fitx¯foo2‡ foo2.evt.fitŠôfoo2.fit44foo3¹foo_evtHfoo_evt0kTfoo_evt1kdfoo_evt2kt foo_y.idxèçfor Ïøfor:Ä!forcÄ•formÄÇform:á}formatžformat:ØÇformats:G, formatting:({formeråfoundû!fourÆfourthÉÊfprintfllfpu Ú¶fpv ÚÈfractionlÚfragmentøuframe½Ÿfread̃freeÙFfreedÏJfrequent`ˆfromÚfrom: èeftp àfullötfulli¼fun àUfun2öÎ fun_bincolÓš fun_bitpix§m fun_blankD fun_bscalk fun_bzeroFfun_coly( fun_column•fun_dim1,fun_dim2,fun_dlen;ž fun_doblankJ˜fun_dpadO8fun_dtypum fun_endian>Ýfun_filt«µfun_fnam³ fun_format€$fun_gio¤fun_headˆ fun_ifungQ fun_ifun0ºfun_max1°òfun_max2± fun_maxbufs#y fun_maxrow;îfun_min1×Mfun_min2×]fun_ncolú.fun_nrowR9 fun_offsetSífun_opl¶ fun_overflowkµ fun_par_comY©fun_par_complexoú fun_par_integVþ fun_par_logŒ  fun_par_r-Ÿ fun_par_str¨÷fun_par_unknownxÏ fun_primariùþfun_primaryhead·œfun_raw¿9 fun_rawbuf( fun_rawparamßöfun_rawslBfun_rowsÒrfun_scalPìfun_sect_bitpix.,fun_sect_block å) fun_sect_btypP fun_sect_dim1f fun_sect_dim2g fun_sect_dtyp j fun_sect_x0¢ fun_sect_x1¢+ fun_sect_y0¢; fun_sect_y1¢Kfun_skipvàfun_typÉš fun_viewfilL0 fun_viewmatchÒ‚ fun_viewnamîfun_wcnfun_wcs0­$fun_ymaxxfuncalcΛ funcalc.s$ªfuncalc:^funcen‚funcen:äýfunclos 8§e funclose:;funcntƒM funcnts.out¿ funcnts.plotaé funcnts.sfuncnts:;|funcol„jfuncolumÙ¾funcolumnactivpÑfuncolumnactivate:funcolumnlookup®funcolumnlookup:9A funcolumnsfuncolumnselect(¿funcolumnselect:*funcolumnselectarrªž funcombinõ funcombine:"funcon„zfuncone:îCfunction,fundispAâfundisp: êNfunds9¹funds9:w¢funenvš§funenv:B funeventsget ¿ funeventsput‘funfil¥3funfil01ƒ”funfil02ƒ¤ funfiles:€funfilt¿ funfilters:ÔQfunflush…! funflush:3ƒfunhead©.funhead:)ÑfunhistÌ| funhist.plotø… funhist.plot:F†funhist:ójfunidxÝTfunidx:qfunimagšÅ funimage:Á¹ funimageget4™ funimageget:7 funimageputoX funimageput:”xfunimagerowget8Efunimagerowget:Óºfunimagerowputv#funimagerowput:ƒ]funindexö funindex: äí funinfoget¿« funinfoget:Êâ funinfoput ´ funinfoput:;funjoin¹Ðfunjoin:£/funlibùæfunlib:T¡funmerg× funmerge:ôfunonÀfunopen<¦funopen:Œ funparamget¶J funparamget:”¸ funparamgetb™› funparamgetd™´ funparamgetiš| funparamputÿÁ funparamput:Ý1 funparamputbÝA funparamputdÝn funparamputiÝfunrefxfunref:žZ funregionw¶funski&„funsky:Ìfunt÷@funtabl< funtable:õmfuntablerowgetñºfuntablerowget:mÍfuntablerowput4°funtablerowput:À"funtask1€funtask2€ funtbl)^funtbl:)pfuntest þfuntextfuntext:=®funtoolœ funtools.ds9Ax funtools.h¥ funtools:]UfunviewG•funview:›efurther&Å furthermorôrfuturû£g «£g:nan' gal_contamÃ`galactn­gameC gatherÞ}gb¿gcc D åwgcount4Žgeneru}generalÌ«generatÍLgeometr“×geometri jƒ@gerrorß•get å½ggg æ§gio æÃgivei&given=âgives:ó²gle ýM çßgloby¾globalþKgnuplotÝÐgoßgoal‰Tgoe é.goldenxYgood‹got é^grammerÔegraph¡qgrate¥ greatáÿgreaterÓgreenégrep”*grid”|group*{gt-gti ê^gti.filtpàguarantegui ê|gzip»æh «êhad ëhalf qêØhandÙhandlŠGhappenU«happi¥&hardÚHhardwir°Æhas ë…haveÚ±hcolfmtݰhd.inXŽhdr þ5hdu ¹q þJheadµheaderYŠheader: ¾Ú ¢heartÅ?helpãhenchere heterogenµ¿heuristu<hex²hhhhiíhi_binlòhi_edg})hi_val V–ªhidden²Íhidim]+high æÕhigher“#highest Ohint ê histogram÷œhistorimhms%óholdt„holderO9homet¬homogen‰hopeu8hostv‹hourv³how&¢howevQåhrc=8hrc.nepržÂhrefhrs?-http:µ‹huge.fitcóhundruhyphen#§i ¬-i.e ç÷i.e.:dIi1 ö«Ïi2f éüi:=ibuf(%icol1)…icol2)•icr #¬Xid Zidea0rident³Úidentifi’yidxY= idx_activÓ idx_debug7 idx_or_sort3úidxal;6idxandÄ|idxeq:ÝZidxmerg†4idxor?§ieee5~if Îif: þ]Y+ifiYrifil;®ifile1 äÑifile2 äßifilen åifun=@ignor¥Ìiii\ilaraäillegÄilluminH/illustruMim.fitvim.in1Kimagd  image.fitKimage:’imblank©Å imblank.c:·imblank: xXAimmediŒÔ implement ~impli%Qimplicit3"import‰} important:®Qimprov“²imuml\inÿin.fit-[in1.fitÜin2.fit=in3.fit/tin:\Iinamminame1ê¨iname2ê¶includ’¸include:H including:Œ¸inclus”4incompat ÀF inconsistlÊincreasÜ increment0Þind\ainden1indefQindependiˆindexcindex:`’indicžnindividuÇinetnAinfinit£infonainfor©ŸinformU·informajP information:’¨ing\€inherit@initoiniti¼›initial_region:ninnerëð inner_radius´Ûinnovî{inputúŒ input.fitv input:qšinsensitØinsert•©insid¥inspirÅ–instalÝinsteadº»int\¨int1qÀint:qÎinteg?integerÓ:integrintensÕintentåinteract“òinterfacª³ intermediintern‘¡ interpret˜ intersect'! interspers ãÖinterv‘Ç intervals:JÎintoqÞ introductDæintuit*õinvalid)óinvariPinvoc.àinvok.øinvolv’Nio×iparyøipar1 œ!iradˆiraf¤irix64Ôisçis:_Šisfi‰iso`issu‘®it"viter”C iterations:.itest.eváiti`(itselfliunits1š¥iunits2šµival1Œ@ival2 zbŒRj ®!j1 j2 j20000îj3 *j: :jfileRIjfile1@#jfile2@3jhke/jjjejn%ÞjoinSqjstatEñjusto·jval1 åOjval2 åek ®¶ k_msigcom.¸karapet:N6 karapet:1428¬ækeep¶kept·%keyjKkey_2Š'key_3Š7keywordø|keyword:Vx keywords:@kindÇXknowóÂl ®Îlabel *lack¯Ïlapo?larg¸ largerL}last¸Nlate¸élaterˆ°latter`˜lazi¹ŒlazyeotÇDldloOlearn•·leastœßleavïalectñÚledoileftò£legalº9lengths leonóvlessô¦letoyletter,levo­level5eleverag»²lexic@lfuntoolÁÉliboÓ libfuntools.ag© libmysubs.a zlibrariEt library.htmlÞšlieoêlift olightQ¡like Ëlimitj„line gline:plinear$âlinefe&ålines:)PlinkÐlinuxtlist‚list.txt±list:¦listfilP‰lists:8­littl’©livetim\)lm&Rlmysubbðlnamelnsl-ylo&llo:hi:ÔÞlo_binÃNlo_edgÓ^lo_val‚uload/Šlocal‘Æ local...endJÐlocat’hlodim:´’logpXlog20blogic³long1rlonger“Älook1—lookuploop2loop:ôlooser Zlotplowplow_edg[lower1ˆlsbq<lsocketõáltmqLltvqkm ¯dm:nnmachinÚämachine:£ machine:port\¿macroÆÒmacro:%madeŸ0magqâmagicî3magnitud›ÁmainŸ¼maintain¾™majormake „makefil›÷maliz•malloc±"mani¢Zmanipul›«manner¾ßmanualýLmapqòmark¢Àmask£Ìmask:;jmatchBEmath¤ßmath.h{maticCÔmationÏmatrixGÕmatterPÑmaxr4maximum»˜maxrowÖbmayr¡mb&ŒmeanµŠmean_pha“meantJ¨mechanx™memori·dment¸Lmentionì4ments:Ámenu¸dmere¹merg¹merge.ev›‰merge:ú*messagàmetsTmethod ²_Þmethods:”rmightàmileagTµmimick äZminsËmindÚ8minimmminimumkÕminkÚNminusÕminut minutes:ÅmiraclžJ miscellan Vmismatch&³missÞmissionïqmixtmixtur‚JmkgtiØdmodeŠmode1N`mode2N~mode:NŒmodifOYmodifit¤monthtmore ­moreov·5mosaic·most :move žmsbu(much5€multiòçmultiplæmultipliƒ)must7SmutualR³mxnv£my.regmycol:Õmydec?Çmydec:dÒÞmyraP!myra:dón ¯èn.fitNn:&|na'á nacis.fitzìnactivúnnamekÀname1–¯ name1:type1N¤name2–½name:–Ëname:dim§Ê name:min:max¤-name:min:max:binsizè×nanxWnango)nargoynateo§nativ» natur½ünaxip)naxis1Z+naxis2Zinb:w¼ necessari[únecessit¥6need‚negatÜkneitherv$netxç net_count“ˆnevynever4newynewevŒnewliŒ»next‡Wnf'õngame _ÃÈ nice“unized:®âno(noheadõwnokeyüÞnomic o…!nomin!<nonzénone­>nor{önormalÜnot|nota®anotath notation:Žnote®onote:hñnotes:€noth°¶notici“notion¬nowSnpha¶:nr:i¸anrad¿[nrowÀxnth¯nuancJònullÏçnull1„nullvaluî¡numçnumbere½number:›×numer„¦ numeric_countX©o ³ˆobject ÂÉobservWobtainÙ´obviat4obviousähoccasion§occur$ocol1PGocol2PWoctalc(odd‚Eoderj;of+Kof:‚…off‚Ùoffer·noffscl¼%offset½°offset1„Loffset2„Zoffset:„hofils½often/êofunuÄold„£old_¯¿older nomitØ)on5‚onamÝonc„Ûone…wongoÝøonlißonly:Êop8Oop1‡ªop2‡ºopenð‘operñêopera§ò operators:E²optˆoptim$optionHê optional:”loptions:`or8aor:ˆÉoradýorderhorder:iorders:E’ordin¯ordinari§Ú ordinariliW&org‰orientµzoriginÅMorthogon€¨osf1;otest.evÄðotherLÒotherkey´fotherwis¶our‰·ous‰ßout‰ïout.fitwouterrÉ outer_radiusppoutputÒoutsid/over¢overal_overflow-=overheadfoverlapœè overlaps:Toverlayoverrid¾¯ overridden.Œoverwritx™ownЍp ´packag êŒpadŒ>pageOHpairPñpanŒƒpanda=îparallelPwparamWparametG© parameters:ƒ{paren]ˆ parenthesp parenthesióAparlanc›>parsS«parser spartS»part:_ particularuHpassTfpastU pathU°pathnam’patholog‡Ãpatternd¼pc=&pcountíÎpcsŒ«pendopeoplÔ¿perŒßpercentHUperformDpermanª#permissUÄpermit­?persist›%pertain^™pevŒÿpevrecW„ pevstruct»¢pha&pha:i"phas}]phokphoton^GphysiÈ<physicC|pi=Hpi:i{¶pi:j{Üpie{pipe bøƒ´pipe:XàpixNpix2wc4Jpix:…Þpixel…|pixel:Œ›pixels:äXplace¨Dplace:ÔR placement§­platform2ÌplayŸ plempleasÂçpleteÇüplistîîplist:º)plot¢plus¤mpmax¥ªpmin¦êpoff´point’Ðpointer§. pointers: 7µpolõpolygonFpool´»populÇiportµpos‘positÞ³possibilities: Àpossibló˜ postscript§¿potenti?"practic·êpre‘=precÇ(precedó™precisôø predecessor:Çprefer *prefix prefx2preparKprepend”presenc[epresent[•preserv\ÏpresumX¦prevÇKprevi5Lprevious ÄÊprimari—ÒprinciplŠprintHŠprintf¢priorHÒpro‘aprobaoßprobabl×÷problemgæprocess8¾ processed:‰.producðÑproductoIprofilú:progÍ“program+ßprogram:«Åprogramm¬ programs:ºúprojÍ®projectn¼propag=Òproper?properti-·proport(propos@QprosÍàprotectaôprovidZ provisional:²çpureëpurpos#@put’qpoeƒêqsortÃpqtpie „quadrant[=qualifiÚ™qualit”quantitigAquarter£quasioHqueriƒ^questionÕquick¥fquot™kquotes:·r ´hr1>ír2? r512 Q©¿r512.400Òp r512.400:2880€¸r512liíra?=ra:hÄra_cenL@racol:9Qrad_cen Eradial­ßradian®'radiiPüradii:²radiusµmradius1#radius2#°radiusn$ºrandom’ÿrangÏ] rangelist:&õrapidrareÒ6rateÒNrather6Ëratio›—raw¡ rawx:j:100]x rawx:j:1:100Õxray¢årc?Ðrd?ðrd_flgkÅrdb¤+re@ reachŸ2readà:readablk$readiŸ@realá¬realliÙÔrearrang~reason äreciproc‰×recnamûrecog©recogn  recognized:Cd recommenduÚ reconfigurL recopiérecordirecord:=Ârecords:8®recreat†$red¤•redhat‘redirectì¬reduc¬Íref¤«refer·E refer_codreg¤Á regalgebrai regalgebra:€èregard8½ regardlessêºregbound9Ë regbounds:5(regcoord• regcoords:Ÿregdiffregdiff:differ¸Ò reggeometriîÒ reggeometry::Wregion^rregion:Øregion_expresspregion_expression1”:region_expression2”Jregions: š regreometri&[regularHrelatÔ"releasݨremain‰éremaindpKremediªîrememb­‰remindÑÔremovÜÍrenamÞ4reorderšrepeat`¢replacˆ(replace:øÀreplic‰"report¨repres¶ request+·requir‘" required:6 requisitšÃresearchïžreserv#Xreset Âôresid ÃÐresolutb»resolv_WresourcŸ®respectùrespondQ‘responsQ¹restóúrestor{restrict&result~žretri å­retriev Ré¦YreturnW¦ returned:¬revers·Frflg¾ri@>ridden[rightv*rinnerˆrmB±rnBÁroBßronment^Ãrootlârotam½rotat&ƒrouterR!routinRtroutine:àrow¦’row:mãrows: êàrstartÜrstopü(rule™Írule:\ruler\ÿrules:džrun­mrwBïs µ2s100.150A©s1024z©safe´same²sao¯saoimag-Msat¯$satisfiÔ;saveßsbufdscalarKscale·†scanf·Üscenariofªscientif9÷scol"Dscope0vscripthsearch7Ùsearch:Wtsec¯àsecond©5 secondariA™ sect_bitpixu›section˜d sectioninfo½x sections::Îsecur "å¡sed¯øsee°6see:)¥seed)Ãseek)ãseekablîkseem* seg²™segment:'segv*[select¢ÐsemantZsemi+ semicolonU‡sens+ôsensibl‰Ÿsensit {±ížsent,7sep²©separ f separately: §sequencn¤sequentisŠseri,Ÿserial,oserious¥Wserv t -server{–session5lset²·setenv h›Lsetup'Æseventh¬¥sever/Ü sexagesim‚ sextractor›Ósfile§ sgi´cshC shapeè.shape:Àshareó<shell Àshm:;Œshort‡Úshortcut½hshouldþshow;¾shown‰3sibl?2side?Bsign?jsignalÁsignifiˆásignificˆŽsilentwÒsillinQsim´‹similarb( similarly: ê.simplvàsimpli‹¸simplic´Csimplif´SsimplifiÕˆsimultan‹Dsin´›sinc@•singlxÅsionAˆsituatÄ¢six´³sixthÁßsixtiÁ÷sizeDêsizeofþóskeleton¬…skewJskipJ@skyµslasháWslaveáãslice`slight slowRslowerÚÌslowest¸æslowliܧsmallªþsmaller'Þsmallest*snr.ev”–soD(soa·2soa:dsocketìsoftwar¿/solariy8somej4somethzÉsomethngñªsometim9—soonjŽsophistªësortkèsort: ·sourc Ðsource_exposurG„ source_filÇ source_region€source_timecorrbDspace_Éspatial¯»spatial_region_express€úspeakwâspecl¢spec:wòspecfiÇ–specixspecialVspecifÇúspecifiW¹ specificav´specification:Oß specified:z– specifier:{îspectrumPgspeedx*speedup»hsprintfßsql·Ž sqlch5.htmß5 sqltutori–ãsquashÃ"srEsrand48ïsrc·Ìsregion sscanf Ħstan€ústandóƒstandard¼7starbasѲstartôstatstateõ}stated:ý´ statementí© statement:XstaticžstatusŸè status:4j;&stderr6stdevtstdin‘stdoutTÝstill2stop lˆƒnstoragCstoreRÆstrcmpk strictNstringŽstrong§÷structÁë structofarray?ïstructur÷ structure: Õ¸ Ästscib|style‚,stylist¨G subdirectori"Wsubjectz¹ subroutin’+subsequ…subtractàsucceedŒsuccess"¢such†ªsuffix’¸suitablS)sum¸ùsumcntº summariòysumpix.^sun¹Bsup¹\suppliÒÀsupport-ã supported:CsupposÔ+sure‹msurf_bri… surf_bri:¹¢surf_err¶à surf_err:X¹surfac&ksurroundµôsurveyÚVsval3®òswapžÚ swap.expr73sway:¡hsweepµJswitchÅÄswitch:*Ósymbol…žsymmetr FV\ßsynopsi;‚syntax´Ôsyntax: ksystemm…system: systems:0¾t ·\t1.fitaÑt2.fit77t3.fitÞtaE6tabºtablàXtable:­‘tables:’átabularùîtailorßWtainå=takeæÉtaken Starget#ètaskêôtbENtbufò3tcE`tcshödtdbin âçtdcº technique:€Øtell¢temptemplatƒ‹ temporari/ÂtenºŸter»ptereYterm}terminÇtesttest.ev üˆ—test.fitì3 test1.fit¬=test2.evód test2.fit‚• test40.fitÓxtext; text_alen Ö zr text_bincolÁ: text_columníd text_comcharO) text_delim¿Ktext_eotî text_hcolfmt´Ä text_null1 ÄtfieldnÍtformp^tform1´tform2ætform3þtform4 tform5 tform6 .tform7 >tform: Ntgr»ˆthEðthanKthatethat:the»Ñtheir†themthem:themselv}EthenftheoretÕ®there²thereforƒÄthese€these: QC¸theyûthing2ðthink3third3ÍthirtiJàthis3this:3“those]¨though·¸thousandn/thread +threek thresholdqÊthrough®thus%thus:|ÐtieØtile* time*!time20:time:d×—times:ä½tion-Øtitl.tlmaxÔßtlmax18mtlmax28}tlmax68tlmax78tlminÖÛtlmin1\otlmin2\tlmin6\Ÿtlmin7\¯tmpصtmpdirŒ0toF@to:Øçtogeth–tokenv`tolÙ‰tolerz¶ tolerance:“ton ¡Ù¥tooÚ4toolF(topic”Ètopics:·ÚtotÚDtotal´,touch¶ÖtraceòÚtraditÇtransfer¥F transformbËtransitŒtransparòÿtraversh’treat C treatment¤triÚxtrianglntrueUó truecolor btrumpq truncatA»ttype1ttype22ttype3Bttype4Rttype5bttype6rttype7‚tunitKtunit1šõturndQtutoriåtval3o6twice:Wtwistu,twoÛtwo:k’twosk°ty_array@Aty_ev ^ty_imagoty_tabl ÃFytypevðtype1‚ type2‚type:‚&typedef‹Ttypes:2wtypic‚ôu ¸Lu:EucdÝpueQØultim“RumnàêunaffectIunaligneunambiguhunarià uncertaintivunclear¼‹uncommonƒ† uncompress_7undeclarb&under% underscortœ understandGundocu¼unexpectÁJunfortun•Çunimportú^uniqu@ unitÕ units:sIunixÕÆunknownk•unless›«unlikL¶unlimit‰âunnam_© unparallelÑäunrelxunsign!–until$upQðupdat£õupdate:Ú¼updated:upoáÍuponå5 upos:4096€ÚupperßmuptoóŠusR‘usag!+useâuse:!dused:tÌuser"?using:Ããusrè¥usualÀ±util ¿Dv ¸xv1 fbF$v2Q|v4.x 3Nnv:Qœv::view1õ«v::x1)¡ v::x2:fooª v::x2:foo.fit²÷v:eÜ— v:foo.fit‹v:snr.evÓˆv:x1t>v:x3tNvalêþval:val ?validVIvalid:zvalu”ÈvaluablØvalue:Ô…values:!Ä vanspeybroeck„˜varargˆ‹vari›variablŠ variable:7CvariatíüvariousÊ´vcol´ãvcolumnjtvectoryXventionRdverbosbpveriáversaÔÐversionvertexàvertic ð viaìbviation„vviceü÷viewý!view2 Ãàview: Ãðviewlist#"views:J,virtualÚ*visual´¢vizier “¡œvoid%évpos+3 vpos:49152qvvSvv1í4vv1:vv2G vv2íDvv:íTw ¸Ëwant‰2warning:£wasî wayîÎway:‘Zways:egwcS¥wcsï‘wcs.hzwcs2pix’¨wcstool°weSµwedg ꩯwelcomhwell«.well:”hwere¬Ÿwhat¹ÝwhenºQwhenev3whereÕøwhere:Hewhetheršwhiòêwhich  whilemwhile:¨öwhiteé whitespacíïwhoówholeXQwhom¾Ïwhose[£wideÆkwidthwidth:0®willÈLwindow„Ë windowsnt4^wingÌNwishÍÈwithÎ withinËãwithout¥‘workýÄworkstatfRworldÜÁ worldcoorSworstݘworthÝÀwould÷ëwritablëlwriteâ? write_row«*written]|wrong äýwww.cs.unibo.it87 www.gzip.org«www.harvard.eduOI www.tbray.orgóx ¹zx0RÃx0:x1vçx1R×x1aíx1a:foo‘x2S x2:foo.fit;Þx3SYx:S•x:1024C8x:dí¶x:e:4¯™x:iíàx:i:10•™x:i:1:10€Ðx:j:1024#öx_imag5 xcUDxceniüxcenter×íxcolk„ xcol:0:512x‰ xcol:xdim; xcolumn:xdimy‚xdim2 ÷ éNxds9pòxfUTxflg€¸xgnuploté1xlabelýÛxnUtxnamŸÎxname #ÏÇxpaú>xpix©xpos«xrU•xsU¥xtensionXÆxtraÀxw1ûÊxw2ûæxwhiËsxwidthù¥xwloÎuxwnü xxxüFxxx:3a´xxxxÔbxyVâxy0:xy1ŸZy ¼_y0:y1 éJ¼y1Tèy2Uy:1024Òøy:dõCy:e:4WRy:iõ[y:i:10bÚy:i:1:10Ùy:i:2:115\y:j:1024íty_imagÃycen êðycentÊøycol¡ ycol:0:512 ÄD ycol:ydimJ® ycolumn:ydim¢[yetÿ7yh1ÿ]yh2ÿyyheights¢yhhi qryhlosdyhnjylabel·ðynVôynam®+you™yourÙ6ypixÝ‚ypoŠyyy£yyy:3a5yyyi#‹z ¾ÈzerobIzlibˆ|zoom¦üzzz zzz:3a€ê‡`!ƒl¦‡a0Y„w$©' J6.Ir¯‚v„xLL \xD*2.&ˆª‚6*V^Œ¤‚Y' 0†A7"b ƒG‚>r5r  §‚JY„u¤‚s-L±‚4¤ˆ„0‰w@£‚M.¤‚w} 1±‚±‚'±¤K ‚h £o‚¥„!}0­5  @©+ qj‚ "¨y 5,W-£‚ (¦mG‚d#=±‘d¢ƒjƒx¤ƒ/‚E ¤&Œ' ‚T£hC¦U‚A.7±…´I{0¥…†ƒ ƒm¦œt0Y„w$©…. J6.Ir¯œ„xLL \xD*2.&ˆª“K*V^Œ¤ˆ+Y' 0’u7"b p‚>r5r  §aY„u¤†xs-L±…¤Ÿ]„0‰w@£….¤ŠB} 1±…±…F±ƒ[¤Š7 ‚h £†'‚¥’p!}0­‡  @©‡3 qj‚ "¨ˆj 5,W-£†+ (¦‰ G‚d#=±«O¢Žsƒx¤‹/‚E ¤–YŒ' ‚T£†mhC¦ˆl‚A.7± ´ƒf{0¥™+†ƒ‰x(„X®‡j)Nƒse&0d …u¦1‚{% '…g%+%'-X !j3?]†- ¤…f8o ‚5=OW…‡ F¦‚$I‚I6­„>S/A> Y/! Iƒ!‚Sdn!#8 =)±‚# ƒyMm4.+''±„&±ˆ (~1R„eF2"¬y4#.+*! " £ „w ¢9V±†\±‚X¥„> E£‚ "¥&£ZX±…K´„g0¥i? ‚B © K ªv‚{ ¥[ 5$±‚-¢‚hƒ ¥mR"  ‚m‚;BG‡"‚A $c ]‚r|c‚"L;  # ƒ ?K?&t ¦ˆƒb  ‚  „v#ƒ8UJ"5j®y  «M ?e ¢Wƒ¥ƒ!I‰ Y 8±•±… ±™)±‰!±‘±†±ˆN±Œ7±‚&±Š,±„)±ˆ±‹±„b „_®œ})Nƒse&0d …u¦…8‚{% 'ž6g%+%'-X !j3?]†- ¤8o “J=OW…‡ F¦ˆ0I‚I6­ S/A> Y/! IU‚Sdn!#8 =)±„F Ž"Mm4.+''±ˆL± (1R„eF2"¬…X4#.+*! " £ˆf„w ¢„V±ž'±† ¥Œ E£…o "¥„E£ƒX±Ž7´’sg0¥‡U? ‚B ©†p K ª‡v‚{ ¥‡L 5$±†F¢Šƒ ¥„*R"  œX‚;BG‡"‚A $c ‹f‚r|c‚"L;  # Š{?K?&t ¦ƒb  —@ „v#ƒ8UJ"5j®‡@  «†iM ?e ¢ˆnƒ¥—EI‰ Yˆt„4¥ˆ…6H¢2ƒE 24<ƒ ‚R q q  P33<„ ¢†Vg ‚89IX‚LIIU‡¦‚ YH ‚"¯„BS/A@"< $ / † b‚v-: =$¨v…g * @±ƒy­‚bL…JJ=­o@#++&! ±"±>¨„;Z‚n?]¤ ‚C ‚B ¢M¤ƒi L ¦m 5} £oV …}†.ƒY ,\©_‚vf‚‚$ C¦†!…_ ƒª‡Sk,ƒH;w F‚r ? ±„«ƒ0‡‚ „9¥…6H¢…9ƒE 2šZ<ƒ ‚R q q  P33<„ ¢tg “M9IX‚LIIU‡¦ˆYH ‚"¯ S/A@"< $ / ’Ab‚v-: =$¨‹…g * @±ˆ­yL…JJ=­†N@#++&! ±ˆh±„¨œZ‚n?]¤ ‰/ ‚B ¢‡!¤‰q L ¦‡^ 5} £„,V Ÿh†.ƒY ,\©‹h‚vf‚‚$ C¦›%…_ ƒªk,ƒH;w FˆK ? ±‹6«—>0‡‚…}&‚U¤3‚8#DªŒuW 39 ‚;&  GY‚FIF ±‚X«„FS" -D!YY †p‚#$: =)¬…+;DR( ¬‚O  J‚« 8#>.t¤ƒz‚6±‚^±—K±ƒ2±‡K±ƒo±ƒ±‚<±ˆl±„8±ŽZ±†l±…T±†±†q±„±‡§ # T ©WƒL‰V ´‰tõð¥…i‰Mƒw©‚ Œ8Bm°ƒXVÆhˆŠ»ªf§P§ƒ ‚:ˆZ<!«`‚ :t ¢… ,²S ©‹$ƒR bf Fw±‡I±‚a±—N±ƒ5±‡N±ƒr±ƒ"±‚?±ˆo±„;±Ž]±†o±…W±† ±†t±„±‡! ‚Y¤…:‚8#Dª¦W 39 “P&  GY‚FIF ±ˆd«S" -D!YY “$‚#$: =)¬T;DR( ¬f  J‚«…p 8#>.±h¤‹@‚6±…<±¯±†d±±‡^±†>±„x±‘X±ˆp±4±X±‹(±Œ±b±ˆ2±Ž<§„M # T ©›BƒL‰V ´”}õð¥šm‰Mƒw©—B Œ8Bm°ˆ^XVÆhˆŠ»ªf§P§“; ‚:ˆZ<!«†9‚ :t ¢,²ƒp ©ŸHƒR bfƒ%O§Œ}m836Pƒu !‚2 0?>‚@IC ¦„JS1$YW †q‚ %: =¨†o  86©‚_B¦ƒ?. *¢†-±G¦…]‚C#‚+r¢‚e­„m‹0 Li‡±…=¦Œ\‚.£9b:¤‚v 9 ¢…)¢L£‹' †7 O§¦#m836Pƒu !“G 0?>‚@IC ¦S1$YW “%‚ %: =¨‘  86©vB¦ˆ. *¢s±„%¦(‚C#‚+r¢†"­žX‹0 Li‡±F¦¡`‚.£¤lb:¤ˆO 9 ¢ )¢ƒi£ŸK †7ƒuwµŽ76Ó§ƒD]§Ž:&J3…D 1‚/)51 ‚:I@ …v+:§ƒRfS.'Y †r‚&: =£ˆ P ¬‚[8±¯ƒ:FRO¢‡3ƒK§ 0 ±†h§˜_ 0±…<¢„‹¤‚w 9 ¢…% ch„~R‚\‚)4/3 G wµ£J6Ó§ˆ D]§§`&J3…D 1“D)51 ‚:I@ …v+:§ŒfS.'Y “&‚&: =£’4P ¬r8±…q¯ŠW:FRO¢ž~ƒK§„R 0 ±=§²J 0±.¢™R‹¤ˆP 9 ¢% –h„~R‚\‚)4/3 G‚P$£Ž1 ±•X )‚0'2',.‚4I=…e$3§„R:+*@¢†s‚#ªˆ #©‚\5'ªƒ3 @ P G ±‡d¦˜Q)±†~±'£a‚C«„-6C¤ˆJR…a‚n %££D ±®~ )“E'2',.‚4I=…e$3§:+*@¢“'‚#ª’) #©s5'ªŠI3 @ P G ±Ÿ/¦²<)±’±¥Z£†:‚C«‹+-6C¤œnR…a‚nY j¤<T ‚GGbdƒw…e3B¢‚(Y¦„V‚ ;/¢†t‚#¦ˆ;£‚{e¥ƒ@M]P±ƒ² ‚9À±¤‹sŒX¤‚d. j¤¦bT “\Gbdƒw…e3B¢ˆ4Y¦!‚ ;/¢“(‚#¦’*;£Že¥ŠJ@M]P±š[² ˆAÀ±‰f¤¥^ŒX¤ˆ=.‚M#¥„ƒb †, ¤=T 3„|†h-¢‚Y±„Z§T…E >¢ˆj±‚&ªƒ -8FC± £i±‚±±‚ ±£  0±‚/¥„„Hq?±„±+ ‚_ ( #¥™/ƒb †, ¤¦cT ’H„|†h-¢ˆY±%§Ž…E >¢’Fj±‡ªŠP-8FC±ƒj£™4±‰`±… ±…*±ƒ>£ „Q 0±‹¥ž „Hq?±±¢/ ˆ8 ( O e¤7 P 9 † †h-±„^¢†v‚#¥ˆ9 ?¤‚s-Lªƒ +8FC¢ˆ^ƒ:± q¤˜Y0¢‚{C±Ž e¤¦] P ’N † †h-±)¢“*‚#¥’-9 ?¤†ys-LªŠQ+8FC¢ )ƒ:± ‡y¤²D0¢ˆTC±£#‚±ƒe²ƒh`¢ƒ8…*±P¢{%±…d±†>±ƒt±ƒe¢„‚j±†(±„*±‚`¤„MQ[¥ „’`?¤„8¥… ‹k£I‡0x¤‹0@ +±¦ƒ,-¢‹Hˆ& ±˜x²ˆo`¢ŒV…*±¡e¢ˆ%±Ž/±’r±Ž±ˆ ¢Œ ‚j±s±‹u±‹L¤“'Q[¥ o’`?¤‹r8¥š ‹k£–|‡0x¤›V@ ±†±ˆ'¦‹1-¢Ÿlˆ&²…"` ²‹*` ± E ± ƒh—5/‹ D:+F'3**5*(    :pV(_ A;u 3& *  ^©FD)<8.\vT ()  ~8[ -ƒ3 „4(,,9 =5  3  Ya  1 H&:63$ ?8@ ) .7xici:O 0v2?0"6  b  '  [&MY2 X.  5 1)P73G(9< *   Tf `U* *r3k<),8 !¦ E  '?6%9 > ? J  # r¥3(!¯J,5 c‚@ #  " a$zd8$l&!"!@Z ¬ : :' 4V5*¤  F­O6‚‚ 4§ !:c9O @D0o  #%V& >%y #( G e8Mƒc‚> (‚XWª   D' '&? $b$VMi® #=]:X¨,%1 %-1¢Ao¬6"s'ƒ|  %/*$ HF , !#&B#rp c"1H!V$/1‚    k% "_$0(0u ­ D R ~TL$  O% ^= 0! ./    %n%0Z­!$7  eX" 'A<1¬&+ $CI \©-'N)  < 2T: #) & 9 :(y>$G' ?‚  0% Aco;w T` Y ‚.H@# g4 6B/ Z  - ( `#6 u<E  bC!,4 0‚ 07TWƒED$& 3 >\#ƒ.8-K  ? (m1Y| ‚:)@DJ GG U     w > Y#    *1 69 ^a @ -D[ ' % ) J @0 7v], VC# 'X , :>   2.J. ,-0¯+9"EC< ;E  f ;'J(|E  :%-|w^ B8-, W>z¥< eW 2%e&) 79 622*^H4%D*) th56x+) I±’B±¢0²Œ0³‘C²˜l@²„M0²–5@±‰B±l±…@±‡e±ˆv±\±‹,±Œ±–±n ‹F D•#:+F'3**5*(    :pV(_ A;u 3& *  ^©…MD)<8.\vT (šO  ~8[ -ƒ3 „4(,,9 =5 ‰)3  Ya  1 H&:63$ ?8@ )‘ .7xici:O 0v2?0"6  b  ' †[&MY2 X. ˆT5 1)P73G(9< *Œ=  Tf `U* *r3k<),8 !¦‚/E  'ŠC?6%9 > ? J  # r¥„A3(!¯‰N,5 c‚@ #‹# " a$zd8$l&!"!@Z ¬„h: :' 4V5*¤} F­ˆ6‚‚ 4§‚g!:c9O @˜0o  #%V& >%y #( G e8Mƒc‚> (‚XWªƒP   D' ‡r&? $b$VMi®ƒ{#=]:X¨ƒK%1 %-1¢‚}o¬‰""s'ƒ| „C%/*$ HF ,Žg!#&B#rp c"1H!V$/1‚  †u k% "_$0(0u ­…]D R ~TL$ †O% ^= 0! ./ †~  %n%0Z­„:$7  ‡=eX" 'A<1¬ƒc+ $CI \©…b'N)  < ‰T: #) & 9 :(y>$G' ?›x 0% Aco;w T` Y ‚.H@# g4 6B/ Z  - (‹`#6 u<E  bC!,4 0‚ ˆ07TWƒED$& 3• >\#ƒ.8-K  ? (m1Y| ‚:)@DJ G•EG U     w > Y#    *1 69 ^a @ …_-D[ ' % ) J7 @0 7v], VC# 'X , :>   2.J. ,-0¯…s+9"EC< ‡RE  f ;'J(|E  ˆ?%-|w^ B8-, W>z¥‚Y eW 2•Ie&) 79 622*^H4%D*) th56x+) t 7¢p#±‰(§,„ G‚xa¤ƒ ‚{:±ƒ£„„I9µ‡g¯H±†k²ƒ  8¢ª#±š=§ŠU„ G‚xa¤šX‚{:±Š/£ž„I9µ’p¯H±›o²—9 os¯~ /‚Vp‚‚/9†#>¢V<£2ŒW ±U²&¢ˆ¥r ‚{-² §„ }±ƒa¥„\!¢„aƒ6±…;¦‚p‚j²J@±Œ) w¯– /‚Vp‚‚/9†#>¢©|<£‘GŒW ±‡a²‚I¢’C¥„pr ‚{-²„9 §‹ }±‰5¥‹M!¢6ƒ6±Ÿ&¦y‚j²‡@± M‚¦ƒ~‚6‡M²†.§Y7m~„d¥‰ƒ8‚e±…n²ˆ ±†£ˆ=#±G¦:‚ Aƒ¦%&‡z:±‚V±‚N¢F±…,±ƒ\±„&¢„5„J¤f*¢‘W4¤ƒ*~ ¦™‚6‡M²ŸT§‰=Y7m~„d¥š1ƒ8‚e±‹z²W±’B£’D=#±…m¦ˆ>‚ Aƒ¦¤p&‡z:±†±…m¢„±”±ŠM±Œ{¢ž „J¤¥j*¢§ 4¤‹#*~q5¤{¥ JD3±‰±ˆ ¥…4ƒ&%§‚2‰K± ƒm±„1 7¤•%{¥™? JD3±š4±U¥]ƒ&%§™}‰K± ‰u±ž, Q« ‚†„Q¢†2„  ‰2@"#*37033¤…6‚a¤G‚±ƒu±ˆ{¤…ˆK[ V«•' ‚†„Q¢ŸX„ ‘& ‰2@"#*3703±‚V¤_‚a¤„9G‚±‰}±¢f¤•<ˆK[D²Œ`¦;‰x!¢B¤…'ƒ]±%“| ²¡s¦™a‰x!¢ B¤Pƒ]±%¨ @£z(~±„¤‚^-¢‘‚W±ƒ@ £‹(~±Œ ¤„r‚^-¢¦ ‚W±‹Eƒps¥ ƒ{)§G“Iw1F;£‰%…±Y¥†/ƒo ˆ Sƒ]‰c8¦„.R¥b-D¶‚<"Q°ª4  HµW#s¢‚‚®„ u‚±†ªƒ >J·‚-"C“±…b¦ƒC l.(‚:.K<£„"„TŒm¢p@±„*§‚W(‚‚P†[¢ƒ((±‘M v¥… ƒ{)§™m“Iw1F;£š:…±‡e¥‹.†/ƒo ŸUSƒ]‰c8¦‹yR¥…Q-D¶…["Q°ªƒp  HµŠC#s¢†N‚®’r u‚±Œªˆa>J·ˆ5"C“±ŒS¦‡7C ‰ .(‚:.K<£ž „TŒm¢¥t@±‰q§’}(‚‚P†[¢‹-(±¥q E§(‚5‚-&o[±‰"§A8*6 „p©‹BQ …|RZ±„/´‚W"0±„ ¥„ ± „' G§‰F‚5‚-&o[±š7§Šj8*6 „p©£ Q …|RZ±‹z´…v"0±ˆC¥’x ± ž±$„,± ±$ž±¥J C¥ŒG-±”F§7 ƒ‚Nmc¦ ‡]†d¤$ ¦„3b':±ƒc±‰¢†t‡7 J¥•)ŒG-±­l§‰U ƒ‚Nmc¦‘( ‡]†d¤† $ ¦ŒM„3b'±‚]±‰7±£¢œ'‡7 <¥M†g<3±† ¦S‚UE§‡-1YN=±‚5¤Š=†F¢Š…D²ƒB€² p ?¥™s†g<3±—!¦Š|‚UE§‹0‡-1YN=±>¤ŸA†F¢šA…D²‹G€²ƒ&p‡/ƒ$ª+…|ƒ#ƒ "_'„z¨T Dh@ ‡pEqExU`5&‰#£L‡<­‚8L%:‚-ˆ±…~¥…,‚V¦ (ŠT±‚±Š±„±‡v¦‚N„c]cª^)s-I-f£s…/£ ‚"§ƒƒ&<5±ƒ$¥‚7|‚X£‚ "4¢‚PA£HR¢|†b±„*ª-" !¦fM‚4A¨ ‚‚D$ ¦2„¤f‚Pƒ±„ ±‡²ƒ/಄'ಈG঄BB‡D²Š{ࣆR©ƒ0†=Š7¦(‡v‚‰h­ƒI4 ±&²…Kಇ अ‚i¦@= ŒU7)T;-?!  s <±!ƒ@±„8±ˆX±™n±‹ ±‡u±•±•6±…J±)±…\±‡±ˆ±‚ ±”' ƒ3ª•"+…|ƒ#ƒ "_'„z¨…T Dh@ ¡EqExU`5&‰#£‰j‡<­‘)‚8L%:‚-ˆ±Œ ¥ˆh…,‚V¦ŒK (ŠT±„8±”D±ˆ>±z¦e„c]cª„s^)s-I-±Z£ˆ9…/£‚~‚"§šZƒ&<5±†V¥Š|‚X£…z"4¢…oA£„R¢Šh†b±ˆbªœ" !¦‡RM‚4A¨…k ‚‚D$ ¦†2„¤‡W‚Pƒ±ˆ$±Ž.²†lಈ\಑à¦pBB‡D²–࣎R©˜4†=Š7¦–[‡v‚‰h­ˆWI4 ± L²‹$ಎ ठ‚i¦ƒ @=  y7)T;-?!  sy 9Q ± ƒY±‚&¢‚‚¥"†EI±†±…c±ƒo±†}±•d±„+¥„g ;± ˆU± ‡H±„b¢†O‚¥|†EI±±ŒT±ˆ±Ž±¯O±‰r¥™ a,£+0¢T…¦"‰\s?¢2±„±‹c¢l@¢ƒ$( 0£•++0¢™z…¦ŒV‰\s?¢„u2±ŒU±¥N¢¥p@¢‹)(F^¥]Š%ƒ §U(4g ~„`±]¦C+‚!qE¦Š :‚_±‚i±^¢‚D‚{£\<±ƒi¤\*53±ˆz£†dŠ@¢ƒ!( c¥šŠ%ƒ §‰s(4g ~„`±‡i¦ˆG+‚!qE¦¡T:‚_±†±†¢‘‚{£‡H<±‰=¤‡M*53±¢e£›hŠ@¢‹&(„&$‚¥zŠƒAƒ} ±‚ h„: ++1=T[<(±„p¤Œ"‚@B¤ <¥@¥c„zA‚1£…wC*£$†Z§ g,L-¢†¢‰r0¥‚U2¤‚6|¢‚ "£ ‚!$¤ $±†[§io‚`]…h¥eM‚4¤ƒgL ¤e‚P±\±{¤Wƒ¢ˆk‚X±†5¤j†vˆ,±‘A¥„" „9…R±‚<±„h£ƒDf±“{ ±†C±„} ‚¥– ŠƒAƒ} ±‡ š„: ++1=T[<(±Ž¤2"‚@B¤† <¥‚c¥‹ „zA‚1£{C*£‹1$†Z§„w g,L-¢‡Y†±‚r¢¡=0¥†2¤Š|¢…y"£ƒ)‚!$¤‚F$±G§Co‚`]…h¥‡QM‚4¤‰;L ¤‡V‚P±…u±…8¤… ƒ¢¢V‚X±‘>¤–n†vˆ,±¦t¥”H „9…R±ˆ±‹£‹If±¨ln¤R‰£{©/G‰_…Oƒ#„N¥ Œ?‚u¤ r¢¢o†@¥d…e!£d‚.-±‚>¬–C5±‚L¢D£IˆM‚±‚h y¤•e‰£…{©™UG‰_…Oƒ#„±‰l¥‘* Œ?‚u¤† r¢ˆj¢‹†@¥ˆh…e!£†C‚.-±…¬®5±…k¢„£•|ˆM‚±‰)J±S±ƒ_£„ „7 ±•]±‡_±‰3£ž „7P$±ŒI¤‚ ¢l–+¦ […(*'4¦„#Œ C '±¡\¤…‚ ¢š–+¦ ˆ_…(*'4¦ž#Œ C+ P£$’^,¤ƒ &¥pj¬ˆD3‚{&±‚±„ £‚W‚\7£6‚O¤n5}±—±“^ V£™J’^,¤ˆiƒ &¥„7p±ˆn¬ 3‚{&±…p±ˆD£‘1‚\7£‡z6‚O¤‡_5}±°~±¨b…a‚h "‚[( 1XFXu … „ £b‚¥ŒOt‡¦^ƒxWKe &)~:P]ƒv k ! 6 ‚Q3,u¢_aªBJ„m & ­#‚-o %B‚ ¦l(fY¯E o+I,F3‚i#ª0RIS‚^8@­- &8TY8'  ‚d …C‹E>Eo<£…}±„ ±ƒk±‚w²eଂB‚„@eƒ~j-‡j¤(„G‚g8ªƒ'D^D­-„s/2*-Œn c±D®‚Y   ‚;‚ƒG¨ƒ ‚( ' 6£ƒ „8 ‚r "—n( 1XFXu … „ £…i‚¥¥ut‡¦‰|ƒxWKe &‘>~:P]ƒv k ! 6 ‚Q3,u¢‡kaªŠ J„m & ­ŒW‚-o %B‚ ¦„8l(fY¯ˆI o+I,F3‚i#ª‹GRIS‚^8@­ˆs &8TY8'  š/ …C‹E>Eo<£H±Œw±‰?±‡,²‰:ଜ-‚„@eƒ~j-‡j¤‹1„G‚g8ª‹D^D­•1„s/2*-Œn c±¥w®’   ‚;‚ƒG¨Š"‚( ' 6£—= „8„e‚, ƒ 1~ZFX… „£d‚ *~:P]ƒv *kz ‚Q3-¥EK $‚,o%A‚ O5 £u ±‚@¯F p4B*F,‚i$ª2QIS‚^8?­/ &8R[9* «”:@k=£…~±„ « „b„.eƒj-‡j±‰ªƒ(D \D¬…!4-+,Œn c±K®‚Z   ‚;‚ƒG¦…6 $ L«tT $ &‚' >, ‚2 ˜ 1~ZFX… „£…k‚ ‘?~:P]ƒv *kz ‚Q3-¥ŠK ŒX‚,o%A‚ O5 £„ ±†f¯ˆJ p4B*F,‚i$ª‹IQIS‚^8?­ˆu &8R[9* ««_:@k=£I±Œy« žM„.eƒj-‡j±”ª‹D \D¬š%4-+,Œn c±¥~®“   ‚;‚ƒG¦ŒM $ L«•T $ &‚' >,%¢|…£ -б"‘O ¢š"…£ ‹/-б"¥s ±…^ ±‹f±'„ ±f ±'™±¢ ±„ ±ˆ ±+|¢…'„N ±+‡U¢™K„NY (±„s±„^±…±^±„ ±„7±ƒ\±‚Q±‡/ ,±_±‹J±Œ ±…±ˆB±@±…f±=±Šs±ŠV±›S±ˆ:¤ ˆ8 ¤ ’/8±b#±ŒS¤‚EA[±’x ±h¤†kA[±ªC ±‰m ±£/±-±„B±…±ˆ[²u𠱡B±v±Ž±“r²›`ð²+ ` ²+†b` A. ±.‚^u 8±‚o©Œ~8'±„±ƒ±„D±‹±†±…@±‹2±ŠF±†?± 8±˜©¦$8'±"±†N±0±™r±±‹±¥±ŸJ±V±ƒ/?\«ˆFƒ2R ‚K£‚OI'±‚G±Š±%R±…t±L±†V±}±_ †y/‚h  ‚{ ±„6£„W‹ S ^«Yƒ2R ‚K£ˆ[I'±ŠK±¡N±„W±ƒ±Ž`±ˆ8±G±±–c œ,/‚h  ‚{ ±”\£˜{‹ S±…c±F ±‹o±…l)«(‡3‚](ƒM$ƒ «(œf‚](ƒM$ƒ ±/†w ±/›8 V±Œ±„D±†~±†   W/#4#0"!#. Xcv §†ttT… ƒ X¤‡£’H±…;¨†ƒO2„m  ±#‘/ W±0±x±ŽD±ŽJ ˆ^ W/#4#0"!#. Xcv § _tT… ƒ X¤ £§{±‹¨–<ƒO2„m  ±" ±"…F ¢‚4@±‚a ¢“I@±x(±ˆ"± „B²Ap²hÐ ±–|± ²¥tp²ˆmÐY*±…O±„y¢P„¦p 8!¢+ƒ±"±ƒ±ˆ; *±‹[±ŒD¢Š<„¦†( 8!¢†ƒ±‡*±‰t±‘3¨‹;M…k±„²…%@ ¨£M…k±ˆ@²“@G ´ ¼³‚L+³ ƒR+¬G ‚+‰F ‡! "´ ˆ¼³…~+³ ŠC+¬š2 ‚+‰F ‡! ±"ƒ ±"‡@ ±*‹C ±*›i ±*ŠP ±*šv ±(’q ±(¨$ ±%‰ ±%”¢‰F ¢žY¢‰0+ ¢žC+ ±…^ ±’¢#„^ ¢#Œq^²%‡\ ²%’e+±ƒr±†n±‡T± †Q ±‹8±c±‰Z±–.± ŽC ±(‘ ±(¦Q¢ ˆ \ ¢ ’3\ A¤…^HŠ4‚y±„± „%±=±h±„T£3‚yc±‚;±… ¢‡g‚%¤ŒH‚G,b±$ F¤šqHŠ4‚y±•#± ‰±±…,±ˆT±Š\£‡Q‚yc±…x±¢œk‚%¤¡{‚G,±‚±¤H¥ . ƒ ¥ ŠW ƒ±J± ˆ ±Š± ŸX±„±q ±‰$±Œ!£'‚#‚¢‚)‚i £'¥‚#‚¢Š.‚i#¢'‚$¤‚.‚uz ¢'¥‚$¤Š3‚uz‡(&ƒ6©kz‚* ‚dƒ Š ¢I~¨ S‚ -’5J¦}' ‚­K h ƒv<‚L†"«>rYMIw©>%@:  G  ]S{) % 2\ƒGN ¦!Ul¦ x* „E¦9 ‚¥,„] C  0ƒ N„a ±†²Шl E‰h£ Tªx‚'nJ¨*nC%¢n¥0Os#«‚1 "y‚-,ƒ c¦)'i+§N) ƒ#)?¥Y eu±ƒ7¤ #†(¤-ƒ*§*W2X!ED 2;*? /%   6|HW z B‚0 nk&ƒPJU!‚4¤+‡±‡L£v‹:©,6ƒQ‚[ƒ[ B/ub±³l˱” ±‘"±˜m±„Q±”Y±–:±‹ ƒQ©•~z‚* ‚dƒ Š ¢…P~¨™D S‚ -’5J¦Š' ‚­‘` h ƒv<‚L†"«†JrYMIw©ˆ\>%@: Œ>G  ]S{) % 2\ƒGN ¦‚3!Ul¦Š5x* „E¦„_ ‚¥‰,„] ‹(C  0ƒ N„a ±W²ƒyШ˜7 E‰h£ƒQ TªˆC‚'nJ¨„nC%¢… ¥‚lOs#«‘ "y‚-,ƒ c¦‡'i+§†") ƒ#)?¥†a eu±Š(¤‡>#†(¤„bƒ*§ˆW2X!ED 2™~;*? /%   6|HW z B‚0 nk&ƒPJU!‚4¤Œ%+‡±>£–z‹:©•_6ƒQ‚[ƒ[ …OB/ub±‘*³ˆq˱¨0±'±‹J ±'¤± } £Š+dS±“ £–_dS±¬m A& ±&ˆ3¥(‘2r ¥(¦62r ±&†# ±&Ž ± S ± ˆq„ ‚¢‡6ˆ9³8( 2 o… ±„b£†w‚£ˆD ‚ ¢‚/†g² …4À£,‚)²…5À® " S ¦…nG’ 4$©„G‚9‚0  ±†[¯‡="Nƒe( ‚¬STh WŠd7t£s­„ :W. :*h‚ Ey‚)1.=R$ ‚¢œIˆ9³¦^( ’G o… ±-£“+‚£’.D  ¢™z†g² Œ À£‡4‚)²Œ&À®„K " S ¦ŸYG’ 4$©P‚9‚0  ±ŽM¯œA"Nƒe( ‚¬–Th WŠd7t£†L­Œ :W. •^*h‚ Ey‚)1.=R$6²‡tP±„f¢†’{´Z±‰ ²™ P±1¢Ÿl’{´†3±Be0±Ž(¢5\±‡z±„j¤ˆ8±†H­ …†;ƒB‚? 0±£;¢¦[\±™±5¤’18± 3­ ™(†;ƒB‚? ±„n¢ˆ  ±9¢’2ƒ/>±•±…±™#±‰±‘±† ¢„rƒV±Œ1±‚ ±Š&±„#±ˆ±‹±„\q±‡C±‚[±—H±ƒ/±‡H±ƒl±ƒ±‚9±ˆi±„5±ŽW±†i±…Q±†±†n±„±‡±ƒ:±„2±ˆR±™h¢‡Uƒ1±‡o±•±•0±…D±#±…V±‡±ˆ±‚±”! @±ª#±Š ±²I±’9±¢'±Œ¢=ƒV±˜e±„C±”O±ˆI±±–+±‰;±e± ±…9±¯±†a±±‡[±†;±„u±‘U±ˆm±1±U±‹%±Œ ±_±ˆ/±Ž9±†w±ˆg±‘'±³S¢’^ƒ1±a±ª±ªc±‹ ± I±‹/±Ž+±±„7±¨Ea.¢Ž*¤#†E± ˆ7¢‹_­m^ƒ/P³‹j‹ .¢£=¤}†E± “@¢ c­–Rm^ƒ/P³œ‹j2±‰ £„#=¢ˆ \±„£\‚C¢J¬„]†6Z‚,!.-= 3±’)£Œa#=¢’5\±£†5‚C¢ƒg¬™†6Z‚,!.-=)R£„!ƒt±†M±ƒ+£„W3±U±ˆ ²P²nP±‚±±‚±± ‚0¥„$)„±.±‹W¢‹D†( R£™4ƒt±—b±‰7£"3±Ž ±’6²ƒoP²™9P±‰c±… ±…-±ƒA± ‹¥ž)„±¢2±¡ ¢Ÿh†(£„S3 £3@/‡B ! ‚eQDg;)At> J32qfG' § iR p ,dcSvii ƒ01„"" IP  y¯„ DL1Ol4:5 ‚‚R1-/rN@ rny*wcQ«rKI‚ 5  "X(BQ 9DO&«Yx-Y^jE<%^ª Hj    1 6  'UhR-ZcP¤x‚..E©‚&bo0 +  ‚ .mfk ~M=¢‚‚J£, 1ª[e-"2O¤[Q# MScF‚@Da=%S‚D-ƒ#45oO .JZ$( ¦~!(2«w)|cK3 £+cT¦m)%-£ &| w 6FJ ‚\_() ]© R;Gj8 a,W1# .?>‚ 6  ‚d ! G '"fM2`~¬# kI 89¬ s 0‚ <­S).5; 'EXO¦p[ §kcIsK5¢ƒ©6Fx-%> cO*,++D‚  B7C; 6‚GI2F   bH+z'DG( fJ$@(_2e".%""u ‚C=«2l‚=Ln‚¯,< Q1ƒ;+ #@dRTt- ('E‚WlE ? <2 K2 W ! T? *xxu6%E))HEl0"8 IJM§j<;q   ] #"zcDC‚F"FI&O¤,‚ƒ ®#EH.d.   J 3 B7 ¤(U  '5‚)GB%*ID =F=` :6'` ), 9-(] ±ª+±Š±„L±ªk± S ‡a !•‚eQDg;)At> J32qfG' §…iR p ,š cSvii ƒ01„"" IP  y¯1 DL1Ol4:5 ‘3‚‚R1-/rN@ rny*wcQ«‡~KI‚ 5  ‰mX(BQ 9DO&«Ž x-Y^jE<%^ª‚.Hj    ŠZ 6  'UhR-ZcP¤…‚..E©Š*bo0 ‹B  ‚ .mfk ~M=¢†g‚J£ 1ªˆM[e-"2O¤ƒ9Q# ˜ScF‚@Da=%S‚D-ƒ#45oO .JZ$( ¦„0!(2«‰B)|cK3 £…cT¦… )%-£ƒI&| ‰c 6FJ ‚\_() ]©…D R;Gj8 ;,W1# .?>‚ 6  ‚d ‡ G '"fM2`~¬†w kI 89¬‡" s 0‚ <­‡D).5; 'EXO¦… [ §‰ cIsK5¢ƒPƒ©„kFx-%> ‰8O*,++D‚  B7C; 6œGI2F   bH+z'DG( fJ$@(_2e".%""u ‚C=«‹ 2l‚=Ln‚¯ˆ ,< Q1ƒ;+ #•@dRTt- ('E‚WlE ? <2 K2 W !•<T? *xxu6%E))HEl0"8 IJM§…[j<;q  1 ] #"zcDC‚F"FI&O¤…n,‚ƒ ®‡,#EH.d.  ˆ J 3 B7 ¤‚EU  '”;5‚)GB%*ID =F=` :6'` ), 9-(]#£„O3¥ˆ8 £3¥’98!£„K 3¤ˆ= £ 3¤’:=/§‡[‚#x"C-±‚p¢ƒw< §”‚#x"C-±œ[¢‰P< ±%ƒu ±%Ž~‚ ±‚¥ƒVc(3±Œ¢ ‡6‚#¢ ƒG!¦ /¢ŠB±†]§ˆ1h'…Z…¢ 7¨q¥„ ƒ¶G )>‚ ^„v[   B‚,&'.v ±ˆ¥Œ!c(3±˜O¢ Ÿ‚#¢ ‰O!¦„O /¢•K±ŽO§5h'…Z…¢¤<7¨†J¥Œ ƒ¶ƒd )•b‚ ^„v[   B‚,&'.v!¤„C03x¢ˆh ¤03x¢’=hK#¯„E"?‚ILL \‰ i9¢„?8±ˆ±†$ #¯k"?‚ILL \‰ i9¢ 8±’>±Ž+£ †y%j¢#… .¢ˆK‰" £ ‘"%j¢#.¢œo‰"=± ˆ¤ƒ)ª!a†jƒ)†M ± ’H¤‡v)ª!–†jƒ)†M ± ˆ> ± ’g ²Œ0¢ˆ?U ²˜P0¢’hU ±%ƒo ±%Žx-¢‡I¤‡P‚#}.¢#ƒo< ¢˜#I¤”‚#}.¢#‰H<¢‰9# ¢žL#¢‰%5 ¢ž85 ±…@ ± g-²2 ±ƒ£ iƒ¤J‰E&£ ”;X`±‚~¤† Œ=±‚* ±‘ /² G ±‰£ˆUiƒ¤Œ~‰E&£ ¬X`±‡3¤  Œ=±‡q¢$†+ ¢$ #¢‚:± „S£…d ¢ˆF± œ£ŸO±„n±† ±œ9± Q&±„[¤ :„~¥‚W´„«p§„^„0C &±&¤ ¤>„~¥—FW´Œ «p§™„0C ±†@ ± Ib³„.W¤†N9±‚j¥V„ &I¢‚[³W¤{…8²‚ ² ²‚ ² ¤ƒw!#¤ ‚1 ®„) .„ G ˆ/ b³™AW¤—c9±ˆv¥Ž „ &I¢‹,‚[³ƒ|W¤™F…8²‰e ²… ²…/ ²ƒC ¤‘rw!#¤ ‹ ®ž .„ G ˆ/ ±…A ±Ž ±/‰! ±/E ²Œ0±$„u ²˜Q0±$Œ ±…E ±Ž ±‰2 ±šG+¢‡I£‡E‚#¢#ƒe< ¢˜)I£“y‚#¢#‰>< ±„8 ±œ7¢‚d#± …p±„¥ ‚7}T ¢#± ;±’\¥ ¦q‚7}T ±‡9 ±œL ¦ˆ# ¦Ÿj# ±… ±œ]'±‚q± ‡D±”H¢ 7 ±ˆ}± Ÿ±©L¢¤>7 ±…I ±Ž ±$‹{ ±$¥f ±Œ! ±˜U ¦/ƒM‹6ym ¦/—q‹6ym +¢‡I£‡:‚#¢#ƒY< ¢˜/I£“n‚#¢#‰2<;«Š-"i ‚7¢‚Y¢$ƒ‹= «›B"i ‚7¢ˆY¢$“=‹=S'®„^ H‚BXxXh‚4&'¤"‰I ¢ 7£6‘ '®ž H‚BXxXh‚4&'¤"”R ¢¤?7£•Z‘+¢‡ I£‡/‚# ¢#ƒM< ¢˜5I£“c‚# ¢#‰&< ¥*‚X(‚‚P† ¥*’~(‚‚P† ±…Z ±% ¢+‚hC¢„_ ¢+ˆAC¢™ ± ƒS ± |u 8±„>±†P±X± .±‚ £‚(¢$¢‚4£ 5± ‚3£„.„J 8±™Q±—e±Ž ± „ ±™V£‰i(¢…¢…34£ƒG5± ‹£ž„J D" ±"„y'¢‡&I¢‡$‚#¢#ƒE< ¢˜;I¢“X‚#¢#‰<„#‚²¦3…P~¤!¯H‡L‚*U{V …pWZL²©‚BOx §U$§m!¦}!¦‚/¤ƒ_ 4ƒwu …           ­>E kD :    ;@   ‚   )A x ‚f ­‚ ' 2p‚!.¤>‚F§=c‚U2 ‚²¦‡V3…P~¤‚o!¯—[H‡L‚*U{V …pWZL²ƒD©‡^‚BOx §„U$§ƒ2m!¦‚O}!¦ˆ~‚/¤„Kƒ_ 4‘owu …           ­†|>E kD : …f   ;@   ‚ †  )A x ‚f ­ˆs ' 2p‚!.¤„)>‚F§‡,=c‚U2 ±G ±‡S£/†v  £/› ¢  ¢†,/¢‡,I±†R¢‡‚#¢#ƒ?> ¢˜AI±¢“M‚#¢#‰> ±ƒE± †>±c ±y± Ž ±§N£‰)„4 £š>„4 £$FF£„"(< £†0FF£‰v(<¢ƒ+ ¢‡{+¢/’G ¢/¦k9¢‡‚#± ƒ±`´ ‹r# ¢ƒ;A ¢“B‚#± ŠP±ŠL´ ¥]# ¢‰A ±‚Y ±‡8 ±+²„*` ±+†g²˜N` ±$‹u ±$¥` ±(g ±(£ ±%„Y ±%b ¢‡‚#¢#ƒ5C ¢“7‚#¢#‰C1±‘A±‡ ± …\±… ¢†- ±¦T±ŽS± ‹d±Œ#¢šQ ±‰& ±š; ± ‡8 ± < ±%†w ±%’ ±‰/ ±šD¢‹T‚q ¢£‚q¤ …E ¤ E §/oT [a,, §/•T [a,,  ± Š>  ± Š? ±)‚= ±)ˆ £„v ± b £š  ± Œ  ± Š@ ±†T ±@±c ±¨.±…Z¤( + ¤(¤8 + ¢(7 ¢(¤973±‘ § †E£ „'‚ ±¦ §u †E£ Œ|‚ ±‹I ± \JT²‰ ±ˆI±a±Œ,±‚O¢„`¢‚±£WR¢@…b¢‚#2¢ƒ¥Wc‚M2±‡M±“<¢„ ±‰p ±±†A±‘[±‹+±ˆ5 [²¢< ±‘g±Œ ±£w±†¢‡S„`¢ƒ'‚±ƒR£ˆtWR¢…b±…\¢‰2¢„!ƒ¥ˆuc‚M2±œQ±¨o¢‰P±ž § „s-,5u § Œw-,5u ¦ ˆ8 ¦ ’78²… ²} ¢†*e±„:% ¢Žue±C±…lA±‹{±„y±ƒw¢ ~‚x9±ŽD¢*Œ ±¡±–±¢ ‰j‚x±±žj¢”NŒ-¤'mt:-±‚¤ƒ" ¤'¤qt:-±‡m¤‹"W) H r%/5ULN[ƒC3#ƒ¢ ‚A#±!Š ) š'H r%/5ULN[ƒC3#ƒ¢ ‡ #±!ž( ¢'„B+¢Šs¨&sAj‚$"CWªwB'L#ƒ1­&…_„`m0D„z gX ‚m k-/g=/f0m ƒRQ£‚?M ©{‚}^F D‡$W±„¥@Jb‚?¤g„‚±@ f&)?C…|„\(:},` ±‘*±„J± ±‡b±†E±„ ƒx®–[7 "c‚‚L/‚ ƒ'd³…Y5£ž‰k‰{¢‹i§—;~Eƒ[¤ŠW! ¦ˆdR‚;‚tfªŒe1f:A^‚9A¥‚,H £ŠMt‚¤…5 0¤‰,dW{¥ŒP„3„S±†.±„+ ˜5‚%ƒ @"$$ 438L‚xd¥ƒz ' ¦‡T‚ {tI§ƒx!f(±ƒ+±‚H¤‰-hƒF‚?¢„xB­pP 4==8‚?i*&±‰y±ˆ.¨ˆ& ek¤‡ %¤„L‚£‡Eƒ ¢…I±„Q¢‹1C šU+5aF vVM;oQnh‚)>s¨‹/sAj‚$"CWªˆiB'L#ƒ1­•*…_„`m0D„z –X ‚m k-/g=/f0m ƒRQ£ˆM ©‘!‚}^F D‡$W±‰m¥‡WJb‚?¤ˆl„‚±ƒ] – &)?C…|„\(:},`ˆ"*„ A‚Kau] a36‚t‚z ‚ U;¥o‚W7®]hs ‚a„ …pƒ+„¢R„k®#Jƒh4 J‚df‚Y¢@‚&¢jw¤0‚p‡5£l…1x¨b5r¢@ƒY©&„B"%m‚ £.z±‚ KY p,(‚sH!=196 * J9¤d|9²0p£hw£ƒY‚‚|¤u%‚¨‚l iq/ o‚o¤pw¤Q‚|9¨\Q)¢E'¦I2Q"¥FƒE‚09±3¥ ¤„LR ` „J…=Ew6,4P$Jc2! *‚a-ªƒkBOIX"):±‚U x!4 ‚L' }/Bj)R(*)R,hq9T (Jq[bƒ)=ƒ3\ƒ ‚5]ngª^„)*F‚ƒ9:¥{Z=¤M@j‚v¦‚>‚ W¢g xb]\&‚4? .}1o ‚ 6‚ „ –"A‚Kau] a36‚t‚z ‚ U;¥…v‚W7®›hs ‚a„ …pƒ+„¢‰p„k®‘8Jƒh4 J‚df‚Y¢‡L‚&¢‰5w¤Œd‚p‡5£‹…1x¨…?b5r¢ˆDƒY©‹=„B"%m‚ £ˆX.z±„z ™Y p,(‚sH!=196 * J9¤ˆ/|9²„p£„w£ŒE‚‚|¤†-%‚¨‘F iq/ o‚o¤ˆ\w¤†%‚|9¨†dQ)¢ˆ6'¦„b2Q"¥‡dƒE‚09±„p¥…; ¤!R ` š„J…=Ew6,4P$Jc2! *‚a-ªŽtBOIX"):±ŠG –|!4 ‚L' }/Bj)R(*)R,hq9T •[Jq[bƒ)=ƒ3\ƒ ‚5]n±†.ª‘„)*F‚ƒ9:¥†TZ=¤‡d@j‚v¦ŠC‚ W¢ƒ –b]\&‚4? .}1o ‚ 6‚‚e,¦‚g…]‡r)&o±ƒ<£‘U„ ¢†q±Ž@¤ƒ3A‚c±²‡8 ±ˆ)±`¤‡xBP±#±…+N±‚9±1±‚7¢ˆ&w£{('±9¥EX‚6;¢ ‚!£w„lr£‚M`”K±’s£‡a,"¢…¯T53(C†U ‚7FT‚m 2¦—z…]‡r)&o±ˆC£ª{„ ¢$q±ŸU¤gA‚c±ƒ<²‘a ±“@±†?¤žgxBP±„U±Œv±„=±…X±ƒm±‹#¢—w£‡g('±…R¥ˆcX‚6;¢…B‚!£‰L„lr£œ8`”K±§w£,±…i¢¯•x53(C†U ‚7FT‚m ±‰o ±Ÿ ±‰i ±ž|ŒC-† $`8(zW"dI  ‚D3,‚caTa50£0<3 6 eFAH‚n@jƒmq#30< 8 -( ®‚),A aP  q 5YZ5K‚Nl‚41h ? "IC¢ƒzP¤ƒ%h0¬EX#MEI‚‚¥m*@«‚-.6n‚#£vA¦‚U ƒ 8  Du\qT‚ sNA¢7‚z¨#+> „2£_!` %[-Fu‚9-Y4 ‚^,2V !5 A( @¤%] ª.BV[ L"¥‚I2 £AAi³d›®.$ y$ \+0‚.¥.I"y2 w‚&W 4, H!>,a¬J8)'->‚"¦heo=*ªop;(9X ©7j‚mC¥eH D« !$5¥0 jR§+ . N\XsJ=(F= c$3 /B9‚N+=‚$ y.%"8 [H7<$cO&Z7"  M YKj(jR'1y1‚ CJ¬+K`1*+i‚$+/  o„*/ ;~B )D04F 07; 1‚  |‚@4/0„?h(%& 38ƒ!3E;­\#!".B… r:\£N¨$ &1‚k6§‚M‚8C£3Z w '1,p`y>Xt‚"]te! †+ $•s8(zW"dI  ‚D3,‚caTa50£†7<3 š\ eFAH‚n@jƒmq#30< 8 -( ®‹G,A aP ’ q 5YZ5K‚Nl‚41h ? "IC¢ŠP¤‹c%h0¬yX#MEI‚‚¥ƒ*@«ŒF-.6n‚#£…A¦ŠY ƒ 8  Œ[u\qT‚ sNA¢†‚z¨‡i+> „2£ƒ=!` %˜&-Fu‚9-Y4 ‚^,2V !5 A( @¤ƒW] ªˆyBV[ L"¥† I2 £„`Ai³„ ›®‰$ y$ \+0‚.¥„fI"y2 Q‚&W 4, H!>,a¬‡68)'->‚"¦†<eo=*ª†wp;(9X ©‡(j‚mC¥„~H D«ˆ+!$5¥ƒm jR§„G+ . ˆgN\XsJ=(F= c$3 /›-9‚N+=‚$ y.%"8 [H7<$cO&Z7"  M ‹bKj(jR'1y1‚ CJ¬ˆK`1*+i‚$+/  –o„*/ ;~B )D04F 07; 1‚  –/‚@4/0„?h(%& 38ƒ!3E;­‘#!".B… r:\£…xN¨‡; &1‚k6§Š M‚8C£‚PZ • '1,p`y>Xt‚"]te! 7 ± Š` ±‚ ±Œ±“q ±“!±š_±¨¤6 ¤‰66V±‚s ±„E±œ^ ±„=±-±‚ ±™P±„ ±™U‡B-ƒQ¯t‚Q>% W‚&†[A£„¨Hp3Oƒ _u¨_* ?(ƒ'¦„m'-‚‚Q5¥sS‚ L¤)‚=‚Y¥)‚ZAƒ‚i¤XLN¢ƒ¦‚*;¦3b D‚p¦4?ƒk‚‚!¢|‚7¦4‚G<±b­‚O„! uƒlƒp";‚"±3§7%)+‚UC¢eV£;%:¥5"]@a¢Y9¨O ‚ „S¥„_£[ƒ4'¤ƒ%4¢0¦1B‚6V¢,‚D¦$"d|¨ H‚,&7¬ ‡i‚4BZ„ƒ9ƒ9«,); ‚yt8<e£‡ $ [-K‚1 KS"P0.+†995\­ƒ{ƒJ‚,~(„im£ ‚,¦bƒ‡7E)‚¢‚Y(£aƒr§]‚6o*+t£JN¨'s…T‚Gƒ ƒj¯–‚Q>% W‚&†[A£‰¨šnp3Oƒ _u¨Š}* ?(ƒ'¦–'-‚‚Q5¥†S‚ L¤ˆt‚=‚Y¥]‚ZAƒ‚i¤‚{LN¢8¦†P;¦‰7b D‚p¦ŒK?ƒk‚‚!¢†[‚7¦‡e4‚G<±„@­š„! uƒlƒp";‚"±„e§ˆ%)+‚UC¢„TV£ƒZ%±‚v¥‰!"]@a¢…9¨) ‚ „S¥‹ _£†/ƒ4'¤Š4¢„I¦‡OB‚6V¢ƒi‚D¦„Y"d|¨ˆuH‚,&7¬š ‡i‚4BZ„ƒ9ƒ9«‹5); ‚yt8<e£Žu $ •_-K‚1 KS"P0.+†995\­™.ƒJ‚,~(„im£†g‚,¦‘ƒ‡7E)‚¢ˆ2(£‡3aƒr§‰ ]‚6o*+t£‚gN¨•+'s…T‚Gƒ ±‘±0² ‡>à ±¦#± ² à‚ ¢Š‡±˜X¢ŒOM±ƒ¢ `¥‚o1±Œa2¢‚†±ƒ)§ˆO'2±ƒ4±^¥‚R‚)‚(#±¢x…£‡.ƒz¢HŠ]±ƒ"¤†y‚L, ¢( z±“% ¢Ÿ,‡±±~¢dM±‡(¢‰`¥Š51±¤,±ƒd¢Š}†±‡a§—)'2±‰<±ˆO¥œ=‚)‚(#±Œ¢ˆj…£œ2ƒz¢–{Š]±ˆi¤—‚L, ¢† ±ƒ±§I ±$“ ±$¬p)±„9¢ …ƒ^±)±‚ ±™L¢ -ƒ^±„±™Q£%ƒm#†\ £%Žv#†\>±‚u£„vL£ƒtL¨X  ‚R@I ±Œ£– L£ L¨ˆ  ‚R@I >±„±ƒa¢lƒ±…,±‚d¥  ±±e±ŒC£‡„) £I‚=g¢ ‚% ±‰F C±™+±Œ¢‰7ƒ±‘;±‚O±Šh¥„l ±ƒf±™0±›£œM„) £†‚=g¢‘0‚%+R¥…fŒ!\ƒx±…U±N¢‘;h±ƒU±‚"£‰£!ƒ:‚±…!¤‚P‰U‡ ¢Š б^¢‰…U±†*_ T¥Ÿ Œ!\ƒx±Žs±‹w¢©h±‡D±„^£—]£ˆ?ƒ:‚±v¤œ;‰U‡ ¢Ÿ б£¢™8…U±A±‚|  ±‰:¢ …ƒ^ ¢ /ƒ^ >£…*§0‚]Š831±ƒ.¨; 86R]P¢–V@¢†&’'±‰±†e¤ƒ ‚Bˆm >£š*§’E‚]Š831±ŽE¨‰ 86R]P¢®!@¢ ’'±”±›i¤“6 ‚Bˆmu8§1‚]Š832±ƒ/¨= 84T]P¢–XA¢†9’±‰±†f¤ƒ ‚Bˆm 8§’F‚]Š832±ŽF¨‰ 84T]P¢®#A¢ $’±”!±›j¤“7 ‚Bˆm¢‘ ¢ª'£g/ £ª / ¢`ƒ&³”c| ¢†4ƒ&³®N|Kc (‹:  T*  …; ±„«…$ j ©ƒ T @  ‚%   c (£  T*  …; ±ˆF«“~ j ©‡, ˆr @  ‚%  ¢Œc> ¢¦ >¢ ˆh ¢ ’;h < ±Œp ±„ ±• ±&ƒ ±&Š| ±(, ±(¥_7±’¢‚g± ‚A±±f±‡ ±«5¢‹2± —E± <±‡?±±(•2 ( ±(ªe ±ƒy ±Œe%±„±±l±‚6 ±™2±ƒm±™7±‰Tm 2¥ $9¢4e¢‚0#±‚ ¤‡,‡±†-£„‚M±†w± „7  2¥{ $9¢„fe¢†#±„\¤–‡±£Š‚M±Ž± ‰~±„@±)Œ" ±ŠL±) F ²†Aà± ‹ ²-à± ¤n¢ I? ¢ Šr? ± ‚ ± Œ3 ± ‚o ±  ±„,±±y ±™?±ƒz±™Dq6±‚U­‚?…a 0( +'²…°± ‚±/¢–J¦‡7KK„_¢“. 6±“j­V…a 0( +'²Œg°± †0±„l¢°5¦œ;KK„_¢§C.Š--… Le1ƒu‚:C#" p 191}‚;*£r9E %Y,/wm /1$$bB‚&+ƒnR„7M!¨,y@ ‚q rƒr 3'‚ zo6G=‚?f¥Q%'.©$-.';ªDR-r¤3nsƒF¤U9$+ªDZ&!2F‚;­ ‚Q 3}O‚;b¢jƒ7£!«e$/!„'I ¤E6 ƒ;)($.!K‰?.*5J/ªgQ58(  *6B%1)Q.Jj 2ªHk8#&1(§/?C$Q1¤9'(¥aH`±ƒN¨ƒƒ67t X! _p +KU©A_+.R!­ k?P!3K«WI‚) 4¨f (%!I®6XXE&:]I6 4@¤l M ±ƒeªJW-D‚ry.  ‚4‚[Q> ‚1+]k8& k‚N= *¤ƒ?„, ‚h¦>5F(«…V„G@:,„i{FM¯)ƒ9 n‚tB 9HL ‚%‚+xz.$Z);H¢8+:¦^R‚%d¢E<©‚iƒ5.ƒ(„ `yb: … •_e1ƒu‚:C#" p 191}‚;*£†y9E %™,/wm /1$$bB‚&+ƒnR„7M!¨ŠJy@ ‚q ’ƒr 3'‚ zo6G=‚?f¥†]%'.©‰Z$-.';ª4DR-r¤‹\nsƒF¤„{9$+ª‰HZ&!2F‚;­Œ$‚Q 3}O‚;b¢…Iƒ7£«ˆ+$/!„'I ¤ƒ#6 ›)($.!K‰?.*5J/ª„Q58(  ‡u6B%1)Q.Jj 2ª„7k8#&1(§ƒN?C$Q1¤ƒu'(¥ŠMH`±ˆ¨‘sƒ67t ‡D! _p +KU©†iA_+.R!­‡k?P!3K«‡HI‚) 4¨„ (%!I®ˆTXXE&:]I6 4@¤…) M ±ˆª‰W-D‚ry.  œ‚[Q> ‚1+]k8& k‚N= *¤ŽH„, ‚h¦‰05F(«šZ„G@:,„i{FM¯•\ƒ9 n‚tB 9HL ’6%‚+xz.$Z);H¢‡+±‡Q¦ˆcR‚%d¢‚b<©— ƒ5.ƒ(„ `yb:‘T.ˆL 3g3 DW+ #PF $($@ 9B`Ch C=§`#C!.  7 L" | CY" T‚?L„%  & T ,Ep u C6a  V;*)5:QB= 5' }   3 :y‚[ BG)0ƒf;?4!'}‚2    * A{B\ 7­8tVE>?‚4e©‚Si l\*^O±+   @6#63=c'& *-4 ®w +    Y g[k‚@4W K*xBH$@4HU"70   $ ¦"1>§RLm¤A'  6VP*J‚L3OKO$D * J(@` fR -I9.<O§!I5<6(¬L#l%@!zV A¦‚4+ ¤P$¢e =02`7$gK)H%§R,&<3 &8 ([}¥r!S*ª O6 h ¦]rA+W6§ F) «$fIO= )©CL #G¬v)kdA FK",)%%!=(ƒ' ,r !0-6-92!‚A@+25L8 {NwW8L`=i'   8X<‚:   9$ >,‚,4 1xA "  &" * 0a^ `(P3="Nk+  12JF$cV X kx'^dY2 ' , (,d+h,¬` { #' ) !‚On?‚4e©i l\*^O±ƒN ŠH  @6#63=c'& *-4 ®….w +    ˆ] g[k‚@4W Œb*xBH$@4HU"70   $ ¦…1>§‰Lm¤„'  6˜!P*J‚L3OKO$D * J(@` fR -I9.<O§ƒSI5<6(¬ˆ#l%@!zV A¦†#+ ¤ƒo$¢„! Š)02`7$gK)H%§… ,&<3 8 ([}¥†gr!S*ª‡O6 h ¦ˆNrA+W6§… F) «ˆ!$fIO= )©„L #G¬…+)kdA ‰K",)%%!=(ƒ' ,›] !0-6-92!‚A@+25L8 {NwW8L`=i'  ‹8X<‚:   9–( >,‚,4 1xA "  &" * 0a^ `(P3="Nk+  1•eJF$cV X kx'^dY2 ' , (,d+h,¬…b` { #' ) !E‚On *1 ? ,h=I P B6)mA5 U6]ª9#N  5? ( +1 %a¬-  = %X¬9= ) t ¤5 ; %=<'(‚< D®%+ &ZOC b,u ƒbN'#Q&V#[ !R")$     ] $ `,V)8 @ f % 3&T L& )W I?>8*#  I'¬M 2 c-­J "$Y%$47©I'&,I ¦Y@  (/1JW:,F $(! .:  FW$3U /dB9 ',  )E> \ eD]B)Z,(; +4 ']  )=" 1‚OI` !5;;      =j L ƒ  /= 5 I 5‚sY %RB ~"~$ 0b  p  "6?‚%,!V¤ .# MuD} )) $ - 167iB CD[9#!ªF?K = ;7$/ -#‚ < 'Vs E c%6b§; ( =‚/C% IhR u S ?@Fa IVM,%2)D : #=n:N ŠU ;•b_$Se#   oa / % h$98 ‚@6`) T/Q? <a¯† %3 #  <š,(! $B 09 S+Vƒ} =&{%$d:z* %$#&#  Š/ BAG‚\ '’ DIC)iKu`v+ ?5)  %%QM †_  ('YjL J ‰K   9 )1M| ŒjL/ ,Q4, DS*~¥ƒ $¬‹^h  ‚#A[-©„}+- I ®‰+L.88 ƒ- Œ&&6. I"7$‚ *1 ? ,h=I P B6)mA5 U6]ªƒk#N  ˆ? ( +1 %a¬„  = %X¬ƒX= ) t ¤‚q ; ‰=<'(‚< D®„]+ &ZOC <,u ƒbN'#Q&V#[ !‡>")$     †1 $ `,V)8 @ †n % 3&T L& )W ‡:?>8*#  I'¬„f 2 c-­‡h "$Y%$47©„'&,I ¦„PY@  (‰1JW:,F $(! .:  FšB$3U /dB9 ',  )E> \ eD]B)Z,(; +4 ']  )‹F" 1‚OI` !5;;      ˆ/j L ƒ  /•A 5 I 5˜&Y %RB ~"~$ 0b  p  "6?‚%,!V¤…V .‘I MuD} )) $ - 167iB CD[9#!ª‡?K ‡T ;7$/ -#‚ < ˆ,Vs E c%6b§‚X ( =–+/C% IhR u S ?@Fa IVM,%2)D : #=n:N†d'ƒ)®rl‚|\‚‚n!‚v_v8 ¬ƒm-‚_ƒp‡3H ,3‚[²†p¥†k„~RIƒY±*£‚VQ7¢‚=„£E±¥n„ck£l…  L…)v0R‚T@ #B‚L¨#g#©@d‚6t% £N1±?§h6„#%¢¦‚ B† oª ?+#|e£‚ ]l§‚ cu* ¤{`±6¦$ƒ]¥GU;£wWFª‚`DkOSR®‚]‚;[ƒq‚hb.ƒ8ƒ`8]¦`„Ku M£B…t¨†thO&ƒpf¥ƒA_†…2*©‚,?„ eI‚‚(¤‚v¥b;e:£‚ W‚ ± ‚K^PW$U N^1†U ƒ4®–l‚|\‚‚n!‚v_v8 ¬-‚_ƒp‡3H ,3‚[²7p¥˜„~RIƒY±‰u£ Q7¢Œf„£…±ˆ> @±‘J¢„G'±r£ TŽLˆ±ƒ ¢‡1±ƒu±„±…d±‡%±‘¢ …¢‹`F F±¦]¢‰N'±Ž&£ ˜ŽLˆ±Šk¢±‡±„D±ŒJ±žj±m±±¦P¢‡#…¢ F >¬ˆ Lwˆ{N£ ¢± ¢ƒ&ƒ¤n=[¤[c‚U2±†:7 A¬ŸN Lwˆ{N£ˆd ¢„.±ƒ\¢’ƒ¤…=[¤ˆyc‚U2±±]%±]±„±…k± ’ ±7±ˆK±t± ¦1´‹U ´¤{¢4\ ¢¦Z\‚s1¥H+‡ ¤‚$I …k±†D±ˆ}±… ±oF¢q$±‰a£kY‚±‡±‚'±V±M£ƒfx‚/±ƒK¢‰F*£k‚e=¤K‚D/¦†aOz…3ƒUƒ>±ˆQ±ƒ¥‡FƒZ†>{+¦ƒ‚R†J‚ ƒ,L¦3…4<¤(ID£†N4£ƒjŽ6 ;¥•[+‡ ¤›JI …k±b±š±‹,±Š:±‚i¢‰u$±”x£…JY‚±Ž[±…±‰!±„l£ŒRx‚/±ˆ¢˜ *£†?‚e=¤‰ ‚D/¦ LOz…3ƒUƒ>±“Z±‹ ¥œJƒZ†>{+¦˜7‚R†J‚ ƒ,L¦Y…4<¤‡?ID£Ž N±‚Q£˜Ž6 ±ƒJ ±‰RYf\±‚X±†&±K±†G¤PJ„|c± „m±U¢C5 &3]{ Q}Khz2‚<"#R,8 q‚H #;OJ 5 $!? 8  "A[ *,2 i<: \ K?W3/'4E‚o. ¦e AM  ++9. OMR‚<¦zyU(:r­‚ =$[]4yQ. Y_Nm 9 eD‚(¦$fL‚-6j­= A keEZa*®9 07 (%  Lx UI - .\! ^IL  6h   g  X e ^ G7k q[O 0> ¥R?' D4 (V%C]6 ! E %‚h ? y 4$M j 19zGlw>& Wp    $ S $ W HHT  \ 5,* / ]+/hSU? B 1n" A. + I. 1Nd#$¨ (We‚E (;5 8Xa(m !S(GP$3y6S\!J&H«)w +ƒ G  H "b;WcIZ J 6 w 74 _d 0:¦>MH% 6vd3(9F-P'B+ (@B?#m,FN8Kf &  @mKF ±’A±‘±„O± †D±„~ Š! 7•RS& C   2 o  += 9& LR#06 RTpI $Z‚C …+!7)?= BT 7 "›XCT{‚l!%‚a *‚ n&.‚ 2ZkL    ‰(qu)!M)>C5 &3]{ ‘f}Khz2‚<"#R,8 q‚H †/;OJ 5 $!? 8 ˆW "A[ *,2 i<:  K?W3/'4E‚o. ¦‚1e AM ‹5++9. OMR‚<¦… yU(:r­Š=$[]4yQ. ‹p_Nm 9 eD‚(¦…fL‚-6±^­ˆ A keEZa*®ƒ 07 (%  L˜C UI - .\! ^IL  6h   g  X e ^ G7k q[O 0> ¥„?' D4 (V%C]6 ˆ! E %‚h ? y 4•$M j 19zGlw>& Wp    $ S $ W H•GHT  \ 5,* / ]+/hSU? B 1n" A. + I. 1Nd#$¨…Y (We‚E (9;5 8Xa(m !S(GP$3y6S\!J&H«†w +ƒ ‡^  H "b;WcIZ ˆJ 6 w 74 _d 0:¦‚[MH% 6”8vd3(9F-P'B+ (@B?#m,FN8Kf &  @mKF …I)‚T­e8 †L‡>L( BK«bTN‡… o‚gK¢uƒS¤†]„P1D¢/ƒP£e1£qxˆ±s£z‡g¤PRP¤A…w 0¢$…u¤ƒS1Œ*‚K±q§X\k8‚|<£\‚±ˆ)£‚a#¬?P„%)‚O/¢†?±r±…W¢…P²‚I@¢‚„¢d!¥1GL®D‚ƒid†W`3ƒ& £8 ‡Y§.+ …B¨†Fll1„kk‚!4¤ƒ`~ƒ*‚'¤‚ 4N«‚;„\^K‚G.U‚£ P‚3¬UY,f;*?J‚¢Q…±‚¦…g„nrF†~ ± ”\±!‹8 ‚d­•x8 †L‡>L( BK«›TN‡… o‚gK¢ŠƒS¤—r„P1D¢‡;ƒP£Š01£Ž%xˆ±„£Š8z‡g¤…vRP¤‹X…w ±…¢ˆj…u¤›1Œ*‚K±…#§ˆ#\k8‚|±„+£ƒ{‚±‘£†Qa#¬b?P„%)‚O/¢?±‡F±‹_¢ŒA²†b@¢‰0„¢„!!¥‰GL®›/‚ƒid†W`3ƒ& £ŒA ‡Y§ˆ + …B¨›Jll1„kk‚!4¤™~ƒ*‚'¤‡T4N«’a„\^K‚G.U‚£…cP‚3¬‡lY,f;*?J‚¢ˆV…±„!¦™±ƒu¥ƒa"¨2Q ƒB£%‚0¤ƒ/ g¦6 g¢.¦lƒ;  0qt' „,J EN*")>‚:‚Z 2l/9J )x-t7‚F5"[¦3.† $ (=tsƒ \ H\‚ ^K9 R> ‚ ¬„@„ v‚g v‚X¤‚M 4  - g ‚Uƒ'(IuE‚1²8P©^&R‚%?I4?¦,D‚Wa±¯‚%L„:ƒ'„g " ²‘%@±”W±ˆQ±  „Y©–@e9=¤…I 4ƒ2¯™]q=Rƒ „pJ,m…% ƒ'c ­ŠGS 0f $$ ‚?©‘c („lw‚^/£‰TM ˆ_?%- o!Z‚T)«Œx @‚Kƒ7XtªŠ3u1.(4\§„03Yk(®ˆ X(o L[ ¥‹tYƒg±ˆC¤‡l16¢ƒ v«˜{b‰y‚S0‚1‚\¤ƒ~'`¨‡VEr0‚\- ¢„% ¤ƒB1e/±‚e±‹v£†rM¨p‚:(‚%%‚1©‡s+"‚!<>±‰I¥‰i"¨‡#Q ƒB£„>‚0¤ŠM g¦ƒs g¢…E.¦‰Aƒ;  šqt' „,J EN*")>‚:‚Z ‹;l/9J )x-t7‚F5"[¦ˆ%.† $ •,=tsƒ \ H\‚ ^K9 R> ‚ ¬™s„ v‚g v‚X¤ˆ 4  S g ‚Uƒ'(IuE‚1²†P©‡u&R‚%?I4?¦‰ ,D‚Wa±ƒ.¯•#‚%L„:ƒ'„g "£ ‚\ £  ¢$‡J: ¢$¡5: ±$Ž ±$§zƒ D¥_„V¤•O>¦.‚]Š73-¤" ‚  %9JZ!(( ‹53Q1 @ ‚Q‚7<g>³ ƒ1’§nK T¢†’; ^„U‚2^  ¬ƒ.<«†`… 9 ª‚[  ‚‚Jƒ F¥¤r„V¤®u>¦’C‚]Š73-¤" ‰]  %9JZ!(( £3Q1 @ ‚Q‚7<g>³ ‡J’§„+K T¢Ÿ{’; ‹g„U‚2^  ¬‰ ƒ.<«›d… 9 ª“  ‚‚Jƒ ±…G ±Ž3 ¢'ƒI¢\‹I ¢'˜M¢–‹I ¢'ƒJ¢]‹I ¢'˜N¢–‹I ± ‚7 ± Š;A¢‚f A R4*$@ƒ*  '  *(E0$)#*.3± „±‚¢… ±’F C¢‡m ‰-A R4*$@ƒ*  ' ˆ *(E0$)#*.3± ±‡U¢ ±†±„?±„x ±^±Œ ±‹d ² …6€±‚! ² M€±‡1±‡S± ƒU¢ƒ$‚M±c± ±œf± ˆ4¢Šj‚M±…±†\ ±'†] ±'›a„_%‚¬!b‡#ƒ  …"£"+ ªv( <;§#?7 £c5„+G¤|+c;£q'3£E£& £H"§ZYt02£#(\²AÀ¦0 ªo ‰ [¤ 2‚,¤_ ¥u >¥4 £$ƒ*£$L¥‚o. ‚+.¥o[ Yªen#W ;‚5N¨L 6z*§I 1Lƒ"±…i¢ƒ”[±‚V§ƒ$‚‹ ªƒ ' $¬YN?Šc>qE"i ‚;¬•4b‡#ƒ  …"£†)+ ª›( <;§Š<#?7 £‘x5„+±†S¤‰G+c;£%'3£ƒ*E£‹O £„n"§‰ZYt02£Œ#(±…;²ˆÀ¦ƒ ª˜: ‰ ±„ ¤ˆJ 2‚,¤„N ¥„ >¥‚p £‰ƒ*£„\L¥‘I. ‚+±‡¥†C[ Yª†mn#W ;‚5±‡?¨„e 6z*§‡g 1Lƒ"±Ž>¢œs”[±ŠH§˜(‚‹ ª‹ ' $¬”}N?Šc>qE"i ±/H ±/¤l ±'ƒK£'ƒ ±'˜O£¡Kƒ ±'†^ ±'›b ³Ž:f±…- ³¦f±”‚  ¥‚|B ¯ƒ =I8OW?‚ … ­%~6ZƒOFvi"‚‚Q¤|YL‚¨„(R/¤5   #%-, 7$a u-VªIiU  G(-'P68; FG8 X`  !& dv   N u3: @R3,«;% &W<¢( 8!<  Wgn .£C#f C?& w2s3^-MC  7 '\, ME-125k6C.=cF:(&&FJ_­ _-  B7'~ "%^B t   *) o# "©F>!ª-r " - #BsA-^>HQ9  - &  2+  3:%"  M+  YJe 3/  +=0 7 9  /$   :  :k) ! 9 8   % (N    3*) "/@2«>g9H71   R@#4V O;P¦90o¯:(  W B' &*#4@D ?F(6# ]%` P8v1( b l(:- SC u>F+4Bc  g"*~kP O U&/ 8E<Z  $"1B {+ ` ‚(!O5­ =,EXƒv65   ("?5ƒj 8  :‚A ,TJ Y\.M1,  ;fq  X9-‚}& rg % !+  H6El q 52Wu®0F  jg /P+  '*E& &GZD?F1F_ ) 2 25,)¬1b­\-M+ |R 9 NC e^VZGK6D *%=akC9w7'"YuT)  \: *~W;r: ± –8±†i±‡d±j ‹$ N•5(n= 6,pY0C 0M =K!  Q  ' %, W 0/ -' #&¦†*91g ;šI9 /G3!7?#6="w h S1! < O0- !v;/ Š%rNx3 VKi1  "‘y 13cL =‚Ks8 ("  ZnF%\¬†:1V\I_Y­‰H gV7c5;ei Œ`+ W- Q7 "56*- l 4>¤ƒ35 ŠF  #%-, 7$a u-Vª„oiU  ˆK(-'P68; FG8 X`  ‹&!& dv   N u3: @R3,«…% &W<¢ ‡~!<  Wgn .£ƒ!#f C˜ & w2s3^-MC  7 '\, ME-125k6C.=cF:(&&FJ_­ƒ<_-  ˆ 7'~ "%^B t  ƒz*) o# "©ƒe>!ª‚ir " ‰ #BsA-^>HQ9  „e &  2+  3Žn:%"  M+  YJe 3/  +=0 ‡# 9  /$  †a:  :k) ! ‡ 9 8   % (N ‡   3*) "/@2«„Wg9H71 ‡<  R@#4V O;P¦ƒY90o¯…o(  W B' &ˆi*#4@D ?F(6# ]%` Pš#v1( b l(:- SC u>F+4Bc  g"*~kP O U&/ 8E<Z  $‹+1B {+ ` ‚(!O5­‡| =,EXƒv65   (•&?5ƒj 8  :‚A ,TJ Y\.M1,  ;–q  X9-‚}& rg % !+  H6El q 52Wu®…wF  jg /v+  '*E& &GZD?F1F_ ) 2 25,)¬† b­‡s-M+ |R 9 ˆSC e^VZGK6D±‚; *”I=akC9w7'"YuT)  \: *~W;r: ¤ŒB ²)‹(0 ¤¡U ²)›N09±„1±!±~§„c M‚‚Ir ±™D±ƒ±™I§•  M‚‚Ir±†±‚ ±—-±ˆ%J£‘m+£Š[†_$±ˆ±ƒq±¢ˆ9‹±'±ƒpx±‚{±†¤VH¢8‰±±‡z N£§+£¤†_$±‘-±Œ<±‹*±‡d¢ ‹±„F±ˆ(±‡d±ˆO±Œu¤† H¢–<‰±ƒ4±œ ±“ ²‹b€± Šr ±ªk²š<€± •{ ±…2 ±ŽP£*‚zV$ £*“ V$D¦'ƒ h ¦‚kc…N3¦E ‡k}„ ¦'˜ h ¦“c…N3¦”i ‡k}„8¥'ƒ h ¤‚`mˆF¤G ‡l… ¥'˜ h ¤“mˆF¤”k ‡l…%ª*‚Sy1;=f…Z ª*’yy1;=f…Zµ%†&k µ%‘$&k ±„A ±™T ±,„ ±,‹.‚/¤‰b‡a    ¢ˆ2¢ ˆj ¢ ’Ej ±“j ±­ ± ±©4±$”K±‡Z ±$®6±œ^ §$H‹n‡5 §$š3‹n‡5%± …±±*±ƒ` ± (±ˆ=±©±Šw…>‚V§„#ƒ†3¨)~6Z\‚B‚Lƒv£= „u¢‚G]¬W !  9/ 4ƒ4 _9E…-T]§v%H (§@¤S%¦i %lƒ4\   £ƒh :…"(†    [h  G£‚F³ bª„& $„ i´‰ & ¥„ˆg„d2²…|@¨w! ‚a§™6ƒ†3¨’>~6Z\‚B‚Lƒv£q „u¢^]¬‚mW !—Y  9/ 4ƒ4 _9E…-T]§‰A%H (§„@¤ƒ6S%¦‚Si %ˆ|lƒ4\   £„Iƒh :“|(†    …d[h  †G£„-‚F³‡*bªž $„ i´”& ¥™Cˆg„d2²@¨¤=w! ±(† ±(›8 ±(† ±(›<k 2±ƒ± † ±‚g± k¢ˆe±¢Œa„p±ˆ ±‹Af±5±…y 4±4± X±‡± † ¢¢P±Œ¢¡e„p±S±›g±†?±ˆL±~ ±(† ±(›C ±"E ±"…z ±(†6 ±(›i ±%‚~ ±%Ž ±ˆ\ ± ' ± ±¤/²q@ ²£@ ± ±¤(  , ±,‡7 ±„i ±™|Q &±ƒ±‚0±ˆ±ƒ¢Œ9Š,±…U±±"±‚1 &±‹[±ŒY±–a±‡¢¦$Š,±^±¢±‘H±ˆ am¦„UT„<Š<±…7±„5a±ƒ*± ±J¢‹$±†<¢†%±ƒ)±†±‚\¦ˆ \‡r3M©Ž*I# gs#!£ŒA0)±L¦ƒE‚=0 ±ƒa o¦™hT„<Š<±–L±L±U±Šp±§W±„|¢™u$±(¢±†f±Ž]±œG¦\‡r3M©£]I# gs#!£œg0)±‡%¦‹J‚=0 ±˜¥ ‡g w ¥ ’ w£Œ3i £¥Yi£Š5"ƒ( £›J"ƒ(¢&i‚ ¢&ˆ[‚E ±’.±†±ˆ+± k¢‚‰l¢@ƒ~±„& ±§A±0±v± ‰1¢™]‰l¢‘fƒ~±Œ+"¥5‚m£ †p ¥…<‚m£ Žp ±Œ2 ±›  ¢'‚±‚7 ¢'¥!‚±Š<²à ²•$à„Y&‚"¤Ci…[ŒD±‚[ B …>2{K9†5*fO%&¥ ƒ' pƒ¢‚W3¥/>.Y¢-ƒ¢„jbh«*'@ 58I$‚§ L;(AC£‚R‚?¦<‚ƒLM±ƒ^ª6ƒi†;‚}s‚)>'j ±‚F±‚`±‚5±-¤=‡ B:¤¢ƒ3D¢‚?„¤!S„wo¥ˆ~… O ‚0¤–Vi…[ŒD±‡b š6B …>2{K9†5*fO%&¥Š*ƒ' pƒ¢“l3¥†;>.Y¢ˆxƒ¢‘b±ƒ «ŠS'@ 58I$‚§…/L;(AC£ŠR‚?¦‹S‚ƒLM±ˆ=ª™ƒi†;‚}s‚)>'j ±…x±Š+±…T±ƒi¤‰)‡ B:¤„tZ\3±’X±‡8¢ˆWB¢ˆ+:¢Š=M¢…¢Œ!'±„f§Š"+,)CJ‚1¨hŠT_/_TQ£‹7[ ¢ˆFe¥—W†2†P‚>¢˜fD¢’e„¤‡8S„wo¥"… O ±($ ±(¥W± ^±„Z ± „±/ ±‡ ±ŽN±±'‘2 ±–/±'¦e¢ ˆ§ T(h B£mT£K'U£ SL¦ ;„W¦ƒw!†Nn²‚O ¥‚ª‰B ˆ#  n¥‘-†/@IF£ˆYK«ŒJ (ƒZ7&U^ >§ ‰(h B£„ mT£„j'U£‚\SL¦‰w;„W¦‘qw!†Nn²‰@ ¥Š\ª£- ˆ#  ¢‹9¤Œlk ¢ L¤¦k ±†& ± ±(! ±(¥T ±Z±…P²ƒ8Ð ±žo±’²aÐ;Z§‚QƒL‚D†L…±‚0±‡±5J£7+±/±H£‚`ƒI±‚;£‰(ŒS ±Š_±‡F¥N?9N±^¥‚'ƒGe2 \§—dƒL‚D†L…±‡7±‘:±ˆ{±„9£‡ +±‡7±…a£‰~ƒI±†p££ŒS ±•h±8¥¤R?9N±¥¥Š,ƒGe2£ƒc £ˆ£d‚D$ £¤w‚D$7³ DC¤ˆ8LJ±‚v±‚² ‡*€ ³ ƒgC¤“08LJ±ˆJ±ˆ² —P€ ±c ±‡k C±“±±ŽN±…)±…P¦Bˆ1l:±ƒ\±„N¢ƒ[‹~¤}‚rƒb*£ ’`C²Cp±c E±¨±†±§t±ŽG±–e¦Œvˆ1l:±ˆ±e¢›&‹~¤W‚rƒb*£ ¬KC²¥vp±ž ±'” ±'© c±ƒX ±=±‰ ±‚X±‰(±‚B ±“m±“Q±Y¢/‰]+ ¢/ž+ ¤‚aa‚@ ¤‹Ma‚@ ±&†T ±&ŽF;¦‡Z# !±†[±ƒ@¦}‚H!G;d ¦F# !±•5±‡Y¦‰‚H!G;d ± ±¨C ±%‚/ ±%8 ±ƒZ ±ˆa ¢'‚!£‚3Jz ¢'¥‚!£Š8Jz¢‚'Y ¢ˆ3Y=¢Œ5¦† #«U '  ¢¤¦”z #«ˆs '  ±… ±Ž ±"n ±"†# ±ˆ} ±¢# ¥&(† ¥j&(† ±!ƒ ±!†B1±Œ.¢†$…=±ƒ ¤Yc‚U2 ±£y¢”~…=±‡$¤ˆwc‚U2  ±…±ˆA±N ±—±—¤3Œn ¤•FŒn ±‡d ±‘±^±ƒj ±‡j±‰>²'‚  ²'—¢Œ\= ¢¦= ±†W ±•1 ±-„$ ±-Œ)±#ˆ±‡O ±#q±’X ¢'‚t;¢1ŒZ ¢'—x;¢”UŒZ ±,„Z ±,‹q!¢†(e²†:à± … ¢Žse²&à± ž| ± ±¨A>±‚ ª >„>1:± ±ƒ{  ±— ª‡M >„>1:± ›o±‰B ±%„R ±%[ ±*‚F²^ ±*’l²‰c ±ˆ( ±; ¢'‚=¢WJ ¢'¥ ‚=¢ˆ\J ¢'‚=¢YI ¢'¥ ‚=¢ˆ^I ±,„x ±,Œ ±…o ±’# ±‡= ±) ±/ˆ ±/œ=±Œ>±„T ±›±Š ±(& ±(¥Y §o8i ! §ª8i !#¤'ƒB'b ¤ŠE ‚L' ¤'˜F'b ¤ži ‚L'j1"±ŠP«‚.0)S/:lY/±…@£\‚W±‚F¥†4L ¢ƒV„ 4±…)±£v«Šy0)S/:lY/±‘t£‹‚W±ˆN¥ L ¢Ž_„%±ƒW± “?±#±’| ±’1± ¨C±‰(±§ %`±)7¤ZŒ‚P ±š±)ˆN¤•~Œ‚P±Šc±‡n ±›x±rH ±Œi± 2¢8…37£ “5ƒV*±‹K¢ƒ‚N #±~± ˜}¢‰$…3±„o£ ­ ƒV*± ~¢—8‚N ± ±†#¤'ƒ@'b ¤ŠC ‚L' ¤'˜D'b ¤žg ‚L'± Y±ƒl ± …±ˆ ²'‚y ²6  ²'—} ²”Z   ± ŠAJ"«‚,0*S/:lY/²…>°£T‚\±‚:±‡R #«Šw0*S/:lY/²‘r°£Š}‚\±ˆB±’[-± ‚A±O±„D±‚±“@ ± Œj±…u±Œ ±…V±¨D9±‘0¨ƒE  *²ƒ8À£”*#1 ±¦C¨‰Q  *²‡mÀ£©]#1±#†<±ƒ ±#±Ž ± ƒ* ± SA¦„.S/(W/«#‚T ‚E‚nƒ() ¦ŒyS/(W/«#’z ‚E‚nƒ()£Š+"ƒ) £›@"ƒ) ±#„S ±#(¢ƒP ¢ˆP ±ˆ! ±4 ± ±‡!c ,±‘Xb±…G" ±Š ±ƒ3¢ƒ± ± “j5±ƒX±† 2±¦k±†n±‘{± ƒT±˜e±Š¢†hƒ±‡± ¨n±•h±Šo±š&¤#ƒK ¤#Œ )¢‚x¢l‚±‚Tj ¢†*¢†$‚±‘.±‡[£ˆFPg £¡lPg ± ˆN²‡~ ±… ± “e²ŸI ±™;^,²’À±‰® ƒƒ±O´0eP±‚U±‰\ -²§"À±—y® Žƒ±¦´† eP±‰l±ž±[±Ž{ ±†:±£ ±† ±—'¦e…E£)ƒ]% ¦‹…E£)‹b%±#‘3²$ŠQ@ ²$¤<@C±„m¢ŠWŽ5±…w±„¢ )‚¢‚>† ¢B‰±‚%±ƒO±“ ±…`£„j…0¤0‚P 6 G±‰t¢£}Ž5±Œ±5¢ ƒ‚¢‹*† ¢‰±‰±Šm±¬v±i£™j…0¤†w‚P ±‡M-¥ˆ1ƒR…m±…±? ¥Ÿ|ƒR…m±“y±…XF¢ƒ/¢xŒ ¢;r±‰m¢ ‚‚I±‚5±ƒ?±†¢…*T¶…—UP±A±…M±’z L¢œU¢“ Œ ±‚=¢‹;;±…±„{±¡8¢ ‡\‚I±…r±‡t±Žm¢ŸT¶š—UP±‡±R±§/© „n<„   ±‘?±ˆ © <„   ±«*±“ ±…] ±’3± Š ±’±‚± ƒ±–a ± •7±ªJ±…A± Š ±°±‘±R±ƒ^ ±‡^±‰2 ¦‘ ‚Q ¦ª1‚Q±C ±œ±‡1‚\(ª†; =cˆ-axm±‡¥'N5„±„±Š4±†X£y0¢‚P¢‚M?±ˆ+¨N +4LG!¥‚Zƒn‚Lƒ¢(ƒ£„&)¦‚o#!¤ƒp|e±K±“M²…`¦‚Uƒb>?‰A§‡ƒdƒH?69¢f‚Z¢†/‡`±„;± -ª›N =cˆ-ax±…t±%¥†3N5„±:±•K±Ž£¨D0¢†¢†?‰A§œ7ƒdƒH?69¢‡-‚Z¢–U‡`±‹R±‰-±ˆ<±Ž+±‰± ‚D±ƒL ±O±Ÿ@±˜Y± Š6±Šc ±$c ±$›N ±*1 ±*W ±…T ±’ ±&… ±&‚ |±@[Z¢gƒ§„(c  (!±†s`Z±Š]¢…W\±‚W£x ‚e±ƒ±‚{£‚pD‚Mª/=\ƒaz„, †-¢‚„I±”±w£„a¤†h@Y†c¥%l!„5 ±†G±‘p±‰%¢ƒ§ŽQc  (!±Žw±‹w±…9±¢(¢"\±ˆ+£ˆ ‚e±‡ ±†8£‹ED‚Mª›=\ƒaz„, †-¢Š „I±©±£*£Š(¤—@Y†c±†X¥ˆ%ƒ`§ƒ^u‚Zƒ‚:ƒ ƒ —'‚ E ˆfZ3F ~&S,¢†?+¬œ{‚z …b…)Tƒsk¥Œ‚cZ¤œ5Ou‚&¤‡ƒ<:A±‹v¢Ž`‚£‚A1¢‹xƒ%¢…ƒ±‰6ªxg8=A*#=a§‰y ‚Ju²ƒwЮ™ ! ‡g…0C <1£„wuD¨‰v "X‚ 2¤…4A$#±†±„V¤Œ&ƒiX¥i†MVw1§‡M5+m‚4¦‡i#F_¦‰oZ¥‡R My²†>°£Š8ƒ=£…%V±ˆ&£‰+„LY¬Ÿ}„p‚E‚7f X‚£Ž„{¤‰m-…¨œ=‚K ‚@†'1ª™|: g Qƒt‚ƒ¯“b„n[K. 6O)2*£†(ƒ(¥ˆU%ƒ±‚}§˜u‚Zƒ‚:ƒ+± ƒv-±ƒ@±„F±ˆ ± ‹z±… ±˜s±‹]±# ±'‚ ±'— ± ‡ ± Ž' `* ±*‘±… ± ‡; ±Š_± œn ± ±©+ ±ŠX ±— J±#†P %‚ Ž" ƒo J±#% %—" Ž" ‹o£-… £- ±‰J ±¡ ±/‚ ±/–>¢$‰\ ¢$£G ±(ˆR ±(ž ±$Ž ±$¨ ±(• ±(ª: ±%‚= ±%F´ƒ Š€ ´œ3Š€t%±( ±%‹}±–, ±*‚ ±*’E ±…} ±Ži¢ˆ'ƒ3 ¢¡Mƒ3 ?±`S^¥)@! ¤‚n‚ -O§7'‚A£”5ƒMƒ±‡N¢‰0¢„¢Ž‚N£„/3B¢‹‚w±Ž$±ˆ ±Œ±„¥›K‚pŠ@ƒ ¢„q£‰ L„E¤ƒAK&£‚d7B±…3£˜4bW±Š'±‡,£‰:‚58±…4±Š}¤œ ˆƒ'E§‹:/UƒE‚ R£ˆ$X‚ª•hts†‡®˜ :Pƒ„ƒƒ0&4±ˆ £oŒ6±†*¢‡tJ¢Šs‚l±ƒ¨•O‡KM‚ZFO‚k ±'‚ ±'—$ ±'‚% ±'—) ±&ƒ` ±&‹R-S±‡7¦†T‚Pd‚xW±ƒ=±\D® ‚0"l ƒRB4 Š>Q`£‚Q$±±‚±±ˆK£ f‡²‰ ±ƒ U±œJ¦—i‚Pd‚xW±‰I±Ž±‚g® ™{"l ƒRB4 Š>Q`£‰dQ$±…±….±ƒB±—%£ ›Q‡²” ±ˆe²ŠYP ²¢$P)² €ª'… C  ²¢3€ª'š4 C  ±ƒ ±„* ±˜3±“3±„y±‹J¨„X ƒ;ƒ  ±‹±¥5¨š ƒ;ƒ  §“alZ §«,lZY*±N±ŒJ¢‚x„ ±ƒQ±†P±‚±„Q¦ ‰/0.ƒ:3 *±¤a±¥p¢‘R„ ±‡j±n±†S±&¦ S0.ƒ:3 ±X ±¨~±$ŒT±‹W ±$¦?±›}%±‹]± †H£‹v?‚] ±š7± Ž:£œ?‚] ±/‡6 ±/›Z5X¢†‡t¤…9o,¤ƒA H±‡>±‚±ƒ±ƒF±‚¢†Y…`¢‚>‚k±a±ƒ>§C8E‚M;±…9±Œw±„;±„O X¢›/‡t¤ŽWo,¤j H±’U±†b±†7±‡5±„O¢•3…`¢ˆ‚k±ˆR±‡W§ˆa8E‚M;±Ÿ$±¡{±™n±Š9±)± ‚b¥„m‚(„{± †±˜9 ±¥<± ‡¥“G‚(„{± Žg±²$ ±&†) ±&Ž ± ‰Z ± ”q¢*…E‰) ¢*•k‰)kl±Ž±‚.¤‡Bƒg ±ƒ9¢ŒTƒ/¢„o±†6 ¢)‚P¢‚'‚I¢„Y)£†UQ§ƒGuˆB)+£[‚‚H±‚¢u‚¥  ¤„:ƒn‚? ± ±"„> p±£2±‡5¤ hƒg ±ŒW¢iƒ/¢Š{±_±ˆ ¢†‚P¢‡{‚I¢‹w)£‘^Q§˜:GuˆB)+£†"‚‚H±‡x¢‰ ‚¥‚%  ¤˜8:ƒn‚?²#:° ²#‰°£(“%a £(¨Xa ±'Œ ±'¡ B±Ž0¢70±…r±ƒ/±‰±„¢…0 ±ŸE¢ƒi0±Ž^±‡g±—v±Šw¢Ÿ s" ±"…(±‡j ±‚% ±‡ ±$‡Q ±$¡<!±‚2¢R-±„( ±…d¢† -±‹ ± …y±t± ± }±‡H± ;·•KÖff ·­Öff¢  ¢ ˆ!ƒYg«‚]‹ ? „Y¯•>;z¦-‚]Š730¬ƒN;J & 4‚G¤}" ‚   &;JZ"'( ‹6/S4< ‚Q‚3 7$c?³ ƒ32¥lR¢†’E %\‚f Z‚TD     §ƒ <¦†_…  Nª‚\  ‚‚Jƒ k«—p‹ ? „Y¯®.>;z¦’B‚]Š730¬Œ;J & 4‚G¤" ‰^   &;JZ"'( £/S4< ‚Q‚3 7$c?³ ‡L2¥„)R¢Ÿp’E %‹e‚f Z‚TD     §‹ <¦›c…  ±–ª“  ‚‚Jƒ ±‚< ±†t5¢u‰s¥ŽJˆ@c&±ƒ¢ ¢–‰s¥§pˆ@c&±šK¢„H ±…A±‚~± ±Ž_±'±ˆ2 ±/‰ ±/7Od±Šm§$ƒ a&E  tZ  ±…¢; .Iƒ;#4 !"  ‚)<  ' lu9 ! f±¤§$˜a&E  †MZ  ±¢ƒX .”mƒ;#4 !"  ‚)<  ' lu9 !² À ² ˆÀ ') ±)…n±„±Š ±š±›.1©…6‚VP[]_3¢ ‚B# ©ž46‚VP[]_3¢ ‡!#±"„4±ƒ " ±"ˆi±ˆV ±"F ±"…{ ±•s ±¯ ±/‰x ±/ž ±$™ ±$²} ±…/ ±œz¤$†E ¤~†E!± †±‚>¢ ƒN ± ޱ…{¢ ‘8ƒN+±xf±‚^±‹O±† ±¦ ±†r±Š)±š)±¢$•k ¢$¯V#£Y…9 ±!„±ƒF £¢l…9 ±!ˆE±10­L“E  "±4 ­™r“E  "±¡I ¢ †y±‡z ¢ ’±“ 6¢ƒeB¢ ‡?G±(¢‚£D±‚¢ƒQe±¢„¢†&‚N ±‡a±„{±ˆs±Œ±Ž? ?¢ B¢ ’VG±†¢ƒw‚±‚D£„@D±l¢†ƒQ±‡&±‹n±–¢‰Z¢šJ‚N ±„# ±‚x!*±‡W¤U„' ²… ృs£R¤„ ƒ2 ¢ …_  £ƒiw¢§!p …D„]¢…¢ g¢I±‡e¤„4‚H¤‚…7f­k… ‚0hL£‰„q„M±u¥? uƒg±†O£ˆD G±œj¤š{„' ²– ౉£…A±ˆV¤ ƒ2 ±¢‡R…_±‚k±—W±ƒ@±‡Z±ƒ±ƒ.±‚K£ˆzƒiw¢„G§Ž{p …D„]±†z¢…b…±†¢„%g¢„~±:¤4‚H¤ …7f­–o… ‚0hL£žP„q„M±’¥ˆV uƒg±ŽT£œh1£„ ‚"e±ƒ+±‡<±…m £ŒW‚"e±Ž4±œ±†±š ± …2 ± I ±‚+Q±ƒB ±†±+±‰ ²#‡P ²#% ±"G ±"…| ±)„ ±)‰c‰O)„S¦rM‚_]‡§, 65>%ƒyƒv?‚+‚p‚ ƒQ 1& ¬‚"e6 /op>(q¦„…l*y ¦„G,,5 (\T)S/#A/«=qc‚Q6 ‚.£?  0 P‚#p* 5 t  " I¥'nT¦^^…`%¬K…1 #ƒv¤…j¢y- ‚"6k‚m#L? U‚}z )" f¦G ‚(¢‚Y£*5W Q"„ -b  ±ƒd¨…X… @F« ?DT5> %  JMc 7P_¢W §, D ¨/ b3fWƒ+ªK= FD‚e^B ƒ&&0 ‚hH„&@   ‚O Z‚JpL"@    0 dƒRFƒz‚]\‚‚$‚ ‚;K2O4]-/‚pD@)„L ±„Q !‚‚i,mu,$!='  8 AQ]£…=I §g`PTS©\ˆK‚&&„‚. ±‹/±Œ „k¦—M‚_]‡§†!, ™\5>%ƒyƒv?‚+‚p‚ ƒQ 1& ¬‹@e6 /op>(q¦•…l*y ¦ŠS,,5 ˆs\T)S/#A/«Œqqc‚Q6 ‚.£‚b  ŠY P‚#p* 5 t  " I¥„MnT¦ˆb^…`%¬‹b…1 #ƒv¤ˆE…j¢ƒW- ™m6k‚m#L? U‚}z )" ±„¦‰ ‚(¢†H£„I5±ƒ Š="„ -b  ±ˆ¨”2… @F«…`?DT5> % † JMc 7P_¢ˆH §„E D ¨‡M b3fWƒ+ªŠ = FD‚e^B œ|&&0 ‚hH„&@   X Z‚JpL"@    ±ˆ" –hƒRFƒz‚]\‚‚$‚ —nK2O4]-/‚pD@)„L ±Š !‘:‚‚i,mu,$!='  8 AQ]£ŒTI §ˆg`PT±‚p©•ˆK‚&&„‚.±I¢3 ±œ#¢…e3±a¢) ±œ;¢…}+R±ˆ]¤„r=(†±„~£ƒp=(£ Š ±ƒ}¤‚2M±‚£q_@±„]±9¤†<‚(&¨h86+Z>¢…x@ T±¢¤–=(†±‹ £=(£ ˜Z ±Š¤…C2M±Ž£•u_@±š±‡¤–'<‚(&¨‡+h86+Z>¢}@(±Uª(l ±œ/ª…q(l ±#ˆT±…= # ±#‘)±‹±†w±„ ± ±Ž/ ±‘ ±¦&±Œ$ ±‚D ±ˆP ±„±ƒs± †h ± ±’M± ŽZ±G±ˆ% ±¦m±p ±…, ±žR±'’r±‡V ±'§v±[* ±* O ±*- ± ±©.¢ ƒl ¢ ˆ ±ƒ# ±‰/%±K±†±‰,±‚ ±„}±ŽZ±ž_±–&£(7( £(¥j(,±Š± “±‚]H ¢eq ±–R± ªi±‡± „}¢†,q‰/„§aa ‹9‡t¥Gaƒ6¥‚"‰Œa£7‡X¦ qŽj¥ @…"¤‡"¤}‹¨!P=! £QˆI¤ Tƒ7²‡u`¥ †>ƒ2¥ %„¦ 4¤ †!£ ‚E¨ ƒ2¥„k%„¦~4¤‡O †!£‚h‚E¨—T†qŠ}¢†„$±‘,G±”_±9±‚x²fూC¢)„G.±ƒ #±®±¡N±‡-²‰;౜.¢‹2„G±•2±Š# ±)‚J ±)ˆhp¨Œ Ca!±–h¢ƒ0ƒM¢%±†d¢ƒ†±=Y±~¤„{-Š.±>±ˆ'¤Š)R £…OB#±„¢†>±„j±‹l¢ŠC!±ˆ.±¢‘Jj s¨¡ Ca!±°¢”EƒM¢†1±Žh¢Ž4†±†±M±‰D¤œF-Š.±„p±‘¤™R £Œ;B#±Š ¢/±Œ±¥W¢ŸG!±a±ƒ,¢¥njg-£z—" ¤>Œ8‚z £6- =h±k¦hƒLƒ/„ ±ƒ% 5£š —" ¤‘SŒ8‚z £†B- ±‰±ˆl±†J¦–ƒLƒ/„ ±“K£'‚DŒj £'—HŒj±ŒW ±›1±‡I"¯…‚_**6ƒ-B&¤ ‚_1.±„p "¯ž.‚_**6ƒ-B&¤ ‡>1.±Œ ±&†( ±&ޤ%ƒ  ¤%Ž! ± ‚±™j±„X $ ± †5±³U±Š ±) ±)†K ±‚V ±š! ¢‚@D±‚q ¢“UD±Ž}z±‡R±F±„_±ˆ.±„ ±†R¢F{£j#g¢Œh†$¢`<±ƒT±‚!¢‚lj¢ˆb?±k±†x£C\ƒN¢‚£‡Q„…Q£/’)‚%²-P¢…p]±ƒ ±…[±q ~±œe±ž[±Šk±”b±Ž3±ŽV¢…%{£ˆ0#g¢¤3†$¢…<±‡C±„]¢‡$j¢—‚@¢)(¢Uƒ%§ F§ #R®† \"  £ƒ>¯P …*  …5   5T1     =  4      )J$      ¨…P5( 9¦~Ž5D„EP) !  m\ d  ‚[n    /C-( 5.¥)#ˆ †  ƒ1…6 x 7 ` ƒiJ¦‚tYg¨+†!<%; c DG%¢…kH ± –3± †B±„|±ˆ7±ŽA±–±l „  —@ƒ ‚' 6u.@ *H! …£°6F+ ‰T#ƒ" ) &  ,~¢’1x¢ˆ:Y±Œb±”$ ‹] g^"5  ¥…k ] ‹!Fqƒ7&T=G 9 , ±†O¢ˆG' £(G  ‚x‚;>‚@¢ƒ[(¢ˆ ƒ%§ƒ(F§‚E#R® \"  £‡>>¯* …*  …5  „# 5T1     =‡( 4      )J$      ¨Ž%5( 9¦šiŽ5D„EP) !‹ m\ d  ‚[n  ‡~ /C-( 5.¥•-#ˆ †  ˜d…6 x 7 ` ƒiJ¦ˆ;Yg¨Q†!<%; ˆc DG%¢šH L) ±)† ±„±‡ ±‰` ±ˆ±Ž)±žd ±(2 ±(¥e„@#‚¤ a‰NŠ-¢ ?¤„ -’5J£ rN£h…@¥y U£?‚c¦‚9x)ˆ¢}¢ x¢@ƒK¢[¬D90ƒ[#-9‚]¤FVŠJ£‚¥¥‚±ˆ-¨Š‚;O) ²± †l ²Y± ޱ‘µ‡UU µ˜.UU£$2s‚8 £$šs‚8‚x±‚ ¢Sˆ^ $G@YZn.QN †<ªrG\I1]£„ ‚e¢„i‡³\U±ƒ¦  -@±‡-£Žb`£X‡Šl£‚ p±±‡k¤„;„‚tˆ ±¢-±Œ±ˆr }±‡¢šyˆ^ ‘$G@YZn.QN †<ª†rG\I1]£ŒT‚e¢‘‡³ˆ`U±Ž/¦„A -@±££f`£– ‡Šl£‡[ p±‘D±p¤˜_„‚tˆ+§…9‚SP[ƒC3¢ ‚C# §ž59‚SP[ƒC3¢ ‡"#!¤'. ‚ ´‚Jµ ¤'¥2 ‚ ´ŠOµ¢“e ¢«0 ± o± ‚Sy ± ‰s± …r±ƒ'<"§–E $±†q ±"„q§°0 $±Žc x* ±*‘ £$¢% £†m$¢‡%¢7 ¢’L o ±š ±)n ±)‡5 ±'‘m±ƒp±† ±'¦q±‹±Ž1±ˆ±ˆm± †HJ±† ±‘5±—G± Žt±ˆ:±†#±š$ ±ƒj ±ˆI±†¢‚64±…)±G±±„'¢ƒ-C±£ˆ±‚n± ‹f±‹£„(‡"„Q¦†(ƒ … v\` I±›¢‡=4±–>±‹p±…&±>¢ˆ C±„=£p±‘H± ¥Q± !£”N‡"„Q¦šLƒ … v\` ±— ±°EF¥jU 5‚;± ‚8± †\¤ ‹K… V±ŠHm "¥šU 5‚;± ‡± H¤ ¥6… V±•Q±ˆ ±ˆ7¢ ‡CH ±—¢ ¡.H ±*ˆ/ ±*˜U ±ƒ ±… ±g ±œF±ŒW±ŠS£(Ž9 £(£L9+§„}ƒ PWYm± ‚0 §ž#ƒ PWYm± ‡4«  gc{ ƒUU±‚U  « Š0 gc{ ƒUU±ˆO#±˜+¢A>@¢l9¢}{¥‚Y ƒg±ƒ( '±±Q¢‘V>±‰ ¢ˆp9¢†\{¥—4Y ƒg±“N# ±†K± „±„X ±±Ž± ‹±‹I ±…X ±ŽD ±‚ ±c ±&†Rµ„X5S ±&ŽDµŒ]5S1T¢>ˆa¢‡GO±1"¢3…k±ƒ)±„9±…o±U±‡ ¥ƒ<„ƒ$‰\V± h¢…=…-±Šo±†¢‹4m£‡AŠp X¢•Qˆa¢ mO±žF±†.¢ˆ~…k±‡O±Œ=±‘±†4±Žf¥›„ƒ$‰\V± †¢Ÿ(…-±•x±Ž¢ gm£›O "0   !   A  4,  4  Xv           +    # s'_ , C H R       H9k& "& )     % -@ .&  \I%    B* $         > D M e1 WT  ' &< )  1 # R6  % $)    / E   7! 1+#  ,c -F"        1U(     @  7  )? H jR+  c F K               "%     q-%3 ¨  +# !  O 8Y4?f&  $  F:  * h:,  1         5   #     5 'F  6       3$  (Wt    + E        / D   "U & &'  !!    (%*   &      O  $  b  B 1  *  $ d ‚<     0 4%  ` E'   NC -  ? $ .<#   $ A H;         #$      6A   @9 7  ( 7K  (/    )  R  G: 2+  B       (     (   4  ?.        1$  (! 5  &     @  %-   M     ; )     =     P 2 2 A   0 L&  } : +2'   R  %2 E&=   5   %  & %@1    )  A" ^WP0L   & # '": 1 43,9   M    ^ #&h FM #   ;**  *  4 ..     &   L &X =$  ' &" Vx  6 (   J ? 4  :7 'L 7   !&S    (W !"  O!    C3  >Q .T|    -     "  , % * "    $ *    1#$   $   &  42  $ ' %0-$ A    #   M!c 8b! & $ !  !- K ,G    7$" E  )   9F 9h?   !   R2  *! ±8±f œ8 5•8_'#+ P      40  $W!      ,  7   45 " "  )+  6$  ) /…D    $    $P 9š-     A   B#  '  G-  I@ X7s>O "0   !   A  4,  4  XŠ           +    # s‘<_ , C H R       H9k& "& )     % -@ .†2  \I%    Bˆu $         > D M e1 W  ' &< )  1 # R6  % ‚G)    / E‹3   7! 1+#  ,c -„l"        1ˆY(     @  7  )? H j‹i+  c F K               "…     q-%3 ¨   +‡]# !  O 8Y4?f&  ƒ  F:  * h˜,  1         5   #     5 'F  6       3$  (Wt ƒI   + E‡e        / D   "U & &'  !„    (%*   &ƒ=      O  ‚`  b  B‰ 1  *  $ d ‚<     0„R 4%  `Žb E'   NC -  ? $ .<#   $ A H‡;         #$      6†   @9 7  ( 7†S  (/    )  R  G†y: 2+  B       („4     (   4  ?‡7.        1$ ƒN (! 5  &     „J@  %-   Mˆb     ; )     =     P™z 2 2 A   0 L&  } : +2'   R  %2 E&=   5   %  & %@1    )  A‹" ^WP0L   & # '": 1ˆ  43,9   M    •^ #&h FM #   ;**  *  4 ..     &   L &X =$  •H' &" Vx  6 (   J ? 4  :7 'L 7   !&S    (W !"  O!    …WC3  >Q :.T|    -     "  , % * "    $ *    …j1#$   $   &  4‡)2  $ ' %0-$ Aˆ    #   M!c 8b! & $ ‚,!  !- ”6K ,G    7$" E  )   9F 9h?   !   R2  *!S '±’5±‚G±ƒ@¢„ ±†9±^¢…bƒA±t±‚n '±§H±‹±t¢Œ±Ž±§I¢–ƒA±‰ ±— ±‡U ±Ÿ #ª ‚4-,5u ª Š8-,5u²#ˆ0 ²#X0 ±˜*±~±(ƒ ±±P±¡±(‹L#±Š£r&¢…7E£Œi#†$¢…†g¢Ž:‚1 $±˜o£„/&¢@E£¡m#†$¢•:†g¢¢^‚1P%¢(z±’X± ‡\« 'MNƒ‚(mƒLB± †e±Ž &¢¥;z±«~± ’s« MNƒ‚(mƒLB± ŽW±ž? ¢¢p†@ ¢…¢‹†@ ±/‰ ±/8| :¦‚oˆ@"±‚<±F¥^…%_b£ A4¨*n1ƒS-±†>¤ ‘T =¦#ˆ@"±†b±‰ ¥ˆ)…%_±„£ Š4¨§n1ƒS-±›B¤–C ‘T ±/’1 ±/¦U²J€ ²¡_€ ±" ±"…?¢ƒ ¢œ<A±†v±‚*¢‹pz±¢Š&…@±†$ ±ŽA±œ¢¡#z±†b¢šL…@±‚:±šH ±w ±¨B±#…±†_ ±#[±ŽQ)±ƒ±h± †u£•X ±‡ ±„$± J£¯Cƒ9£‡;†f*¢„?5©‚3Eƒe ‹<‚K±…/¢ƒV}¤‚\Q<‚^§ u‚W,ƒ(¢ƒL"±…r± ±ˆs¢…hy£‚K¢ _±… ¥„ˆ}m‚/‡v²†V€¨† ‚$l‚H¥ƒ'ŠA‚}j£"3w±‹/¥~R+:±~±‚I¢8©„‚Rƒ‚)M‚E= ± ”V =£œN†f*¢‰F5©›YEƒe ‹<‚K±ŽM¢‰b}¤Q<‚^§Š2u‚W,ƒ(¢‡r"±‘ ±ˆS± >¢3y£‹7¢ „±_¥žˆ}m‚/‡v²‘_€¨›‚$l‚H¥˜M'ŠA‚}j£†i3w±›U¥†WR+:±‰±ŠN¢‚U©˜:‚Rƒ‚)M‚E= ±$ ±$©~ ±‡y²+…~  ±‘²+š" 1¤‚&^)£’c5_²z@ ¤‹^)£§g5±†&²‰@¢-„{ ¢- ±*Š ±*š7:³k± ^ !±•.±‰4±†"³ŒIk±‚;±„=±‹4± „±&‡q±… & ±&c±ŠZ³(Ì ³(¥O̤ƒ~  ¤Œj  ±‰ ±¢.±$—#± “ ±$±± §6%±‚,±$±‚±’v ±…K±ƒ`±‡p±§ ±‡^ ±œq ±&† ±&Ž ± ±©2)²„5°±ˆN¢„W-±† ²‰<°±•¢,-±Ž ±V ±†]5± ‚w±‚+±z±‡p±Z±d ± ‡±… ±§E±\±‡.±…} ±!ƒ±†3± †G ±!†U±Ž%± šk;  ‚D| 3MF-   ŠH| 3MF-¥‚MP+S. ¥‡,P+S.ƒd#k¤a‚[‚w¨ƒ}4‚-‚%‹HVp±‡^§ƒhK„&†{±#±†G±ƒY¤x‚n1ƒ(±„¢c…®.*yK8*%†¢&‡y¢‚9L±„0¢P±&±…` r¤–t‚[‚w¨#4‚-‚%‹HVp±|§”(hK„&†{±‡/±± ¤‹!‚n1ƒ(±ˆ*¢ˆg…®‹E*yK8*%†¢‘L‡y¢ˆL±‹G¢‰U±ƒC±š±‚N±–y ±—a±°B£‚hƒ£ŠIб„*±†²D0± …} £—{ƒ££oбŠ6±Žs²ˆ60± š! ±M ±¦s ±„w¢"„V ±‹¢"š ±* WM$±‹r±‚Q±†F¢Nƒd±M¢ˆ]„L±†±‹& $±¡±‹o±—[¢Žƒd±Œd¢¢H„L±‘"±›L£$Ž„ £$¨„  ±ˆ.£ „F ±—£ ŒmF ±$…B ±$Ÿ- ±/‡ ±/›/,†+ (!c6($e^&A%lFLQ$-M2U5_# a'§QV‚BD 6! Q{54_9G,#%3  7k‚1wOG(3qi  V ®OgU?#)/ƒ 0 3I&q‚ 7$0z ‚tGV1])C£_‚D¬g(l9 ed   = 7=Q‚! 4% '¦#El®!/ :2/$54U©(0 «<@E+‚-UFl¬/ :# A&}8§. ><0ƒ >P5$-sii1‚BVHO‚(£- ª`k} ‚50/ ±‚u£d^­s  # !GƒA£pN‚ YWGK)SJ; 0.'¨:F|2JJ© E&I1:ª-F'+$©6!y.07(¥^B²ƒ|P¥H,I ¦#h; ,= 7=Q‚! 4% '¦‚FEl®‹J/ :2/$54U©„N0 «ˆ@@E+‚-UFl¬Œ./ :# A&}±…§‡t ><0ƒ ˜ P5$-sii1‚BVHO‚(£ƒ_ ªˆ+k} ‚50/ ±†d£„^­‰_  # !GƒA£…(N‚ tYWGK)SJ; 0.'¨‡&F|2JJ©†_E&I1:ª‡ -F'+$©‡6!y.07(¥…^B²‹P¥„,I ¦„Xh; ˆh,û±Š2£š3…4a =¢†ª/ ƒwq !ƒ±(² …zp±Œ8¤g‚t3 ¦ :o†x„W ±„N¢†i >¢’MªŠX ƒwq !ƒ±…N² Žfp±›¤‡o‚t3 ¦ –mo†x„W ±Š¢—A¤† ^„‚}±ƒ± ‡6±Ž(±ˆm±†x ¤T^„‚}±‹o± ¡!±£,±™±ŽP%£+…l‚±…x¥0 ¦' f ³‡ ¥±ŒK &£‘@…l‚±ŽC¥‡ ¦‡/ f ³’¥±œq±ƒh±$Ž- ±‰t±$žSA£! 0©‚Z xrŒn_±±¥†v <‚F)‡ CaW Z  iI. B£!„N 0©˜Z xrŒn_±†Z±ˆ-¥Ž{ ”`‚F)‡ CaW Z  iI. ±/‘s ±/¦ ±¤ •45 ±h¤ š •45 ±(ƒ_ ±(™+£Y‚{c±†h±…±‡f £¥l‚{c±Ž.±±œjG ±`¢_B±±‡[¢ Š!jC±–-±‰6 "±¢s¢†fB±‡±’r¢ ˜{j±„x±°±™\ ±„: ±ŠB;± ±•qo¢„f‚-±¢ˆZŠR ±–±¯±…'¢“@‚-±‰¢œ~ŠR ±/“D ±/§h±"ˆu¢*‚r] ¢*“] O( ±(– ±%†. ±%‘7 ±%†0 ±%‘9 ±%†' ±%‘0 ±(’m ±(¨ ¢#ƒG ¢#Œ±Q±. ±+±…c±‹±(…U ±œ.±(Z£„,Œg £™,Œg¢‚Y ¢ˆ*Y ±$„\£‰X ±$žG£Ÿ  ±$y ±$ªd>Y¢„h‚[±z²&à±)±‚±’J¤s z£‚;£ƒi‚ ±ƒR±…R±‚w²ƒ^P£‚a ±Š±ˆ>H£hU'±’u `¢Ž‚[±† ²à±ˆo±„u±ª¤„% z£†*£ŒU‚ ±‰&±‹Z±‡²Š|P£† ±Ÿ±˜d±‡0±ˆM£ƒU'±§E±† ±†n±„T±†±‡'¢…s„1¢†ƒX±‚±‰z¢‚± ˆ±Š£‚n‘ ±O±Œ? E±› ± ±Š`±’I±‘P¢‘ „1¢SƒX±…E±˜T¢ˆ|± “±Ÿ£˜!‘ ±ˆf± c ±'Œv ±'¡z ±J ±©p ± ±¤2b m£N¨--„x…9†a«)v [¥~'  ‚1 . !&#‚±‚¢I‚©…_ŠI‚D +±‚i¦‚B< ƒZ+ p£†%N¨™S-„x…9†a«„Ov [¥‰'  ‹ . !&#‚±`¢…~‚©šcŠI‚D +±ˆ0¦ŠG< ƒZ+ ¢‚=C±‚m ¢“RC±Ž‚E¢‰‰P¢4±†¢Ž‚'¦t 2'±„5¢rO±‚±§ §;t †F{ U(+84"^I ±{¬ ‚ -2 /±ƒd± R! ( 5ˆ}‰ 8 ¢>±ƒ6 ±[ ¢ž#‰P¢4±T¢¥^‚'¦„& 2'±Œ¢…aO±…;±ƒP§…S §t †F{ †tU(+84"^I ±†Y±‡¬‡z‚ -2 /±‹±‰p ›=! ( 5ˆ}‰ 8 ¢–B±ˆ} ±Št ±¢?' P¢‚:‡;£„$±ƒx©?4I  ¨ƒWƒXp‚U ¨‚*9‚ ,K©‚ „wdYeƒ@¤%r±† R¢—M‡;£Š'$±ˆ0©ƒ|4I  ¨BƒXp‚U ¨*9‚ ,K©— „wdYeƒ@¤…~r±š5  ±†#4±Œ`½ ƒw3VeU´2%P±‚\ ±u½ Ž w3VeU´† %P±‰s ±,… ±,Œ&±‡±… ±ŽT±Œ! ±) ±)†G ±‰¦„zHa K ±’"¦Œ~Ha K ±‹ ±œ ±‰h ±š} ±$ ±¡9¢ ƒk ¢ ˆ , ±,‡4¢ ˆ@U ¢ ’iUVh£‚A‰‡±’o±‡6¢‚$±ƒX±…b£ƒy ˆs±Šw±ƒY±‚8¢„ 6±‚]±‚ ±‚Q¢ƒ|‚p¢Š…S¢c†`±‚u±£‚/†]±‚ i£—T‰‡±¬±˜K¢ŽX±Ž±y£›D ˆs±™Q±ŠE±ˆ ¢Š6±‰N±‰>±‡¢ŒQ‚p¢£p…S¢‹l†`±Šg±–£’U†]±Š1¢ˆƒ± ‚O±„p±ƒs± ¢”Gƒ± †>±ž[±™&±•Bs 7±‚:¢–`‚±±Œf±ƒ^±„O±‡ £‡x‚*±v¢‚G‡ ±‚±ƒ' 7±‡A¢°‚±Š4±{±‰f±‹m±b£“‚*±¢z¢—z‡ ±‰±—K¢&ƒ}6 ¢&‹o6¢n–+ ¢š–+£„*Œg £™*Œg ±$„]£‰Y ±$žH£Ÿ  ±ˆx ±š „‚¥ƒ}ˆ=i±‚a§‚~‚ƒPg„†c±„¢ƒ£rSƒa£‚ „+e¥†9lBG£‡\c¥‚ DYƒ¢‚q£N% §)5†OC‚=C.±„¢x¢e¢4„J©‚0ƒ1[c±j¢ƒK© ‚f{R‚P‡f‚eƒc§‚H0‚‚z"©m1yiƒ<‚2ƒvƒ ª2%‚/WKcEvˆv±m¦UvƒF+ƒR„y±‚E±„_±G:¦‰X9_ ‚?‚h ‚ ¥˜#}ˆ=i±‡h§œ$‚ƒPg„†c±<¢ž(ƒ£†~Sƒa£ŠW„+e¥’mlBG£’c¥Š DYƒ¢†nq£ƒ,% §˜t5†OC‚=C.±‹O¢„g¢ƒ!¢‰ „J©\‚0ƒ1[c±…'¢ˆpƒK©šv‚f{R‚P‡f‚eƒc§ H0‚‚z"©–q1yiƒ<‚2ƒvƒ ª–e%‚/WKcEvˆv±‡4¦‘{vƒF+ƒR„y±ˆ±‹v±‰L±‚W¦|9_ ‚?‚h<¬ =!z )!ST±‚±‚+ ±‘ ¬ˆV=!z )!ST±‡4±‡r ±*‰i ±*šw 9±‘'±ŠV±‡±“|±¢†±ƒj¢ƒH…± †S±†¤ƒ^;¢‚„d 9±ªM±— ±’±«G±„Q¢‰{†±ˆ"¢’"…±  >±›¤”;¢‰%„d ± ±©9 ±‚$ ±…V ±ˆ7 ±‘ n* ±*‘ §/pT [a,, §/•T [a,, ±‘ ±¨R¢…% ¢ž8% ±“m ±«8-T±†s±‚±…$±‚%±„{±R¢‡P„l±…$±±†(±–2±ƒ¢d:¢†Z[±„R¢‚>^±-¢ƒ"±…> T±˜±†A±;±…W±ŒF±Š>¢–*„l±Œ±ˆ4±Ž}±°±Št¢¥h:¢œ [±Š¢’d^±‡¢‹!"±™b ²'‚x ¤5 d3 ²'—| ¤”Y d3 ¢'‚#¢‚*‚O ¢'¥‚#¢Š/‚O%±ŽY¦ƒ  ±3¦ˆ] ±-†x ±-Ž} ± ±¨9 ±‡ ±s¢"‚_ ¢"…R‚_Kc±£’²ƒ`ð±1¤‚PJ8£†w‡A²†X𱃱b²„WÀ±†B£ ˆ'…O¢‡P±‘i¤ƒC‹664¢…w…V¢†K£wŒt c±¢'£«=²ð±ƒT¤ŠPJ8£žB‡A²Ž#𱇱„²CÀ±.£ ¢…O¢’P±¦m¤˜v‹664¢–…V¢ŽK£–Œt| ;²˜u ±…E±‡"±‚F±Œ±… ±‚± ±?²AÀ¢ƒ†.¤†c3)±’n <²² ±‹Q±Žm±‹2±š\±‹±† ±¨u±‰1²•EÀ¢™2†.¤— 3)±§'±‡ ±Žq² ‡S°±†] ±ŽT±¨\² X°±› ¢'ƒ5'¢' ¢'˜9'¢¡5' ¢'ƒ7'¢' ¢'˜;'¢¡7'±‘. ¢'ƒ9'¢' ¢'˜='¢¡9' ²ŒwÀ ±ƒ9±‚V²›QÀ#² Š §“R #7 $" ² ”, §© #7 $"h 0±@±’O¤v\„Q¢‡G±„>¢‚‚I±„z¢"‚O±Œ;± ‡_ 3±©f±ª¤‰b\„Q¢Žw‡G±‹*¢‡n‚I±‹k¢„W‚O±¦&± d ±ƒ±ƒq±ˆ ±†±‹±œ+ z ± ˆ~ ²'„5 ²Š/  ²'™9 ²žS 6U±)„p L  2)   > (+L 7"#$@ G 5f; .0 ±* Q V±)Š7 L/ 2)   > (+L 7"#$@ G 5f; .0!§Œk:±ˆ §¦:±b ±!ƒ ±!†N‚$ £„Rˆm†k¢‚)±…K±g±„w±† ±6^B±ƒA±‚¢7Q¢Š‚ £Iƒ#‚"¢gƒ"±ƒ¢'¤Q5<ƒ"±]±„£‡k3¤‡p ‰!„H¢Š@ˆ1¥‹jfCv±W±†Q¢2Z±‰D £™eˆm†k¢Št±‘±„ ± ±Ž±†±ƒ<±ƒt±‡0±„J¢Š#Q¢˜^‚ £‡5ƒ#‚"¢†;ƒ"±Š¢…)'¤ˆo5<ƒ"±…±ˆQ£@3¤¡[ ‰!„H¢ŸDˆ1¥¡fCv±‡±h¢‚OZ±h± „± ± ˆ5± 6 ; ±„T ¢'ƒ6'¢' ¢'˜:'¢¡6' ¢'ƒ8'¢' ¢'˜<'¢¡8'/L± ‚±‚±%±ƒhj±‡L±„~ ¢‚;†E£ŽyU‚n±b¢ˆf„q¢b ¤„: ^± †@±†e±˜p±† ±‰T±…"±–&±ŠR±„C±ˆa±™y¢D†E££}U‚n±¦¢™ „q¢…ib±‡"±ˆ±‚+¤”5„:²'“+p ²'¨/p ±l ±ŠX ¢'ƒ:'¢' ¢'˜>'¢¡:'A[¢i±’± ‡£ ƒ4R¢ŠGƒK+¢Bw¢ƒ?±„£ƒY‚7‚!²„M€±ƒf¢ƒ&!±‡C±Š ¢Ž|lu±ˆ±‚N¢U" a¢¥|±«B± ’£„ƒ4R¢¢ƒK±ƒ]¢„1w¢Œ?±ˆN£’3‚7‚!²ŠU€±‡¢ŠD!±±£u¢¤/l±†<±˜;±ŠS¢ƒr" ±G ±ˆ8 ± …B ± Y ±† ±Žt ±%‡9 ±%’B 8) ±)……m(‚n¥ˆ7‡hj‚P±„$¨ƒd‚(„'‡$ ¥kn4 ƒf§…I„M"KO±‡v§„KPj3B(¢_„H±ƒ±†j£h‚_‚z¤+!cL]¤‚_Uh©QJ†/ˆ)ƒ/(S¢9¥!&9¤‚wC£‚¢ƒ%….§$r    D K|$+1H't9£8ƒG § O$§z6f‚<|¢‚v³|¨7`bei ¢ƒ%©=WLWƒc(¨‹[‚GX‚PWƒ1¢„„V±‡¦…s†4",†D 6N…FZM‚ ‚ ƒ)1?‚I#$ªOA'.Se…7£6±ƒr±"¤†4 Œ ‚x¥J‡hj‚P±‰+¨ ‚(„'‡$ ¥‹ n4 ƒf§–^„M"KO±A§Pj3B(¢Œ„H±‡>±Žn£Œ‚_‚z¤… !cL±Q¤Š%Uh©˜J†/ˆ)ƒ/(S¢„k¥ˆl&9¤†fC£„C¢Œ….§…\r   Žx D K|$+1H't9£‡$ƒG §†X O$§‡6f‚<|¢‰v³…!|¨ˆU`bei ¢‡Z©‰WLWƒc(¨¥F‚GX‚PWƒ1¢#„V±Žx¦šw†4",†D •iN…FZM‚ ‚ ƒ)1?‚I#$ªuA'.Se…7£†s6±‹ ±‰'¤šC4 Œ ¤„ ¤Œl ± ±d¢(‡ƒk ¢(œ:ƒk1±‘F¢&ƒ 1±ƒ3£‚)ŠSƒ ±¦Y¢&˜$1±“Y£–MŠSƒ'O£…Q‚<…P¢Šw‡Y±e±‡Z£–&9¦3/ƒƒ\¤FE¢/±ƒ}£„(m±ˆ±†l±‡9¢/ƒ@e S£šd‚<…P¢¤‡Y±Œ±’q£­q9¦ /ƒƒ\¤†cFE¢‡%/±ˆ2£Œd(m±¡q±Ž^±œl¢…vƒ@±‘  ¨(“S7  " ¨(©7  " ±ƒ3±‹k±"Ž ±ˆ:±±"£ ±ƒ8 ±˜K ±†)±‚²†P ±—>±Ž;²ŽqP±(ŠJ±ƒ ±(Ÿ}±—< ± ‰ ± ”' ±ˆB ±—¢(… ¢(š7 ±(… ±(š@±ƒ± †" ±I± m ±/ˆ ±/œ> ±‡ ±ŽFw*  ¢„\¥#‡A„]  H±±‡S±‚l±—X±ƒA±‡[±„±ƒ/±‚L¢ˆ{„\±„H¥Ž}‡A„]±†{±…c±†±„&[j¢ƒbŒh±Š6£m=e§‰OM"A@±…Z±†)±‚¢‘r&¥A4…T£ƒZ‚s„,±ƒ ±‚_±‡&¢†1…7¢1±3¤; ±¢ˆ&Še l¢˜uŒh±£\£‹ =e§šdM"A@±‹f±R±‰L¢©=&¥Š-4…T£’4‚s„,±‰(±‰P±{¢›5…7¢•d±Y¤ˆ@ ±ƒ8¢œJŠe ±†k ±“ ±ƒ{£!‡{ ±‰£!P‚%¢R„j±‚{±–¥‚"m‚r†7±…X±„{£‚'~‚n±ˆi£‚[ƒj±‚/¢‹.‚q±‚!±‚±±!±.¢%ƒq¢‚1±… ¥„Y„e‚2†/ƒ@±†u¤„J„N„I¢„u‡w±„T¤ˆG†0‚oH ¢¤e„j±ˆ±¯6¥“7m‚r†7±’ ±$£Š+~‚n±”£‰\[ƒj±… ¢¢y‚q±‰l±…6±ƒJ±Š ±‡¢‡-ƒq¢ˆr1±Œ)¥žD„e‚2†/ƒ@±‘~¤–P„J„N„I¢•‡w±ŒY¤œk†0‚oH+Q±ƒT±„4±…¢{R±‘a±‚n± ±ˆ9¤…F*‚HŒ¢‡rg±†²[бƒW±R¤Š7'ov2±‘ U±Œr±Š@±‘5¢†!R±©,±†]± „A±‘¤Ÿ1*‚HŒ¢’{g±Ž ²¢_б™ ±‡¤š]'o±ˆ ±ˆ7±¥) §(“T-7  " §(©-7  " ± „N ± ‹l%±†W±ˆR±‚±Z ±“ ±’{±†p±ž ±)…9 ±)‹‚±†Q«‚9tƒ„B†{ƒXR±‚£8 \±… A¢ƒC¤9‡/!£%Vb±†l±…JG£+3£“„)ª‚ L‚ # ©‚K… " ‰:£…Bƒ±ƒU¦Ž,'‚Q ±›d«›_tƒ„B†{ƒXR±‹%£‘M \±‹±‰ ¢CC¤‹P‡/!£†Vb±ž7±±‡3£ƒh3£­j„)ª L‚ # ©— K… " ‰:£šuƒ±‹Z¦¢@,'‚Q¤/‡%2; ¤/›I2;-¢‡gO±ˆq±‹s ±'ª ¢¡ O±•%±• ± ^,¢eŠ ±ƒ$±ƒ±‚±±…5«Rƒh‚ ƒ O‚9,s( -¢š Š ±”9±Ž(±‡h±ˆ,±:«•vƒh‚ ƒ O‚9,s(¤‚‚C ¤‡m‚C)¢„Cƒ3±…G±…g±“t ¢™Vƒ3±±p±©' ±m ±†t ±'”6 ±'©:±$„u± „3 ±$ž`± Œ8 ±ˆ ±!¢&ƒw6 ¢&‹i6u 8£Š%"ƒ*±‰ ±Q±_±ƒ1±‰±ƒk±—t±’.£‚ ¦‚>q]„K 8£›:"ƒ*±•A±†0±…N±Œ±—p±ˆ±±_±§a£‰ ¦–6>q]„K !¦„/S/(W/±‡ ¦ŒzS/(W/±‚e.ª 4…Er‚z„Ia'8±‚W¥ƒ@‡ˆƒ‚H¢ƒsp£(ƒ)±‚l£):¢‚R±…k±<±‡¢…x|¢‚*+±"±ƒh±‚¢G†£yƒ «[u1„o? …VƒU  6 @> †*ƒ ±„ ¥D‡p . 0ª–34…Er‚z„Ia'8±‡^¥œf‡ˆƒ‚H¢p£†4ƒ)± £…O:¢ŠR±‘±†±Žb¢C|¢…I+±ƒ^±’B±†6¢›2†£ƒ «–_u1„o? …VƒU  –i @> †*ƒ ±‹7¥”h‡p .G ¥!Œ> §x'Q…G£ „(>±‡;±ƒ' "¥•*!Œ> §R'Q…G£ Œ[(>±’D±ˆn ±() ±(¥\±†a±‡ ±—v±‘5 ±7± TZ ±…o± Œ]±•^ ±‰ ±’'²#ƒo ²#ŒD „\/‚#¢‚“±„|¢”~„ , ‚w&:3 G3w72¦%‡Y eƒ1ƒk£89„±ˆ@¥8„Aj-†±‚¢„^…@±„£%‡A±‹ ¢ ƒKi¤R‚ƒE±‚S£3‰GŒF¢Z‚M¢;†¢ƒ8,¢2b¢‚,¦9ƒƒ_¤8ƒH±ŽO±†a±…I±…}±†f¢G‚G¢‚x„±ƒ2±„*±ˆJª3‚RJf%A£H £q…„C¢ ‡G£&l+±S±‚<¥’'41„£³‚(¬¢Db¢Š`…Q ±‘±˜k±„I f£–|…-±¡4£ˆS‚RJf%A£‚+H £Œ…„C¢ Žt‡G£‡l+±†±‹¥¬41„£ˆx³‡o¬¢†b¢Ÿ…Q ±/‰I ±/m£ƒT £ˆT ±)…0±‚ . ±)Šw±„9 £(‚_4ƒb¢‰9 £(˜4ƒb¢] ±‚^¥‚&"‚ ±‘8¥‰&"‚±r ±ƒe±ޱŠ ±‹+±¥K±   ±™< ¥‚g V ¥Š- V  ±Y±ˆ±‡e ±… ±“±j¢‚I# ¢‡(#)Q±R£‡6Œc‚"±„G¢&¢‡b‚<±‚v³ޱƒJ±… £‡h„Le¤‚„Iƒa¨ˆa^ H…-¢ŒIƒT S±†Y£ \Œc‚"±{¢ƒI¢’y‚<±šA³…>ޱŠ ±„±£œl„Le¤—H„Iƒa¨™^ H…-¢ mƒT ±ƒ_ ±ˆf ±$•| ±$¯g ± …k ±  ±%ƒ ±%ŽD  ƒ8ŒM3*    ™E ƒ8ŒM3*  ±‚?±…^ ±ˆK±ŸI ±$…q ±$Ÿ\ ±$† ±$Ÿo ±$† ±$Ÿz ±$† ±$  ±$†% ±$  ±$†8 ±$ # ±"ƒ5¤ƒ|ƒ'7 ±"‡j¤”"ƒ'7ƒ4 U¤ƒS‚o!£ƒDD¦%ƒ29‚L±…;£†„L±„R±_£2†xƒ&¦‚QM‚±ƒ>±†?±„.±‚9¥†„!H‡„¢h|¢^±…Z±s±ƒ±‚u±‚¢X±‚~¥†Qˆu„4[‚X±ƒ~¨ƒL „P/"†0|„¦= T‰M¢Œ±¦L‚*_0‚m£oI¦‰M‚S >b X¤˜f‚o!£ˆKD¦šKƒ29‚L±ŽY£—2„L±Š^±Š*£f†xƒ&¦ŒzM‚±‡d±‘V±‰ ±‰¥R„!H‡„¢‰3|¢„}±ŽF±†+±Š ±ˆI±ˆ¢ˆX±‡¥ <ˆu„4[‚X±¨˜P „P/"†0|„¦•p T‰M¢œ,±†`¦‡c‚*_0‚m£ˆtI¦q‚S >b < ±„U ±$a ±$›L ±%Š? ±%•H$¢'g]¢…V±" ¢'¤k]¢ˆ…V±¤F ±†4 ±ŸZ ±'„} ±'šk 1±_¤3‚g:¢dƒC±T¢ˆ!± ƒF±ˆ ¢†l±‡j±‹F 5±¥±ƒ¤„Y‚g:¢…CƒC±¨¢‘!± ‡{±u¢—±o±Ÿj ±I ±¨o ¢'6‚±‚b ¢'¥:‚±Šg ±… ±Ž £,Y(¢ £…3Y(¢Š ± ±©-$±^±‚N¤ ‚N ±†e±‘(¤‡ ‚N±‚S± ƒY ±†± ŠJV(±”1¥a‘k±„m¯‚M+$)##‚$± ‡ )±©D¥˜,‘k±Œ8¯‹9+$)##‚$±  p ±‘6 ±©/£+x6ƒ©„FN†„ £+‡Q6ƒ©˜jN†„ ±‹ ±—?7±ˆ|±P±ƒ,±y¢ =X± † ±¢"±Š±‡±„5¢ ŠX± š> ±U ±„3‚¤„<Q‚-±‚(¢Š-5¤†V‚Hƒx±ƒ£^0 ±„b¢‡M±†s²,@¦‚ +ˆ|R£‚‚8R±#±‚± ±ƒ±ƒM±‚>§„4„F‚$‚&„]±ˆ±K£Œy¢ƒƒ: ¤™OQ‚-±‡/¢£S5¤—k‚Hƒx±‹j£Ž0 ± ¢Q±’ ²„ @¦™T+ˆ|R£‰h‚8R±…±…2±ƒF±‘`±‰U±‹§ž„F‚$‚&„]±“±¥O£¢,¢Š)ƒ:P$¢Œdx¢‚Y¨+ƒw" ± /± …±ƒ '¢yx¢ˆY¨ˆvƒw± ƒ± œ ± š±—2 ±+„ ±+‰x¢‚k" ¢Š6" ±ƒ ±™S &±“[±…>±‡!±Šu± /±±˜8±‡ ±\$ (±¨n±Ž\±l±– ± …g±ˆ.±²#±œ$±‡#±‚Al 0¢‹Sˆ¥…{Ng¤&…,± 1±±‡)zp±‡$²‡ð 7¢ fˆ¥Ÿ!N±†s¤ˆq…,± §|±„P±±†N±†x±)²›?ð²"{ ²"†0 ±$™ ±$³ ±,„% ±,‹< ±,„ ±,‹/ ±ƒx ±‹>¤#" ¤#ˆw<Z¢“b±ƒ3±Š_±…p±ƒ$± ˆ ¢y‚P¤ˆPt)±‚v£‚dDQ±,±ˆe±‡D£ƒP‹ƒa¢…x…u±‚£„"Tp1± ]¢¨u±ŒQ±›t±‘±ˆ± w¢…1‚P¤—*t)±‡£‹9DQ±ª±“n±œH£™‹ƒa¢–…u±‡t£‹9Tp±‚N±•7 n" ±"…#ƒ<V£J‚v]£i‚U5¥††„ˆ=£sƒ;±Ž6±‚Z¢‚?†¢‡/{£PK ±‚%¥‹ „4‚4¢†1n¦pL‚‚>:©‚ ƒ8J‚Ng±…%±ƒl±†¢-'¤*WƒD‚f©Ds„Q…5S^„H¤D…ƒ 0©C …N i>„‚…8¥‰‰0R±T¦ƒ`/,‚rƒ ƒQ¢i+±‚p¢… ‡5 _£¤]‚v]£†p‚U5¥Ÿ5†„ˆ=£‹ƒ;±ŸK±‹%¢Žs†±‚>¢‹F‡/±…!£‰K ±…¥¢h „4‚4¢|n¦‰\L‚‚>:©m ƒ8J‚Ng±Œ±‰@±!¢ƒj'¤‰WƒD‚f©š/s„Q…5S^„H¤‹M…ƒ 0©•G …N i>„‚…8¥ž9‰0R±‡¦”/,‚rƒ ƒQ¢‰+±Šu¢™1‡5 ±-‚V ±-Š[ ±†Y ±E± „D±‚ ± ŒH±†H±†p  ±a £‡P'¢ŽY £<'¢¢:Yk 2£Ž1t¢‹±…)±0¢ ƒƒ ±…;-£sU±ŽD±_±…h 4£¤1t¢œ(±‹5±…¢ Š;ƒ ±Ž±‹6£‰eU±£w±‡8±š ±%Š+ ±%•41±…B±‚A±p§…`  ±žh±ˆM±†%§ŸK  ±… ±Ž ±Œ} ±ž?±p± ‡X±„±h±‰gA¢ˆ}‰g ±¦± ’±ˆ6±…%±žk±ˆF¢!‰g ±%‰. ±%”7B] 5 98RI -Y-i6Y!55E‚{m#h @ Fƒ#± Š(¢‚dR£‚ #±ˆ²"ð²„`` ` 5™B 98RI -Y-i6Y!55E‚{m#h @ Fƒ#± •?¢†|d±„£†E #±m²¥Uð²‹w`{ ;³„­±†R¢Z…³ ­§h ‚z&£‚Q ±±‚ ±¦ „„* ;³™.­±—g¢Ž…³ ƒi­§™3 ‚z&£‰aQ ±… ±…+±ƒ?¦ ž„* -±U¢"ƒI¢†[£‰Z ±¤h¢"Œ¢ F£Ÿ ¢m–+ ¢š–+ ±Œ ±š`¤‡ ¤˜&£#y £#‰N ±‰G ±š\};±‡'±ƒX±‚a±ˆ3±;±†J±…S¢ƒ&t±ƒS¢…N±Š¢ƒ$!¢…0I] =±E±‹#±†±‘±…s±6±‹[¢Št±‡l¢Œ"N±Ÿ ¢˜W!¢ŒGI±‚z ¨*‹Z/0 ¨*›BZ/0±’j±w ±ª5±¤{ ¢o<± „W± ‚8 ¢ˆ5<± Š_± —<³#†&B ³#Ž{B ¦(‚ W ¦(—G W ±$•5 ±$¯ )¨ƒD3"¤ƒ4 ¨”Y3"¤ŽK ±)_ ±)‡&K£‚*d±[§‚+6  ‚b3%    ! ¾…bmmeeem`¥ƒ„Kƒ)¥Bƒ' L£›Pd±žp§ˆ76  š-3%    ! ¾ŸMmmeeem`¥˜ „Kƒ)¥”fƒ' A±ƒ{±ƒ%±q±…M« ‡ (  M8 J ±›F±‡±„-±Ž9«  w(  M8 J ±ƒf ±˜y ±&…w ±&i±Œ ± ±¤%±ƒ±m± ±• ±Œ±G± šr±ªS±„C±‘3 ±/±¥WU (±ƒ9± ƒ2±‹5¢…HA²‚bб‚W¢‘VA±ƒ±…~ (±ˆ@± ‡X±š¢Œ4A²†бŠI¢¦ZA±˜P±Ž ±Š) ±£O ±/‡ ±/›- ±‡' ±r ±j ±  :±ŒE±–¤‚ C²@²@¢ƒz(­ŒX  ~²@ H±¡X±±‡T±­d±ƒB¤‡\‚ C±„²ƒ0@²‚M@¢Œf(­›2  ~²„'@±‡. ±8 ±„F   @B !&1 KP(±‚o    ˆ  @B !&1 KP(±ˆ6 ;¢”2¢X—k± ‡²ð3 £‚;U6£Ž‚lƒGF£‡pƒ"Y±ƒi¢ ‚2±5 @¢©E¢™~—k± ŽY²§Kð± ‡$£Š-U6££‚lƒG±† £˜ƒ"Y±‹¢‰‚2±¤Y ±!± …k±† ±¦l± Œ\±šA:® /@ ‚af±‚ ±²U ®™4 /@ ‚af±†F±(‰n±Šh ±(Ÿ!±Ÿ ±“u±ƒO ±«@±ˆ¢+N„h ¢+†'„h ±‚X ±š# ±/…K ±/™o¢†vA ¢bA¢‚m& ¢Š8&#¢„-¥*‚lq5 ¢‰ -¥*Šq5 ¢‹%‡'²'‚f  ¢ 8‡'²'˜  ±ƒL ±ˆS ±—+ ±®v!¢‚[±ˆ#±‚, ¢‹3[±Ÿn±–P G±‹2² ð ,ˆ‚b65¤… P‡±‚~¢1C¤6ƒ\± ƒp  K± E²‡fð —R,ˆ‚b65¤“dP‡±‰j¢„JC¤‡Tƒ\± ‰7$ ¦9‚}L-(±ƒ  ¦„f9‚}L-(±ˆO ± ‡ ±  ± ‡ ±  k* ±*‘ ±…. ±‘b ¤ f±ˆ ¤¤ f±”C ±† ±Œo±,±’/ ±ˆ±¦S ±’:± ‡G±—s ±§M± K±±^ ±— ±°3 ± … ± Œ ±#†s ±#H ±Ž{ ±¤ ±Z ±©¢‚%Yv ¢ˆ1Y±‰K=  ‚: 3MJ)   Š> 3MJ) ±‹` ±˜¢ 3 ¢¨13 J! ±!„-¢”{‚F£$‚X… c£‚Y4 ¢®!‚F£$—\… c£—6Y4¤$Ž„ ¤$§~„ % P©"†= ‡@#N!<„Y±†u±…|±„5± ƒ ±„D¤Š-Eˆ5¢14±§‚1W†_ .(±0¤$\=v P©šH†= ‡@#N!<„Y±˜ ±ŽG±Œ9± †)±Š¤¤Eˆ5¢Œ:4±¢§’WW†_ .(±‡ ¤ˆ;\=v@±~± ‹¢‹8‡u¦ †Qƒk†{@± ±¦± –¢¥#‡u¦•S†Qƒk†{@± * ±"ƒw ±"ˆ,%« ‚@!4NI, « ŠD!4NI, ±† ±•Y ±…= ±Ž) ±…B ±Ž.'!±‡C ±!ƒd±›ge 0±’@¢ƒxŒ±ˆw±ƒh±†r±#±‡±Ž&±,±‚z¢ƒuƒG 0±«f¢• Œ±“ ±Ž±Ž8±„`±œ#±£Y±‡±Š¢‹zƒG ± „@ ± ŒD ± ±©5 ±†( ± " ±"„N ¤ˆ6 $ ± – ¤‘T $ ± ¯~£  £f³‡%U ³˜:U±\±ƒh ±‡h±‰<)¨'‚;Œ1 1¢3D ¨'—?Œ1 1¢‰8D‚I²”pऔg 7±‚±¢ )±—±‚±‚¢†I±…"±ƒ*±P¥55& £ƒMz®] 2Z $ "¢‚8†\¢‚lƒ¨ƒƒPƒ7*‡=)¥^aƒ*§ p‡)4ƒJ‚E±‚±‹W ±(ªj± R !²ªà¤® 7±‹ ±ž¢‰ ±…±®i±‰[±…%¢i†I±Œ±‰2±…i¥„j5& £ˆtƒMz®š ] 2Z $ "¢A†±ˆN¢—pƒ¨•;ƒƒPƒ7*‡=)¥†%aƒ*§0p‡)4ƒJ‚E±Š±Ÿ{ ±'8 ±'¤<±‘K±C ±¦^±©i ¼8çgw ¼’Mçgw£ ‚] £  5£†p¥[+ ±„E±†s £m†p¥†+ ±±Že ±‚C¢"‡v ±—V¢"Kk2±”*± ±‰a¢‚g8¢‚`ŽQ¢‰KH¢¨ ˆP‚WV 4±­P± ‰ ±¡,¢—k8¢˜ŽQ¢™qH¢…u¨”DˆP‚WV ±„~±Š ±š±›- ±&† ±&Ž ¢ˆxP± —w ¢—RP± ±b ±“~¤$ƒZ„? ±©¤$Žc„? ±t ±„R ±ˆ6 ±— ±&„9 ±&Œ+ ±'ˆ ±'A¥ƒ Tk¦%‚/@ ²Sp£‚/‚B ¥ˆTk¦%¥‚/@ ²¦p£Š4‚B3¢Œ#B¤ŒadR±…mh±†8 ¢¡6B¤¦dR±‹y±‡T±š\±>" ±³;yVY ±¤³‚^y±„±ˆK ;±…>±‰ ±PD¤†| ±^±„}b£‚‹ j±3¢z¦‚>q]„K‚ @±‹J±•@±ƒs±ƒ"¤ŽG ±…M±‹±‰7£œ‹ j±‰%¢†S¦–5>q]„K‚ Q&§Œ …Iu±„u±L±„¢‚n‚/±‚±ƒx &§¡0 …Iu±Œ@±Š8±’a¢ˆB‚/±ˆ±‹²-‡. ²-3±‡ ±Žu ±ŽX±¨`  £O±$†k±Œ £•&O±$‘t±¡ ±&†n ±&Ž`!£LU±X± ˆ. £¥_U±2± ¢ ±‰ ±—o¢ˆ]l ¢—7l ±…N ±’9¢„r±†"£#…eŒ‚*±†±ƒe ¢š±@£#šiŒ‚*±Ž±˜ " ¤ 5sz±'| ±Š ¤…5sz±'‡C ±)„( ±)‰o7£Š&"ƒ*±‰± `¥‚>q]„K £›;"ƒ*±•B± …O¥–7>q]„KH_¢‚ˆ+£‚J¢T‚±‚S±J±b±‚g±ƒt±I¢†w±8±J¢ƒ(‚±r±‚S±t±#¢^‚1±…h±@j d¢—ˆ+£›p¢Šr‚±ˆ_±~±„±±‹x±Œ`¢˜c†w±‰±„5±ƒ¢’‚±ˆ^±ˆ'±‡|±…<¢‡|‚1±Ž=±¤D±–l1« |BSDTs}¢ {¥8¦ƒw!†Gf¢‚5± ƒ@  2«‡R |BSDTs}¢„,{¥Š 8¦‘Zw!†Gf¢‰5± ‰ ±/Œ3 ±/ W ±(• ±(ª9, ±,Ž1 ±,‡ ±“" ±¬H ±/‡5 ±/›Y ±$†Z ±$ E¢„.z ¢Š:z¢ „r< ¢ <‚}/:±•±…±™"±‰±‘±†±ˆG±Œ0±‚±Š%±„"±ˆ±‹±„[p±‡B±‚Z±—G±ƒ.±‡G±ƒk±ƒ±‚8±ˆh±„4±ŽV±†h±…P±†±†m±„±‡±ƒ9±„1±ˆQ±™g±‹±‡n±•±•/±…C±"±…U±‡±ˆ±‚±” <±ª"±Š ±²H±’8±¢&±Œ±‘±˜d±„B±”N±ˆH±±–*±‰:±d±±…8±¯±†`±±‡Z±†:±„t±‘T±ˆl±0±T±‹$±Œ ±^±ˆ.±Ž8±†v±ˆf±‘&±³R±–±`±ª±ªb±‹ ± H±‹.±Ž*±±„6±¨D#£‚5G±ƒ< £Š±!±‰¤ ‡h/R ¤ ’/R²'“,p ²'¨0p ±‡H ±²ˆ7 ² ²$’|€ ²$¬g€ ±)…@ ±)‹± –?±…,±„* ±–A±A¢…% ¢ž9%['¨ kƒ9]<O±…±Žw£ƒƒ¢j"¢† ‰ ±’@ )¨‰'kƒ9]<O±‹±¨b£Šyƒ¢†1"¢–/‰ m* ±*‘4¦ ‚#J±:±Œo±ƒN  ¦ƒ& ‚#J±ƒv±›I±‰/£Evmq±†X± Š+ £©kv±ˆ8±„±D± ¤ ± ±¤K„ $‚¯ˆ-W0@ ‚„rO±“5²ˆ@¢‹ …o¢ƒ6p±„F±0±‡±(²†cÀ£Œ)†M£‚(X£ƒ"z$±ƒ¢‚4(¢,¢ƒI„[£(c§ƒC`stN¦u,'3p±‚p±‚¨‚>J06,] ¢‚DV¨=+c}a)e±ƒR£ƒ~4©‚?‡z‰‚ZZ1§n?oƒf£†r1¥1LDŠƒ¤ ˆj‹¥„J±…²Ž)À££t†M£…O(X£Šmz$±†r¢…S(¢ƒh¢Œ5„[£…`c§’`stN¦‡a,'3p±ˆD±ˆ¨‰>J06,] ¢†]V¨ˆ[+c}a)e±ˆ£ŒS4©œ*‡z‰‚ZZ1§Œw?oƒf£Žd1¥•5LDŠƒ¤•K ˆj‹¥”p¤„2‚± „) ±†g ¢ƒ:±‡M¢–6>¤Šs2‚± ‰p ±/„ ±/˜,N$£gŠ£$„ /£D¢0(©† v/‚\/) %£š Š£$™$/£‡¢ƒM(©š/v/‚\/)_k¢~‡f¥†i‹ Kƒv±ƒ¢†-e±Š!±‚"£„$2¤Š#ƒ% „#p±{£m 1£‚<‚b‰¤‡5‰@± £‡‚4h±†:¤… ‡V‚U‚F o¢—‡f¥ ‹ Kƒv±Œ.¢Žxe±–U±ŒK£Œ(2¤¡nƒ% „#±ˆ;±U£…* 1£œ'‚b‰¤œ5‰@±¥@£—B‚4±‡±Ž?¤™/‡V‚U‚F ±Šb ±›w ±…0 ±œ{±%†>±†` ±%‘G±w ±‘v ±§ L£„ †'±ƒ/¢„&H±1¢ƒx±ƒc²Ð¥m ƒ .†\± „Q±… ¤„#Œv±† £‚ˆG ±„M L£™3 †'±”D¢Š2H±…W¢Ž3x±‹)²ƒnÐ¥™8 ƒ .†\± ‹=±‹~¤žŒv±‘£— ˆG ±š±!.±( ±!„k±•L ± † ± I ± †! ± JO%±†O¦ƒ ‚ ¢ †`µ†ªx¥. ± %±›b¦9 ‚ ¢ ž+µ]ªx¥§ ±–J+S±ˆK±,¢„Œ0± ‡±‚i£‡w‡ƒ@±ˆ ±Št±…t±ƒF±„|¢† O±‡P±Œe±‹±Ž{£ƒ‚>±†? S±^±†3¢5Œ0± ’&±Š/£ŸB‡ƒ@±v±™N±Œ`±‰N±Œ¢Ž_O±¡;±¡i± 4±Ÿ!£Š‚>±šc ±ˆc ± .! `b±‹H±‚K ±‰L±…±š"±†d ±"‚k ±"‡ ;y±‚±±±…±†l±Œ ±– ±›=±’±F±ž±‘u±¡  ± †:¢%„9†2 ± c¢%˜]†2‚~8±„±™  4bn6Z\‚L'IEw0i"‚T03oL.§„f‚‚#‚C/£‡p&£‚OS¢/9¦D17U]N±“±…U£—jR¤ƒGhG²ŽX CƒTƒ5P5#1‰2C$±‚ %Fƒ @ƒF%I8 ¦ƒY) e²“aà  ;±‰±², ‘ 4bn6Z\‚L'IEw0i"‚T03oL.§‘‚‚#‚C/£’&£OS¢…9¦‰ 17U]N±ªQ±Ž*£±UR¤‹ GhG²£\ •vƒTƒ5P5#1‰2C$±‡b ‘KFƒ @ƒF%I8 ¦Šp) e²¨à±c±„F ±™.±™y=±ƒg±‚E±c¤ ‚o4'± ‹_«m@GI!+@y¢„S­(" #X# (O/=R >±ˆn±ˆQ±‰g¤ ‹[4'± ¥J«¥m@GI!+@y¢‹j­ˆ-" #X# (O/=Rfn¤ƒ ‚ƒC%¤„ ¢„ Žgq±Œp¤q^±‹£‚CA.±„8±„±…`¢ƒ o²ˆà¢„/6±•g±C¢‹ƒ±o±‡²ƒaP£…DIƒj s¤˜‚ƒC%¤‰ ¢0Žg±Š±ž¤‰<^±—8£†iA±… ±‹~±›d±ŽL¢‡Bo²–wࢋ 6±¯R±ŒL¢  ƒ±¥"±—<²ŠxP£™hIƒjgp£†S%±†i±‚(£ nS¬Ru"+#‚„W¢†d±±<ª†6  ¢–l±¥Ž hOVƒ8¢‹?±‚C¥/‚R) 3¦‚ 3‚yŽ2 r£Ÿy%±—~±Ž\£ „LS¬—^Ru"+#‚„W¢d±›k±…Uª  ¢°W±ˆr¥£hOVƒ8¢ r±’i¥ˆ4‚R) 3¦–13‚yŽ2 ¢'„8'¢Š2P ¢'™<'¢žVP ±‡ ±( ±† ±Žx2±f±%ƒ±‚.§Qˆb ±†m±%˜±‰E§”uˆb ±(• ±(ªP ±$ ±¨J ±$™' ±$³ ±` ±© ±ˆ3 ±~ ±‚e ±‡± †[±˜ ± ‘±±y± †d±˜ ± ‘ ±±z ±' ±¨M ± †m ± ‘[j¢‰$‰T­„oƒIPMm„p¨ƒ'S/=kW/±ˆ2±‚±† ±‚D±„G±‚ ¢‚9‚c¦d9‚4¥V‚P‚{± ‰>±•±‚M¢„< l¢ž7‰T­žƒIPMm„p¨‰Qƒ'S/=kW/±”f±†~±f±…v±Œ±…x¢‘‚c¦‡P9‚4¥‡G‚P‚{± žB±ª3±’s¢‹S¢‚Y ¢ˆY±†`± ˆ ±“± F ±$˜ ±$±{ ±*ˆ, ±*˜R ± Š ± • ±‹h ±šB£ ‚Av £ ŠEv ±&†^ ±&ŽP ¢$U“<± ¢$š@“<±Œ±…EE¤q„*ƒ„s£&\²ˆð±‚±…(b !¤—„*ƒ„s£¦L\²[ð±†a±Š|±…±…x±“ ±Œd±§3‚¥@%„Jƒ_¢„$¢‚¢‚.£}„*£„^¢$j¢) £E9¢)¢ …{„s±„d±ƒ ±‡W¨ƒyK„Gv0‚f±‚« ‚hk‚OS¢_£‚+05 ¥•0@%„Jƒ_¢…„$¢™>‚¢‰<‚.£‘/}„*£†$„^¢ˆoj¢Œ] £‚<E±ŠB±„>±ˆ=¢‹6)¢ ”U„s±‹P±‡U±,¨dK„Gv0‚f±—«•I ‚hk‚OS¢;_£–O05¢(‡H ¢‡H ±,‚ ±,‰#¢*Œ‚ ¢*œ5‚K#¢ˆ:!±†2±‚!£‰S±„'©‘  #¢M!±±‰?£¢{S±0©¦? ±$•,±„*±†/ ±$¯±3±F  ±ŒQ²$ŠR` ²$¤=`£•E £®+Ets¨‡L‚vC±…± †i£'fj¢9R£/y{¢ˆj‚±…n¤ƒ/d6q±„+¢ƒD{±ƒH¢p‡1¤‚Hˆ.S‡'y±‚5¤…N‚e…v¤†O‚‚5*¢‘a[ |¨œ_‚vC±‹$± ž4£ƒY±ˆ1±„ ¢Š%R£„gy{¢—D‚±ŒZ¤‰7d6q±‹¢Šb{±‡}¢‰E‡1¤œ3ˆ.S‡'±Œ±—9¤›‚e…v¤–u‚‚5*¢¦[±²Y ±"A ±"…v ±'” ±'©±$³_ ±$‡m ±$¡X ±"_ ±"† ±*† ±*–;£`„" £‰~„"± ‡a± ƒw ± e± ‹ ±,ƒ ±,Š($¢„ [±†f¢N…a ¢›W[±;¢ˆ@…a¢…-= ¢x=)±ƒ0±"†L±ˆ ¢…nƒ ±œV±"‘U±¢šƒ ±†k ±6 ±‹` ±¥ ±ƒ ±‹~%±ŠZ±0±†\±ŒD ±™4±¥c±s± hƒzp¢ŠG±H±=¢L…4¥Hw&¢PP¢3$±Wf²"p¦),Iƒi@£H„<.ªt ¢:!±…v & +&2 K£‰j¯D FI ( : A.¤'‚I4x 5Ri0    9 .±ƒA¦+'ƒ0 `-BN-  †M‚,‡#L¢{"¢‡m‹±„`¦…3‰*!|±Œ< ‚¢ŸZ±†O±Š[¢‘a…4¥†(Hw&¢‰P¢Œg$±Œ±… ²‰&p¦‹@,Iƒi±4£˜„<.ª„1t ¢„)!±Žb …?& +&2 K£—uj¯‡0 FI ( : A.¤†V'‚I4±‡ ‡&Ri0    9 .±Š_¦‰'ƒ0 šK-BN-  †M‚,‡#L¢Œ"¢ ‹±Š'¦•Y‰*!|± ` ±…p ±Ž\‚m-2±• ±…±™±‰±‘±†±ˆD±Œ-±‚±Š"±„±‡}±‹±„Xm±‡?±‚W±—D±ƒ+±‡D±ƒh±ƒ±‚5±ˆe±„1±ŽS±†e±…M±†±†j±„±‡±ƒ6±„.±ˆN±™d±‹±‡k±”}±•,±…R±‡±‡~±‚±” 4±ª±Š±²E±’5±¢#±Œ±‘±˜a±„?±”K±ˆE±±–'±‰7±a±±…5±¯±†]±±‡W±†7±„q±‘Q±ˆi±-±Q±‹!±Œ ±[±ˆ+±Ž5±†s±ˆc±‘#±³O±– ±]±ª±ª_±‹+±Ž'±±„3±¨A±"±…> ±"…K±Ž ~ ±‡o¢-„| ¢-A±<²;0²:0±L±R² ƒi°±‘ ±šb²‰'0²„r0±…e±Š'² ‹n°±¥%H`¢‡J¢‚"±˜;±±„R±‚u¢…$‚£ŠJH„#P±/±~¢„B†d±ƒI±‚q¢Mƒt±‚W±‚s¢’ ±„±‰-±? c¢œ&J¢†‚"±±a±¡,±‘±‡¢(‚£¢H„#±„±„N±†6¢“†d±‰±ˆy¢‡>ƒt±†p±Š¢«o ±™±™S±£c ±q ±K ±&†E ±&Ž7±'ƒS±/ ±'˜W±¡S ±† ±Ž~ ¥ e… E‚h ¥ ‹… E‚h ±$ƒ) ±$‚}¢Œh‡¥1…¢&[§<Š B†*¢¢‚:# &§?ogAo£@§8„Sl."‚¢‚d£Cƒ*¥M‚[RQ¥N~#]§NqcB‚2±‚:¢ ’a ¢¡{‡± ¥‡_1…¢ƒ[§˜Š B†*¢ƒK¢‡g‚:±„±ƒ?±‚b§‰?ogAo£„T@§„Sl."‚¢‡‚d£†ƒ*¥†U‚[RQ¥„6N~#]§‡9NqcB‚2±‹¢ •%’a ¦‚c)‚m ¦‹O)‚m ± …} ± Ž'Q±‹e±ƒH±…±‡;±£„„a±ˆn± …~£ŠŒ*q¢‡)¦h%>¢…[…y¤…R]…S1¢†Ja± Q± x±œn±‹(±’R±ˆY£›g„a±—H± ŽS££zŒ*q¢’2¦‰Z%>¢š_…y¤›]…S1¢–pa±£=‚6«#Š@@… B£„ ±‡B±†¦‡{=LM= '±…{²‚𱎱ƒm±‚v¤~/±{±‚g¢J¨i O 5!£ƒ ƒ(£W‚D¢“;„*¢G&±‚'²!À±ˆ §„( H1#&+¢…Ž3 «•6Š@@… B£' ±˜W±’P¦“=LM= ±±A²„yð±¥O±‹8±†¤Šj/±†3±‘A¢‡;¨… O 5!£Š*ƒ(£‰,‚D¢­&„*¢‹P&±Š²–%À±?§‹? H1#&+¢™&Ž3 ±Š ±¡L£(…o £(šGo±%‡"±‹U ±%’+±›{o5¥ƒ)S ¥ƒd ¬‡ƒR  ‚¦‚'J(±…±ˆn 5¥”>S ¥Ž-d ¬œƒR  ‚¦ˆJ(±±'±„±ƒ%¢‡ƒ57 ±ŒZ±Ž.¢œƒ5±†±‚r± … ±&± J} ;£‹n3±—J£‚K3;¢‚5‚y£‚WƒVŠ*± _±ƒ±•'£‚#s„ ±ŽA =£¡3±°p£“`3;¢L‚±ˆ?£š"ƒVŠ*± ‡g±‰s±¯£,s„ ±£tB±“l±„f¢{<±‚±‚¢‚<‚O£ ‚f`¤ … ±B±F±‚w±‚X±„,²„` ±‹.±Œ D±­±Šr¢…j<±„@±Šm¢‰(‚O£…_‚f`¤†… ±ˆ3±…_±Š±‡ ±™_²‰f` ±$ ±$©{‹;*…H 0ve?=/`Ry88[‚y ƒ~§& 2."O   } [ JH;‚PWŒ\R3> %:    De‚=Wa1 4 33| „U RWK7R«C '‚f ¯08 H'I4¯U  Wc%- /t†7¢UU } ! ;3wg§/ K-©‚tQ"(7U S0 C 2jQ };d§5*/5¨.jLIko !S)!*o$.x (TMw@#ƒ~9%A%{U $ ;7 Q‚5& ¤y0©) -* 3£/±†#¨eJ ‚3„j©/ %:   Š7 De‚=Wa1 ‘I 33| „U RWK7R«†O '‚f ¯ˆ{8 H'I4¯  Wc%- /t†7¢‚xU Š9} ! ;3wg§„C/ K-©‰‚tQ"(7U ‹j0 C 2jQ };d§…*/±)¨ˆW.jLIko !˜)!*o$.x (TMw@#ƒ~9%A%{U ‡o ;7 Q‚5& ¤„h0©ƒH -* 3£‚k±¨?J ‚3„j©‡®ˆ|:" WSCZ‚ % 2š'PN(&$‚$M)1a2."0 V#8:q7u?8xb<«‹Wƒ' #„±ƒ$²„R`¢o$¢—_Z¥‚Y ‰ 6¢6ƒ4 c£¡…Ka±±Y²‹$`¥‘O‰2ƒ ±Š'¢…f‚U±ˆ¬›d$.)„†>„±‘~²ŠZ`¢…$¢±JZ¥—3Y ‰ ±\¢¤Zƒ4 ±&ƒ ±&‹  ±2¤‚!K+J ±†9¤™lK+J ±ˆE ±‘c@¦‚Yƒ F¢ M²„p±Š8³eC ¦—lƒ F¢ „:M²Œp±¢³©PCMc¢„ ¢”E‚0¢w7¢5g¦k: ƒ±± ¤fAFƒA±‡)£„#(=±ƒH¤‹gƒ+‡X±„4¢‡(|£ˆ5‚{±„1£'Š † e¢™, ¢­k‚0¢‹7¢‘Jg¦†w: ƒ±…;±ƒg¤™1AFƒA±Žt£‰w(=±‰P¤¥Rƒ+‡X±=¢œ[|£˜[‚{±Œ6£•KŠ † ±Ž| ±¦G/±„h¢ˆWJ£‚•^f± D ±•}¢“nJ£›k•^f± •h¢P0 ¢•c0 ±•p ±¯o 4¢„w¢…rv±„2£JŠ¢Q6±‡± ‚X£y ‚e±‘8¢I†O 6¢š&„w¢v±Ž[£‹aŠ¢ƒ/6±ža± ˆ,£ˆ ‚e±«#¢¢M†O ±‘f ±« £.’Y £™T’Y ±(† ±(›L ±+ ±¢>-±Œ_±ƒ± ‡±Ž~±… ±¡r±‹^± Ž^±¨i±Œ(¢]‘^±ƒ.²‚7Po ¢•p‘^±‹y²…tP±…$ ±ˆe ±™zE ±ƒ2±¢ ˆ(±‡t«‹Z*!Z;ƒWV ±‡!±„;¢ }±¡_«¡ *!Z;ƒWV ±— ±°D ¤ƒVZ²ƒFp ¤”kZ²Ž]p ±)… ±)ŠU ¦&{GhG ¦&‰{GhG ±”] ±¬( ±$–* ±$°±,Ž6 ±$†_ ±$ J±„g±)' ±Šs±)£K<¢y†~¢ „(0±‚^¥†S:-‚ ¢S†~¢ Œ\(±‹9±ŠP¥–y:-‚‡nƒX±”r£ƒ}¯ S‚@e …#­"-ƒpcCEˆ  I0B 2#‚~ ] % ' E @Ov ")(c1c% ±„« UU8"WG§,1„QH:²I°   .B3%A$ WB ?   !$ #5 D ©  .n%^¦ H ®x"= 0²ƒ€ D‚# 4 E„p !W£‚:M±„2±„¦+&0%¨ 8‚p¢„^ ,%P-G  w!ƒ*B 7 P91F=u:6, 23d@¤}'ƒ. !ƒW8‡$ "  (h@A3X¢†}­;a/)1; 9#­  HQZTR«E5" !K(I/¥…Q=G. !±‘+±˜n± ² ±‡c±†F±…± ˆq ƒl±ª£…"ƒ}¯™F S‚@e …#­‘7-ƒpcCEˆ  ˆeI0B 2#‚~ ] %Œ?' E @Ov ")(c1c% ±ˆ7«ˆ UU8"WG§‹C1„QH:²ƒ{° ‡U .B3%A$ WB ? ƒy !$ #5 D ©ƒ, .n%^¦‚IH ®‰d"= 0²‡@€ ‚# 4 E„p !W£‰&M±Š±Š¦ˆ+&0%¨„@8‚p¢Œt^ ,šP-G  w!ƒ*B 7 P91F=u:6, 23d@¤Œ'ƒ. •!ƒW8‡$ "  (h@A3X¢–3†}­†a/)1; 9#­ˆ  HQZTR«ˆJ5" !K(I/¥™u=G. ± ‡, ± ‘U‚±T±„C¤*“„K±…S±‚'¢‚`„f±±…%±‰$O ±ƒC±‚[±†²B ¢…E‚(¤„„#5¤‚l‚H‰k7±…*£Œ9‚ ±‚¦‚252¤% «†V>\#q6G ±¥g±‰J¤šP“„K±‹_±Ž[¢ „f±‰±Œk± o± ‡;±‰±ˆc±²ƒ ¢N‚(¤™!„#5¤˜‚H‰k7±Šq£œ_‚ ±‡w¦‰-252¤‚-% «šz>\#q6G ±&†v ±&Žh&±™¢ vD±‚ ±²7±ƒM¢ ‘D±„  ¢‚:B±‚i ¢“OB±Ž ±!; ±!„x ±‡L ±W )£ &±>±ˆH±ƒ-±‚n±‚4±” ¢†>‰<±ƒx )£–&±¥ ±‘4±‡F±‡#±Š&±©¢›q‰<±˜ ±/†: ±/š^ , ±,‡2^,¢Ž]ƒhª5{ ‚!E)±†1±‡±±Œ_±M±†H -¢£pƒhª™[{ ‚!E)±’e±’%±Œ±¡c±s±_ ±'”5 ±'©97X±±ƒ-£•L<±ƒ#±… ¢‚MD±ƒD±ƒ±¢‚„J¥,‡wC‡-±ƒ{¢ˆt†D¤„(„Mi¥&R‚D Z±–.±ˆ4£®AL<±”8±‘@¢ŒvD±‹H±Ž'±…v¢‰b„J¥˜w‡wC‡-±ŒP¢ž'†D¤”'(„M±†B¥•JR‚D ±• ±®9G ±“}´…`%P²\ЧD…oi ±…5±‰= "±©´‹l%P²‚Ч‹[…oi ±'±™c ±&ƒ_ ±&‹Q ±†} ±i±!‡ ±ŠQ ±£w3¥†,ƒƒ $¢–A<^ ±…: ¥›?ƒƒ $¢® <± ‡J±‹%± ±¤ƒi„f ± ‰±˜[¤T„f ±.e ±.„±ƒ±ƒ ±”-±Ž¢‡>/ ¢ /~2 ³k´¼¢‚8±‚R±J¢‚C³WL G±•-±…±‰3±‘+±†!±ˆk³ŒHk±‚9´ˆ¼±‹3±„y¢Š±…q±„¢‘³‡CL(Q± ‚e£ ‚(^)¤†K± Y /@ $ 3 8  #Z  &‚OD 5 R± ‡ £ ‹^)¤s†K±…1 ¤] /@ $ 3 8 ˆ #Z  &‚OD 5 ±&… ±&q ±$•Q ±$¯< ±$—g ±$±R@¢…c†;±ˆ[²*pA±’%¤‚j ¢Ÿ †;±‘y²„Pp±±§X¤ˆ1 ± ± ‚b ± ‰ ± †QI ¥tY‚#ƒ¥A‰Pl:±‚A¢ ’_±… s $¥‰?Y‚#ƒ¥Œu‰Pl:±‹-¢ ¬J±š±†:¤ŒD + ¤¡W +± †±„a ± ޱ•¢(7 ¢(¤:7 ±/ˆ! ±/œER#K¥ ~N±‚9¤„L„nƒ%¤B:>± ƒF  &±ƒ}¥ƒv ~N±†q¤“&„nƒ%¤ˆ B:>± ‰  º/Ž< º/¢`¥(‚ ¥(—E ±˜ ±±: ±-…$ ±-) ±&†" ±&Ž ±* ±* E‚}/:±•±…±™$±‰±‘±† ±ˆI±Œ2±‚!±Š'±„$±ˆ±‹±„]r±‡D±‚\±—I±ƒ0±‡I±ƒm±ƒ±‚:±ˆj±„6±ŽX±†j±…R±†±†o±„±‡±ƒ;±„3±ˆS±™i±‹±‡p±•±•1±…E±$±…W±‡±ˆ±‚±”" <±ª$±Š ±²J±’:±¢(±Œ±‘±˜f±„D±”P±ˆJ±±–,±‰<±f± ±…:±¯±†b±±‡\±†<±„v±‘V±ˆn±2±V±‹&±Œ±`±ˆ0±Ž:±†x±ˆh±‘(±³T±–±b±ª±ªd±‹ ± J±‹0±Ž,±±„8±¨F ±*ŒG ±*œm ±&†! ±&Ž I ±™o ±(“| ±(©/‚E£{‰r‰@¢‡!8±‰ ±ƒr¢‚B‚ ±‡±…|£T&¯]'zPS"‚.ƒ!‚}„ q¥‚'AV ±‚K±(¢ ¤ƒ ‚=)±ƒ¢2-±ƒn¥6$±„F¢…ˆ±†£ƒ4„±±†£‹e„fZ ±ˆu £–‰r‰@¢ G8±š"±Œ=¢Žv‚ ±’±B£ƒ2&¯˜('zPS"‚.ƒ!‚}„ q¥‰rAV ±†:±Š¢„B¤‘_ ‚=)±Š¢„K-±‹ ¥„I6$±¢žoˆ±›£˜34„±†^±0£  „fZ ±†+±‚ ²†€ ±—@±Ž=²Žr€¢ „Kg ¢ ŒOgƒn'd¤R‚d+¢!z¥u‡Šƒ,±¢bŠ3¢FƒJ{p±£%„]¤G|¢‚¥~„$ƒl%£Y(¢@„G/¥n=ˆ8~¢^K¢t(3£# ƒ+²#࢈ct¢nW¢d„£#„(qy§ˆ3*|…;¢"-¤ˆ7ƒ…` ¢œ+$±‡]¦ I(ŒE‚y±w£•z‡‚¢‘†w±ƒV±¢Š R£‘*ƒ¢† ‚-¤¡7‰ML‚d¢…B*±™8¤ ¤Qˆ …-£; „F¢—†p¨–~7‚">(qy§˜Y*|…;¢†{-¤œ[ƒ…` ±…C ±‹K ±ƒ ±œ( ±a ±…7±ˆ ±‡n±ƒ{±B¢ˆq4±V ±™!±’±ˆ!±‰¢ <4±‘| ±(†& ±(›Y ±(’s ±(¨&¢•n‚H ¢¯‚H ±$‹ ±$¤y ±'“ ±'¨#¤+Y ¤q†C ¤…2Y ¤‹†C ±(…| ±(›/£/†m £/› ±ˆ; ±‘'±Ž*± ‚g ±Ÿ?± š2 ± ±©3Y(£‚5‰c„3± #±ƒR;}£b:)£ƒ"1¢&‚| ,£›[‰c„3± ˆi±›±„*±ˆo£¥f:)£‹"1¢¤J‚| ±" ±"…A ±b ±©#±W¢"ƒH£‰[ ±¤j¢"Œ£Ÿ¢$†\ ¢$ G ±( ±(–E ±\ ± q ± ˆ^ ± “ ±(„w ±(š* ±(„y ±(š, ±(„} ±(š0o5±ˆ¢‰'ƒr£‚Y>¢ f©ƒ*<qI ‚£…oAO£ ‡NcŽ=±‹A 5±¢š<ƒr£ˆ"Y>¢ „D©šR*<qI ‚£Ž[AO£ ¡9cŽ=± t ±… ±ŽV(±$¢ƒK\¢‰7=£j!¢…Œ ±„C±Žl¢„Z… )±’9¢Œ\¢”N=£„'!¢ŸŒ ±L±Ÿ¢˜~… §„/S/# §ŒY/S/#± †±%‰s ± ?±%ž1³‚3Û¬‹7, ‚9 ‚Q ³…Û¬£, ‚9 ‚Q §„6S/:lY/ §S/:lY/ ±Y ±¨ ±,| ±,‰2±ƒZ± =¤‚o>^…]¢,‰{ ±‰f± ™¤—s>^…]¢”P‰{ ±ˆ8 ±‘V ±ƒ, ±‡E±&rO%¢”|‚F£‚3f±… ±„±‰\¤‚Y4‚0±‹1 %¢®"‚F£‹"3f±‹±Œ±ž`¤—7Y4‚0±›W ¤'‚CŒ=- ±‡ ¤'—GŒ=- ±$‚*¥ƒ;…c‚"ƒ8ƒu£‚S&K¬Fƒ3 dP[‚kX3‰*¢†dŠ£`‚„¢z‡±†t±‡]¢†@Q¤Tg#Q¢…`±„G£ƒZ8 ±…¢‘=P±†j±†{¢ˆl…#±‹d¢ƒQƒ&¦†=„4IK‚Y ¥˜N…c‚"ƒ8ƒu£‡Z&K¬š4Fƒ3 dP[‚kX3‰*¢—yŠ£Š+‚„¢Ž.‡±‘±a¢‘WQ¤…3g#Q¢+±“!£ˆ8 ±W¢«(P±‘s±Žm¢p…#± E±†=¢Šhƒ&¦ša„4IK‚Y ± ‚} ± &²“c€ ²­ €²* ²*Ÿ5 ±ƒ1 ±Š ±$– ±$¯} ±$– ±$°Q& &"ƒ"   & &"‹  ¢,…CI ¢,ŒZI±†I ±F ±„$ ±‹L ±š& ±#† ±#Žd ±†? ±’s ¢‚CE±‚u ¢“XE±Ž ±Š!±$‚_ ±Ÿ4±$h²ˆP ²#Pa .± E² ˆÀ±…l£'±²…Y€±ƒb±|±^±* .± …k² |À±ŒX£†{±‡&²ŒJ€±‡{±±–b±ƒG ²'„4 ²Š.  ²'™8 ²žR c (;Z¢3¢…wƒ*±‰e±….£?~³ Þ£ˆa‰g ±.„A 0±‡'±„¢š¢‘ƒ*±ži±Šu£ˆD~³‚(Þ£”?ˆa‰g  ±—d ! ±—l!±¢D„_±‚b ±ƒ`¢™„_±Š-±…±„ ±–,±, C± „\±‚$c±D±;© ‚ ±T§‚‚xw<¤‚…^ ¥‚$5!…P± F± ±Š(±„±‰±„Z© ƒ[‚ ±Š)§'‚xw<¤—…^ ¥—5$5!…P±•;9±…r¢ ‰*± u±ƒu~¢ƒ\0 ±8¢˜T‰*± ˆa±‹±–¢”0   ±‰> ±ƒ/ ±‰; ± …~ ± ' ±"‚S ±"‡±&…'±ˆh ±&±™ x ±…0 ± ‚ ± †6 ± ‚ ± †7 ±$—@ ±$±+.S±” ¢†l„|±ŠW±_¥‚„Q±‹R¢‚‚I±†¢E£„ (‚BZ±‹n£…Š 8±‰U±…B±‡[±’x V±©¢˜„|±— ±„¥Šo„Q±š,¢‡g‚I±/¢„£Œb(‚B±ˆL± r£šRŠ 8±™{±‹±`±§ ±/ƒz ±/˜ D &@ƒ--(< D &@‹-(<±(ªrz 7`ª s '±ƒC±‚£‚QO¢‹ƒ%±†>¤„‚!±†f± „0  :±Tªƒ9 s '±‡2±„L£‡ O¢™tƒ%±*¤Šx‚!±Ž± ‰w'±…:±„8¢†„, ±–O±O¢œ„±†£ƒN £ˆN ¥„rƒ PWƒF ¥žƒ PWƒF£6 £’K¢‚/Y ¢ˆ;Y ± †z ± ’ ±&…; ±&-S &±Žs±ˆ0± •{± …f±…V±‚d:±‘h±„$±“ (±¤±”d± ­F± ŒR±ŒG±†}±ˆ,±§±‹;±§@ ±(‡/ ±(œb‚z8¥‚%‰6‡-g±™¢…[£‹ ƒ0‚'±ˆ¢xƒ~¥†qŠi±W±N±ˆU£„W‚-±ƒ±„ ±D¢‚n¢2q¢£‚~D[£ƒa‘3¥„‚ ¬‡zg‚ =‚(‚7#F£~‚?ŽLf±…B±‚ £B~ ±…_¨ƒ&y\Š„(ˆm‚,†e±†$±ˆN£„RW±„±‚t£‰‚R‚©„`i8v a!£‘E‡9j§ˆX}_wc%±†G±†q¬†|   ;I,!±„i£‡kƒ±…D±ˆt± „V²/j ²/– ±"ƒA ±"‡v‹Y#…M &J#4EC := .Q  ?NEmˆ4   H)ƒ6 CI‚CP0"}‚I…)‚W #  )!A -82FIp# L *W-ZQa  ƒl " 8AXD R£„op¨+a2t8«‚]Q% 0_+*„r¦ I ,S +  !_  1 K6%= ; ' R&ªkc8  ©‚,A ,OPF ! w 0D]T   X ƒ1¨ )?14  ( *   < 9 GQ2 %¯ 7\ + 6 81/ r„pR&+'= Ny7  U+ N?2&*zb8¦Z …cL£^ ‚¥†%`a¢‚3?­]„1*   S…D §‚v ±ƒ¤p4 ¤. +¥. ƒ3j±‚±V 'ƒ~7‡7&Y? HZ  !r4«7 l‚AAU&^­5+- !3 $B(¥…y) 1  ,)5< ]c8 ‚JKP0/ .‚2 + 20/  S¬JF ?# .!#, %‚K &s@6/1X { ±’H±‘±„N±”^±±…B±¯±ªl …c &•/J#4EC := .Q  ?NEmˆ4   ™n)ƒ6 CI‚CP0"}‚I…)‚W # ‰/ )!A -82FIp# L *‘,W-ZQa  ƒl " 8AXD R£Šop¨ˆY+a2t8«Q% 0_+*„r¦‚0I ,S +Š:  !_  1 K6%= ; ' R&ª„Bkc8  ©Š0A ,OPF !‹5 w 0D]T   X ƒ1¨…j)?14  (‡P*   < 9 GQ2 %¯‚i7\ + 6—U81/ r„pR&+'= Ny7  U+ N?2&*zb8¦ˆ% …cL£ƒ} ‚¥`a¢†k?­7„1*   S…D §‰b ±ˆX¤‡x4 ¤„G +¥‡L ƒ3j±…L±Š+ ›ƒ~7‡7&Y? HZ  !r4«‹@ l‚AAU&^­ˆ'+- !3 $B(¥š}) 1•= ,)5< ]c8 ‚JKP0/ .‚2 + 20/  S¬†F ?# T!#, %‚K &s@6/1X {%± ‚k±‡%±‚ ±u ± ±Žk±†A±ž ±Œ] ±¦ ¢'-‚±‚Y ¢'¥1‚±Š^±$‡&±• ±$¡±ªEL¨‚^ˆ'[‚U±$l¨{?ˆMƒF „{<£‚4¥2 ‚ M¨—qˆ'[‚U±$Œu¨•?ˆMƒF š.<£ˆ ¥‰7 ‚ +±‚q±ƒ>¤†ˆo" ±†8±ˆ±)¤–9ˆo"¢ƒX ¢ˆX ±’ ±¬%±‚b±‚ ±ˆ6±ˆ pu£…Žb¢dE±Š.±ƒ ¢ƒ…`±„c¢‡N±†t£ˆi‚F¢‚~ƒ*¢ƒ.±†;±ƒN±ƒ#¥qc‚L;h±ƒ~¢M„]±ˆ¢ƒk¢ƒƒ:¨Nˆ )ƒ& y v£š%Žb¢†kE±£T±‹k¢O…`± ¢R±’ £Ÿbi‚F¢ŠIƒ*¢‹}.±•±‰V±‡<¥‰c‚L;h±ˆ3¢§8„]±“¢˜k¢Š*ƒ:¨”rˆ )ƒ& y¢lƒ" ¢†@ƒ"9±%„t£47u\±‚b£ ±/¨L ±%}£•87u±†#±‰y£”, ±> ±©d ±/ ±¨U ±†) ±ŸO,­ A7%k±„T ­… A7%k±r ±#ƒ} ±#ŒR±%z±\ ±%±–`+¨' $ o ¤‚ 6 ¨'¥ $ o ¤Š! 6 ±$”A ±$®,=X±‚ ©„t0 £ ‚^©ƒr0   4<(   M+ I@+V±<±ƒs¥=„Lˆ ± Z±—©– 0 £ŠG ‚^© 0   ‡N4<(   M+ I@+V±„±‰:¥‘B=„Lˆ £ˆ6 3¢†Y £”j 3¢ D£)O £)†UOp*†L C7  …G o%…G‚. Y¤O[J  #\8"'‚*b(…xNƒu¯-r"w iN*%G©F)e„Š7«A5 ‚K j¥?/)  &<? T" %9§y$ 0!  %$)!#E !$< % - 5'h!!  $,  )G L1  § 'I‚ ""2ƒP(r# 'M#  ¤4ƒI¨   £„{G L evv$.„Dbb9b8¬ f!$2 G¦SQw"[£=£W6±¥ƒP"t§Md) '  %5u2 M4g/t&(JP    ,!+%8 I#W`  £„-  =rC:|  8¢(ƒ9±ƒ=­:w!"2®3H XMD‚‚'0 V  3  Zm - ‚dc .45S K S 0o PoA<  ( qkB ­jJ†%¬I? (ƒ&  2‡U(O;ƒK  o ,  +Yƒ# U'‚…_<‚*-# 5e $Av! 6 B*.  q g!1-%5A!(36 J ,8²ƒp¨m  ±†_ 0±¢3±Œ!±‘(±˜s±ˆU±–7±o±†k±‡g±_± ³\±ªo †k •(C7  …G o%…G‚. Y¤…V[J  ™I\8"'‚*b(…xNƒu¯‰Kr"w iN*%G©‘#F)e„Š7«†A5 ‚K j¥ˆb?/) ŒD &<? T" %9§ƒ$ 0ŠJ  %$)!#E !$< % - 5'h!!  „4$,  )G L1  §‰$'I‚ ‹%""2ƒP(r# 'M#  ¤…ƒI¨  £ˆ]„{G ˜ evv$.„Dbb9b8¬ƒ>f!$2 G¦ˆQw"[£ƒ}=£ƒv6±ƒQ¥ŒP"t§†d) '  Ž5u2 M4g/t&(JP  †x ,!+%8 I#W`  £Š5 ‡ =rC:|  8¢„Aƒ9±Š[­„ow!"2®‰H XMD‚‚'0 V™u 3  Zm - ‚dc .45S K S 0o PoA<  ( qkB ­‹sJ†%¬ˆ;? (ƒ&  –"2‡U(O;ƒK  o , •@+Yƒ# U'‚…_<‚*-# …|e $Av! 6‘2B*.  q g!1-%5A!(36 J ,8²‹p¨ˆr  ±› ±‚¤‰)…) ±†¤š%)…)+¢†q¢… ‚c± ‰± : ¢%q¢‘?‚c±  `± …S ± ƒ6 ± ŠT1±‘±‚?± ‹U±{ ±Š ±¦+±…±…± š/±‡B²&ƒuÀ ²&‹gÀS _ª H ¤Q…'£-&;± ƒnz¥ƒ‰?±   T !!‚&= 3 * ¤‡^L H£lT‚R¤Ž`!~ ± „K±i eª ‚-H ¤‹BQ…'£ƒ &;± ’H±ˆ¥‰?±Œ) ‡{T !!‚&= 3 * ¤L H£†3T‚R¤Ÿ!~ ±‰) ±ž< ±&…z ±&l ±e ±†x1±‡¢†6…X± n±„O±†J ±4¢ž…X± ‡v±ž:±Ž< ±$A±ƒJ±Ž0 ±$©,±“p±¢T¤$ˆ † ¤$¡x†3±ƒ¢ƒ~q±ƒ!±n¢ ‡Oc ±˜¢›Iq±‡±„*¢ ¡:c ±ˆE ±‘1 ± ±…9O$¢‚Jƒ±‹,¢ Žˆ±‚ K±†(£ †C@± &¢—]ƒ±œA¢ ¥Mˆ±Šv±‡7±F£ –i@±†] ±‡P ± ±–¢‚'„0 ±­b¢—+„0 p* ±*‘+¨‹ r  ‡7± †gn ¨  r  ‡7± Žk±†5 G±‡|±†£…B9Z£ ,‚gV{±‚ ¢h0£„*²ƒRТhB§ƒ{w0‡|(a¤†"‡M±” J±±—&£‘v9Z£ ˆw‚gV±„j±…?¢ƒ$0£Š„*²’,ТˆYB§fw0‡|(a¤›&‡M±¨3`l±Œ3±‡<±†j±†2¢ „o±Š±‚±„(±‚l±`£ƒJ…6‚>±ƒ¥‚ Jn±‚£?‚.±ƒ@±†¢‹7…P±…t±‚K±…¢‰† o±¡F± b±—±’f¢‰„o±–±‰H±›s±†±†£’$…6‚>±‰t¥‡`Jn±ˆ£‡0‚.±‡u±Žp¢¥"…P±}±Š=±Œ±‚<¢+† ±%ƒ ±%Ž ´‡UP ´˜4UP ±„* ±›u ¥("x | ¥(¥;"x |c /±ƒ¢ƒ3±…p±„M±‡±†@± ™1±‚b±E¢‡}‚r±‚k /±Œ=¢‹3±6±9±•]±,± ³±ŠT±¤x¢˜#‚r±Šp+¤Œ- n£‡| ²‚Z@ ¤¥S n£G ²‡@ ±(5 ±(¥h3± ‡_±Œ R±s±’P±’2 ± ’±še±…±›^±¨±¦V±…¶>p ¶’Sp ±‰C ±¡ ±„A ±ŠMxn±Š¢‚E±‡§ Fr‚¢-„$²T`¤8b‰1±‚1¢\„1¢‚u4¤/+!²0p±ƒC±Š­#„B„ A ,#¢[¢‚sv¢/±„/ ± –2±¯ {±Ÿ¢‹c±‘=§‹ Fr‚¢‡s„$²„2`¤—S8b‰1±†i¢6„1¢‰a4¤„H+!²‡Np±‡x±¤­‹,„B„ A ±ˆ±•'¢–¢ˆ:v¢U±‹FK¥ˆS ± †¢…'¢ Mm­z†Y)ƒ) $# ¢F¢R ‚ ƒƒi#‚8n/2'ƒ".  M¥• ± O¢Œ^'¢ …fm­–~†Y)ƒ) $# ¢†¢‚o –/ƒƒi#‚8n/2'ƒ".  ± †p±„P±… ± ’±‹<±‹} ±‰- ±ž@?¢’? ¢ƒkƒB¢ˆuD±Š¥-,leƒK ¢«e ¢ŽƒB¢“~D±š5¥ˆD,leƒK!¢†~¤ ‚a„;  ¢Z†~¤ j„;   ±‚3±‡g£!V3 ±‹±–A£…hV3 ±ˆP ±‘< ±. ±.ƒ: ±’b ±ª- ±$™ ±$³ ±„(±-‡ ±‰/±-›8)¥.&0/± ‚(±†: ¥šT&0/± ‡±‘C³m{ ³£{ ±‰J ±š_+±„3.¨… Š ±g±‚Q¨š Š¢ˆ(ƒ3 ¢¡Nƒ3H ±’±ƒ±Š\/¢Aw¢„'K±ƒ%± H #±«@±‡5±•s±‡z¢„0w¢Š/K±ŠC± ‡~ :¢“w‚¤‚=:7±‚2±*§ISw3a¦H…0`ƒm±„¢B<£ƒ=  ?¢«B‚¤Š:7±…Q±ƒf§‰5Sw3a¦"…0`ƒm±‰s±„7¢„w<£‰  ±ƒ` ±ˆg³lL ³¢L p" ±"…%µƒx¨ µœ+x¨ ±) ±)†Iy 7¢ef¦†=8&ƒz‰1¢ ‚Mm¢`B¢…T$±Œ6¥w^±–B =¢ƒCf¦ž8&ƒz‰1¢ˆX‚M±„\¢„"`±‚~¢Ž@$±›¥…^±°- ± ±©0 ± ±©8 ±…3 ±‘g±$”^±†N ±$®I±‘W±'‚fY ±'—j±†  ± ²$ˆ} ±C ±š2²$ž ±‘i ±&… ±&± ”aJ©‹Z…i,  ‚@¢ƒDƒ±W±‰0±…±‚B±…*±“ox±ˆ ¢ˆ-¤;„…^ƒ±W±„7 O© Z…i,  ‚@¢œjƒ±¡l±”G±Œk±ˆ±‹'±„C±­Z±Œ± ¢`¤a„…^ƒ±‡0±‹N ±‰' ±ž:%±ƒ\± †i±„P± „m ±Œ'± Ž/±Y± ™ ±ƒb ±ˆA,© +BYLzP±#‚%  ©† +BYLzP±#‡l¢$‰d ¢$£O²”rP ²¬=P &" ±"„[ ±(V ±(¦ ±'„| ±'š£/„  £/˜-  ±ƒ±ƒ±‚ ±Šd±†±‹ ±ƒ( ±œN M" ±"… ±*‹b ±*œ ±‰o ±£ 4* ±*Z)± ‰!¢†'±3± ± “J¢m±„±¢Q D &@ƒ.-(< D &@‹ -(< ± ‡l ± p-±ŠJ±‡h±‡`±†;±‚ ±£p±‘±d±Ž-±‰f 0£^j‘8¢‚ƒj±&±„i±±†R±e±‚)£Š‚t±†2 1£›j‘8¢“ƒj±…L±±¦_±•,±‡m±†^£šŠ‚t±–X ±/ˆ ±/œ;A©ˆ+PcƒC#¬ ‚G ©¡QPcƒC#¬ ‡& ¦…%ˆ]3 ¦ž=%ˆ]3!¤ˆ#P_„± ‚[ ¤¡IP_„± ‡:!ª ‚=y-,5u ª ŠAy-,5u ¢3± ‚~ ¢¨73± ‡]¢‚S# ¢‡2#¢‚K# ¢‡*# ±0 ±¨Ve .¥…ƒPg„¢†[#±‰$±ƒ±‘q+±„#±„d~±“] 2¥žDƒPg„¢y#±“M±‡d±©<±•^±”I±‹{±ƒ±¨£ˆ*Pc £¡PPc ±( ±¨N ±K ±¨q'±9±&Ž¢ƒ+±’h ±†@±&£R¢“Q±§ ± ±¨F ±-†y ±-Ž~ ±‚N ±‡ ±-†z ±-Ž¢…% ¢ž<% ± ±¨> ±”{ ±ªƒ*N£ŠrC‚x±…±[£†<'ƒq±ƒZ¢†C¢+4¦T„c2¯Š`{j:‚Or -:]h ¦&g£„ >¤*7a¢‚¦<1‚k«/V R(0­-‚I !,3LX‚g2£HƒT¤R„g\¥By«4‚bz!OO±‚j¦0H„W±‡4±‚P±„±Š U£ C‚x±Ž&±¡p£’p'ƒq±ˆ¢‰ †C¢4¦‰„c2¯¢+{j:‚Or -:]h ¦ƒXg£‹M >¤…7a¢„K¦Š(1‚k«…K/V R(0­‚I !,3LX‚g2£‡4ƒT¤‡C„g\¥…2By«‡R‚bz!OO±‡¦‰H„W±’=±ŠB±™#±ž= # ± „I ±$ ±$©|¢ 3 ¢¨23 <±± d¢3J¥z’ZO¤*ƒ4#I±d¤6±… ² ¢±‚² Ð ±'ª ±‹9±±¨O D±š<± Œ{¢ƒpJ¥še’ZO¤Œ3ƒ4#I±‰V¤• 6±Š\±…d²‡$¢ˆ ±„"²”/Ð ±‚u ±‡T²‚R€ ²‡1€ ±‚} ±‡\¢‚J# ¢‡)#±… ±d ±ŒT±ŠP ±[ ±„9%o¦„% ? ±… ±†{¦‰y ? ±‹!C±ŠV¢„Z‚-± ˆ6±…C¢Š-x±ƒX5 ±£|¢“4‚-± ‘ ±Ÿ.¢Ÿ1x±™ ±‡LN*±ƒ ±*t±‹ƒA[£kƒ)ŽQ¦‚e„R7‰bƒF¤ƒ25Y©…* ƒE L;¢ƒ~F¢‚U‚I¢„!H±‚±‚y¢„(‚1±†T®ƒ+Š [6q0‚$¥qU>±‚j¢>!¢"‚%±Œ ¤)'‚'±‚¢…¥M[-4¤‹;‚r‚l†¢‚"¥Šo‚0†z-¢‚P±¤„<„A0‚±†Rj§‚K ƒl…„^‚J _£–~ƒ)ŽQ¦œ „R7‰bƒF¤ŒP5Y©–? ƒE L;¢Š F¢ ‚I¢ŽJH±†'±Š}¢?‚1±Ž®šP+Š [6q0‚$¥ˆ±†Y¢Š*!¢…Z‚%±šf¤‡r)'‚'±†¢ˆ#…¥„ [-4¤¥&‚r‚l†¢Š¥Ÿo‚0†z-¢–6‚P±†N¤”b„A0‚±ŽW±ƒ§•A‚K ƒl…„^‚J ¢…=„0£„a- ¢šP„0£›aa- ±$‚k ±$œV9±„j¢‰%…¢„sƒ±#‰¢‡j‹ ±™}¢¢K…¢Žƒ±#ž¢œ‹³"‡± ƒ< ³"„R‡± —`5±—±‰0¤ ‚FA)²‹€±‡g ±±%±šE¤ OA)² €±¢ ˆEx ¢ ’nx%±Œ ±„±„k±‹ ±5±ˆS±™o±Ÿ2¤†'\j‚ ¤r\j‚¢(”Z+ ¢(ª +'¢#†o±c±±“. ¢#D±¢g±¥K±§R ± ±¨E ± ‚p ±  ¤…:ƒƒ7„ ¤ž`ƒƒ7„ ±$„ ±$s±ŒR¢!; ±g¢„V; ±D ±šj ±‰r ±£ ¢'‚s;¢0ŒZ ¢'—w;¢”TŒZ¢ˆ"ƒ/ ¢¡Hƒ/¢3 ¢¨63 ¢$•j±ˆ0 ¢$¯U±˜V²#‡o ²#D £/„M £/˜q ¢‚i²b0 ¢Š4²ŠN0 ±/‚ ±/–?‚²‡2€±‚¢‘\†r²‡0ࢉ`Q¢ƒP¢„o±‚.¢ƒf[¨‚+….‚(…$„±6¢ˆ~}¢f!±+¢•:E¢V‡,²†,À£\‰K‡H±Œ:± ¢z…5£0…B*£*…%H£px ²œE€±‡ ¢«†r²N࢚uQ¢Œ¢±†T¢‹,[¨™v….‚(…$„±„h¢—X}¢„#!±…`¢¯%E¢Œ_‡,²ŽÀ£•`‰K‡H±¡m±†R¢’ …5£‡G…B*£ˆ/…%H£ƒ xCB ±‰/±„z ª„I!0$> ª!0$> ±,‚e ±,‰|'¢Žg3¥ ƒ:QYT±˜a ¢Ÿ|3¥ ŠY:QYT±²L ±Œ[²ƒÀ± ±¡n²ˆqÀ±ª ±ƒ` ±‰h £… /:±†q £U/:±’ ± ±¤!±…y±„ ±”S±ˆA/±’J¦‚ ƒ±„FT ±«p¦ŽG ƒ±2± … !±”3±˜D¢' †Q ±©F±±j¢'‘F†Q£(‘#% £(¦V%!§Œm5±ˆ §¦5±e ±%‡K ±%’T±P±„ ±„.± ±%„ ±%± …m±–t ± ‘±°_ ¨"5:o7 ¨"…j:o7=±‚t²†^ె²…5À²…6À²ƒMð ±(²Ž$à±L²Œ!À²Œ'À²Œ"ð ±V ±„4. ±.„= ±.‚$ ±/†C ±/šg ±\ ±„: ± * ± ˆHz7¤ 0ƒ"¨v F\A±‚J¢‡kD¢…~†.±ƒ8§‚_-C'¢ ‚Xg ± ˆO 8¤ „.0ƒ"¨§A F\A±†9¢WD¢”X†.±Š$§ˆ,‚_-C'¢ ˆg ±„f ±Šn7±X¢%ƒ!f²<`§Œ/Nf„BV+ ±†_¢%˜%f²ƒY`§ SNf„BV++±…)± ‹F±‚K±Œ ±Œo± 𠱇p±œ6±œ9 ±z£ ƒ. ±© £ ‡r. ±†. ±±a±"‡A ±žv±"œE„6$‚¢ƒ+†O¤x 9^§ˆmU#>‡Ov‚¥‚ X+>ƒI£‚ †z‡¥>C‚(1±V±[±ƒ¢„'ƒ+±‹¤‚[‡g‚7ƒ:±ƒ%£&|±‚±ƒG£\?¥†‚E-j£]+D¥j1(IX¢ƒ91¥m‚F,#¢Y¤‚$nN‚y¢[£-W‡<§‚ $‚ ‹Vx9ƒh©:Fu+yOuPk§):& {*e©: c†?†G‚Zƒ§‡4‚ ƒH¢8…J¦(EA-e£ „Kj¤‚2„.>„p ‚¢˜>†O¤… 9^§¢U#>‡Ov‚¥‹(X+>ƒI£“"†z‡¥rC‚(1±ƒy±Œ±‡:¢Œ+ƒ+±–¤š&‡g‚7ƒ:±Šp£…|±„B±Œ3£…R\?¥”`‚E-j£ˆI+D¥†>1(IX¢‰A1¥ˆm‚F,#¢…3Y¤‰BnN‚y¢„£‰W‡<§›u$‚ ‹Vx9ƒh©‹CFu+yOuPk§‰:& {*e©•> c†?†G‚Zƒ§œ54‚ ƒH¢^…J±…q¦ˆ?EA-e£‰„Kj¤–V„.>„p ±* ±* 54¤VzC±‚J±Š/± ƒC±. ¤…]zC±‹6±™ ± .±‰ ± ±¨< ±/‡ ±/›+ ±Œ? ±›c.±†± †¤‚3z¢‚$¥`M‚4¤`‚Pƒ± ‰2±†C 0±ŽY± b¤‰~z¢…t$¥‡LM‚4¤‡Q‚Pƒ± ™X±Z ±%†o ±%‘x£%  £%Œ‚ }¢‡,‡V¦\/Y;  %| "p:hƒ v""ƒ-B&:‚rƒ N¤‚"U£†|±„s£ƒ.±#¤ ‚dk(±6±„M±‚¦%ƒ1C±“R ±²O ¢œ?‡V¦…c/Y;  %™.| "p:hƒ v""ƒ-B&:‚rƒ N¤ˆ.U£Žg|±‘'£‡p.±„B¤ †Cdk(±©!±V±‡J¦‡<ƒ1C±§v3±ŒQ± ‘£‰p±‡f¢†-: ±f± ¨M£—`p±¢D: ±&†' ±&Ž ±'3 ±'–7 .±ˆF² À ±…5±— ² ªÀ ±$‘J ±$«5 ±$‰A ±$£,¢‚ …[ ¢e…[&P£9ƒ d±”c±†Z±ˆ±…C±‡ ±„ ¢b‡D£„j‚-‚8±ƒ'¢+s±‡±†d±ˆM±‰}¢o„p± Q£–Lƒ d±® ±—o±”<±l±’ ±ˆ¢¥-‡D£“D‚-‚8±Š¢ˆs±’±ŽV±Q±Ÿ0¢‘„p±•1 B«„_ H‚BXxXh‚`7±…Jª…:"‚`   £„L…£ˆ'±„x¢;!£†q B«ž H‚BXxXh‚`7±‹Vª0:"‚`   £U…£–ˆ'±š+¢‰@!£› ¢ƒ+ ¢‡}+%¢†x‚#±†y¢ƒ-C ¢“,‚#±’¢‰C ±&…v ±&h¢'“; ¢'¨; §(“U-7  " §(©-7  " ±/ ±/¤(¢+ƒ!C ¢+ˆzC ±…$ ±‘X±‰#±(„d ±š8±(Œi ±%‡{ ±%“±‡1±‚* ±œD±™u¢+‚iC ¢+ˆBC£-„g‚E £-Œl‚E ±ƒ1²(8 ±‹|²(•\¢+ƒC ¢+ˆnC¢$Cx ¢$š.x ± o ± Œ±‚M±ˆ% ±‹k±Ÿp¢( 7 ¢(¤@7¢/’H ¢/¦l¢+ƒ C ¢+ˆdC ±/ˆ ±/œ<¢ƒ!+ ¢ˆ+3·…@Qu£!‹x¦‚ b ·‹LQu£! |¦—<b/´…L´!‹}Ê¥‚ d ´‹X´!¡Ê¥—=d ¥(‚ d ¥(—>d¢+ƒC ¢+ˆ\CM#¢4‚v±‚ ±Œ7¢"o¢iƒe±‹`± “±Šp %¢©Z‚v±‹+±L¢‚Eo¢‰Uƒe±š:± ¬|±•y±'±‡! ±'¤±&¢+ƒC ¢+ˆ[C=±ƒA±…±± 9±#±ƒw±…f ±ˆH±Ž=±…;± …n±†j±”±š ±'”8 ±'©< ±ƒ ±ŠW ±/‡ ±/›, ±/‡ ±/›.+¢–6=¢ˆ …;±ˆx±‘Q ¢®=¢¡w…;±”±§ ±-‡1 ±-6 ±'”i ±'©m ±&„8 ±&Œ*²/„+€ ²/˜O€ ±†9 ± ±‡¦„0$. ±¦›{$. ±/†x ±/›/±ƒr±…q±„;±„w¢ “} ±™±Ÿ±‹'±‹h¢ ¨Q}-±‚4±…±‚{± †±…; ±›Z±‹±/± S±šn#¥• .F;¤B_ ¥®/.F;¤„_ ±„~ ±I²† ²’8 x# ±#‰M" M£ ƒ&±†F¤‘'@¢o‚9±e¢ƒ]‚&±ƒT¢„(¨‰d3…m- ‚ ±„K§5 3? m¢ˆ{‰g P£ ‡B&±‘]¤¨r@¢‰:‚9±…¢’7‚&±ˆ ¢Œg(¨žh3…m- ‚ ±‹b§ˆ: 3? ±ƒ ¢‰g £‚3Y‚Q±ƒ$ £ˆ?Y‚Q±M "±…!±…%±ƒ&±¢‚fMC¤ŽeB ¢ ‰)¢ j‚X±J¥‚# ¤£xB ¢˜W‰)¢ ‡>‚X±‡R¥†X ±! ±!„@  ±Ž¦7‚v( ±œy¦†?‚v( ¤…a +±'Žp ¤št +±'¤#±…± ƒT ±Œd± Šr  ±™9j 2¢Oޤˆ9‚Z‚±ƒL£†Jƒ][£–">±…?¢Š„u±(±‰ 3¢™uޤ’0ˆ9‚Z‚±‰X£‘aƒ][£­m>±Ÿ*¢Ÿ!„u±ƒE±; = ±ƒo ±(ŠP ±(  ª†lB. ª7B. ±-‡q ±-v‡n*ƒk¬ƒ=ƒ…WT ‚Nv@-±‚ ƒ| AX%Wb e4…108D%*9F ¥…Mb­…† ;]M$?N /¢j‚±\¦‚_ƒQ-&$B¤lJJ§`ƒ2 ƒ01¢„?ƒ,®pƒ.kk>x7+p£S<«"y2% „' ¢j 2ud&‡%‚(i K+¢s«^.) <¢‚£si±kq¤%x&^©pƒA,yzOw=¥~HƒC ¦‚Iog*&§S+ M¥ ƒ\¥du\¤j‚iS‚0±‚l«;$3„(9(:3" ‚)‰lƒ<(C: Es0GP _¤$1…¬ˆQEZ‚`@„\ ƒ7c+`1'.K„Jz¬‚#‚p$‚kQ7?<ª#ƒ$%9 &q±ªy>‚6e+^‚‡1 ƒ|¬˜Pƒ…WT ‚Nv@-±‡ " AX%Wb e4…108D%*9F ¥Ž1Mb­–† ;]M$?N /¢‡v‚±Š'¦ƒQ-&$B¤ƒJJ§Œ ƒ2 ƒ01¢ŒCƒ,®Œƒ.kk>x7+p£…rS±0«‡hy2% „' ¢ƒH ˜R2ud&‡%‚(i K+¢ƒLs«ˆc^.) <¢† £„-si±„'±‰]¤…]x&^©JƒA,yzOw=¥ˆjHƒC ¦‡hIog*&§†[+ M¥ˆƒ\¥„}u\¤ˆ‚iS‚0±‡!«‰$3„(9(:3" œ‰lƒ<(C: Es0GP _¤‰1…¬UEZ‚`@„\ •Qƒ7c+`1'.K„Jz¬’D#‚p$‚kQ7?<ª‡:ƒ$%9 &±ˆv±ƒ1ª–>‚6e+^‚‡1 ±R ±¨x ±/Š ±/ž/ £…@q‡8±$‡ £šSq‡8±$’N!¯'ƒ LR/…s6«u‚gƒe…a |"/@¤u7I ±…±ƒ.±{¤‚R.„qPl§~…]t*ƒ`S¤xk O³u§¤k _£$A„E¢RLªO@Q‚(: i±±‡n§0pv%‚^3£‚xR‚¦ Oc„b ª~‚J‚D-5V3ˆQ  .y„ y‚0IC‚]O,£Qeƒ  2ƒb#3+#‚be_‚r0!N ¦L]_5L¦w[>w4I¥[%„0N¤#HT' W‚(‚U^s) %H SD.Y\ ±²T ƒQ©œ.„2ƒ1T£…XE‚4¯™3rA‚^…ƒz%‚KQ%P=c¤‹!ƒ'Yj¥”*‚<†S‚Y£‡ƒ¢Žb‚£’)‚P¢‚C¨‹EkS‚)E ¥…9‚¥‰M‚‚d¨ŽMI#]yI¤†L h£ˆ >…s±ƒ«˜@‚gƒe…a |"/@¤„'7I ±Œe±‡±„7¤‹>.„qP±…$§X…]t*ƒ`S¤ˆdk O³†I§¤†s _£ˆA„E¢„kLª‡m@Q‚(: i±ƒW±…J±C§ªpv%‚^3£ŽR‚¦ˆOc„b ª—‚J‚D-5V3ˆQ –=.y„ y‚0IC‚]O,£†eƒ  Xƒb#3+#‚be_‚r0!N ¦†%]_5L¦ˆ[>w4I¥ˆ`%„0N¤‚@HT' •{‚(‚U^s) %H SD.Y\ ±+ ±¨Q §(“Y-7  " §(© -7  " ± †i ± Žm u" ±"…* ±†¢#‚mC ±’<¢#ˆFC¢ƒ#+ ¢ˆ+ ±† ±’=¥‡T ¥KT ±† ²Š  ±’?²”.  ±† ±’@ ±† ±w+± ±+†P±¤)%±‹s±ƒJ±‚±†q ±˜'±‡p±—9±Žvm 3w¢‘t±X±ˆ/£vYx±±u±…P±ƒR§Œ. G±” 5±– ¢«±žm±z£‰zYx±‰J±…±Ž<±Š>§œT G±¨% ±%…4 ±%=£‡IF £˜IF £‡IF±‡, £˜IF±w ±%„ ±% ±Œ ±˜E ¥&ƒGhG| ¥&‹GhG|±%ˆ3±‹Y ±%“<± ] ±%„ ±%±y±‚_ ±¦ ±Š*>£+g¯‚>q]ƒ/b:$:B‚N4/Po £+†@¯–8>q]ƒ/b:$:B‚N4/Po ±$…R ±$Ÿ=¤…E.A ¤Žc.A% ±%– ±%‹ ±‹P ±š* ±$†~ ±$ i ±ˆg± ‚)±ˆ( ±z± ‡±, ¢‚IG±‚} ¢“^G±Ž ±& ±ž; ±& ±¨L H±†N±‚V¦ƒ  ±ƒ ¢‡@¤†^Ц†  ²…-À£ƒ!£‚!¨…ˆ0  7 H±›a±‹!¦A  ±‡2¢D¤ž)Цe  ²ŽÀ£ˆU!£ˆ)¨žyˆ0  7 ±$… ±$Ÿ#±ŒD.&±ˆ%±Œ5 ±¥j±&…u±˜K± Y ±(ƒO ±(™ ±‚t ±‡S²$À ²$ªÀ¢Œ@m ¢¥fm¢…% ¢ž7%¢+‚nC ¢+ˆGC²~ ²©$ ¢/‹~„ ¢/ "„ ±'”7 ±'©; ±ƒ ±Š]V(¨Œ:ˆ)-¢†/‡¤Z¤ec‚U2¢‡ )¨¤ˆ)-¢• ‡¤„.Z¤‰c‚U2¢Z ±/„u ±/™ ±„$ ±•9 L±†M±‚U§ƒ  # ±ƒ £>‡¥†)4Ч†  " ²…'À£‚£‚¨… ˆ0   M±›`±‹ §@  # ±‡1£ˆB‡¥t4Чd  " ²ŽÀ£ˆS£ˆ'¨žxˆ0   ±„+ ±•@%x+±…²Q°±‹# ±+†Q± ²ƒn°±ŸG£ˆCPg £¡iPg ±-„ ±-Œ ±Œ ±˜F`-¯'‚q   . J3(ˆr  .¯'—u   ”R J3(ˆr ¢…% ¢ž;%²\Ð ²¡qÐ ±# ±¨I±l±‹)±„j ±œ>± ±‡T ± ±Ž ! ±H ±Ÿ± …±‡PM$¢‡Z1±m­„"‚(r ‚N†\ƒ/£ƒ~To $¢œm1±„K­›m‚(r ‚N†\ƒ/£iTo ±ˆH ±  ±ˆr ± =u 7±… ±‹%±ƒ±‚2²†iP±…>¤‚2¨‚ [‚F<±±…: 9±‹± ±¢p±†E±†!²•CP±‹¤…*‚2¨‰)[‚F<±¤±šm 2 ±‡x ±$+ ±$ªK#±…E¤‰P ¨ˆ/g&¨ƒ ‚9ˆY #±‹M¤£; ¨3g&¨“9 ‚9ˆY &* ±*L±nz ±ŠZ±ˆ±‚6±‚ ±‹"±^ ²!‚E°± „ ²!†°± Œ ±„2 ±•G†h*ƒ¤/ „4±ƒz­M? Œ‚ƒV + ;2+wiE9L0¤y‚1@‹8¤X&ƒ2¨:6=)$® G +‚ Q0† ¤}=_ƒ§!e"­ ZO,~(_­ F F=‚@#} BJ¦ @aA±… C!ZwJ„ƒ-5Rc; TgN±¢wƒt¢‚D+¢'~Y¦  v"¢)‚"§fxy74…8¦‚#Ca±n±N¥9nL‚YR¢ ƒ>§&1@b=¢ƒ|§‚ƒ$J‚H‡)…f¥%‚+~‚n±†©…K;‚>‚§…5‚ „6b‚27¦kK5 W¥H‰p‚±…E¥TC25¤3 >„=®qW} [a6‚. @ƒg†4 ±‘ ±˜o±–4±‰D± ‘] ƒ3¤–B „4±‰­šs? Œ‚ƒV ‰I ;2+wiE9L0¤’‚1@‹8¤†d&ƒ2¨ˆZ:6=)$®Œ@G +‚ Q0† ¤‹&=_ƒ§„E!e"­ˆ ZO,~(_­‹"F F=‚@#} BJ¦„j@a±5±E ˜!ZwJ„ƒ-5Rc; TgN±„G¢ˆBƒt¢†3+¢ƒF~±ƒ¦ˆv v"¢„a‚"§@xy74…8¦‰#Ca±‡B±‡V¥‡*nL‚YR¢„9ƒ>§‡D1@b=¢‡P|§›nƒ$J‚H‡)…f¥‹.‚+~‚n±Ž©šO;‚>‚§šh‚ „6b‚27¦‡2K5 W¥n‰p‚±‹¥ˆkC25¤ˆ8 >„=®•W} [a6‚. @ƒg†4±„9±"”F ±•N±"©J%±$“§‰{/ @‚ ‚L ±$­§š!/ @‚ ‚L²° ²™A°±ª0 ±„@ ±•U£ƒN £ˆ N ±‚z ±ˆN¤ ‡jG9 ¤ ’G9 ±„G ±•\‚L§?& +®„fJ Q) 83±ƒ±…±‡x¬&t ' " 3§X«…M‡u‚(P ‚:¤„`‹b%§‚$p‚8 ®-#AY +! US¥sT [a &§…F& +®Š$„fJ Q) 83±”1±‹ ±”,¬„Lt ' " 3§ˆ\«šQ‡u‚(P ‚:¤š‹b%§‰;p‚8 ®ˆ2#AY +! US¥•T [a ±‚l ±‰]B®= ‚y5{$ dP[ƒ43¢ ‚:# ±²V ®™5= ‚y5{$ dP[ƒ43¢ ‡#‡|'ƒQ« ^^ XX…s8Š-¥ < U«uƒ,-4ˆ0 ˆ1I¤ =‚©h…-‚Cs„w4®d  & ­?6C>*WN6«Ayx)c-…!_5¥ V¤x)© 4K]"¨\ .ƒ0  !90ƒ .-#4J'9‚]§ "1‚1¤GŒ ‡£‚=D¥O…tJ±‚?S¦ƒ‚ T¢‚'A©F„ ‡)£‚Z ±ƒ£‚(]£" $¨"‚y‚p ¥ /W1¥hMX„0 (UsOyADW„pQ tkƒPNT 7 ,   q +A'm‚q¥‡%¨,…N‚0…g" .… Nm^RJ ?69 - !H Z  3&$§ 1‚(¦jc‚~ 4±ª-±Š±’D±‘$±„S±”[±ˆT±–<±‰C±‡±–±o± T ƒn«•^^ XX…s8Š-¥…< U«šƒ,-4ˆ0 ˆ1I¤‰+=‚©’)h…-‚Cs„w4®‡p  & ­ˆ^?6C>*WN6«uyx)c-…!_5¥‚5 V¤Š7x)©„34K]"¨‰` .ƒ0  ‹*!90ƒ .-#4J'9‚]§„i "1‚1¤˜Œ ‡£…oD¥ˆ…tJ±†.±ƒr¦Œ ‚ T¢†_A© „ ‡)£‰F ±ˆ\£ˆ0]£ˆ" ±„=¨‡@‚y‚p ¥ƒH /W±„f¥‰=MX„0 šUsOyADW„pQ tkƒPNT 7 , ‹ q +A'm‚q¥ˆ‡%¨•0…N‚0…g" •a… Nm^RJ ?69 …X- !H Z  3&$§21‚(¦ˆjc‚~ ±„` ±ž1±ƒ8± Šz±Y±”¢‚‡= ±ˆ?± –±…±© ¢’5‡=K±†m¤…, #±‚[£-ƒu ±ƒ¢#Š,±£‘,¢‚c‰M¢+¦ƒ"oYm± ƒg¢]‚f¢‰l3 M±œ¤‹8 #±‹&£Œaƒu ±‡6¢‹:Š,±„]£¨K,¢‘=‰M¢ˆ+¦‰*oYm± ™¢‡$‚f¢š3±>±#‘~ ±¡S±#§1£ˆ!P_ £¡GP_‚X¤„*ƒ1 ±†S²!À£[†QA£…w¤Q&  8= Y# ¤‚Q ¢¢r¢!c¥„wBSU †d…n   £B¶Ì„@¹hhˆB£p`¢„!„I 2¤™1*ƒ1 ±—h²†-À£Ž†QA£‡X…w¤‚qQ& —_ 8= Y# ±ƒF¤‡b‚Q ¢„ ¢ƒ:r¢‚]c¥‰„wBSU±„O •>…n   £†~B¶…hÌ„@¹†hhˆB±„/£‡4p`¢ž „IC¢‚0„/¢„8b¢„WY± Š}±„ £„Y‚-„D±…~±‚A#c±…W¤…j„G^±±„ I¢›V„/¢Vb¢‘ Y± ¢H±‹k£“3‚-„D±Œj±ˆ±‡A±„ ±e±ˆI¤–„G^±‰ ±˜% ±/q ±/–K# „e; ‚;EqExU‚3&(„wi9 # ž ; ‚;EqExU‚3&(„wi9 ¦ƒDt ¦ˆ Dt ¦ƒDt ¦ˆ Dt²ˆ9@ ²—@9 $˜E,,  $²0,,„V‚'°Ž- „f; ‚;EqExU‚3&(„wi9 $ŽL   ¦ˆnM<¨‚r,K 2‚x'1M²e ´…2´…3 ‰E  wPg †)!Mg&‚d+ ªF R‡2 ‚^ ‚‚P‚g(~¦9 …²4 ‚(°£@ ž ; ‚;EqExU‚3&(„wi9 $Ÿa   ¦”M<¨†vr,K 2Š>'1M²…T ´Œ´Œ$ £0  wPg –†)!Mg&‚d+ ª•y R‡2 “ ‚‚P‚g(~¦‰> …²•X ±„N ±•c  ± „;  ± „<-¦ ˆrM<¨ŒE+  ¦ ” M<¨¡I+  ¢„^‚-£‚+!< ¢“8‚-£†`!<C²!‚ 0±Œ¦V_# ¦…Q## ±o ²!…H0±¦¦¥Z_# ¦V## ±„ ±„U ±•j)¦Œ^m '**±…l±„ ¦¤)m '**±”F±‹* ¦‰Hn"{‚ ¦š]n"{‚ ¦‰Kn"z‚ ¦š`n"z‚ ±„\ ±•q ±‰ ± M@¨‹†YO&4_¢)E~¤XŒ$‚? ¨ *†YO&4±š¢)‡\~¤•|Œ$‚?+¢‚„~¦†UO'±Œ ¢“„~¦ O'±˜4?¦Žb-ª ƒ&?DE¤˜\1 ¦Ÿw-ª ŠT&?DE¤²G1+£Ž[3B¥ ƒ;T[R¢˜UM £Ÿp3B¥ ŠM;T[R¢²@MA¦Ži,;ª ƒ4MPQ¸˜c~çwà ¦Ÿ~,;ª Š[4MPQ¸²N~çwàS'©ŽZ-¯ ƒ(=F C³˜Tç±”G '©Ÿo-¯ ŠL(=F C³²?籩K;¦Ža-ª ƒ (=DE¢˜[ ¦Ÿv-ª ŠS(=DE¢²FC¤ /† Œ¢ *±‚\±†A±‘e±ŽZ ¤–/† Œ¢ž *±Š'±›E±§±Ÿ ±$™E¢‚‰_ ±$³0¢—J‰_·$˜www~ ·$²bww~²$™!à ²$³ à ±/‡ ±/›0 ±)‚ ±)‡Q±#‚±’E ±#ŠU±¬0 ±„/ ±Š7 z" ±"…/¥/„h ¥/™  ±(‹X ±(¡ ² ,  ² ˆ0  ±(’o ±(¨"±)…±”# / ±)Šc±¨G F¦Š<…20ƒX¤C¥!$%ƒ ¢ƒ¤$$¢"aªƒ)‰6 |¤+  Q±‡[¦—`Š<…20ƒX¤ƒGC¥‡c!$%ƒ ¢„ƒ¤ƒ;$$¢‚^aª’‰6 |¤„0+ ±‡5 ± ˆ1 ± “H¢)Z ¢)†FZ ±$™. ±$³ ±‚y ±‡X2 R£‡. ±„N£ #¤‚l‚ ` ª85u7H ‚/+±‚w±…2±‚&¢ g±>¯ „)49'‚2N# !‡ ±!†~ U£ D. ±‘£ƒE #¤u‚ ` ª•<5u7H ‚/+±˜*±Šy±’L¢…yg±ƒ[¯•-„)49'‚2N# !‡ £… /:±ˆI £V/:±—# ±%„E ±%N ±ˆ> ±— ±Š& ±£LO%¢‡+‡±„k±† ±†±ˆ£„(6¢‡@H± Š %¢ Q‡±Ž ±—±Ž^±“,£Œk(6¢¡+H± ž&v 5±†]£ <±:²ƒ0¦p†>=‚$ ±†3¤„ 0‚±‹n±„3±‰A ±k 6±{£ |<±„l²‡P0¦J†>=‚$ ±¤Š{0‚±¥Y±‰z±e E$ ±$š0 ± ‡T ± ‘}v6±‹6§‚P‡H‚„ƒdU£†‡§ ‚xB(¥bc82±…l±ƒ^  7± I§š‡H‚„ƒdU£”q‡§„  ‚xB(¥‰c82±ŽA±‰%!¢‚T±]¢ƒZ ¢†±†¢ŠK²/< ²/•` ±-†w ±-Ž|;±‚|±ƒu±ƒ ±œ"±‹@±‹±ˆ±•±•F±ˆ\±8 ±'\ ±'¥` ±‰ ± O ±)„E ±)Š ¤(‡Bf` ¤(œuf`¢Nm ¢…gm ±&† ±&Ž ±‘b ±« ±%†x ±%’¢'Œ-L ¢'¡1L ±V ±¨| ±) ±¦O ±ƒq ±ˆxW!±… ±!„±oi 1±‡(£„*² Z`£‚$J„m±–y±‚{±„/¢*§ŽY]< ~ 3±œ;£Š+*² ˆ `£™oJ„m±°d±Ž±™b¢†§¢2Y]< ~±Œ>±‚p ±¡Q±‡(Wf¢8‚hP±‡¢.N±ˆ(w¢‡u±…*¢$¢P`±ˆ(¢"'±ƒ¤nY9„±ƒ/±ƒ,±„I±…%±ˆ¥7†#†I¤„Q‹@a l¢¥K‚h±…W±:¢…TN±“?±…V¢žfu±Œu¢„C¢ƒ `±‘¢ˆ'±‰y¤ˆ Y9„±‡d±±R±±¥–j†#†I¤˜u‹@a2±‡=¢FŠ ±‚7¢ ƒ'±‡u ±œP¢™lŠ ±š¢ ‰/±’~=±‹±(±ƒ±‡O± ”J±”e±†] ± -±˜s±Ši±–)± ®5±©i±œ ±)‚q ±)ˆ8+±‚ ± ‚¢‰o¢ ‹jƒ ±‰O± †;¢—bo¢  nƒ ±*‹B ±*›h¤„! ¤Œl ±&…x ±&j£  £e ±ˆ? ±—4¥  :.&±#¢±‚H  ¥ ‚* :.&±‹L¢ˆv±ˆ¥‡| ¥˜'| ±#†} ±#R ±$x ±$›cW &¢‘e‚Xi±‚z±†A±† ±†bd±‡O£‡' ,¢« ‚X±†u±.±ŽE±k±R±‰N±…±œS£—?'_-¢<£„O‚Q£‚ ‚Oª‚&$AC ‚D±ƒD¤‚`‚LA -¢ƒO<£“)‚Q£‰ ‚Oªˆy&$AC ‚D±‡]¤‰#`‚LA ±$– ±$°±Š`±"† ±Ÿs±"Žc#¦ƒE).0£ƒ5) ¦”Z).0£ŽL) ±$ ±ž9Q& &"„Q  / & &"ŒC  / ±‰; ±¡)¦… ƒ P[ƒC3¢ ‚@# ¦ž2ƒ P[ƒC3¢ ‡#[ *±„m±‡±†h±ƒj± ƒe±ƒ±‰\±y±„Lk±ƒ) ,±Šy±‘H±‘±›5± ‰m±Š&±”e±¢}±™±ˆ±—Muu±”&±ƒK²‰p0£„q £‚ ±ƒ £Žy e¤_g%±ƒ3£cZ±‚±…{±J¢DW¦‡^†S.ƒ;‚t¢‚%r¤c1d©ƒ?u ‚FK}ˆZ± {±©9±ˆR²›0£Š} £Ž> ±‡3£˜iŽy ±„¤ˆ*g%±‡"£„Z±„<±Žg±…c¢ŠW¦¡I†S.ƒ;‚t¢.r¤–g1d©–Dƒ?u ‚FK}ˆ±ˆ_±•? ±„a ±‰hL ±)„o k b~U&]‚G^F ±* P !±)Š6 .k b~U&]‚G^F ±ŠR ±—±%– ±* ±*‘( £i ±I £‡= ±‡Q ±„! ±‹l ±&…6 ±&(!±Œ<£‚vf'± …- ±¥b£‡+f'± 2 ± ‚o ± Šs 3 ±‡y ±_ ±©…" ‚F©I0ˆ [ƒF„8^Z¤S0<¢}’m¤‚>‚iT5j£ND‚^©5CA*R‚#&ƒ#±N¥-aQ„h¦O. $¬]-A< a_¤:ƒc(B`£C£†#±D [e‡R‚Zj08 ! Q?-#§*U ¥,(‚G±z¤1P±.±ˆ>ª  ¯‚<VU4>   ' : 0? a!±ƒ`ª%Zw!$&.¢”kD¤ŽEƒ;~ª‚‚<>>†Q+ ‚U©–\0ˆ [ƒF„8^Z¤…Z0<¢›#’m¤‹\‚iT5±‘£†ZD‚^©ŒiCA*R‚#&ƒ#±ƒq¥‹VaQ„h¦„u. $¬ˆa-A< a_¤ŒQƒc(B±…?£7£V#±„" ™&e‡R‚Zj08 ! Q?-#§„4*U ¥‡w(‚G±…i¤ƒPP±ƒj±‘*ª…E ¯‘VU4>  ‡ ' : 0? a!±‡yª‡CZw!$&.¢®VD¤£Iƒ;~ª’A‚<>>†Q+ ¦„M0 ¦0%±ŒM±ƒ±‡ ±ƒ4 ±›'±‡L±Ž}±ˆ{ ' ±‰E³% J ³%ŒJ ±/Œs ±/¡ ±$™ ±$²o ±!‚B ±!…r 6¤s‰s†:ƒB±±Š±„±—3¢ˆL±„#²•p²‡J°±‡K¢‡Š 7¤–‰s†:ƒB±‡±–S±ˆ+±®~¢mL±Š+²¯p²<°±œO¢œCвƒ7 ²‰C $ O¤‹|.±Œ(±‰±‡¢ ‚‚I± m¢‡ $¯|fˆlƒ1 ƒ]±‰H¢‚&o©07|‚$ P¤¡.±=±“1±ŽM¢ ‡d‚I± Œv¢$¯–fˆlƒ1 ƒ]±™n¢‡o©‰57|‚$U(¨ ‡4‚Q …pWZ±p±‚0±(±„±…(±> (¨˜V‡4‚Q …pWZ±…_±…O±ƒd±ˆ?±”±…W ±†z ±ŽE ±‹: ±¤`Sa¤dm9o±ˆu¢‚±l±„m¦‚aw%‚^d±†+¢†7#m±ƒK£A<‚0¢ƒ=‘1¢…(‚d¤9„‚E‹¢’ ` m¤–#dm9±ƒ±“-±ˆ@¢† ±„(±Y¦‘;w%‚^d±¢(#±…±Ši£„v<‚0¢(‘1¢1‚±ˆV¤–=„‚E‹¢•R’ ±•£ ‚/$Nª | 7 2£$P±‡w  *6M®R^‚@Y„P  2'. & 7 [s7 $±‚/¢j‚B ( )(5  !  ,£„+J£”w;‚±‡#¤ƒ<±„] ±‰G±†j ƒ •N S‚{BM _  %…qA¦…;`EQ8¯™b „C2„n,‰3‚9¯‰R#Xe'M¦‘D ˆD ƒjƒ¨†>=6*r§‰‚, ‚e¦Œbmp‚:§‚K  z%§‹k?‚gƒ+¤„@jXD«ˆfƒSRG L  ‹;%\*ƒ^9,?'[Lp©„m%)Y%FQ²;ð¥Š24Wª˜6‰7ƒ>/$Nªƒ=| 7 2£„P±c …C*6M®,^‚@Y„P  ˆ'. & 7 [s7 $±ˆ¢‡r‚B ‡( )(5  !  ,£‹IJ£®b;‚±¤ˆN<±‹t ±Š7 ±¢¢3 ¢¨53 §ƒ  V §˜(  V ±/†z ±/› ±+‚X ±+ˆ1 ±„ ±‰%¢ƒN ¢ˆ N ±‡' ±žr ±* ±* BU (±‡_±}± †±„O±„±†I±±l±'±‡ (±}±“± N±$± ±Ž;±¢"±¥±ƒD±›9²(JÐ ²(¢}Ð ± ˆ_ ± “ ± ±©)¢ …ƒ^ ¢ ,ƒ^h m±ƒc¢„\ª†  %/  3±±'£‚)±)±‡W¢…†G &  %3<ƒU4  #0….‚X :!K±„l±M ±(ªn p±¢Šhª’T %/  3±ƒ7±…E±…£†Q)±›±I¢š#†G &•? %3<ƒU4  #0….‚X :!K±Š3±‘s%± W±‹E±‚H±†P ± ƒz±š±†a±št²‡+P ²˜@P£%ƒg!†c £%Žp!†c ±‰ ±š5±†n3T¢0‘D±6±‚±-¢s†Z£Rƒ);±¨…‚2?‚C/±4£VH¦|‚¤yOSo± ¢ •) Z¢–C‘D±†=±›,±ŠK¢’†Z£†^ƒ);±‰[¨5…‚2?‚C/±‹]£„|H¦ˆ|‚¤Œ%yOS±…N± ‡o¢ ¯ ±-‚ ±-Š ±'Œ~ ±'¢²†h ²3 ±ƒx ±Œd I¢ƒO¢†u2£7 4ŠU‰@B¢-¤…;+†oT§V!+‚n;{¢„a=±— N¢‰[¢Žy±&£‚z7 —ŠU‰@B¢„6-¤”+†oT§‡V!+‚n;{¢‹R=±°z5±‹^³ƒ9¤qUDJ±’j±’ ±š8³‡n¤ŠFUDJ±§n±§K [" ±"…*´QÌÀ¥ ‚p±‚L ´œ+ÌÀ¥…m ‚p±ˆTQ&±D¢‚:¤„JŒU…7³ƒlV±‹¥„d M‚ &±‡P¢†4:¤ž5ŒU…7³ŽuV± ¥•  M‚ ±‡[ ±&-± 8±‹<± ‡1±†±ˆ. ± ƒ[±š± ’:±–-±œRdo¢…O‰n£ŽFƒ]‚(£…IC,±…2±ƒW±@¤lm‚±†?±„0±X£† „s‚B±l±‚5±ƒK±„z± §ƒNƒ29‚A…_ƒ±ƒ£„d‰pB¢‚H; p¢šb‰n£§lƒ]‚(£ŽgC,±–G±‰c±‹i¤…m‚±ŽC±G±‰£W„s‚B±…±†$±Š7±ŠN±…U§9ƒ29‚A…_ƒ±˜ £š‰pB¢ŠM;¤†|T ¤GT ±&‡ ±& ±$Šl ±$¤W ±'l ±'¢p¢‡b ¢œu 7±%‡0­‚aD …''‚7x„: 7 ±%’9­˜D …''‚7x„: 7ƒ 6¢‚6£C‚w1¤‡S‡ZˆH¢ƒI„/±…u±ƒ¤ u‚„5¢ 3±‚#±'£bm£CZ„¢$*£‚„|±‡N±ƒz±“ ¬3, Uƒ4F‚ ¤4Hƒ;©fls3iyp¢ƒ9c²‚NÐ¥K {‡ …-±I£-s!±‚ ¦„q†f„,J ± ”X±ˆR B¢—I£…J‚w1¤ ;S‡ZˆH¢Œg„/±Œ±3¤Š4u‚„5¢„13±…±˜r£„m£‰Z„¢ƒC±‚f£‹ „|±–(±ˆ±¬t¬‹<, Uƒ4F‚ ¤ˆ&Hƒ;©•jls3iyp¢˜lc²ˆÐ¥q {‡ …-±‡"£‡Ds!±„&¦•:„q†f„,Ja ,±„h¢Š,ŠK±ƒ²u`¤6ƒ>‡C0L±“±’l±ˆw±‡] 0±™{¢£RŠK±šg²‰a`¤ƒ>‡C0±„ ±­±§p±ž*±b §ƒ4D#&!- §šD#&!-ƒWd¢ƒG„e£‚@£„ƒ>‡¥`??…&¦†‚~"„V±ƒ/£*‚<¢%¥ƒ4 _‚¦4w~gK£5„H„5¤|-£(‚JƒH¨†Z5‹O9D ‚5¢b…|±‚kf±ƒ£ƒ1G¢V±1­)5"/:SC‚ F !¬TA$‚`ƒt ‚'‡z£…*‹<ª‚R†z‚ 10 .‚¦ƒU/‚‡‚D§"z]ƒIKD6±‚p l¢˜Z„e£‡@£9ƒ>‡¥Š~??…&¦—*‚~"„V±‹z£^‚<¢‚H¥94 _‚¦‰8w~gK£ŒL„H„5¤…[-£‡n‚JƒH¨ž%5‹O9D ‚5¢ˆ-…|±†Z±„±‰r£‰G¢ˆG±…f­ˆ~5"/:SC‚ F !¬›?A$‚`ƒt ‚'‡z£›*‹<ª˜†z‚ 10 .‚¦“{/‚‡‚D§ˆ'z]ƒIKD6±— ±G ±šmA¢‹mˆ£ƒE$P±ˆYh±£f ¢¡ˆ£œk$P±• ±‹q±– £ˆ5f ±ŠQ ±™+U (±1±ˆ*±ƒH±†(±±‹ ±†A±„h±ˆ±‹ (±©W±‘H±|±‘?±ˆI±¢W±Ž ±™l±6±Ÿ/±Œ7±!– ±¥]±!¯ym2±”0e¯ `=„n‚> %d†"&‚2±‡±…c¢mƒ8£#„ 6±©C±ƒ¯ ˜+=„n‚> %d†"&‚2±p±”=¢ˆ ƒ8£›„ u# ±#‰J±)!±ˆ ±)†h±œ@²#ˆ ²#a ±Œ ±šw ±†) ± ±-†? ±-ŽDL#¬T=Uˆ z „.>C¥ƒŠb±„4±ˆx $¬•g=Uˆ z „.>C¥šiŠb±‹±£…) £Ž³…5k ³Ž!kh 1±‚±….¢Xu£ˆ(‚w±ƒS±ƒs±‡K±‘y±†{±†!¢‚Œl 2±„d±Œy¢„Gu£—‚w±‰'±‰{± ±¦}±œ.±Ž&¢–'Œl G ±‰ ±(W ±(¦ =Y¢…ˆ.±†%³ƒ0³¤‚¢=‡²‚`¢†Ns±†/BA±‚[£|ƒ-¢„E‰£ƒ^‡¢…<‹¤… 5¢]ˆ _¢š/ˆ.±—:³‰<³¤Ž7¢ˆA‡²„c`¢žs±z±‰.±„y±ˆ/£ˆƒ-¢ž0‰£Žg‡¢š@‹¤¢5… 5¢•ˆ ±Šs ±¢>²†,p ²ŸRp! ±!†} ±!ƒDu 7¢Œ]$±†±‚<¤‚2z¢‚$±‚J¢B¥_M‚4£_‚P±‡/ 9¢¡p$±a±…¤‰}z¢…s$±…i¢ƒ~¥‡KM‚4£‡P‚P±!*¥ ‚ ,± ±„  ¥‚e ‚ ,± ›w±‰M;­nj‚&ƒLSƒB…² ‚1@ ­›j‚&ƒLSƒB…² ‡@m#±‚3 ±#‰B±œ ¢Žn…±‡| ¢¤…±”0‚±;±‚;¥ƒB1ƒ#SI¢†c¢Œgƒ±ƒG±…V±‡M¤„ [[…Y²Pృf²ƒ_@±‚¥„[,`' ¥‡y‚* ¢L…¢w„¢ƒ:g±K¢.ƒ±†&¦‚‚\‡s„w ±¤N±‡B¥œh1ƒ#SI¢Š5†c¢|ƒ±Œ±’ ±ƒ"±‘v¤›X[[…Y²…ొR²‰g@±†*¥0,`' ¥“‚* ¢‰>…¢¢{„¢˜mg±‡$¢‡Eƒ±Ž+¦•<‚‚\‡s„wŠ-… [4*-^" ‚ Ym‚= S 3{l¤ |p „0l3:Wx7† ;N Y=}/dk ­‚X K ;$I „^‚U‚4J0$pX0Qs#¤‚Zs¦hp3C©‚^Y s+ _n£t £ƒp£x9O¢+„]©…^x- `?£3‚7¦+|‚E"W£M%; ‚ @h‚?ƒ!~r~,$$!;'&C¤8p¢…je£F1‚±‚~d¬k_[I^ ƒ§#,<;Y ¬g‚oƒLnkj+ ©}Il2! ¤Y_=¦y xVQ‚<£0„p(£Z«,lbEBI"i¥ 2I?8 :*N? 3]hUH4G7LY¤‚_ 1 uq HP  *¨+ n!$fƒH:¥XS mT BK!"|#MP‚ _t3 ‘XI?8 :*N? 3]hUH4G7LY¤‡r_ ‡H uq HP  *¨ˆ0 n!$fƒH:¥‚uS •T BK!"|#MP‚ _t3@±!±’\±„8 "± E±‹?±ƒc²…a@²ˆ\@±© ±¨±‹O…'‚?¢‰v¢j)ªK†„t vƒ9]„\¢ƒFƒ?§…‚cz‚*…J¢K2±†.^¢‚.„C¢<*¦M 1ƒ¨ƒ~2‚[A9©I‚M^6®ƒF-*%,†I„3Q#‚:± ¤>‚1‚{±ƒB£‡j*¥+l 4¤,‚Q‚\ƒZ¢„3£ƒ£‚W~¦?‚YWo"±_£@c{¥\V„](©†k‚H‚_ ‚‚Z…I¢l‚\£R/l¥ ‰C\†L¨ƒhv‚uƒu…?«…f‚1-!,;‚?&¢SƒX±… ± ¤Žcv! ‚K¢–‰v¢…q)ªšq†„t vƒ9]„\¢Œdƒ?§–‚cz‚*…J¢Š2±’b±ƒ¢ŒW„C¢…b*¦‰Q 1ƒ¨2‚[A±-©‰‚M^6®›-*%,†I„3Q#‚:±„<¤ˆ ‚1‚{±†u±ƒa£V*¥…cl 4¤‚Q‚\ƒZ¢‹£†qƒ£‡‚W~¦ˆ0‚YWo"±…x£ˆ^c{¥‰1V„](© V‚H‚_ ‚‚Z…I¢‹u‚\£‰D/l¥–$‰C\†L¨™v‚uƒu…?«– ‚1-!,;‚?&¢‡jƒX±%±ƒ'¤¢'cv!8W£‚p‘D±”d±ƒm±…£o(‚Y±†e±‹± ±‚¢:X§…ˆ}…M$} ƒ3±…e£ˆd†o~¢*„BY}¢ˆb‰4 \£˜‘D±® ±!±ŒU£¥:(‚Y±Ž0±šY±‡}±†6¢ŠX§žqˆ}…M$} ƒ3±n£h†o~¢•]„B±±ƒ¢‰4 ±$™N ±$³9+w±EVX¢†u ±…~±žZ±‰B±…¢—±!ƒ<±…7 ! ±!†y±Š~¢,…@I ¢,ŒWI ±,†S ±,j‰1/„H ƒ,3>oJ?8 ‚S#Rz* b¢lP¯ƒNG‚F$(ƒ‚ †#‚*-^"©ƒ15 H4'J«…(ƒ=‚+j tk‚M¢¤ZjK‚~¨C@a&ƒZ¤j08-¦n|6S& ¥!_iFS¨/(ƒP §„&JK2Dƒ-¢ƒ -©H>h‚?c07¥7' N(|=z‚ %)‚OS:‚aH3I7‚?£Y¤‚E‚#§Fx$ 5#±‚i¢u#¨/9„!>H¦0BF$¦ƒƒ;‚*uK*¦sxo‚9¢‚fZ£‚Q¥‚~y‚¨S C F¬PIc @ ?;¤w1D¤u #­ƒJJ=-p)#P GF¬ ‚,‚l‚ƒ „O‚z8ƒ4t¤ˆM~§nDƒF-  &…R,M OZ5*x!x s„0Zt>Ep"X0))M‚WYu£ y¯k'^>_&hZx6L¢‚¬/I*,m$Vy#J ¦ ,)ƒ^W!¢o+ qƒSWuD!h‚PƒKS9< * . „b ˜?3>oJ?8 ‚S#Rz* b¢…sP¯œtG‚F$(ƒ‚ †#‚*-^"©ŒO5 H4'J«–=ƒ=‚+j tk‚M¢‡$¤Š%jK‚~¨w@a&ƒZ¤ƒ 08-¦Œ|6S& ¥„G_iFS¨‰3(ƒP §=JK2Dƒ-¢„|ƒ ±!©ˆ>h‚?c07¥ƒ' ˜(|=z‚ %)‚OS:‚aH3I7‚?£„OY¤Š‚#§…5x$ 5#±†¢„1#¨‰9„!>H¦„hBF$¦‘yƒ;‚*uK*¦ˆ_xo‚9¢ˆ:Z£ˆQ¥‰oy‚¨„l C F¬‡nIc @ ?;¤ƒKw1D¤†* #­‹ZJJ=-p)#P GF¬™w‚,‚l‚ƒ „O‚z8ƒ4t¤‹ˆM~§ˆnDƒF- •&…R,M OZ5*x!x •Bs„0Zt>Ep"X0))M‚WYu£…Ty¯4k'^>_&hZx6L¢…g‚¬‡FI*,m$Vy#J ¦ˆ,)ƒ^W!¢ƒ + ”3qƒSWuD!h‚PƒKS9< * . W ± ˆ[¢#ƒF ¢#Œ h)±"¢†6…u ±)†/±ƒ?¢šZ…u,R¬=Z‰? ƒv±.± †²—-@±‚#±ƒ¢‚†±‹u±‚1±ƒw¢„h¢ ‡y±„&<±i±†4 U¬•PZ‰? ƒv±¡C± K²®x@±…U±Šf¢‹†±šO±‰"±ˆ¢=¢¨w‡y±/±ˆ.±‡0±šX9¢ ‚ r£) ƒc¢?†Z¢†?±ƒj ¢ Œ2r£ˆ- ƒc¢‹V†Z¢›C±™4± ‚ £* ƒd±‡¢†@±ƒk ± Œ4£ˆ. ƒd±’1¢›D±™ ±(…h ±(› ±(…l ±(›¢(…s1 ¢(›&1‚&¢‚|‰-¢‚y*±Ž"±…v¢„ …(¢„y`P±7±‡.±…3±T±‡S±‚±ƒ{¢‚Q‚O¢. ±5¢7W§…6ˆ[)‚„@¤ƒx40d±‚2£‚E‹H…±„£Š;|‚±¤…yTƒ1‡ ¢˜‰-¢ˆ*±§H±¢• …(¢"`±D±ˆ}±žy±Œ~±…C±?±†K±’U¢‰=‚O¢…G ±ˆS¢‰ W§Ÿ!ˆ[)‚„@¤40d±Š$£—I‹H…±™E£ša|‚±‰¤šTƒ1‡ ¢ ‚ ±‡ ¢ Œ6±’2 ±'‚T ±'—X#±84± ŒH±‚4 ±Š$±„l± ¦3±—8$¤Ž¥‚ ¤œ]¥†#‚@ H#*S<0?c% ±%‚ ±’?  ‰&H#*S<0?c% ±%‡R ±*‹' ±*›M ±„f ±R[ e¢Š 7±‚A§ 5-ƒ $ ²1À¨n=±y¤ŠV!¯ƒn ! 9$(a 8n&‚} !:±“?±“±‚r ± –1 k¢Ÿ7±‹_§ ‹5-ƒ $ ²%À¨„ =±…h¤˜vV!¯ŠZ ! 9$(±†5 ‡)n&‚} !:±­*±¨4±ˆ9 ±%†! ±%‘*‚§‚c ‚EV„±P±†F±‚9¨‚‡‚!j… £…| ±ƒ:±„ £O‚9J¢„_‰T¦ˆ9‚ …hfa¢q\¤$ƒ0/+¤Ug¢ a¥‚5 ^D³t¿¦ƒ0f….ƒ §—v ‚EV„±‡\±’z±†_¨™a‡‚!j… £Žh ±Š&±‹(£‰$‚9J¢žJ‰T¦=‚ …hfa¢¦$\¤Jƒ0/+¤…mUg¢ˆ$a¥Š5 ^D³ƒ¿¦—:0f….ƒ ±"<¢…O3 ±"…q¢Ž$3 ±*Œ ±*œ7 ±ŽB ±ŸW ±P ±¨v ±)‚ ±)‡d'¢ŽY3¥ ƒ:Q]P±˜S ¢Ÿn3¥ ŠK:Q]P±²>m"±…+ ±"…"±š/ƒ<±ƒ.©4y6‚5:7y $(w. -A…,k ƒ%V30l4©‚F -C±b ‚ @3NZ!(+ ®‹[‚}sƒN!0#3(cB¤‡C ¨…! ‚JM¢‚‚6±ƒ1±…£†‘_R£‰ ¤ƒGhG±’`¦…IP@ ?±ˆ5©™Zy6‚5:7y $’=w. -A…,k ƒ%V30l4©] -C±†A ‰_ @3NZ!(+ ®£&‚}sƒN!0#3(cB¤/ ¨“{ ‚J±‡9¢‰=‚6±‡f±c£ ‘_R£”¤‹ GhG±¨¦™mP@ ±^ ±©%±Žk±„K±…± ‹ ±£~±‹7±‹x±  Kƒu n ' %ƒp† *" (‚P?‚"£^Gb§y:G‘a_A¢!†T£fˆ*…,¢J‚x£o†~¢tƒO±)¢Kƒ8±6£Q†¤+ 5±…~£U‚ ±W¦„q‚IE?ª ^2…M ‚87&5±„]±…±‚B±1¦h/ +: ¦„/.%71¨‚O„k„M…K‚E‚ ¢!„B±¦!$‡…[#±“¨,2!±ƒM±“F ±: z •: %ƒp† *" (‚P?‚"£…eGb§›:G‘a_A¢Š?†T£‘{ˆ*…,¢†V‚x£‰:†~¢(ƒO±‹R¢„qƒ8±‰:£ŒQ†¤„}+ 5±D£§ ‚ ±…F¦]‚IE?ªŽd ^2…M ‚87&5±‹I±Œ ±†[±„n¦…/ +: ¦Œo/.%71¨šo‚O„k„M…K‚E‚ ¢‹*„B±ˆw¦•%$‡…[#±¨;¨†s2!±Šd±§j9±‚}?±ƒX±Œ"±”±‡0Z ±†l±‡+±Šv±¦ ±© ±œc±†!±±ˆ ±¦9±_/¢‚Q$¤ <4„r±Šm±‚N ¢Š$¤‰u<4„r±™G±‰?±{± ƒ ±©!± ‡s£Š8"ƒ( £›M"ƒ()¢†>…n±F±‰ ±#…F ¢—S…n±z±“3±#K ±( ±(¥I£ ‚3 £ Š7±D±Œ ±–W±* ±*„O ±*”u M§„qzPWƒ/¦y7\…G ¤‚ ‚ *¢ „¤…H‹@¬ƒ L"}.*ªiP'=/Š N§žzPWƒ/¦‹7\…G ¤Š ‚ *¢ ¤šL‹@¬‹ L"}.*ª• P'=/б„i±…( ±‹U±Œ£ƒ N £ˆN ±Š ±˜nM$±„A£„#†O†`±n±ƒ-± ‚ ± “&±ƒ±Œ# $±‰H£I†O†`±§9±Šx± ‰± ¨Y±Š&± G ¥…# ¥“}¢'“ ; ¢'¨; ±&…& ±&±+‚±…- ±+‡[±™Qx 7© R>yq£ VG¢+…Q£ƒ#¢ ¢L§†5 0  <©ˆ\ R>y±„`£„& V±ƒ¢Š…Q£‘l#¢ˆ)¢…§ 0 ¢ƒO ¢Œ ±6 ± K ±˜ ±±; ±,‚c ±,‰z¤ … > ¤  > $´— ´0z¢J ´…$— ´‚Sz¢ˆN/±…?±‹s±'‚^¥_ ±Ž]±±'‰u¥£9_ X* ±*~:¢ ‡F²ð±…w¢„{±…b± ƒ= ¢ J²ƒOð±ŽL¢y{±k± —a ±O ±„-_ ,£ƒ{„pб…~£‰M=M± ‰n±†G±ƒ±‚s±•±Žq .£!„pб’2£”M=±A± ˜H±3±†V±Še±ªR±Ÿ#±‚±‚ ±6 ±‰_±…)±¥E±…}(¢ ?‚Q±„±†5±“ ¢ ˆC‚Q±›b±Ž'±¨FN]¢‚ ³‚Zî«<%G.‚HXG(q¤‚Dƒ/…u‚}¢v‚^±ƒ0±}¦ƒ+[-‚S ¢…K†u±ƒ:==±‡±…@¤b ƒ= ±‚ba ± f¢Ž@³‡î«ˆ <%G.‚HXG(q¤šƒ/…u‚}¢ˆA‚^±‡±„9¦Œ+[-‚S ¢”%†u±‰B±„V±‡[±¡ ±šD¤– ƒ= ±ˆ)±•±#)±ŽE ±#‰~±¨0 ±”` ±¬+¥‚UM+Q. ¥‡4M+Q. ±$™ ±$²v ±‚V ±‡5 ¥&„4 ¥&‹t4 ±ˆ ±”P ± ±©*£$˜( £$²£ƒ2Id £ŒId ±ˆD ±— ±‚±± ±›<±’±E¢‚#Y ¢ˆ/Y ±’B ±§U B±,¤Œz‚qn†L¢/'±'²‚>£†E†[±…0±±ƒC­ j`/o)Ad.± ƒf  D±¤?¤¤E‚qn†L¢ƒa'±…²†v£”wE†[±‹8±ˆ ±‡\­‡% j`/o)Ad.± ‰- ª„Q0(> ª0(> ¦6‚j / ¦…=‚j / ±)/±H±† ±)†v±‡!±š* ±(@ ±(¥s-±…"±[±ƒ,±‡V±„ ±‘V±5±‰4±+±ž'±•1£†p£ „$j ±¬|£l†p£ Œyj±…± Œ+ ±’3± £v ±,‚% ±,‰< ±‡G ±˜\>±‚±ƒ0±„T±ƒ±_£/ƒS±±ƒP±‚t¢B‰G¤ƒz‡ lz~±‰ B±—$±ˆ7±z±E±†>±‡`£ˆzƒS±‰±’*±ˆ|¢§-‰G¤™-‡ lz±ˆ±39¢|£ƒA1”?±±ƒF¢ †B…Y ¢¥£œg1”?±¡±Œ¢ ž …Y ¥&ƒGhG‚ ¥&‹GhG‚¢„@9 ¢ 9 ±ƒ7 ±˜J ±$†u ±$ `‚¢’K±/¢‚rB±W±‡k£¢ ‚±‚¤‡3ƒ±ŠM±ƒ'v¢@‚K¢„ (§zƒJ…jvƒS…B¢v…A¢‚U¤‡'ƒƒ.¥ˆ'†£3%s¥„W9‹fz ¢§^±†6¢ŒB±žl±”£‹?¢…2‚±‹¤’Jƒ±¢±Œ±P¢ƒ}‚K¢Œa(§›eƒJ…jvƒS…B¢‹…A¢‰xU¤œ+ƒƒ.¥–8ˆ'†£‡J%±ƒ¥•4„W9‹fz ±$…m ±$ŸX ±$† ±$Ÿk ±$†4 ±$  ±$†G ±$ 2 ±*‹ ±*›(+±˜a±‚T± ‰±ƒ! ±²±š±ƒX± ™:±Š8S&±–«‹9Q h‚c± ƒ/±‚|¤ƒ@& (±¯=«£Q h‚c± ‡H±‡1¤ŽI±…m ±)ƒ} ±)‰D V ±‰t%¢…d-±‡bY± ˆ# ¢’-±’ ±…± œG ±‰w ±£1¢Š=‡v± „}± ±Š+±ƒt ¢ŸP‡v± ± …W±Ÿ/±‹ ±)…(±‡ , ±)Šo±Ž- ±- ±¨S ±ƒq ±‰y ±!e± '±Œ ±!…"± ‡± =¤$–PG ¤$°;G ¢‚7A±‚e ¢“LA±|/ ±/¨K ±/”+Y*¤‰r„h…:-¢‡‘R±‚±‰u±ƒ(²ƒ+ð±‘a£kuU *¤Ÿ„h…:-¢ .‘R±‹,±¡@±Œ²‡cð±§£‰uU %. ±.‚B²„ P ²ˆBP£ 2„z9 £ Š[„z±ƒv  ±ŒPo±„2 ±I±‰y ±$„^ ±$žI¢&„> ¢&‹u> ±" ±"…I ±!‚| ±!†9±%„± ; ±% ± £_‚ /^                            <±• ±…±™6±‰0±‘$±†±ˆf±ŒE±‚6±Š;±„5±ˆ±‹+±„n±±‡Q±‚j±—V±ƒ?±‡Y±ƒ~±ƒ-±‚J±ˆy±„F±Žf±†y±…a±†±†}±„$±‡)±ƒJ±„B±ˆ`±™v±‹±ˆ±•±•A±…S±3±…f±‡!±ˆ±‚*±”2‚w*£† ¢d¤‚}9 ¤f P|;±‚H¤+%§‚* ‚ „1ƒ  @D  TL  2 ±}®Q /} (yj¤.E¢‚ -±ƒ:  ±£[ ¢„5d¤ˆQ‚}9 ¤„U P±„±‚w±‹4¤…L+%§‘ ‚ „1ƒ †s @D  TL  2 ±†[±‡®‡B /} (yj¤‰E¢›v-±‰( ±(ªi ±(•: ±$„ ±$m ±‘ ±ªC‚~¥…K†E…4…Q§‚$bgu]w¢‰\ƒ\±x¨‚,9D"C‚±ˆ@±“E±-²‚W€±‰ ±…%±‚e±‚P¢ƒL±,¢‹U„,±£ˆ$;¢ƒNбS¤„„f…Y ~¥žq†E…4…Q§‹Bbgu]w¢šqƒ\±„¨ŒU9D"C‚±“W±«±…²‡€±—g±Šy±‰V±†i¢Š7L±„i¢¥@„,±‰q£(;¢™Š±y¤˜?„f…Y%±Œ±0±{± ‰ ±¡+±žE±ˆl± žC±ƒ±ƒ±’w±ƒ.t±Œ+±=±, ±”,±Ž±ªB±‡f±… ±¡/±‡±ƒI ±† ±ŽM?±‚)±‚±ƒo±„ ±ˆP±…9¢ƒX4 ±›O±‹/±‰{±‹>±ž±‹¢—|4 ±&…4 ±&& ±‚y ±‰e%¢ˆj§„Q Ga ¢’§ŒU Ga ¢“bq ¢«-q ±‘< ±¦O± ! £'„ir±… £'™ir±Šb±”7 ±… ±Ž ±$“7 ±$­" ¢‚Y¤$ƒK/( ¢ˆ'Y¤$“q/(‚ ²“€¢…<²‚_P© fuR‚9  ‚'A ': ² ‹X€ X /=D$ + ' p£`‚‚< # # #  &| AE5± ± ±! ²¬E€¢‘I<²‡P©ˆfuR‚9  ‹A ': ² ¥C€ ¤\ /=D$ + ' p£†'‚‚< #ˆ# #  &| AE5±„ ±† ±Ÿ.¢#ƒ ¢#‹W/¢Œ]± …K± ± *±ˆd ¢r± ± ˆ± ¢]±¥†xT& ¥CT&# ±#‘- ±#ˆ\¢‡D ¢˜$D±…k±…T ±ŒW±ŒEA]¥",ƒeƒ=³‡(þ±ŒB£Vƒ±+±Ž 1„D9E  #.   )   4+ % ‚ ±- _¥™H,ƒeƒ=³Fþ±W£Šƒ±ˆI±£  1”j9E  #.   )   4+ % ‚ ±ƒJ ±(Š_ ±(  ±$ŒW ±$¦B  ±‰ ±$j±! ±$›U±–T)¦ƒGL ±‚±—% ¦‰SL ±ŽM±±5±‚h¢%‘L>©6!%|taG= ±‡o¢%¦P>©‰;!%|taG= ¤ƒ\[²ƒLp ¤”q[²Žcp < ± ‡Z ±‚ ±‹J!©(‚'†BeˆV ©(—Z†BeˆV ±„a ±±†±‚z ±Ža±‡/ ±, ±¨R Ar±„I : @[n q2 (! ± ‹ ¨- Q@‚Q¬S53(† ‚;B D±…y±o ‰X @[n q2 (! ± ¤u¨ˆ3- Q@‚Q¬•w53(† ‚;B±‘b  ±Žm B±ƒ¥”&q:‚±j±‚3£q&£…6E¦Œ J#†$±ˆ¤0ƒc>†)¤Ž9m$ C±˜$¥­Lq:‚±Š5±‰$£„.&£?E¦¡ J#†$±K¤‘Vƒc>†)¤¢]m$ ±‚~ ±‹I ±/†j ±/› ±/ ±/•5±'†~X ±'œ±†1] +±Št± ‡EF ±…²‚S`±‹t±ƒI±†±ƒ{±„|±†u -± ± ‘n± ƒx±m²‡ `±šN±Š5±±ˆ±±›y±ƒt  ±)‹ ±Œ`±…R)¢H„{±‡9±h±( ¢©n„{±%±‡/±‡k 2±’z±ƒ±t±‡B±‚_± ƒd¢†C„!±‚J£{‰Dƒ¢‘ 4±¨ ±‹b±ƒ9±…±’Y±†± ŠU¢‘L„!±Š<£–‰Dƒ¢•8‘¥• *D: ¥®1*D:±%†rR ±%‘{±x ±%†- ±%‘6 ±*8 ±*^±‰± ±š,±šy=¢‰[‡±… ±•W±‡+±ƒ ¢†M ¢¡&‡±ŒX±¯B±œ/±˜=¢šq²° ²™@°±*% * ±* Kƒ'M¢9“ £„ ƒK±†-­@}UY WH£ƒG±†±‚ ±†a¢‚„¢Y¥:…(±‚C±1±‚|¢1§‚`‚‚-9zU¢‚H¯PJ H?R  0- [6 19 et ;%¤1t±ƒf±‚U¥ƒŠO r£ˆ9 ±”¢ƒ.©„!-6oƒƒnQ±ŒG S¢™_“ £ ƒK±—B­†L}UY WH£{±G±†1±Že¢™d„¢„ ¥‰…(±†2±„P±‹h¢…i§‘:‚‚-9zU¢‰H¯†$J H?R  0- †c6 19 et ;%¤‡"t±‹±‡ ¥ŠO r£“B ±©"¢–;ƒ.©”G-6oƒƒnQ± k‚0¨9f4_…X‡5 ‚£‚@‚a¢ƒrX±c¦ƒX *±ˆ-¤‚k…;B‚e¢R¢sƒ3¤wƒ, =¢†£6„A|±ƒg±…&±\¥m .q±‡^§F†‹„L £†H‚X1£…A†FJ¤> -‚Qz ¨•Lf4_…X‡5 ‚£œ%@‚a¢X±¡x¦‰d *±x¤…;B‚e¢…x¢‰wƒ3¤ƒ, =¢G£‰„A|±’A±Œ±…¥†" .q±3§›1†‹„L £›L‚X1£•g†FJ¤‰C -‚Q±• ±$‘m ±$«X ±…w ±Žc ±: ±©`±ƒ/±‰ ±Šz±- ±‘h ±¦{¢( 7 ¢(¤=7 ±*, ±*R±w± „< ±…f± ‹- ±$V ±$›A‚: ¨„d?li9²…1À²…2À© # T 7  %kK 7_kY Nd#‚e( ‚ƒD²ˆVp®KE £<B¨8!…!  8{@‚A,  ‚zG H 7=h ¨ž ?li9²ŒÀ²Œ#À©„J # T 7  %–kK 7_kY Nd#‚e( ‚ƒD²ž p®†$E £‡SB¨‰=!…!  ”\{@‚A,  ‚zG H 7=h±%‚U± ‹X ±%^± Ÿ|/ ±‹[± ‰a±‡hP" ± ‚B±š5± že±±†±‚? ±ƒ± ƒ+± ˆ ±šh± б ”‚`+¤ŠEH K¢ƒ1k±…S±ƒt±‡{±…U±‡$±r£„Q4*§j8 ‚<£„‰9‚±„3¢>ƒ±‚$±‡s±‡U¨ƒ_+ $ ¤„J ¢‚„g¢… +¢”TM²‚Hð¢‚)O£†5‰I±…£‚6Š‚¥‚ H+ `±†%¥…4;‚=ŠN .¤ŸXH K¢œWk±–h±бF±’ ±‘M±‰v£h4*§‰08 ‚<£›Q‰9‚±‹~¢„-ƒ±„`±_±–/¨ŠK+ $ ¤‹; ¢‰2„g¢^+¢®?M²Qð¢ŠO£—†5‰I±ŠJ£’\Š‚¥‡bH+ ±‡w±Ž*¥™X;‚=ŠN ±$– ±$¯| ¢‚1?±‚] ¢“F?±t  ±—f ±ˆC ±— # ±—n±1±Š ±„±¡S ±(‰7 ±(žjr5«&"‰wKp‚~ %±‡]« „(>(‚' !±…J>±ƒ%±$±Œ* 8«•9"‰wKp‚~ %±–7« ŒY(>(‚' !±Ÿ5±ˆ0±ˆl±ƒA± N ±(’k ±(¨ ±… ±‹( ±‚ ±d { ± •±D ± ƒ± ¬h±‰6 ±‹, ±š5¥…ƒPg„±…\±ƒ±„c ¥žCƒPg„±±‡c±‹z ±*…5 ±*•[ ±&ƒ] ±&‹O1±…+±ˆ.±†W¥‡3ƒFk ±š>±Ÿy± B¥—YƒFk - ±-‰#±ˆi§„P Ga ±’§ŒT Ga ± ‡ ± # ± ‡! ± % ±"‚} ±"‡2²$– ` ²$° `£8 ƒ £‰V ƒ¢ „~ƒ^ ¢ 'ƒ^7±’_±ƒ)±v±„}¢‚$±…A ±ª*±‡±„2±ŠQ¢œ$±J ±† ±Žn7¥aƒ|† ²<¤+[Œ%‚Ee ¥šƒ|† ²‰Z¤+•Œ%‚Ee ±/Š ±/ž. ±‚V¢"„>‚ ±›|¢"G‚ ±… ±š ¤ %s8±‡ ¤ „Ks8±Y ± ±„q±†±‚y ±Ž`±‡.)±ŽX±‡±Œ@¢ ‰s0 ±£k± ,±U¢ ¡>0]k±U£„‘1ƒ;±†¢†#†I±±‡r±ƒp¤Š{„q‚jƒJ±V±ƒJ±‚±‹:±…R¢ƒ¢~ƒ ±†n±±J±…5±“#£EPN¢ˆY‹3 m±†\£*‘1ƒ;±=¢—8†I±‡±”&±‹t¤¢F„q‚jƒJ±…±‡9±„S±š±Œ>¢†\ƒ¢‡ƒ ±Ž ±„=±…±Ž ±­£ˆ7PN¢]‹3`-¢ƒ\‰z± †±‚«O„w9|F‚l²H±…[±‚q .¢˜o‰z± A±†-«™„w9|F‚l²…±”5±‡ ± ˆT± ‚} ± “k± ‹i ²#ƒð¶‰?™›à ²#‹Xð¶£*™›à ±%„ ±%y6¥)„b  $= $S 'q  c     "±‚K ± ”U 8¥‰G„b  $Š1= $S 'q  c     "±ˆq6 $ˆEO?…X@B±„ ²….` 6 $ O?…X@B±ˆE²”` ±&„H ±&Œ: ±/‰B ±/f ± ‡R ± ’i ±(„v ±(š) ±7 ±Ža ±&†f ±&ŽX¥• #&B9 ¥®3#&B9u 8£†3ƒF±G±‡K¥‰rC/¤(YOV¢–B<¢ ,'±…;±„8£•+‚- 8£›FƒF±Še±˜`¥R‰rC/¤Œ?YOV¢® <¢ ˆ'±‹±Š@£¯‚- ±/‘H ±/¥l³j’ ³D’ ±‰4 ±  ±'“ ±'¨ ¢/‚’ ¢/–2’'¢…lJ± “'±Œ±‚ ¢Œ]J± ¨Z±œ:±‰& S ±‡? ±%„ ±%S&±ƒ1±~` £‡r ±‡i±‚ª‹YB!Z#' „ (±‡ ±„:± …£¡] ±’r±Šª¡ B!Z#' „  D±†±’}±„P¢ŠˆvU¢ ‚{D¢‚•9£@ƒ …[£‡G…z¢„sŽP±ƒ.±‡`¤(Œ# …G H±›*±¬#±n¢¡Pˆv±ƒ¢ ‹PD¢œ•9£‹Iƒ …[£œK…z¢š&ŽP±“T±e¤”LŒ# …G ±‰x ±£ ±“ ±ªc±X±ƒd ±‡d±‰8 ±$˜. ±$²)±ƒ~±–z± „m¢/ ±‰±° ± ¢© ±$ ±$©}¢D ¢’Y ±*†w ±*—²•LP ²­P ±&… ±&Œ~dj±Žf¤'[&¥“A l§gK%ƒ d¤!YL99¤?ƒ>;]±ƒ1±†LªI‚Z'#4±…L¦1$n±ƒ¢„"^¢‡h£ƒ)P±“! u±£y¤ƒ[&¥«  l§‡hgK%ƒ ±„S¤ƒ@YL9±‚u¤‰?ƒ>;±…±’ ±8ª†‚Z'#4±‹T¦†1$n±Š¢Œw^¢’q£˜\P±§E¤ ƒ0  ¤ ‹4  ±4±…E±‡ ±¤±± ¢‚Y± ƒ ¢ˆ Y± †<£$–:" £$¯z:"/ T¨5  %¥„ U ±,¢Jƒ± … ±…¢a±ƒ¢j¤ydUŒr 5 ‚jQ d‚_ „/ 0 V¨¥H  %¥ŠU ±…R¢…)ƒ± w±Šd¢‡i±†L¢Œs¤•}dUŒr –h ‚jQ d‚_ „/ 0±T±ƒ` ±‡`±‰4 ±Œ ±" ±(3 ±(–f 1 ±™W¢ 3 ¢¨33 ±%‚q ±%z ¦„U 0 ¦  0;£‚YM±m²y¢*±B £ˆYM±„s±ƒ)²‡M¢‡2±Š!£‚YH±†± C £ˆ#YH±± Šy 8±†v±Š!±‡¢&±‚±‹x¢‚&±‰^±-¦.‡D±Œ9 <±’F±ƒ±•8±ŽK¢§d&±…B±šR¢†[±žb±–9±…t¦‘T‡D± ]¢K ¢’` ±ƒ-±z¢ >X ±‡±„6¢ ŠX±-…2±„5 ±-7±˜Y ±&‡= ±&/-±‚ ±Œ±ƒT±“/± ±—3±¥A±‰`±­± ,b .¢\‹H±†/¢ƒJ„+±‡9± †C£ƒa.±g¢rŠT£†Y:ˆ /¢š‹H±—D¢~„+±‘b± Ž£ˆ.±§R¢—%ŠT£–:ˆ r 6±‘+±‚X± …q±F¢e„±ƒN±‚²‚°±†r£‚_„)†±ƒC±9 7±¦>± ± <±„x¢ˆ0„±‡=±„W²j°±Ž£œJ„)†±“i±‡ ±$…i ±$ŸT ±$…| ±$Ÿg ±!k ±!…( ±$†0 ±$  ±$†C ±$ . ±$•\ ±$¯G ± ƒO ± ‡u ©, < ©,ˆ) < ±'… ±'š §„A10#A § 10#A ±$„ ±$t±)‹ ±(“# ±(¨V$ ¢#!ƒM±”h ±)‹ ¢#ˆvƒM±®S±…Nru¢ˆ1‡g¢Oƒ¥%WRC'¢ƒL`±X¢0‰±†U¦c‰<ƒ[!ƒ £,^6¦.w £‚El£…Yƒ{±ƒ±‚=±„N² ¥/x9±•±„:± x¢D‡g¢Šmƒ¥YWRC'¢u`±…~¢ŒG‰±Ž¦˜.‰<ƒ[!ƒ £ƒ^^6¦„w £†}l£“rYƒ{±Š±ˆ±ŠV²ˆ  ¥ˆMx9±®p±™m±‰‡NƒK - @7I".; 6 G+    9,@& G TWTƒo(E  &S…{©‚M‚a  ²ˆR` =(Rr  ƒ[ "  ¤q ¥”Q`¥…© z « J, < = ©OC4k(¢„g-¦{’ZO ©fE ‚)I²eÀ ] /  & ' Epi@D F   #  7 & '- ej  3 ^‚1M B)©M:ƒ ±…=¨  7­ R lW I)®  |‚"‚      !D + ‚%C) 4 B@ #‚ . ! |&<'E[7. ±²S±†±ª ±‹:±Ž2±±„B±¨P ƒZ …- @7I".; 6™2G+    9,@& G TWTƒo(E  &S…{©“b‚a  ²•` ‹T(Rr  ƒ[ "  ¤ˆ7 ¥«\Q`¥Œf© † «ƒF J, < = ©…C4k(¢<-¦šf’ZO ©‹oE ‚)I²‰WÀ ]• /  & ' Epi@D F   #  7 & '- ej  3 ^‚1M B)©†:ƒ ±•c¨…e  7­‡ R lW I)®ˆ |‚"‚  ‚)   !D +”0 ‚%C) 4 B@ #‚ . ! |&<'E[7. 0 ±™V ±!‚@ ±!…}¢,„O‚0y ¢,‹f‚0±ˆ~ ±" ±"…D¢3 ¢¨43£ƒT £ˆT %±ƒ± †±-± ±8± \±§±–I £ˆ7 3±†y £”k 3± d ±B±U±‡P ±¡W±† ±¢$‡g5 ¢$¡R5£%ƒh$†b £%Žq$†b‚ ‚{f,ƒo 0‚G‚DX(¦†X‚Ce‚wX±`±„g©‹8Q …iL U¥‚n)£%C £‚£ ¦„ Q¥„ˆ@4£(%¥4,‚F¢‡t  ˜f,ƒo 0‚G‚DX(¦—m‚Ce‚wX±Ž±©£Q …iL U¥‰jn)£…C £…4£ƒH¦Œt Q¥’`ˆ@4£…|%¥†<,‚F¢’}@±•d±ˆ9 ¢{O±‚v±ƒP²† ±¯ ±‘± ‡¢„-O±‡.±ŠA²Žq¢ˆƒ/ ¢¡Cƒ/£…> £Ž> ±-…/ ±-4%±Š?±„±‚±„ ±ŸR±?±Šh±¢…% ¢ž:%±‹2dn¢g£~Y‚f©…\'W K >±}±ˆk±E©k # V ¢zUªQ ]‡P„$U†H£[‡A¦‡h‚/©Tˆ;#1£…U±2 q¢¡|£ˆ Y‚f©’'W K >±„ ±“±‰ ©„( # V ¢ŠOUª›< ]‡P„$U†H£‹d‡A¦–‡h‚/©–ˆ;#1£•{±•V ± ‰T ± ”k ±(“1 ±(¨d ±) ±)†d ± ‰H ± ”_¥†tT' ¥?T' ±$‡D ±$¡/ ª‚E#.)T- ª‡$#.)T-#£‰x/±ƒ:±"Šv £š-x/±‰F±" )±‰ ±‚] ±¢0±†<±„p±‚#±£H…¢„!±‚J ±Œ;±…B±ƒW£‰kH…¢’l!±‰;=±„r±‚%±£E…¢„!±‚L ±Œ=±…D±ƒY£‰pE…¢’n!±‰= ±Š/ ±£U-±‚y±…R£m9¢‚z ±†+±Ž>£†%9¢‰k‚}/:±•±…±™!±‰±‘±†±ˆF±Œ/±‚±Š$±„!±‡±‹±„Zo±‡A±‚Y±—F±ƒ-±‡F±ƒj±ƒ±‚7±ˆg±„3±ŽU±†g±…O±†±†l±„±‡±ƒ8±„0±ˆP±™f±‹±‡m±”±•.±…B±!±…T±‡±ˆ±‚±” <±ª!±Š ±²G±’7±¢%±Œ±‘±˜c±„A±”M±ˆG±±–)±‰9±c±±…7±¯±†_±±‡Y±†9±„s±‘S±ˆk±/±S±‹#±Œ ±]±ˆ-±Ž7±†u±ˆe±‘%±³Q±– ±_±ª±ªa±‹ ± G±‹-±Ž)±±„5±¨C¢,‚)F ¢,‰@F ±(„ ±(™N_ -±<±„B±]±†=±„a± „j¢‹`x¢ƒOƒ$¤‰$iƒ -±¥O±‰I±Š(±‘T±‹M± ™n¢¡x¢Šfƒ$¤Hiƒ ±‰/ ±¢U1±‚"±…±‚#¢…I…±†} ±—5±‹±œ¢š|…± ±)„> ±)Š ±$— ±$°n ±)8 ±)†)µ$‹Tl´„/ªÐ´Š)ªÐ µ$¤|Tl´™3ªÐ´žMªÐ%±ŒK¦,‰00.ƒ:3 ±¥q¦,T0.ƒ:3 ±.‚ ±.„'¢ˆ ƒ/ ¢¡Fƒ/ ±…' ±‘[ K¥Žp ‚$¤Q‡±‡~±ƒ\± „|±S± †2£Š!=(¢„;†(±‚D¢Y'±†J¨…+I>;‡$_ L¥¤ ‚$¤‰o‡±”2±Ž± ŒG±Š?± £¤ =(¢D†(±’j¢‡2'±a¨™OI>;‡$_ ¤I -±…A ¤¥ -±” ± ˆ{ ± ” ± Š ± • ± Š ± •( ± Š ± •. ; ±Œo D. ±.‚a ±ƒ ±†@ ±ƒ. ±‰:†e/ƒ¦@Š„o¤4“‚p«6‚$?‚y¨…0„Cqsd¥‚,Y¢k£…n„6§¨z ‚N( ¦G:"«% xN0O;F«„.c‚w!'M#¥\S?‚7¤c/ƒ5§&¦*‰G…ƒ¢‚L¢‡£…«ŒMR( ¨ O)'ƒ© ‚K/K© ‚y£ƒR9¤&' UN6&jˆKl.'t_‚J¤„pA£",£x‚% K‚‚Z‚v Nƒ1.+‚q !TR,+% {%Dƒ%F*pw8g£‚? ƒM¦•@Š„o±… ¤™,4“‚p«‰$6‚$?‚y¨‘…0„Cqsd¥†‚,Y¢ˆQk£Œ:…n„6§‚)¨Š/z ‚N( ¦„,G:"«ˆ % xN0O;F«‹„.c‚w!'M#¥„e\S?‚7z¤‡Lc/ƒ5§‚d&¦—Q*‰G…ƒ¢ƒ8‚L¢‡Q‡±ƒu±ƒ%±‚B£ˆr…±„>«Ž`ŒMR( ¨†r O)'ƒ©…Z ‚K/K©† ‚y£†wƒR9±„±‡$±ƒC±„;¤ˆ[&' ™qUN6&jˆKl.'t_‚J¤‹„pA£‡x",£• x‚% •9K‚‚Z‚v Nƒ1.+‚q±…M !,TR,+% {%Dƒ%F*pw8g±…_±‡£ˆ ‚?±‚#±”* ´'„3ªÐ´Š-ªÐ ´'™7ªÐ´žQªÐ± †;±%Šl ± d±%Ÿ¥‚p++T. ¥‡O++T. 8 ±˜ ±c ± x ±$˜} ±$²h ±“# ±¬I=¥Œ ±ƒp±ƒ±…m±j±† ¥¡ ±‹6±†4±ŒY±†±›#¢$•} ¢$¯h ±#Y±7± ±#Š.±‡±•3 £‚ YN¤3 £ˆYN¤‡£o! £„!!/±‡¦‰og R± ‚± F ±œ0¦š.og R± ™c± ˆ7!±“*£ ± ‰! ±¨=£z± ž% ±&„7 ±&Œ)±/¨T²(Rp ²(¦p²j𠲡ð ±P ±¦v ±$Ž ±$¨ & ±&g ±&‡y¤(‰‰6 ¤(žJ‰6¢ ˆJ ¢ ’s…H'‚_¬‚~q‚*;j@r3†²ƒÀ¦„<ƒ„aŠ-1±ˆ¤‰lC„u¢sƒ1¦„}#a¥†6@o@%±n£‚Jƒ{±„>¢gƒ9¢‚ h¤ƒN-ª„%ƒ`%„Dg‚o‚.ƒ:¢UK±ƒ±ƒ¤‚‚V‚?£‚#7 ¦W…^]‚J£‚U%`¢‚x‚#±‚£„ ±ƒv¢‚-£^W„-ª…Q‚1† |_a+9„=:£ƒ>…%H£=1§†4gƒg|ªW ƒ,X‚gˆ1!I‚6±„;¬‚HZl‚GB',2B,¢B‚£9ƒR.£nƒP *5‚(hF* =FQ~:m.>:) ‚b¬˜q‚*;j@r3†²ˆ#À¦bƒ„aŠ-1±‘:¤šlC„u¢‡ƒ1¦Œ_}#a¥’j@o@%±„£Œsƒ{±ŒB¢Œ~ƒ9¢†hh¤ˆNƒN-ª›pƒ`%„Dg‚o‚.ƒ:¢…K±Še±‡¤‹‚V‚?£†[7 ¦oW…^]‚J£‰A%`¢ˆL‚#±ˆ £‹ ±ˆ¢†8-£Š3W„-ªŸ<‚1† |_a+9„=:£ŽG…%H£‰=1§›8gƒg|ª– ƒ,X‚gˆ1!I‚6±Š¬’nZl‚GB',2B,¢†‚£‡PƒR.£‰sƒP •N5‚(hF* =FQ~:m.>:) ¤@.†L± ‡I ¤.†L± ¡4 ±*ŠD ±*šj ¦*„w‚h…}S ¦*•‚h…}S ±O ±¨u± …V±ˆ] ± ±a ±(†4 ±(›g%¤ƒIM± v±Œ ¤‰UM± ¥A±šl=¥…ƒPg„± ƒ±†?±„e±‚z ¥žEƒPg„± ‡e±–e±‹|±Š ±± ‡r±„ ±¡'± Ÿ=±”9 ±/‰q ±/ž ±(‡ ±(œ@ ±,…5 ±,ŒL¢,…^! ¢,Œu! ±,…_ ±,Œv ¦,„.7= ¦,‹*.7= ±,…a ±,Œx ±,…b ±,Œy£,…7, £,ŒN,  ±™=7R± Š¢‚!‚I±„\±ƒ±† ±F± ˜h¢‡u‚I±‹z±†X±š: ±( ±(¥M)±2±"‡A±Ž/¢‚…| ±–E±"±¨¢’7…| ± ˆu ± ” %¥„zƒ PWƒF± ‚- ¥ž ƒ PWƒF± ‡ ±‡ ±Žs ±ŽV±¨^£ ˆlN= £ ”N=¢#IW ¢#ŠW± ŽD ±&…u ±&g ±†. ±„4‚ ‚zP &L 2 4Prf±—~¨†ƒ#8bRE+§,nI‚O±9¤4+„h²‚80¢j "2 E#D2±‚V£k=¢C; ƒ[ 5 ‚Aˆe‚MƒG±‚E£‚h‹G ƒu ‚HR‚$ )  B6‚Fiƒ#7$±…±Œ1 ‚ ˜ P &L 2 4Prf±±$¨—4ƒ#8bRE+§†8nI‚O±Š¤h+„h²Œa0¢‚xj "—} E#D2ª+*d"22 "z;Q>O+9kS+©u/1=fƒ+±±7¢:£-…h?§-I„&6ƒ4¥?*%¢ ¤BD $F h  Q*`‚4=F@r‚ h'2ƒ'¢  )*@  - B'sf¦4 1s©.9A £F/k§ a‚^ M J‚#% ‚Y^L¤ O¤‚0w¤‚Uvd ¥j+,Y£Bƒ¦@I`‚KA§ 1@¢„ ^  R q/[ 2 'H]ƒL„4„ £Xo‡>±P¦ … ‡| i_p< *‚‚v ) J6.‚Y‚ h#7$«i, -®S0[w _?‚K‚nD‚d±†O¢‚…N±‹Y ²¢.@±˜r±n±†h±^± ³[ „E«˜\ 4L s4PŠ_¢‡$Z $šL^Xxb‚IP@ :% )Zx s4t‚I¦ŠN„ $E ‘:/„g( ƒ#8bRE+‚C>ª†7*d"22 ‰^"z;Q>O+9kS+©ŒCu/1=fƒ+±ƒ&±‹`¢„`£‰1…h?§‹DI„&6ƒ4¥†*%¢¤ƒaBD $™ h  Q*`‚4=F@r‚ h'2ƒ'¢ƒ; ‡t*@  - B'sf¦„# 1s©ƒM9A £ƒ/k§Š a‚^ M $‚#% ‚Y^L¤†wO¤ˆw¤ˆ]vd ¥ˆ[+,Y£„[ƒ¦‡^I`‚KA§„U1@¢Œu^  ™tR q/[ 2 'H]ƒL„4„ £‹ao‡>±‰B¦–… ‡| —_p< *‚‚v ) J6.‚Y‚ h#7$«†0, -®y0[w _?‚K‚nD‚d±f¢Š …N±Ÿ}| ±E ± ƒ±‰7 ±)„ ±)‰Y)£‚_Ž>± ‡5£ƒA £—rŽ>± ’L£› )¤ˆ7 $ £‚^ ±– ¤‘U $ £ ±° ±…B ±‹NJ!¢„7²†ð±‚±‡4±ƒm£[-+P±Œ $¢Š!7²‘5ð±…P±œ8±™ £‡r-+±‚m± >$ ±$³Y ±$™r ±/…E ±/™i ±Œ ±! 9±‚2±‚^±£‚ R‚±:?>$£^N¦bt<7†¦C0dT 6G B±—E±‡e±ž£ŠR‚±™±‰+±„v±ƒa£ŒgN¦•ft<7†¦–v0dT 6±† ±(+ ±(¥^ ±‡s ±> ±/ˆ ±/œ.+ ±+‹5 ±+…`¢ƒX ¢ˆX±ƒ~ ±…? ±‚f±‰E[±ƒh ±5±‰/ ±ˆ ±%!ª ‚Bv-,5u ª ŠFv-,5u ±) ±)†_£(ŠuA‡: £( (A‡:¤i* ¤…X*±‚@±‚ ±‹,±f ±# ±¤6!¢'Šf„E±±… ¢'Ÿj„E±†a±Œ7 ±(„% ±(™X £†v¢)ƒC £‹†v¢)‹C` ,¢„ ±Œ~±„i<¢ 4±…x¢$I¥„B-y‹5±†m /¢‰±ž±Šu±‡(¢ 𱑢¢(I¥™u-y‹5±Ž:U¦`ƒ‚7ˆk±„H±ˆ² “ ði¢‡*/¦‰(*fs¢†/±†0±†#£Av†±‚/±Ž¥ƒ[ †Gi†"¢ Y ±)‹ Z¦–sƒ‚7ˆk±ŠT±”R² ªX𱄢/¦Žy‰(*fs¢ /±N±Žx£š,v†±Š!±£ ¥™ †Gi†"¢…QY ±'…k ±'šo ±YU±ƒP ±„±/±‰ ±…9 ±‹E\+¤}‰r ±!s b*‚;‚L H)K+ ("[] ,¤–‰r ±!†( ’*‚;‚L H)K+ ("[] ±%‰" ±%”+%±—/±T±ƒF±ƒu ±®z±…±Š2±ˆ ¦”#RZ ¦«nRZ ±* ±* C  ±—h % ±—p±e±Š) ±„C±¡t£ˆEPg £¡kPg , ±,‡5f 0±‡+¢“Q¢„?¥tHk„ £‚ K+± ƒy±r£‚^ƒ[b±O 1±œ>¢¬w¢$?¥‹Hk„ £™kK+± б©]£gƒ[b±— ±‚N ±‡-Z *¢ =f¢ik±”A±ƒQ±‚¢†&.±†u±¢Š…R +¢ ‹ff¢…k±¬ ±‡@±„Z¢.±Ž±¢C¢š(…Rƒ@Y¢*n W\ƒc5+$0 ƒe&H7£†‰y±†:£-c±‚z¤‚ F¨L… 55ƒr ±ƒ£„w'0¦N‚B !V±ƒª :   @‰0.e ‚ d<t²Ep£^L   96M(3N$¯1J a!$‚"7,G¥ˆ8ƒ&‡! `¢…1n ™}\ƒc5+$0 ƒe&H7£—‰y±£ac±‡ ¤Š F¨‹c… 55ƒr ±‡q£ŒB'0¦Š:‚B !V±’Yª ©%   •D‰0.e ‚ d<t²¥xp£‡7L  ˆ 96M(3N$¯ˆ#1J a!$‚"7,±‚d¥œ\ƒ&‡!¤ 8ƒ ¤ Šaƒi 0¤…fu¢0\a£‡|¢‚‚±„?±ƒZ±Š ±±„ 4¤šy±…|¢¦V\±ƒ?£h¢†M‚±‹0±‡s±£x±†^±”& ±(ƒR ±(™ - ± ŠV[)±„-l ±‚¢:?£U‡2¦ ˆ#}`¤…1 u‚% -±S± …K±†L¢š%?£‹^‡2¦– ˆ#}`¤•W u‚%¢&ƒz6 ¢&‹l6 §„Y3/A §$3/A ±/†y ±/›±'ƒR±. ±'˜V±¡Rw9§'X&6Z\ƒ9«ƒMKK'5‚H¢‹¢ƒj£|I]²†]ಠ…/À²…0À 9§’]¢‚ ¤ƒV‘n ±‡@¢…p‚d¢ ƒ3D±„¢„ ‡[£„_ˆgF±e 8¢Q]¢‡¤œ|‘n ±˜U¢’$‚d¢ š~D±‹L¢™ ‡[£•ˆgF±¢ ±#ˆ ±#V¢(Ž4 ¢(¤24 ±(4 ±(¤g ±J ±¨p£ƒN £ˆN£ˆ)Pc £¡OPc±V±ƒb ±‡b±‰6 ±7¢‚m5 ±„¢—q5-±ˆS±#”±‹±T±C ±f±#­l±›C±‰Y±¤g ±ƒu ±’O ±†¢…t ±›%¢t ±ƒa ±ˆh ±(N ±(¦±„|±"„[ ±‹±"š±‡k±"†B ±‘ ±"Ž4 ±N ±¨tr%±& ±%‹{±–* ±… ±|±‘j±&5 ±«±&†| ±)‚a ±)ˆ($±“0± †%£qH‚ ±¬V± Žz£ˆcH‚¢&69 ¢‰D6±‘N‚4¤Œ};!±‚§‰ <$v(¥‚9 ‚*±&¥p<0… ¢‹&†'£^ H¤?%ƒ £6$±„&¤Wƒ. ¢b‚±„b±V±‚y¤ƒq‚sŽP^±†E W‚8VvKƒjZ‚5(7!J EU²ƒvp ¤¢;!±‹0§‘2‰ <$v(¥Œb ‚*±†¥ˆ6<0… ¢¢q†'£„ H¤‰ %ƒ £„U$±‹¤†+ƒ. ¢†j‚±‹S±…o±Š¤\‚sŽP^±›I — ‚8VvKƒjZ‚5(7!J EU²˜p ±$e ±$›P ±"8 ±"…m ]" ±"…± ƒ ±™:± ‡f ±‚* ±‡ £$˜ 0 £$±x0 ±’C¤*‚8H ±§V¤*ˆH ²ŒuÀ ±ƒ7±‚T²›OÀ ±ƒ5 ±‹ ±" ±"…= ±‚x± †³gŽ ±,± P³Š<Ž)±‚w± †³ež² ±+± O³Š:ž²© A£t$¢Œ2±U¢ˆ.O±†A £¦$¢¥X±¡j¢O.±‚r±Ž±… }* ±*‘#¢‚F# ¢‡%# ±“c ±«.£ ‚[ £  ±‰, ±šA ±*Œ ±*œ8 ±ˆ; ±—‚|¢G…O±L£“3‚$¢W?±Ž5±¢… ¢¢ƒ>„ ±±‰¢--:£1‡2£S ±„o;±…=£…-ƒZб†¥‰l‚'BXƒ`±¤BcZƒZ ¢–Z…O±†S£¬Y‚$¢Šu?±ŸJ±‰L¢‘T ¢ƒ)¢g„ ±‰±”6¢˜x-±ƒl£‰‡±„j£aS ±Œ ±ƒx±Ž£ŸƒZб‘ ¥Ÿ‚'BXƒ`± &¤•fcZƒZ  ±Œ4¢/ˆ±ƒ! ±¡G¢ ˆ±ˆh(±”e±‚¢5‚±†C ±©x±„1¢‹>‚±Ž5 ±“Y±ˆZ± 9 ±¨l±‘x± ›$ ±&…( ±& ±…J£ ‡S+q ±Ž6£ ¡>+q ±‰¢ –K< ±š2¢ ®< B( ±(•u ±+ ±¦Q¢‚ Y ¢ˆ,Y¢%ˆj ¢%“s ±ƒ4 ±ˆ; ¢v)LK ¢ƒT)±‰8±…¢!†- ¢‡g†- ±H ±¨n¢>Š ¢™dŠ'¥… ƒ P[ƒC¢ ‚=# ¥ž/ƒ P[ƒC¢ ‡#±&‚p± ˆ ±&Šb± œ* ± …: ± Q£mƒYŽD £›ƒYŽD¢„-z ¢Š9z#±–f*±ƒv±†1 ±° ±†6±ˆU±| ±r ±L ±'‚ ±'— ±'‚ ±'—¢„, ¢‰  ±@ ±Š ±'…& ±'š*±’Ks w¢Ž+¦ƒDu „O ‚s7>ƒ &†+@9©‰@n"~‚R0B±…<¬‚2 "% A K²…8€¤‚L¥‚v7U]Nª‚V ]A‚K‚nƒ( w¢£>¦ˆDu u ‚s7>ƒ &†+@9©šUn"~‚R0B±‹H¬Š6 "% A K²O€¤†tL¥Š<7U]Nª’| ]A‚K‚nƒ(±)…$±ˆ - ±)Šk±  £”Gƒg ± £­mƒg ±¡ 8! ±!ƒuVc±‘Z±‡l±‰~¢…i¢H¢ˆ#D¢F>5£tŒ_ ±…%±ˆ@¢wk²t ²j Q¢N„±]±ƒ±n±…^¨„ -6H‡p' . n±¦m±‘ ±›¢‹D…i¢‰L¢“:D¢ˆ >±ƒ£˜?Œ_ ±Œp±‘,¢ˆck²†H ²†r ±„j¢‡l„±ªH±Ž ±‰`±šb¨”F-6H‡p' ±†  ±—b  ±—j±>±Šh ±™ ±› q* ±*‘ ±v ±‡J ±U ± j ±%‚} ±%Ž ±(“s ±(©& D¤„l†X…F*ªaƒ)ƒ P[ƒC3h¢ ‚>#±ƒq±‚z±†W± ˆ¥‹‚ ‚l±…v±†p D¤™†X…F*ª›ƒ)ƒ P[ƒC3h¢ ‡#±‹<±†±C± “ ¥ H‚ ‚l±–±Žu ±,„t ±,Œ  C¢…±…{±ƒ¥P0QC'¤ 2#`© ) '‚B¤ +¢ƒ"¢6W£‚ L±ˆa F¢Ÿ%±—±‰(¥0QC'¤ „!#`©†f ) '‚B¤‡ +¢Š@¢‰ W£œ L±“j‚y±‹±‚¤P.…p§[ 0W S‰Aª .Is_ .±ƒ £*D1±®…¢ƒV  K‰  !/ JH†t |£~'±„t²p ± ± ±›?¤‘e.…p§ 0W S‰Aª ‡X.Is_ .±†x£ƒID1±ƒS®‰o…¢‘hV  š6‰  !/ JH†t |£Œ'±Š;²‰ pS'±„f±…¢ˆUD¢~•^¨„j3Lw±ƒE±? '±•{±‹!¢“lD¢›i•^¨š3Lw±“k±•c+±#±!ƒ£„(ƒ;±‡) ±¢6±!‡D£Œi(ƒ;±—O¤$4)! ¤$©)!I±‚¢‚7–-±X= ±ƒ±‚u± ±‚N±Z±ˆ±‡±Ž*ª‹\ ( ]G£ˆo†@b¢…{ L±—%¢›]–-±ƒ{± „,±‹q±ˆ}±‡|±†g±…±g± |±£.ª¡ ( ]G£™†@b¢ˆ…{ ± ‡ ±  ± ‡ ± !v6²‡F0   ,„K:'# )[ 4C$¤ …K,±„?±‚;±…  7²˜[0 Œ;  ,„K:'# )[ 4C$¤¦u…K,±™r±ˆ±Œ4 !* ±*G(¦#8W]V>D¤†v!U ¦#‰ W]V>D¤ a!U ±‚ ±ˆ$ ±-„ ±-Œ!¢”a ¢®±Œ3P ±› ±…z&± ±&ˆl±¥L ±-„6 ±-Œ; ±$‡n ±$¡Y¢U ¢/[j±ƒ ±„/¥;‚~%Œ]¢q‚¤„h?ƒ@±„C¢‚R)¢ˆK‚;±‚5±‚a±•±e/±‚X±…#¢ƒ(¤‚02‹Uˆ"¢‰m„Z¢†2-±ƒs l±˜ ±‰6¥ša‚~%Œ]¢‹‚¤’$„h?ƒ@±ŠO¢‹)¢”‚;±Œ^±Še±­J±…±„±‹D±Œ¢ŠF¤œ2‹Uˆ"¢žq„Z¢I-±˜ ±ˆz¢$‡u ±¢ ¢$œ±ƒ ±’; ±«aY *¢Mƒ5¢„.ƒ$¢†~I±ƒH±‚f± 7±…9¢6]±†i *¢©sƒ5¢Lƒ$¢‘'I±›±‡± …l±Ž¢Ÿ\]±Ž'¢Ž`3¥ ƒ :Q[R±˜Z ¢Ÿu3¥ ŠR:Q[R±²E £„ 8„±•* £*8„±¬u ±/“e ±/¨ % O±S±† £„1@§gd $8£‚$ +¤N2 ¦G„a!©ƒq" ˆ£}N «ˆ_%@   Q±Š±‘7£‹|@§„gd $8£…C +¤‚XN2 ¦‰mG„a!©’K" ˆ£ˆnN «¢J%@  % O±V±†"£„2A¨Z` $8¢‚&¦> /¦D„n¨ƒyˆ£~O ª‰ =   Q±Š!±‘9£‹}A¨„ Z` $8¢…E¦‚Z> /¦‰rD„n¨’Sˆ£ˆoO ª¢t=  - ±- ±-ˆ  ±† ±‚¢4' ±†H¢ˆ ' ±$ŠN ±$¤9¢ˆ&ƒ3 ¢¡Lƒ3?±„J²„4¢ƒU£0“!±†k±… ±“$²Š<¢ˆ £›“!±Ž]±ŠG K( ±(•~ ±$+ ±$§±‰JZ*¤ f„vK±4¯‹3  +-ƒ±„hµ„$D +¤ ‹„vK±„¯¢~  +-ƒ±žSµ $D£b„" £Š„" ±/’j ±/§ ±†p ±\ ± ±¢0±(‘±I ±(¦N±‡ ±‚T ±ˆ`‚e/U9±oC:BLLy6¢n…qM#9 #²@@J¢¢Y!¢„a!§d`: Um¤ /„<§|??h: Y±•h±…@±š(±Š ±‘X±†F±‰ ±±‚o±‹"±„\¢ˆr…q±‹d±„z±±‡\±ƒ±˜±ƒH±‡d±„±ƒ<±‚_±‰±„Q²Žh@±‡±†±†R¢†±„3±‡6±ƒ\¢„MY±ˆn±š ¢‹%„a±ˆ§•d`: Um±•O±…\¤B /„<±…p±‡(§ˆ"|??h:±‚7±”A ±†8 ±$ ±†? ±+ ±†F ±2 ±†M ±9 ±…& ±‘Zµ‡UU µ˜(UU ± ±©( ¤ ]²L ¤¦5 ]²¡a ¢ƒtf±ƒd ¢• f±Ž{N$¨B'…‡@±Œ±t±„K±…?¢†J7 %¨•U'…‡@±± ± ±•e¢šn7 j+ ±+†CIb G/~  <!S$ G ), #%‚M"-1,_s  Xƒ7¦ ‚'!¢‚$± „b b GšU~  <!S$ G ), #%‚M"-1,_s  Xƒ7¦ ‡!¢†P$± ‹y5¥}B#D±‚¥„ ^$±„ ¥¨HB#D±‹¥Š^$±‹9 ±…: ±‘n%±n± ‡O±‚$±L ±¦± ’f±†Y±‡…?‚J§ƒa¯‚B9 „&‹TPD ‚*1£T‡¤7£ˆB‚h¢r±Z§a†=LM=²}à±…Q²ˆð¤n5!© ,9X­ƒg!9"‚$ L$ŽgƒV& ƒj  & *  &(=;+5c A    7)*&H‚nI, $   W „.P…TG)¤8"‡S§N„6 0g:D*…)*d Z ? ‚B9 „&‹TPD ‚*1£‰r‡¤’37£”MB‚h¢ƒ±Œ§Œx†=LM=²ˆC౎=²–tð¤†5!©ƒI ,9X­Œ<!9"‚$ š7$ŽgƒV& ƒj  &‹ *  &(=;+5c A  ‡} 7)*&H‚nI, $ • W „.P…TG)¤•k"‡S§†„6 Vg:D*…)*d Z ? ‡/¢‚L&¢!„ L;z¢‚_h¢~r=¢ƒ‚:±‚I±R±…"£V7t¢S…P±Œ3¢GZ¤`†zŠ/‚±A«po  ‚d±… .±–o¢†R\¦›Cƒ2ƒ4‚yŠ¢Š^w¢“+„,¢‰q„w±K±ƒ?£J‚n>¢ŠP&¢Œ8„ ±ˆ±ƒ±˜E¢ˆS‚_±„W¢„r±‚y¢‘u‚:±ˆ±‡Z±Œ£„o7t¢‡q…P±¦¢¤KZ¤–†zŠ/‚±‡«‰uo  ‚d±™? ±ƒX ±ˆ_£(Š9 £—sŠ9& ² Ð  ±; ²Žeб ‹±ˆ ±•%« ‚?!4NI, « ŠC!4NI, ±‚ ±Z¤ƒ ¤Œk ¢(H ¢¤;H ±$‘k ±$«V ±ˆU ±  ±¢6 ±‰& ± qta ±„c±ƒ ±„g ±S ¢†=³ Dc ¢’q³ •wc ±…N ±Ž: ±Œ ±šv ± ‰, ± “U ± ‰/ ± “X ±†g ±2 ±‰q ±¡<±±… ±ƒ_±t ±‡1 ±˜F ±ˆ¢'„. ±™(¢'‹'. ¤#yUCJ±P ¤#ŠNUCJ±›; ±‡o ±: ±$ ±¥7 ±‰u ±£±‚V± ±‹t±‰r ±‚b ±‡¢&hq± ‡N ¢&ˆZq± ›r ±$•` ±$¯K a±$‚v±†- ±•t±$±–S ±/ƒy ±/˜ ¤‚iN+‚< ¤‹UN+‚<P%±’>£—L±’'±‚±ˆ±ƒ¢f„Z¢Cƒ; &±§Q£°r±©r±†I±¢ ±˜ ¢ˆ}„Z¢”gƒ;+±‹ ¢‹|±“¢ˆ;‹ ±¤3¢˜0±¬k¢n‹ ±)(±:±S ±)†o±‘`±‡,E ²Œ.У‚uf'±„*¦l±…,±Š$ ²¥TУ‡*f'±™.¦ˆ(l±1±žH'¢~4¢#j@£ƒ"($ ¢‹4¢#¥n@£‹'($ ±*Šs ±*› > ±‡*„C%‚¨‚‚;"%‚~„Ca„,±‚¨†‚ 7¢‚B?¦„d;ˆ)ƒk¤… h‹§ƒq‚‚:CWe2¢‚`¢…d+¢6‡©‚g„c‚ S/‚F‚) ‚¨—!‚;"%‚~„Ca„,±‡¨ŸA‚¢!'8£†,\¥‚4ƒtOIv¥4'EO!§(0O‚U29«‚?   "0G‚nƒKS ‰BP ±²‡wp£3 „( V¥™Y‚jJ…P±›%±ŠI£‘r…¢‰0W¢±ˆ9£Œ„A£ƒ5wE špwZHiQb ! &†z(tS p2>¢‡l±„±ƒW£\¥‘ƒtOIv¥„M'EO!§‡F0O‚U2±„n«‹   "™0G‚nƒKS ‰BP ±Œ#²*p£…z „(¢( ƒ! ¢(¥<ƒ! ±(’w ±(¨* G£‚W:‚4±…Y±ƒ&±„W¢‚„±5¤…p‚;h±‚I£‡&…:9>±‹9£7,§TO<f I£—j:‚4±–n±Z±n¢™Z„±§ ¤y‚;h±Š;£œ*…:9±•q±›_£ƒT,§¤>TO<ft6£„CˆXd®0 '?‚Sd$(±#‚~£F ±‡F¨;4‹‚? 9£iˆXd®‰90 '?‚Sd$(±#˜£‡] ±K¨”_4‹‚? ± ±©7 ²(‹{À±‹3 ²(¡.À±›Y ±Q ±¨w ±‘:¢„]‚- ±¦M¢“7‚- ±‚9 ±…<±ƒ±mª.‚kJ&K2± „  ±†:±œGª…[.‚kJ&K2± ‰gy 5¢„>d¢m]¨4= ‚ <¥8l|<±"±ƒ ± ”5±'±ƒ ±‰A 9¢dd¢Ž!]¨„g4= ‚ <¥ˆl|±ƒ[±Š±‘c± ® ±Œ0±ˆH ±Œ7 ±› ±*‡b ±*˜ ±(Œ ±(¡3 ±'U ±'¢Y‚¥‚H"d ‚²‹: $ ±N£Œi2‚'ªw!(; ' :'¤‚9 £ƒ.‚¦Hh! a£Š#j?©kfM=¬ /"I,!'²ƒ\ౄn£† ²ƒ,p±‚£MM ±h ¥—["d ‚²œO ± ±‰£¤42‚'ª„)!(; ' :'¤†( £‹|.‚¦†h! a£˜}j?©ˆWfM=¬†{ /"I,!'²Šzà±C£›  ²ˆsp±’+£ˆRM ±k ±¤~ ±†J ±h ±!D ±!…„M‚¥p’q<9§0?cD¥‚‚0’U m§'„+*5¤`)f¤w1ƒ6¤G/a¦n@8ƒ{²2ð§"#5&‚@¨c%„ TO„©K‡k‹¤R…(3V£‚8‚D‚G³…+\±…2³…,\' gMX   @^ 82  CZ L~  „_ JW %WlK5¥*q5ƒ!ƒ]±‡Q£/Œ‚¥ †mo‰£C„!¢ƒ m±“S ±‘' ‚)¥–’q<9§…%0?cD¥›(‚0’U m§ŠE„+*5¤‘u)f¤ˆ1ƒ6¤ˆaG/a¦"@8ƒ{²‹[ð§„H#5&‚@¨‹z%„ TO„©˜‡k‹¤ˆ…(3±ƒu£‘‚D‚G³Œ\±‹:³Œ\±„@ ‰<MX   @^ 8š2  CZ L~  „_ JW %WlK5¥‹3q5ƒ!ƒ]±C£•3Œ‚¥–?†mo‰£† „!¢Š$m±§w¥‚x(+R. ¥‡W(+R. ±v ±¢ 9±…uz¢ƒ±gF?±‡! ±@±ˆE¢†o±„#±„_±‡]±¡ ±(’_±‰T ±(¨±™z±- ±&ƒ ±&Šw ±(” ±(©8 ¢#~E±’C ¢#ŠSE±¬. ±•@ ±­ ±)[ ±)‡" ± ƒW ± Šu ±‰±„P * ¥”E  ± ‚M¥š”E  ±'Š9±‡v± ±'Ÿ=±˜±ƒ"¢„) ¢‚?£„ ¢‚¢5¢{E£Z‚M^±£ „F±<£^U¢R¢W²Уw J±±±‰M£)'±]±£+<¢dG¦‚AL%`¢‚o‚±‚d¨#O‡.„J0„7±‹ !£™! ¢›4¢ŠS¢’E£†f‚M^±‰c£=„F±‹e£…U¢ŠR¢Œ-±…6²ƒxУ™B J±…±ƒ<±˜'£‡t)'±‡e±…/£„`<¢‰9G¦œ,L%`¢x‚±—h¨•VO‡.„J0„±…~±›F"¢$‡H¢ ‚ZC±‘j ¢Ž~‡H¢ ‹/C±§¢"K ¢"…I S ¢I¯6†U  rSM¢…_‡L $± ˆW¢‚|I¯˜†U  rSM¢”9‡L%¤ˆS'‚7±=±Œ; ¤—-'‚7±‡± _ A£… …±‚h±…¢!C±…t±‡(¢†%¤ƒi‚;5¢„=±’±“±ƒ¢{> A£š3…±±'¢„SC±?±–¢%¤‰qi‚;5¢‹[±¬±¨N±Š¢–>-±(‰?¨9 <$@ ±; ±(žr¨_ <$@ ±‡ ±$…] ±$ŸH±‚5±‚ ±‹!±] ±&†G ±&Ž9 ¢‚Y±ŠT±ƒ ¢ˆ Y±•k±†B¢„A ¢Š ±(’i ±(¨ ´'„6¬Ð´Š0¬Ð ´'™:¬Ð´žT¬Ð¢ ˆ;= ¢ ’d=±%‹±… % ±%–±ŠSd-¤‚U`±‚!±§ )DX† ¥ƒNB!†?ƒC±‚H± „  .¤Š `±…@±ƒU§ˆs )DX† ¥’(B!†?ƒC±‰9± ‰W ± ƒ' ± ‡Mi±ƒ` ±C±‰'' ±”z ± ‚J±®e'¢Žn3¥ ƒ:QWV±˜h ¢ 3¥ Š`:QWV±²S,£@,±;£_ ‚$ £¤S,±œ±„2£‡} ‚$± @£… ‰l‚t±†c¢‚O¢‚q„2±…r±‚@±”[±‚z¢†(ƒ±,±„r±‚¢ƒ_P @£š‰l‚t±—x¢Š#O¢š<„2±=±ˆ±®F±Ž¢›,ƒ±¢_±•±‡]¢˜P ±(’u ±(¨( ±!ƒ ±!†D ±† ±dL £„H!±'…'  ( * u"-" ±,Ž3 !£‰O!±'Šn ‡ ( * u"-" ±)‚1 ±)‡x¤%†E ¤†E±+‹=4 P¢‚VˆT±i TN…ƒ3?`?„O! =\p.6© ‚V)nw ¢…\¢^¢+0±…<±O ±‘_±ˆx U¢—iˆT±„G ™N…ƒ3?`?„O! =\p.6©ˆx‚V)nw±„E¢“x\¢„w¢‡I0±Ÿ'±‡ ±/…a ±/š ±… ±x\ )¢W±Œ`± ¢eVg±ˆ ±ƒr¢|„t±”h .¢†$W±¦±¡ ¢‰QV±…±–c±ˆ'¢‰n„t±©l±”: ±(‚ ±(˜2 ¤…9ƒƒ7„ ¤ž_ƒƒ7„¢‡=/ ¢/ ±(/ ±(¥b ±“v ±© ±ˆ5 ±‘S ±(G ±(¥z_ -£‘)‚?±k±ƒ±‡V± ]±± ‡Z¢‘-!¢‰>±ˆ% -£¦<‚?±†r±‹]±‘± …L±_± L¢¦`!¢™7>±œI ± ‚? ± Œh ] ±‰{ § „q-,5u § Œu-,5u ±= ±„-±ƒ± †*±†±1± ±<± u±`±§±–M£&ƒv. £&‹h. ±,„ ±,‹1 }± ƒk±” ±…5± ˆ ±©B-²ƒ@² †@²,@²@ ²7@² [@²§@²–H@ ±ƒ9 ±˜Lc .¢Oz±„E¢ƒP•±)±… ¢‡.’8¢‡C‡±ƒC±…Z 0¢¥bz±‰L¢œv•±ˆt±`¢¡’±ˆ*¢œG‡±ŠZ±™~ ±‚q ±‡P ±Œ+ ±› ±-…* ±-/ * ±*? ± ‰C ± ”Z ±‡@ ± ‚|7¦%‹T‚tK¤w."N®…]Il_ƒ=gJDN'c¯‚P_ ED ¦‡z„^$¥y0¢ƒ;‚£„J©gj= $A §_6%k¤„*[Gk§†LQG/‚3©[¢‚['±]¤@M‚I±8± “K±…. >¦–8‹T‚tK¤†~."N®™8…]Il_ƒ=gJDN'c¯‰2‚P_ ED ¦™z„^$¥‡0¢Œ‚£MJ±‚8©Š=gj= $A §†6%k¤Œ.[Gk§‘cQG/‚3©…:¢Š&'±ŠI¤‡M‚I±‡@± ¨~±•T¢(Ž] ¢(£G] >$ ±$š) ±( ±(¥H ±‰ ± K ±*ˆ_ ±*™ ±ˆ^ ±•#¤‚¥ ¤…8¥ƒL+¤‹' Dƒ7± a¢ƒwA ¤ : Dƒ7± †@¢ŒLAƒ9¢‡ ‚GX±”U±„a¢ˆƒ*±S£?… ¢‡pZ±\¢>„ ¨8„]}Ep‰±ŒB±ƒF±‚^±†±„1#©[U l„j ‚  ]% )#†&0‚_‚K¥gv ¨a 8‚S¤ˆBˆY>¬g1M$?‚!"‡ ¤Š"‚-…i F¢œ3‚G±…_±­{±•v¢”Nƒ*±ƒv£Šh… ¢“Z±†;¢ˆ„ ¨™„]}Ep‰±›±‰±ˆf±Œx±‹O±ƒ`©‰0U šW„j ‚  ]% )#†&0‚_‚K¥‹pv ¨•e 8‚S¤uˆY>¬‘ 1M$?‚!"‡ ±ˆ¤žF‚-…i£S†R £-†R ±… ±Ž ±† ±ŽU ±Œ6 ±KE±‚g¢V‚±L±ƒ,±‚K±Au "±œ ¢Št‚±„7±ƒ±‰±ˆS±…Z±ˆ ±#…x ±#ŽM} <¤‹o±˜I±‰ ¢l…£ƒ#±%¢‚mD±ˆ"¢‹H…s±Ž:±…l±…^ <¤¡±±o±š!¢Œ…£˜jƒ#±…Z¢‹BD±“+¢ L…s±£m±±c²#‡+ ²#  ±t=±’4 ±¢ ±š(±§8 ±% ±¨K?±„ ±±‰O\+¯'‚r   / J3(‰y  ,¯'—v   ”S J3(‰y  ²‚R² N ²‹p² Œe#¤'ƒA'b ¤ŠD ‚L' ¤'˜E'b ¤žh ‚L'G!¢ƒ2ˆ¦„2S/:E/±ƒ±±O¢”5$ !¢”Gˆ¦Œ}S/:E/±Ž6±ƒd±ª:¢©h$J¢‚E‘¢@&£„A’:±‡e±ƒ±ƒ ±†G±…±„B¢x¢†g‚H¥B …tƒy‰±ˆn±…;± M¢—X‘¢…G&£g’:±‘±”4±Ž#±ž±Œj±.¢…¢ R‚H¥•F …tƒy‰±ž!±‹±ƒ$ ±ƒs ±ˆ ±‚T± P ±‹r± ŒgL±”x¢„pˆ7¢T‚¢‚h±‚C±ƒI¢ƒ@‚±ƒQ±…,±“"±‚£‰ˆ<‚o±’±…v±‚±@ L±®¢–ˆ7¢Œk‚¢ˆj‚h±‹/±’#¢‰H‚±ˆ±Ž±­ ±‰u£žˆ<‚o±§H±{±„±•d‚% ®< Q‡ |Vƒ  4r4¤‘T‚m £†~‡Fl£1…e¤†‚9ƒ±‚± ¬/…#1J)63M=$£ŒcH6¢YD:£†F‚n‚d¢‚?¢‚J+±– ±…)±…±;±‡d¢Šuˆi ®•O Q‡ |Vƒ  4r4¤ªz‚m £˜‡Fl£‰|…e¤’K‚9ƒ±„$±‹I¬‹F…#1J)63M=$£¤.H±ˆ¢…HD±ƒY£• ‚n‚d¢ˆn?¢†+±¯w±2±š ±‡±i¢Ÿˆi#¤'ƒ?'b ¤ŠB ‚L' ¤'˜C'b ¤žf ‚L'|9 '&/( ("N#9-@\URyV‚d /T2±"…Z±x  : '•&/( ("N#9-@\URyV‚d /T2±"Ž/±‡?-±„2±†w± t±Œ ±† ±f±’± †,±œ0±.¢iƒ" ¢†=ƒ"g0¤‚ e²…5pX ‚(vK ‚B"v±ˆ9±…6 2¤Šj e²‘ip±ƒ 1vK ‚B"v±˜_±; ±ƒ± †± ±6± Z±–GƒG]±Žh¢ŒYq±ˆ(¤…w‚EH±„4¥† F9§JO &ˆ)au`V…QX`$£6‚4"ªAR&N¢‚$£ i±T£/‚5£_‚*­‚EC V!&V w8¤]M‚O_£… ¤-ƒg¬]*  e0§g#j0¬d$=!‚2&©‚:K‡^8 £ƒ, ±ƒu c±£{¢¥q±s¤’+‚EH±Ž]¥S F9§ƒ(O —qˆ)au`V…QX`$£ƒh‚4"ªˆ_AR&N¢…q$£„)i±„£Š‚5£†‚*­‘C V!&V w8¤‡IM‚O_£Šj ¤‡5ƒg¬‡N*  e0§…#j0¬‰$=!‚2&©—mK‡^8 £“R ±˜4¢y—-¢?;¢76>±†B ¢š—-¢‘T;¢†C6±‰ ±ŽFJ"±U± ˆG¢vƒ± ƒ]±ƒS¢|±„v±Œ #±©{± “^¢¨Aƒ± ‰1±‰[¢†U±Œ{± .±“d±„ ±¨w±<²‘&P ²ªLP ± ±¨:²$‰J ²$£5¤*‰d…A ¤*š …A ± ±©/²ˆ9Ð ²‘Wв} ²©# ±$–L ±$°7 ¦ „{Ha K ¦ ŒHa K ±(" ±(–U/±ƒb±‚±‡¢Š=± ƒ, ±‰j±†)±l¢•F± —P!± †k¦ƒ$u,P', ± ’¦Š;u,P', ¦„Q¦…v…‡ }ƒ ±† ±Š£„ ^±†¨‚ F‚) £‚ 0Q¢‡ƒk±‚¤‚i†YŒ!*±‚I£@U'|£ƒX…K,±‚s±‚¤‚  1±„F¢…#>¤†Tˆpk¢ˆP$¤ˆuƒbp„ 0‚t|Zj‚ƒW6L /‚ ¢±‡N¢ƒ‚C¢‚Mƒ0 J¢˜QQ¦Ÿ…‡ }ƒ ±)±›(£Š^±Žd¨‹@‚ F‚) £†20Q¢’ƒk±‰T¤š4†YŒ!±ƒ\±Š£„/U'±ƒ8£’2…K,±ˆG±ˆ¤†$ 1±‹d¢x>¤ ?ˆpk¢“Y$¤yƒbp„ –c‚t|Zj‚ƒW6L /‚ ¢†a±—t¢Š'‚C¢ŠRƒ0±‚9 ±%‚ ±%)²%‚Ð ²%Ð ±'Q ±'¢U±%‚E ±%N±…l±˜v ±…+ ±žQ ±+‚\ ±+ˆ5²*5Ð ²*‘[ÐG ±“¢Ž ,±±0±‡\±Œ P¢’yr "±¨¢Ÿ",±‡#±ˆ!±N±¡>±†)¢§r ±‚!¢ „( ±{¢ Œh( ±)„" ±)‰i±y¢= ±œS¢†=¢&ƒt/ ¢&‹f/ ±Ž¥-#b k ±œo¥†5#b k ±Ž¥0Y„ ±œa¥†'0Y„ ¨(†X‰gN9N 8 ¨(œ ‰gN9N 8%§Œ>hX £‡y+ §¥dhX £D+ ¦ … ‚e&U" ¦ 6‚e&U" ±ˆe ± 0 ±‰p ±£ ± ƒ& ± O ±(P ±(¦C±±ˆ±‡o±Œ.±M±‰B±ƒ ±¥/±‘0±Ÿ:±ƒV±¡2±‡±™h±Š! ±‚= ±†u =£ P‹y¦<#‚MP-H¤qo'0¢‚q„b¥‚Q± R¢†CH±t£‚}0±…w ±ª* ?£•P‹y¦…C#‚MP-H¤›o'0¢Œ„b¥‹± §¢H±‡;£Š0±š r* ±*‘¢ˆ%ƒ3 ¢¡Kƒ3±ƒ- ±Š±ˆj%¢‹"X±'‚W¤+_# ¢œ7X±'‰n¤¤O_#^,±†±‚;¤‚1z¢‚$±‚I¢A¤‚+‚4£^‚P -±`±…¤‰|z¢…r$±…h¢ƒ}¤‰‚4£‡O‚P ±„, ±Š ±‘5± ‚± ±¦H± †d±…S£(‰] £(Ÿ‚^'¨Aƒa@ '±1±‚ £9 px¢Wƒ+±¢„d±9¢[e¨|,~(wG±$±R \rn†< P]!cgJ‚@Z.±‚y¤‡T& ±ƒ©‚@B_04IQKt¤"Q ‚#±ƒg£8‚Bq¢…br¤ƒ6„-O±ƒy 0¨–Tƒa@ '±†8±›1£‰W p±’ ¢†cƒ+±‰`¢:„d±‹b¢…e¨Š,~(wG±Œ*±‡j±„0 ˜'rn†< P]!cgJ‚@Z.±†h¤@& ±‡;©‘B_04IQKt¤‡Q ‚#±ˆ£ˆV‚Bq¢Ž7r¤!„-O±‰@ ±,„ ±,‹0*±ˆ ²…:€L£[‡} ±”>²š>€±r£”‡} ±† ±ŽQ+¦ ‡v6s§“V-7  " ¦ ’6s§© -7  "%±Ša±Œ± ‡2±Œ( ±Ÿt±šj± œ6±¡[‚c*§‚†"?…¤…8o‚g£ƒ9$£7/VR±X¦‚^‡)‚w3)…N¥G£ƒ6£'c±ˆT£'` ‚Ly?8O0 (B ^£G¦„W3¢`‚%±ƒ= O?9 8MN9'K;r ±…8±ƒz±D 2§—,†"?…¤ŽVo‚±‰2£09$£‹N/V±…1±„6¦š)‡)‚w3)…N¥ƒy£†v6£‚cc±‘@£…='` ‘&y?8O0 (B ^£ˆ G¦Š W3¢ˆQ‚%±‡V ‡:O?9 8MN9'K;r ±Ÿ#±‰A±‘j ±/†^ ±/›#±†±ƒeA±ˆf ±/±‰q±ƒ~±j/ S¨6‹+ „±‹±Ž-¥ƒFR£d„£x04¤„p‚-‚5‚R¥‚h4&>±x²‡Y £‹a‡90±„F W¨•I‹+ „±¤+±ŸB¥‰RR£‹ „£¨C0±ƒf¤“J‚-‚5‚R¥ˆp4&>±†-². £¥L‡90±Š +¯”q ^ ¯¬< ^ ±• ±®B± „P± J ± ‹n± ‡#±ƒ±$ƒM ±˜&±$ŽV ±)z ±)‡A ±. ±¨T±‚(±ƒ ±‘±ˆa±†I±‰r ±5±ž¢(‹<‡6 ¢( o‡6…I"‚]¦ˆ-GNJ‚5V§…8h4CJ*„ª58M‚FbG1 ¬ƒv $ƒp9qy;¢„{¢ˆ`&® ) 8B+p Ff±‡C¨6‚0$± )@  RMTU2¬ƒ‚_„]D7mZ‚4*ƒ'(±…±‚d¤†3r1t¥‚^/ZP£$X‚#±¢…'¤`eVH¨D%ct s:Q±‚¢qƒt¦‚I‚f‚„ ‚p¢ƒ{Z¥‚9c‚I«@ƒu+'ƒA„‚6) ƒ0L9: H@jqDC7„Nc¨m‚F‚34A±‚)£ƒ7‚|8£D„6)ªX ƒlƒBˆ‚ ‚e¦@GNJ‚5V§ž^h4CJ*„ª‰S8M‚FbG1 ¬• $ƒp9qy;¢†'„{¢•&®ŠI) 8B+p Ff±G¨ŒM‚0$±…~ ‡o@  RMTU2¬šO‚_„]D7mZ‚4*ƒ'±ƒZ±Œ_±†S¤• r1t¥‰J/ZP£†xX‚#±‡#¢Œ¤…yeVH¨ˆb%ct s:Q±…U¢‰Fƒt¦œ4‚f‚„ ‚p¢Z¥‰v9c‚I«–Dƒu+'ƒA„‚6) ˜cL9: H@jqDC7„Nc¨‘'m‚F‚34A±ˆ£ŠN‚|8£‰I„6)ª”| ƒlƒBˆ‚~w±Šp±"„u  5 % 9{co <B?&…R]£(E¨) ( , L064)R00() 5 bdCp\0ƒ‚N ±/¨M |±¤±"~  •9 % 9{co <B?&…R±†$£…v(E¨ˆ*) ( ,”-L064)R00() 5 bdCp\0ƒ‚N ± ‡S ± ‘|u.ˆ *A"x7S?1$K,'' 'kZs:L (4+58‚h;a1   j / %9. %N 0C  -#ƒ$. o P"60w 2$d ;&S !=9$"GƒH#* d~=0G   D+‚S0 !+ R !6pq k01$kJ/ ;6S;:ª@_>‚pBAN '!#% V‚;Sc^pn;FZz])*&2Q#!W4/  -!N6v &K _ W]; YokF~Y"n;d#'# =>~&"+ %,$  <0 |hat-4 9)' A;1P*5 *&«3" X!5‚k¦'QDD.3¨*‚(jIh!¥ + 2j(G6hFc?U-(6< 9B%DS1$)#@l ± ±‡±ˆo± „@ ˆB *•T"x7S?1$K,'' 'kZs:L (4+58‚h;a1  Iu> o ‰%"60w 2$d ;šS !=9$"GƒH#* d~=0G   D+‚S0 !+ R !6pq ‹t01$kJ/ ;6S;:ª‰2_>‚pBAN '•!#% V‚;Sc^pn;FZz])*&2Q#!W4/  -•TN6v &K _ W]; YokF~Y"n;d#'# …e=>~&"+ %R$  <0 |hat-4 9)' A;1P*5 *&«† " X!5‚k¦‡>QDD.3¨ˆ*‚(jIh!¥‚' + 2•(G6hFc?U-(6< 9B%DS1$)#@l ²'„MвŠGÐ ²'™QвžkÐ U" ±"… ‚ M¥…X>£ƒ,ˆ±…y¥ˆ=AM=±Œk±ƒV±‚#±‡+¢Š;±†±‚2±†z¥Š6LH†…8±‰&¢†s±Ž$£0‘J‚¨‚%]34'„o±4w¥ˆ1‡vA ±•`¥Žv>£`ˆ±9±…¥“=AM=±¤6±‡E±„_±¢˜b;±Œ~±†K±Ž¥¤!LH†…8±”/¢ss±£(£•c‘J‚¨’K]34'„o±‡ ±ˆ|¥•,ˆ1‡vA)¤‰BXh¤ ‚s-L±# ¤¢hXh¤ †us-L±–V ¨&ƒ$FgF ¨&‹FgF+±ˆ!;±„A¥–D  ±–{±„p±¥°/  ±)‚' ±)‡n ±*ƒy ±*”±± ‚< ±¨(± ‡ ±'L ±'–P ±‰= ±šR5±‚±“£‰>)|² ‡€±. ±‰V±ªZ£˜)|²  m€±†u±Q± „ ±žf± ‹Fs 6±ƒ4±e±Q±ˆ±y± „ ¢ ‚D±…0£Œ?‡s±…Co£1‡Š 8±˜G±¡z±‡]±Q±± ’c¢ ‹TD±9£¡C‡s±•i±†H£•U‡Š9£…N†-£‚3†J²#‘ 0¤„@ £žt†-£‹Q†J²#¦$0¤ŒE‹1-…J  iƒvPOdbxK*<‚qbaC R¦T\&  Pw7 ZB ?J‚!_„ƒ ƒQ¬(g?P\M-G wjW W „d‚N§VP)‚22O¦‚ 9„?«*6- "®,3k&H>¥Ze/2­J&%P‚&s *VZ VO?j(Zf±ƒ% ,,<w ‚%T t Y Pp?u)‚,0,l'%  |.2‚‚H¢M©. ƒ-‚'!:¥‚I$ '¥3 0¢a'¥ƒ+( ƒg¢‚:®d<ƒ EYZ1%¤ƒd6±‚G¢i`¥ ‚[ |¤:bF<§:R‚`j[¢‚+g¤ƒM* ¦Q‚|L‚h 6C3†vƒ..1  ƒ@J‚g2ªFc *a}¦b}M‚j +E +kTj7&2)@V WflL)@=-^3 } ‚_ <&o  9_V/@O9>@>„IH± s^c -y@ , zZ+§&?n':  wR$1 "  ]Tp-$ ¨1M{3'M  #75%‚+.‚K{q> #Yo;.ip% …` – iƒvPOdbxK*<‚qbaC R¦†[\& š8 Pw7 ZB ?J‚!_„ƒ ƒQ¬Š9(g?P\M-G ’ jW W „d‚N§†bP)‚22O¦‰_‚ 9„?«9*6- "±‚@®‹H,3k&H>¥…e/2­‰ J&%P‚&s Œ)*VZ VO?j(Zf±ˆ ‡r,<w ‚%T ±ƒR ˜$ Pp?u)‚,0,l'%  |.2‚‚H¢„©‡y ƒ-‚'!:¥†8$ '¥ƒR 0¢„'¥‹t+( ƒg¢…H‚:®><ƒ EYZ1%¤Šd6±ˆ¢‡q`¥‡~‚[ |¤„SbF<§‡XR‚`j[¢…hg¤‡HM* ¦ˆsQ‚|L‚h š!C3†vƒ..1  ƒ@J‚g2ª‹Oc *a}¦ˆT}M‚j +•I +kTj7&2)@V WflL)@=-^3 } ‚_ –o&o  9_V/@O9>@>„IH±†H ’^c -y@ , zZ+§…?n':  ‡'wR$1 "  ]Tp-$ ¨ˆ6M{3'M  ”G75%‚+.‚K{q> #Yo;.ip% ±Žv ±¤ ±,…U ±,Œl ±„g ±Šo ±-‡g ±-l³‰>: ³žQ:³‰CU ³žVU³‰<š ³žOš ±ˆi ± 4 ±'ˆ ±'  ¢'4‚±‚` ¢'¥8‚±Še²‰+ ²ž>¤ˆ5 ¤ ²‰2@ ²žE@ ± ‰ ± ”²‰/ ²žB ¢'5‚±‚a ¢'¥9‚±Šf-±p±Ž±±‡q±‡_ ±†w±Ÿ%±‡(±u±Q ¦‡\ ¦œ\  ±#…±Š.±’ ±#p±Ÿa±¦,'¢Œdn±I±ˆ±P ¢¦ n±¡^±Y±†/%¬/†o   ¬/›  !±ƒ5¢Wa² ”V° ±‰A¢Š"a² ©Z°V(±‡¤F‰QjU± „²ƒr€¨ …k0±…P²ƒ ` )±O¤Œz‰QjU± ‹]²’L€¨ ŸV0±šT²—1`±±ˆ ±¦7±]…G/‚Z¥…X„V‡W‚i¢gƒ¤‚A‚“!§‚v1%U‚5§ƒˆk0tm‚X¢ƒC‚8¢(‡¥ƒV‚cƒ[±‚±Š£‚d¢_‡¥o‚„.Lƒ±„N£3(±‡5±‚M¦†b„w‚?†‚ ¤AD‚±‡:±ƒ^²ƒ P±‚+¢‚†<¢ƒ9n£„tˆQ¤‚rh‚G:±…C¢D„3¤T„ g£u‚ £„‚l ±ƒ,¦3EW:¤T†fCG©’?‚vqbCB¥bƒ~ƒv£‚Aƒv*§v 0…*r‚oŠ"¨{†%J@‡cƒ^2b¦ZS„B….i¢‚T‚t£#„J¢‚ …i±‚ ¤‹5„`>‚@ ‚f¥šk„V‡W‚i¢†nƒ¤šA‚A‚“!§Œ1%U‚5§”2ˆk0tm‚X¢‰O‚8¢‰s‡¥ ‚cƒ[±„5±”A£†Cd¢ˆc‡¥Œ‚„.Lƒ±‰-£'(±Ž{±…+¦ž-„w‚?†‚ ¤ƒsD‚±±‡M²†(P±„g¢‹ †<¢‡qn£^„tˆQ¤‰^h‚G:±‹¢‡L„3¤ˆE„ g£†‚ £‹6‚l ±†i¦„hEW:¤‰)†fCG©¬*‚vqbCB¥‹kƒ~ƒv£Š3ƒv*§•z 0…*r‚oŠ"¨–.†%J@‡cƒ^2±†)¦‘S„B….i¢ˆ-‚t£ˆ:„J¢Š…i±„)¤ŸY„`>‚@4£‰]bƒf¦6‚ ‚Ec± „&  £˜7bƒf¦†6‚ ‚Ec± ‰m£(‰^ £(Ÿ ±(> ±(¥q ±(ƒ\ ±(™G ±†-¢1z¢Gv¦‚b„= 1³‚Qö±/ "±›@¢ z¢„|v¦k„= 1³ŠCö±‘U ±‚Q ±‡0¢(‚7] ¢(—j]%¢ ‡zE§“W-7  " ¢ ’#E§© -7  " £'‚n>^¢+‰{ £'—r>^¢”O‰{ ±,†R ±,i ±#†Q ±#&ƒ/H±• ¢qƒ¤Œ?gŠt±‰±‘£‚5Y‚x±ˆE±Œ.±‚±Š#±„ ±‡~±‹±„Yn±‡@±‚X±—E±ƒ,±‡E±ƒi±ƒ±‚6±ˆf±„2±ŽT±†f±…N±†±†k±„±‡±ƒ7£ƒz0±ˆO±™e±‹±‡l±”~±•-±…A¢ˆ&‡z±…S±‡±‡±‚±” J±ª ¢†xƒ¤¥egŠt±’6±¢$£ˆAY‚x±‘±˜b±„@±”L±ˆF±±–(±‰8±b±±…6±¯±†^±±‡X±†8±„r±‘R±ˆj±.±R±‹"±Œ ±\±ˆ,±Ž6±†t£‡:z0±‘$±³P±– ±^±ª±ª`±‹¢˜L‡z±‹,±Ž(±±„4±¨B‚z3©@7‰?Š72.   $ˆZ8 I` * !`¢9‚p?i¢lj±…v{£ƒ ²i £ƒC+H²A@±d§p† ‚ŠF¢[_ª†N‡WQz?=¢>ƒ ,?%V 49 ‚A+ƒN& ¥„0-f|±r @©™f7‰?Š72.  ‘' $ˆZ8 I` * !`¢†E‚p±‰ ±ˆm¢†Kj±A±ˆF£†q ²„% £‰K+±„a²‡_@±†§™}p† ‚ŠF¢¥__ªœ‡WQz?=¢‡ƒ ‘E,?%V 49 ‚A+ƒN& ¥Œ5-f|±„-±ƒ$±p±…L¥ ‡3 C ±‡±„,±Ž8¥ ¡ C‚n2¢ŒLŒ±C #] ! ,1 CS/e//§?S @ ±‚5±‡²6°« ƒP& ¥C‚¤$…5±ƒ ±ƒ¤03'/«…‡j,HQ;%‚H&£† " ƒu:±„w¢†j 5¢¥rŒ±¡X ˆn] ! ,1 CS/e//§sS @ ±†[±’²ˆ|°«‡j ƒP& ¥ƒb‚¤Š…5±‘e±‡C¤Š3'/«žl‡j,HQ;%‚H&£› " –:ƒu:±Š>¢/j ±( ±(¥RW i«„ƒ0£‰-U<±†Q³…vç¸ U…t0 jI 3%    ! G±…!  „ $ ƒy²,0 i«™0ƒ0£šBU<±“³ç¸ƒkU…t0 ™5I 3%    ! G±Ž   ž $ ƒy²¢00±„4±…S ±‰±•y!±ƒQ± ŠP¢‡*† ±‰]± ¢¢œ]† 5±ˆ&±ƒ)±'±Œ/±…M±‚# ±‘±Š±„d±¦±V±‡|±ƒ"±‚s ±‹m±Šwr 6¢‡A‹±ŠQ±†¢‚\± ²kP±‚¢2‚o±‘X±ƒh±†±ˆi 7¢ g‹±—±/¢†)\± „v²ƒ'P±†,¢ˆP‚o±¦\±”±Ž± %±²„7 £/‰ ±ˆT²™; £•S‰ @±‡X±ˆ¦ ‚u= !Žl²Oà§‚b.7±„z 2d ‡pJmO 5 CCqm[< B±v±i¦ —y= !Žl²†(৉2b.7±Œ ”Vd ‡pJmO 5 CCqm[< ±g ±’|¤)`Y ¤)…``Y ±‡¢'F±ŽC ±ŽL¢‰|F±¨. ±!‚} ±!†: ¢‚9Y±…c ¢ˆEY±ŸN±“±Šq ±ªj±•z±‚I±…v ±ˆU±Ÿa ±$† ±$Ÿt ±$† ±$Ÿ ±$† ±$  ±$†* ±$  ±$†= ±$ ( ±„ ±™)= Z£–'7 s +" k-.£R9¢i¢(±,¬ƒ nˆ  ¤‚ +¥ƒ¬…    ^£­c'7 ‡as +" k-.£„R9¢ƒ5i¢‚R(±Š¬‘a nˆ  ¤ˆ +¥‡+¬Œ+   ‚j0±k±ƒI¦ƒ[‚ [~¢ƒ/…!¤…>†$±„^±B¢„„s±‡\¨„ƒ(7=GM=±ƒr¢‚%ƒB¢‰ˆ±…]±†?¢„6±†O±‚$2±ˆ5¨„ƒ% C1‚†qY£‚9‚ƒ/¢†.\±Ž±¦1ƒ…uƒM,§et /Z ¢ƒb 3±¥~±ˆP¦‚ [~¢ŒM…!¤–>†$±Šj±v¢Ž?„s±`¨ƒ(7=GM=±ˆQ¢‰kƒB¢ hˆ±ŽI±+¢Š!6±@±†=±„g±‘ ¨~ƒ% C1‚†qY£B‚ƒ/¢›2\±£4±†J¦Wƒ…uƒM,§ˆ|t /Z ¢˜ £)` £)…a`„K(‚¥‡M‚gz‚l‚]¢‚O¤‚d‡{v‰^£ƒY a¢‰{±ƒ}£‚F‚"=±‚¥|[mƒK¢ W£B‡#¢ud¤ ƒ ‚¤F ¬ƒ ƒX! „ˆy¤g„.& k¤*‚a-¢*U¥`vƒ%ƒƒ £)'±‚?¢ƒ ‚]¢`<±†B±‚A±X¦ƒ{(5(£+“p¤…{„:¢a…,¦i‰I‚W‚<*ƒa©ƒ(,ZŒ5‚HZ}±Š|¤‚>F¤a== ¤)ƒ6‚U¢|=¤‡9‚E‰" ‚+¥œ`‚gz‚l‚]¢‡ O¤œ ‡{v‰^£Œw a¢›±Š £Žz‚"=±„)¥Œ%[mƒK¢„FW£‹Y‡#¢…Td¤‡a ƒ ‚¤‚tF ¬˜Pƒ ƒX! „ˆ±„+¤ˆ2„.& ±„ ¤‰‚a-¢„bU¥:vƒ%ƒƒ £‡q)'±ˆ¢‰~‚]¢„y<±`±…~±† ¦ˆeƒ{(5(£›“p¤‘„:¢ˆS…,¦•m‰I‚W‚<*ƒa©˜[,ZŒ5‚HZ}±›"¤ˆF¤ˆx== ¤ˆ.ƒ6‚U¢ƒ=¤›]‚E‰"£†gDA £“DA%±!‚c±Œ)± W±ƒG ±!† ±¦± ƒt±—k ±‡e ±Ÿ0£ˆBPg £¡hPg„\$‚¤/ ƒˆm±ƒB§†gŠl‚q‚£&b†¢ƒm£h‚¨:K‚W- <‚@±:¦„Z9 ‚.¢!O¥#bS£‡s*¦{A„k©„.$.…5ˆ²_À¥Kuƒc w¢Oh¢‚{o±‚G£zƒC+¢-ƒ ¤oI ±6¢„_d ,m‚;‚sx†IGg; ….§Y$ „+c_¢†<«j ‡~7i*,5 G ƒ eƒp<^=C7C/+‚[¤?†%†)±…:>¢‚„b¢Y- ±’E ‚2¤•B ƒˆm±ˆI§  Šl‚q‚±‰,£‘;b†¢‰y£Š3‚¨ŒnK‚W- <‚@±ƒ]¦9 ‚.¢…GO¥‰#bS£“ *¦ˆAA„±ƒI©›y$.…5ˆ²„À¥ˆuƒc w¢ƒnh¢‹go±†£TƒC+¢‡Kƒ ¤…,I ±…k¢4d šm‚;‚sx†IGg; ….§‹Y$ „+c_¢ˆ†<«•j ‡~7i*,5 •DG ƒ eƒp<^=C7C/+‚[¤6?†%†)±‹±‡U¢Š„b¢‚v- ±•3 ±¬~ ±‰ ±’5±ƒ.±„%±ƒ±ƒ±Šb±ˆV ±”C±Š1±Ž2±Ž±Ÿf±˜|3±‚4±#‘$¬ƒ^ $@ ±‹R±#¦(¬‹c $@¢„ ‘r5 ¢›U‘r±[ ±-‚S ±-ŠX‚¢Œ‹S±f±‹@±†F±%±…0±…*¢Œ4$±ƒSH±„a±†)±†±ƒ¤_c‚U2¢F‚$¢ƒ„Z±…S¢„rŠ,¦†3Š=c±`¥8ƒwƒsƒƒF±‚/£H…D;±‹ ¢¥E‹S±‹±œU±±ƒH±Y±A¢£$±‹±ƒ±M±•±Œl±‡*¤ˆ}c‚U2¢„‚$¢„Z±\¢™vŠ,¦›fŠ=c±‡'¥‘^ƒwƒsƒƒF±ˆ£‰M…D;±Ÿ9 ±-‡r ±-w‰-„5 (E]W>"dI )‚D‚`‚‚EL¢‚‚ 5z„ƒX jƒK< x~ y2ªl<GD%ƒX z5YZ;2‚`'&"L!'+"dC£ƒD5¥p‚Lh0‚#¬D"X‚ 4Ax0±(¦‚b>$X£MQ{£‚`ƒd §C&O\&Tƒ=¤,ƒL4^¤5‚+U±‚=®‚#ƒ^.4"‚^A‚2k!g„d$£Iƒs{£OG¢@ ¤{H ¨t,$ 0‚.¢‚,1­‚]!-$+iqx>‚/§9H)'=ƒ¤ \$¤EeD¤6‚`/]¢‚C=£„:‚:£/ j©j+ .¨*XsJƒk' A‚r+‚*h"dI )‚D‚`‚‚EL¢‡%‚ š[z„ƒX jƒK< x~ y2ª‹ <GD%ƒX ’4z5YZ;2‚`'&"L!'+"dC£‰P5¥‰;‚Lh0‚#¬x"X‚ 4Ax0±ƒK¦ >$X£…sQ{£Šdƒd §ŒZ&O\&Tƒ=¤… ƒL4±R¤‡{‚+U±…®™nƒ^.4"‚^A‚2k!g„d±ƒV£‰ƒs{£…OG¢„_ ¤ƒ7H ¨Š`,$ 0‚.¢†d1­‘7!-$+iqx>‚/§‡%H)'=ƒ¤†^\$¤‡EeD¤‡'‚`/]¢†\=£‹X‚:£ƒl j©„Fj+ .¨ˆf*XsJƒk' ›,‚r+‚*hW¦ *@ L ±‹4 4r&' *(‚"*$Df©RZ?C$„$®hi3 >ƒ8c"-(1:&@‚HG CS?X`l0$k>W¦ ƒg@ L ±¥ ‹=r&' *(‚"*$Df©ˆDZ?C$„$®•li3 >ƒ8c"±‚V¢„'“±ƒ*±‡C±ƒg±ƒ±‚4¢ˆR±„0±ŽR±†d±…L±†±†i±„±‡¢ƒ ±„-±ˆM±™c±‹±‡j±”|±•+±¢tƒ]±‡±‡}±‚£…A†)ˆ2 H±ª±Š±²D¢~„6±¢"¢‡8„X±‘±˜`±„>±”J±ˆD±±–&¢†^‚X±`±±…4¢›r“±†\±±‡V±†6±„p¢‘>±ˆh±,±P±‹ ±Œ±Z±ˆ*±Ž4¢†R ±ˆb±‘"±³N±– ±\±ª±ª^± ?¢‡Mƒ]±Ž&±±„2£™e†)ˆ2 ± ±„p ±,…2 ±,ŒI¢,…W$ ¢,Œn$ ±,…X ±,Œo ¦,„.77 ¦,‹).77 ±n ±“ ±,…Z ±,Œq ±,…[ ±,Œr£,…4(" £,ŒK(" ±, ±¦w ±'…j ±'šn" I±™Z®9)I]‚ƒN=!£†U±“¤ „\E £… ±…T±—lL±‚~¥ƒZSF  P±².±‚}®‹9)I]‚ƒN=!±„o£MU±ªS¤ ‹HE £Œ  ±Ž)±±W±•±ˆE¥ŠqSF!²…-À²….À±v ²ŒÀ²ŒÀ±›au 8¢ˆƒ_±ƒ±‚±…`¢ˆk±†G±…@±.±‚B±±Œ)±‡3±‹( 8¢+ƒ_±”'±Ž±&¢ 6±•!±‹H±›±—F±¤A±œO±8±ŸLYj b‚X;Y|$k 4R"T)„, J‚*  j b—k;Y|$k 4R"T)„, J‚*  ±"B ±"…w6± „¤•[mD¢ƒ"ƒ1£{‹| ± Œ¤¯FmD¢˜&ƒ1£•‹| ±$– ±$¯f.±‚w© SU(t!7±Ž9¦ /PyP¢1£‚k ± „  /±†)©„? SU(t!7±¦†`/PyP¢‡ 1£‰\ ± ‰a 9) ±)†¢!: ¢!ƒw V ± ˆZ ¢‚FF±‚y ¢“[F±Ž] ,¢$*±Ž0±{±‚W¢ƒ ‚"±‚+¢kV£ƒe„k…F± ,¢¢7*±§V±„±¢ˆ_‚"±ˆ3¢Š@V£P„k…F±‰5±Ž$±‚b±ŽU±±±ˆB ±£7±‡i±§{±… ±ƒ=±F ¦c„#2p ¦Š„#2p±‰±‚< ± j±E ±(“ ±(¨S‚!¨ V‰t‚B^4ƒx±‡±ˆl±Œ>±‡±†I±c  _QON$.AƒUs„W4A Z=%3‚i±†£…bz¤ƒ9 ¢…¥6 X2¤*00A¢…A±‘¢ gd ±)‹ ¨•3V‰t‚B^4ƒx± *±’ ±S±±Ž±„A  ˜*QON$.AƒUs„W4A Z=%3‚i± £”<z¤Š% ¢‹w¥„O X2¤‡H00A¢‹…A±ˆ ±•±¦M¢…Pg±‘ )¤ ˆD §“Z-7  " ¤ ’+D §© -7  " ±‹G±$ƒ(± ±¤m±$˜,±¡( ±‹H±$ƒ)± ±¤n±$˜-±¡)B¢‚g  W S 2($@ƒ+ +¯ *(F0,!$(5,± „±ˆ@±‚¢… ±’G D¢‡n ‰. W S 2($@ƒ+ +¯ˆ *(F0,!$(5,± ±—±‡V¢ £  ‚²Tp £ ˆ ‚²¦p#¢ŒXq±ˆ'£ˆ;H ¢¥~q±r£”oH ±v ±¦ ±'ƒ*± ±'˜.±¡* ±‡D ±-§'&X ¥‚@ƒf §'¥*X ¥ŠEƒf  ±‡5²…bà ±S²‹jà K ±•^ ±/Œr ±/¡7Y£f…m¢†7ƒo±‡W±‚ ±„W¤ˆ+ƒ‚qƒ&±ƒ ±±‰±Œ8¤=‹….U¢‚I‰X¢„ ±ƒY¥†R„HT‚,Y Y£¢y…m¢’kƒo±’±†i±Œ¤Ÿvƒ‚qƒ&±†J±©s±” ±¡<¤–p‹….U¢’o‰X¢‹#±‹^¥šv„HT‚,Y-£ƒ‚² †#p¤‹ ‚ £J‚² np¤¥ ‚£(…o £(šHo¢%‡_ ¢%’h ±+u ±+‡N£lƒYŽD £›ƒYŽD-q"£…X{@§‚1  W ±"…&£š\{@§–U  W²(ŽXð ²(¤ 𠱆(±‚e±ŽB ±ŸN±‡±žh ±”D ±­j ±%‡ ±%’ ¢'‘¢ƒ: ¢'¦¢‹?¢+j ¢+†Yj£(‚r £(—Ir?[¤†s‹hƒ+k± ±„,B±Š}±‰~±‡¤ ¢ƒ8F¢‚|¢|V£‡'„‹h±‡S¢ƒeƒ)¤ƒ;…I‚R±„±= _¤ ‹hƒ+k±‡±`±ˆF±–±¡I±k¤ˆ ¢‰ F¢‰±‡m¢…9V£¡„‹h±E¢™ƒ)¤“a…I‚R±‰q±ˆT/Q±ŠTM-±#‹,±‚g ±•d±£z±‰k±‘B±# _±‰~¢ ‰4. ¢ ”K. ±†^ ±›q ±u ±“ ±¯ :±Ž¤ A†u*  .<  C+ Q±…¢…‰m¢R‚:±‡h±ˆ0 ±"ˆp ?±§C¤ ˆE†u* „? .<  C+ Q±t¢š ‰m¢†‚:±m±‚0±œT ¢'=‚±‚i ¢'¥A‚±Šn ¢'>‚±‚j ¢'¥B‚±Šo±ƒ`±P ±’:±‡) ±…' ±Œ ±-„ ±-Œ ±)ƒ ±)ˆG)º/  !"#$%&'()*+,-./)ó/ #$' !%& "()*+,-./*,/).( % ", ! &  -#+*'$/*e /*ž/   " !/%('#$&.)*+,-*×/+/ "#& !$% /'()*+,-./ - )&+/ !.%* #($"' ,funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/sman/fun8.index.prop000066400000000000000000004154611256243640000251040ustar00rootroot00000000000000M§rø//proj/rd/eric/funtools-1.4.5/man/man1/funcalc.1funcalc‚ñ'Funtools calculator (for binary tables)1­EÑxœ­[ ÛÈ‘þ+Yl Å’lÍ>`Èk³žYg^{ᙵ÷01‚ÙñL‘ Ò(‡ü®ü½«¯ªºÙ¤4›\ñjÈîêîz~UÕ|wñó•1«¶Hlž˜©ù©-š²Ìkƒ¿ÛÜ6eeF+úg™¶:˜Æ.sWÍÍ¿{ÿËÍõM7÷nZ|¦¬±Õ}ÝTøíŒ{Øò¯•Ye¹Ã¯ÜäYñ¿¶f[•÷ŸÍDyã^™»ÿ5wI™·›¢þüÙ¼ÿåöúý;Z#P5ô¿¯L[» Ú+šÚ4¥ÙÚšÿÛ¬IÊÍ–K™|e74]6bŒL÷;Æ3W×YYÐÙa‚ßIY46+²âþôeYû)ü›¶`ÓÿÁ)±•-R[?®l›mÛ˜{W¸Ê6´Í¤LÉŠºq65åJ÷U1Õ=¸¤mð—QŽyBž‚ÛÂi'¦(ý$ÞeVN3ZgETfg« ’4YmÚ"uIn+¢1JiJclÛ”S}86—W7¯?\³(:iÓ<ëˆçu³¶4?ÏË= ¨–YSAk:¶1‹–Ì[g›&Ab“èĴڋ걇– ºÉJhF?]ßÞôôÒÐF*»7nGzÁ2ÏÌucöeõ¥6Ë‘im“Ù %šÖív›g.ÕNÁ&G¤à4”di·Ùæ`òëŽÁ¤dÅ£R‚êÈÙ µW@¬nˆ(«/:oÖe{¿6uIúŸm¶eÕX:@M?ól•%¶á™£ºMÖÆÖ,Ÿ =LŒ‰ßCu¼XiÿX§#Z.™“[IlYÔ[—Ð2Äbs³®œ3{{¨€k1ÖÛü)ɪî:jŸM½Ïšd=Y±EcWæN<€E¢ZU冑҄éeá2ZnAoi )YØIò=l£­jçéGú{ç«`XÝbÄŒ+KŒÌŠ]™Öùù•ûk›+€¥ÔŽW%îGBÁ1WYU7}~y7E«ÞÒµþS43¡Q;:)ÿ;³yD€4™ÆÎ¥lùA¬9Є9ˆ£aK¶$tv˜Ò(›¹‹&±5nOŒv²åcÏÆ¤·Uߺ³yëjv*ºŒß«ì¶RFáÌñ ¨à²lÖŸ&°¨uV8 KxcyF¬dw(.æ˜4ÙÆhF¢ZÄÆ×üúBߌƴ!ó®lœx"ºÔ5®Ú<øè¬f¤bEÙ€lp¤ì‰ìöUÖˆi÷´$Þ¥Þ*À.W$ìtìR®†S"ñ_œâµ:»T´²*÷LF5<…¯$fÔx^¼à¦x9n¹•ƒÃÖÑ<~ Ú£mI+/IÂjþ.´s´ÙOd‹0ä"Ú섌cEzƒ“’llʆ`±yNZJV¢…Ûª‚L±`ç°_¸|SÈn0jŠhøõùÕĸÙýŒ¾z˜È·kK›„6ô–l575ýc«n«ÞÄS·"ᦺØëØ/’%7fç*Ѫ¥»Ï öºÕøxÄX—×l‡!åÎéRt; ˜xiŽÄ€ÞaKÊvÉçvÝ’á@܃%Oî ýõÞnc­~` ÄiŠÈua%ÍÝ„C©wÔm¯JÄX~NþЬ”#Þ±\Ý ú…áÿ˜—Êfú[~ø'ÿä@OtFY-þiŸ%I‰êXÝù/ ïr,Ü¥F·EGW̯ƒ·Œ¬¤™¹)ýfQns6V¶·}–çfmwN=—ç—ç³ç;èn90þx€Œ-áÈnRÛX‘¤N X ¢´J!xk@VõþG3u(½® #ùø*îú‘ýMÖ¶¸§¤VØW‘â@g‹»ä>Ÿyh+ñ¥³B~l]ˆ\q¡:ÍúF:»,w¤v4Œöžt\P?EÛ!m0ŸÄ\È/Ï’¬ÉCEX\«B÷,R†ËÀ ªZuN¬H-Å`bê!Àq6@Že*:ћ۟Þø™öó‚¶ sqóúúl¬(H€8¿øqAè¶ÎîaÀϧ„Fy„¼»^}3ÿž_Q¼“7¿F³¢w#„‹ÞfÇ2þ¿¥oÎû”>F”¢wRºZøa«¼´Jära¾ÿvøð·!_rû£F#¼eÄb«ÊØ¿Ð9 F¡£ú#J´º& š§XyÉÒÔ;ÈÌ'€2BŒO:üJ„I­ÓÜýžu ”,Ò.P+ÂëMI»\Ž : ¼ŽW®ªH)hoÞI(ØÞ@)Ô(7cË:ÏöUIºMô9s´ŸÔiSTc¿ÍÛÕd‡FÀ©BáGªúSÕ÷ñSÿä‰BºßÖ-‡ &Ÿþ ;K?¶%„ÝÝ“3ž L¬(Â9b¸K^rÉ€fß­º+>V³.k=$ T z´²Á3× ™3ñʶÈ){ùKng½ ŠýH@ 3g2ÈÞ”ûˆ…óg@ #bÞÙù•ÕìK=/™1òçWûlîÂôt©„GŸt•œjž6B’×Šâ …Å Åœ\XÅÀ9x†ÊMUɼ݀5н³"ÉÛ”®‡…\®5gáÞ}€#‘øïž}^œ?ª/¢óÏ'‚ŒBEÈüfÌXnÉz;­Ü¥í¹:R)þ…¥øô9™·Tzæßÿ"Á –‡ÆEÔfR l,ôõü\áMt²wyà*`Ö¡Î_ÄÏéÌOÏé韈³0-Ò]öäKS¬äÌÏ7?rèq¬óà²ßÒs}x>È×WEG¬¤èì¸|Ó¸ÂÇÛÎÕF•®[Ê–"“¨ý%Û†ÂOâ*À 9‘BìÁg®,Î’³¢ug]ƨͻ" ‰ú Å%ãHœ¢RYO#†²Ø<Ì6ôoƬW}ïã£8£ž¹ÈÞ™˜={vÃÞžHb»ÈÉÎò?¯óÙj“4/}2i(]ñ<}!À¤·îp¹5ä¹R=xÖPiÖ%|N%Âç0nfnû±fŠÊ](8V.ç@©FõòNö5AYz›Aâq¸x¬­‰úšæÄGО%Ú°BŸ3wMÔNçö'ØàûìqÓvf>úri¯ϪÉÅ÷ǺNl]¹MPk×Q9×üãgíß°c0ç±A°mWs³psîùD´•ôÉ™þ›œ¶×3°3/Ëí̼gb©#P32ô3¼“×H½+í7 q9ÔÚú™’%ó8üM `Ùf9é:&«²·)%Š|ëÈrBCì†=ÌHÜCb:&½½…h>”û7Ž^Š “6·Å—¢ÜýkuÇ­~Èܘ‹¸671q\’d7»F1¡ªËê:\þTG…\µC'§ôG®QÔ(ð/BG—@Õ‘@¥—ª½0çïm0 ú-ºC˜· …pžk’l­@nod©úXhl†‚f¶ëêˆúï¶x‚ɳÙLHÜ—4š+|xÄ’í/¢EZ¢ïû¼\¢wê· !÷ÌD£cê-©ý„ع*5ß°Åu0ôÄÐ@®Ge$ÝÇÔÍÿ´uÐ#Ëä%™2ÔåÂyº>$¿O)‹Š^7s$!!# ö©È3÷5ÿœ†´àúý²ª£E¾ïâùÖµÁ„ý‚ëKe;˺w*Œ0É»–xO‹ <vó‰Ù!SÒ¿É,šÑ®ÌÒq÷ ¶R¯G~Þ°‚èÚDéÏ ï Fº¸÷È´¢2¶¯ûÒlÖ9Ù9m†h銻ùX!;=ýÁ<›=3ãÿíÁ:²y‚uÑ)W–ƒÂ×÷fúŠþeˆ'gä­‘ÜFLôïºÏÂÒÚ÷ÿôÌPÝÅXa »ñàëÀâî•·OxJܽ’+>áþInîøFVdNtf2@¹2c[#g‹ ]à\ÄÈeèÉÒu.Fî)Y½{o¼ »Eö·òw?òl‰Æûxè€íF6Ž Ö)np½_Wgøïæ@ ZϬõ”@×SuIO齞½¬\óŒú¬`ÏÙôíÑ„i.4ÏD?~í_»;‚m¶ƒƒæLèõ*‡þSžMíYDOý~T„ÝúwS_¹¸î#ZQ8~jÍÙÜœë±vwD¾DZ·|#ˆ[¹ÖJ@cwÒUYdçµÙe–׿øðæã¨“7HªrXÆä«©ú‹¨§—šÅ×rãpKz1¡íÃÐàÍKÛ”Ùˆ×{6†‰a`ôp>Î=òW,Ì«—<lþð‡èé/™Àyù‘Ás¹{Xñ–D¿»»1æWÿÛPWº§YiŽ`I-â3î¥aœ€ãèpöƒäŠS³wNñܾÔ+ Zõ¥L 0?—›ž%åE…;wIV™ïè9þ?CáÊÿñ}÷óy÷ó»“?Ÿ÷ú“ÿuúÄ£.P(d³ÖKÕ[hÎ2˳æ0L[¥ÌMUTy—rk¤¯Õbµâöz œÖV\ë}÷ëÛ·|ÅŒKÖ®æjd”ß‘üöˆÚdX²IÓ’Îö¯'¡:Ä7Wo>J«Ë§¿Kr¨)w„o)m[»ä‹Ð —ÅPîìZ7t‚ײýÎ^ò’ÉS>è\úrÞSÞêËg³çC‚Q0%²‡9i=&R($Êc«Š‡Ó0¦'ãV±¡Õ©õ·ÏG ž™TߌÍ+=Ž+_·Œ ‹O®o¯þòáý'XÍ Éi„äiHDúœÆ÷kydGŒxã y/áxÚH|B²^$nÖk–NÏ`OïNlóUغ&®H9i„†^à¯ÒÇŒZ,–)ržNŽ~ãØ²£\DeCr‹ëP5ÜfôG{Ö—©h /JÂm„ áa¡ù¿.>¾Y\™P˜£OtT¯¼ùîg&¨*0?~@;dÜÉëE(ŽL·æNî¹+ˆ8®õ«¹huÙô‹Td2;òÞgjµÝÅuô¾øèËUFäßo¦Årc> ‹*ðRjê «Nß@”k¿®c\øBilƒîQ¦w!‘ Ð`r*{IùøÖžR@ Ôc¥¦úu2‹£²}ÝPÆŠCzOŸ±¢¸©B‰YoâöŸgy© HüÍÌH«)<–(w¾äb²ÆÈÅÿ^ºpëE}?›Oš­¸]Õ(øËpq+lN„é´Ó6æ>"ÎHL`öwœC÷²;¼b9¸÷8â>’Áw>e¼¶Ë$xö1Kâ´Æ_0S8°¢ü™—\’†St#[NI•mý¶A·:ãr¢ bô” ×2 ªGQÑI}#|â¶Êáw¤«…í×"Ú`SvKëjZúH‘(Lë>IÇà$Ü”´dF’¸tÉEÎwY1àæÍuqÚPîS­:‡ÛýÃëý"šÚ#ÊÜ<*Ä$<ÑIˆ˜ÜNó¼|±Éî×ÈYIyÁ;®œ†oV€LS­ †ª%Ÿvƒ±÷(©6ÂU­Á†âñç¶(ÃãbÊYuVÇwëãNʨr¶. Åa,)ï'Ü ÒË9[Ý IÍYé´+𺕖¤yíí˜/0ÚÊ/ö¹Ÿ>Vÿ;Jùª *>ÒãŠËtÅKu]&Y׬€Ñ‚n©éÝ1îÝ ö÷ð!=F>LŠ`ƒ%ýñe,æè‘ž·Û®`Œâ$ÊB"¨çq9†"æÓ?ú •89&Ü'(—â˜3¼µI´ÄØüñiÀL&‰WëÇ£iäWòù±¯±°¾ùÄCLÇm²—ÝÒ^@Ö‰a¾ýo$‡ ‹QxÒoMÞšáEjÔu På1.åûÿ\`‰’ç@òŽvmøü‰\~Ë’Ñ]É¢ 7kž>w “'fo(ÉÇä哘/PÊQ³ì‡\´Å5Xx[Ûp-JjÊ]ê©bWákˆ°øîIÓùŸþLM ŒÞH,îªò×6Í>KÜBîo¤m¥@ð¨b^¤½!á³µ¢–Õ4›:ájYT±m™sø|>·¿¹E×&æ—MÀ½¿hD|Ò ã! ¯Ü¦Ü…Ú.­Oɼtà˜?A¸É+`Œ=Ðc"ñ¥t’ºÜõ …„àeÄ÷WNŽÙIaXèzÝy¬[Vž!)…1Á9|Õ]‹öŸ“°iÁ„‰¢â‹Øà¿&xÆ?Rw{­Ÿ}ÅmqšJÿü¿Lsè¨z ¹lÁkÀäÿ3¾¨#œÓŸ‰ª‡ï'ÚMrZŠa]ÑÏQº. L¸OÔsÂò‰¡ôn¹l*·i£Ûºˆìr=ºeóèîi(ÒfM/£æê±,ÐoýµÆ­+¡ÚòÇpÝ-fäàüh࣠¥~ã/ÄõnhúÖE?¼Hå_RcŽWÿ@¿—–—¦ Î7–¼=®IHq7ºþÃ|VGÌœ˜Ó‡öþw ¤“çX9ˆ’¾]ãÐ/æu¥€è¿äögç)È«òLn²a¯Ø‰Ñ¯1|ä ²ƒÐG±¸'ŸE÷¹„¡‰§¼ý ½ôU¯ø·|«zú1ØDöÄH;ÚO,ÀÇÕ²ÛKwEÉ—mÙâÀšŠÂ$.*"öGŸÏuI½´œËþ­|I™³Û<êÈKí”[Ÿp¼¨4 Þ+_¬2² ®(õ>í|0ßž([*'­þÇ߬m¬ÍÚ‚™¹¹º2ooÞ›ÐtGIU0iºû¯Çšk—oÉ-ï\Åt>ûvö¹ ´ 7óo'æüÙ|ΟZ+ÛFóñÿ»@ð 5e5a600ff111fa37718789912f20cf23./proj/rd/eric/funtools-1.4.5/man/man1/funcen.1funcen!â!find centroid (for binary tables)14“+xœµWïoÛ6ýWÙp;qÚ¤( ¤]‹h“¢î0 APÐms¥D¤ìhýÞ‘´d¹M~X&ŠDÞwï·×ß­š*—ÒJUáÑ[£ ­Œ¥¥ª„mÉ‹¥–nL‹¿nï>-nݦûSõ€)/-?yòFóÖ´Ü>ÐK(å+ziåZ™êÝ}úrsw §ŠÒ¿ß¨q’T)Ö1hXRÕšF…\‰Fû$·ˆ©ÿ2ÆÞè°Û_ŠGªšr‰Wf> oîÀÈ”·…èz·µz”š_a=Ò¡B9úm³,lÜÒýt2›œMÎx£i|ÝxÚJ»4Nù–s…¥·ßß.Þ|¾ Ùvp¥È°¶¥\è¼ÑÂKG~#{Ük¶ˆài§üFUd*I¨Di¬¤¢ã$½k*oŒv±:4zwóe1(o³b×ã'ÇÑ ë`¶OAUœKØ1‰ÿÐɹZæj¥ò€(/(¢=ÆD¹A “DmÍÚŠò87 ¸¸awû]м&yãø³bJðf娒»~‡p‡«4Ôœ™Êo+ùèûÈ2ºé‚ÄC d8 [çÕ *›òÇÄ_+E¾‘1ŒÝ¦Ö÷”Á†RúŠð)ÂŒ®#>l>Ô¦£%t[²r1ëH, ¬Í¾B×@Ô„­Ð ¬&™e„…Ò±‚¾Yt+¹Þ_‚/ë< »nJ¦‚7ƒj¥ §bÑŠið8—Îe´PœnÌŸÊ–—\QàG-r¡[¤ÂDâ'Ϊ:á,+ã©æbx,ëa}ª•©Nÿ•Ödô‡;íµù7 M·Æ§›”FK¡ÀY¹`†)ÅÃ%8œÌMÅÑþÓ(‹0:`bŽ; .·ªöÆfôí­jÝ·¢ú]B½7;”ÙNPõ²Fá‹náHä¹dÚÀŽ›«ÀóÎâÁ&ÄYÉœ¡Ú*AK$/Ñ|B¯åÒŠqp>@ ~2ŠYÆVj£Ûu0© ‹•Ör-tÆ08NÂy«òw©Ö›PJ­Vì<.ß`Rr¡ýÕŠv‚ûÑ£ 1õr+9&òæ›#ný´å˜dÒ¢Ê%1å¢L™ç æJ¤ïbƒ2x‡¼È©²f] íÆé£7k-Ú#‚ »pXê‘㎩dô :¤ä4J]!¼€ÎU X®P úO£N(~ÀÕF)®¹fª:úµŠ®ö³”~'SÇäµÌšïÏØvIHI ôçð[Hçy²Š">Ld½W̔ξÉ>öÌ¢.íÓÝÒ¨;Ÿ¨ÿñib‚Qõž®:hŠW.2Ò0Í$­‚¶¤£˜u—õ:Õb> f!N®VFk³ãŠéür8œZº·äxeláZ÷S žeMr/%Ïèþ *fnıw‚¼'ZàKPÌ ”RZζ„À¨+˽۟^Méï³)>›=ÒìlvÆçÙü¿®²gÉî³ùå4Ú_\>ßÛíÏ–”  Ý/tÞP™÷Ö"'¤ýthº±ͪJ¤‘·’»+°'KhÜI×ðó:‡€Ã(Õ³Ò,·Ê4 Ä4ÂÐ?÷,½ö‰½³É{ ý„‘QH¿òBU1n‡x@á’|‰á˜ÿ&ÛHGqSö˜[4ÜO‹ðýÊÃÖ´hó×ó l¢^s°³n¨j¯wü2Ù ÏÌzœ´£zÓ:Œ„zŒ·Cº`✠…F!üù‡ü‰ÅIA͸ CX‡†`êC@é,!ì:XYS"1.µ,rH Çøî¤f]º³ÏÊç‘$ ý]šÎv Ë DSèÖ«œF!çq¿Ò˜A‘é ê|«ƒõ…Ú\¶\;>…â ‚–`Eˆ³ 3W $“ãËÑ=¨s,ýâó)ÑOýæ¨Yè*V™Ö4á°J‹Ð}òoƒVB.©mÑ¡i™$`$(*ãÝaá:¾³aÞ ¥ˆ ¥ÃoyWT3†ÁÔì ÙeÏGLœGüÎ$ˆ­qWÂù·ZIG¤H€¥ÌßòÆì0f¾ö$… 3YœWeqÔFÿ‡¢ª'>¿ºü£ HÙçHÓ×1%>8WûÛß@C³?L^¥S©»zí9íåþí[ºþ°¸‹WiªUãàKàluáÂÒÍÛ©kªQk·Ÿ!óì‚®k4Íæ:›Îfñ^QÍÆÿI•Ý a6b4242773c1ec68bb818bbbbb3fa6d8//proj/rd/eric/funtools-1.4.5/man/man1/funcnts.1funcnts²“9count photons in specified regions, with bkgd subtraction1µ,úexœí<‹ŽÛƵ¿2UÜ@r%®H½×w¬íujÀµ{û7 ¨‘D˜">¼»úï÷¼f8¤¤µ›¤½½… $K‘ó8sæ¼çœyyù§+¥ÖU¥e¡*ʪ´TûmVfi¡âT{ÅëX¯T®71¼ì«›¸ÜªåûÍJÕ²Ìè„÷êÍ÷/_}÷æù›z´·´Œ¶ºx§þ§Èª<Ò?®ãDøøN½ÅÁè›yæ/4ɤ‚¯¾»~þê% ?Ъ#èÛ}VT¹~ûˆZšŸï:J}¥¸êâ§žzöüú2 T¼ 7ZUEœnÔ. ñ(`ü›ßvü¿>y£Ki±Îò _ÚáËx§£,ÏexóóØðøMáGÍØ&¤¨,W[®t®öaît O)ü…Y6Jþ}¥²ªÜW¥@“Æ0(¬` Kh÷í‰v¿÷ü±mÖÝ…·ñ®Ú©=Ì@ºÆªó6Ê’j—>z§¥ÿþxž×±øý`@9ð^ç1"wWÏGˆ‡«øC¼ªÂÄ,9LWL^BqÐk%æ>¾Õ Уþ S¯ÕM[ Œ…Nqmù‘^©ÎÏà *Wq¬º8[˜n`ë{¸\xN«DÞïáak-†*ªÝÖF ~€m…UÃ^Âÿß!Š<ª×ÂÆh)h¢2\2½][\Q†9bï,_-ëÝúxÐÔàˆ˜ò£Î3æ:TO¯Þ®ólÇëçe«ðÆN©§q±OÂ;ç¼›q%ÕJSg~àŒztÈM' þÅ^:Ï‰»ôé™(ñ 3CÀçë UË<ÞlËT…ê"™ža7@qpœDUÒúÚ4GÈ^ÇyQÂ4›j‡»+$°Ï³ HC»7 % è8%öBé äyŸ¡(¸!)R2ÑÀ80FÁ<Ï×ÀØå*N;(\ì~÷™–p‡\wJùŠçòÔŸ ˜pÛZ¨Ç€Ø÷ºT/³2$9SñwFƒ”:…M/XÕ²)X茼5±O!(Èöø …'èeqáÒƒ(Ô•.¢<Þ—YÎ+K3ó¥¹6ÚÖ´’…ét²Âψr™Ôa3_AQ†ï5Ò¸ÊÖª¼ÉHpØ+½× æãa¦›­&ŽdT[ec<ÚátVbæ–š€"âpAbòäU”Û8w°"l+LY6×bi”¤†,V:ÍJ\‚Ó!²"Ó’'§'Ý!¬Dê#§Ülc ñä>õ_Ã’AH´÷ÔénÙ7³5asSCÕ^ìÒÐl­êÆžöú8J=~GNI×…¹,j%Ivƒ˜ˆ2xÝ d:^+°ò¶ï¬ê)hÛHqÕBÅÝÑcÍ ¡ÍãÝÌÇ{:.ÝŒdöpÅÄ®Ÿ;ÿ’±u8ŠEç½½é—å( †”—ÏU•&1òÑ©•"Ú€¥\[©MmM ag¨÷Ê lÞÄ$N¡ 3‘*n2¨‹ˆ´p¯p$À F,‰ÑkælƒËA{”…ULæ …@pVØQƒ8¸ ¤ßnŸÜ1YÂD†GPìõÕ$8Øšš€(°ª‚”…bŠÃS‘ ¹Ë*…ÒÿP*ÊÚˆµÌúˆpx[xG¯)áˆ.lŽí¬NºÉúM­TÆ :oðY ƒ6=.~„…±¸>žÒSÌn@KåŽr5ËÆV4$ˆ—½ÎQì’±A-o¶`Q°º}/?º=#PVz‚1ÐD‹Ç[–ÃD¦´D B†ÌRoÃ1ê‘W< S*`c%"é³eœ‚à[·ÈÉÖ¥NE謫„”-î¨ØÆ²Xcõ ²ƒ”ÏX"ì‘Ö.jŽ)Ú©¤6%íF[Áù -‹Û6h€ ŒÖcÌÐrž\†ª@šq?jÅits C¬^iîéÄ"ÆÄjKózp;`DמÀÕ³`àHÙIaHØ™ þp(0_ž¹Åy”èîdô'~Ђ^Gud(ûv2ìÃH=×…'U+ªsãƒÈ°üUor­IÊ÷¡7ôdž£e?5šì_•Æ;µFZ· Ã<[mpú†vä`CÚïbC6;õžF5„®l¬d¤•êòG! üÇv¯j¬ Å¿&þ´ÐÕ €ÿèæŸ:òtâõÑ'åü£y0õÆÃÂ0…§é&“‰7YÌ܉·˜ÁJÓùÈ÷sÞ¢ñÐn–Xh*øãR4Æl<â -2Û]òš[ÿíȘ¥-±˜κQ´æ1, *âÔ¡"< w?Aö¿œ„¯RóédJá¿`4A„_aÍM®?ÊKößMD —ý¾6íôÁçÊ騮q•jO©G{Ò14Õ±Âc0DÌ[”y4`ÏUÚ½å<Ûç1jJ LÅ)ÇÄ©[ûÏ^<öÐ(¶Ak”»MAí™!YK£Æ]e¤ÑoÐJªa\ôI¿â0ƒ½â`!J`€(Òq²° ÙØ ¨€F똇±R\Q‚:‹][B€u£«ºGy½ÇrZ ë ?ÃŽ#´#U¬ß¬™A«…Ž•ÃîÊ)ˆdf‹Ž‚X4¸Šš^Èv±²fm¼«³î—cH}kt*P3‚ÛxWÄV]D0‡¨ §P~ÿŒˆÛ{x¿Îþþà¬ÿ`%±Á`Ýhožaç˜=O¥¦\:KV0‰T¤Zóõ´Ù2zûVû†Â²Ô»=…˜<âZ\´–; „d,ŒÖ7¢C؃Ú:ר›Ã†£]7ûÉLÇ<†. .ä)“m­0vIÝý¼ ´W†dñ,ÁÜ’ewµ®„£€a~‰JBÃ'O¯^\÷ˆ2E*³®2]³È¨býTÅEŒh¦EÖó³ÉÙ\JÌXsÓCO±Ä%£ÿJ¶ž1®sU ‚â(âeœÄå[)…Ë-¶kìñvZ$©IA…˜x 8ƒù¼ÜeÇŒVUÔ&©S\HѬƒ[c„¼Ë‘qµƒÆ12|=H~#(u‚Ö§,¦ß!E…´|ø…è¼Q¾Òhô/uy£A;¸äž¶£¾†(JŒhmÉ!\‹ AÔóÀŽvœ ŠfpÀÆ`:8¢«‹Óh§`'Æyï˜Rj”›.¨ŒvÊnëý!!ýôâSX¾~1‡ÿ™ÃþÐ÷†Á‚TÌÔ[ Þ•?‚§«&ß£Þ FóÚ´Eþ¨6‡ñ>Ï‚‰7š‘Þ=? »ÓŸ{Ó€uÙØ›`ïY°˜,¼Å‚{ûõ8ÃY}’¨•u=ÜðF³cÃ÷Çc6¸}TпÞàþuPž6ºk«‰¥qGÍhŠÊ+2 |aË‚,•ýI³#_]]鎄tø ªÀøv*’Sä9 g”Ù‡Be~ˆŠ’”j·#‚1û ó$ܳXŰtø½§ðãÉØÿΡ™&ªôs¨n²¼($”‹H§ag÷ÍÝÐÂ&>^Ú³šw£KÚ 'd[Ê÷°ÝoÛ§h?ÛCBÀ“h6 6Tê]WÔŸ€5Nù x–NA¨v¯û•Âðyz⋎øoÐÃù dõÄèˆÉEÜdnËöÀ-&mÁ:¥©#Àñ/:"À>àú€ð³®™xSJ_tħuÄoªÂÅlBà,æÁ!Oç¾U>(÷†ÂØe ×ÖIÒiß>³TýTG—±¸%+{ŠÎr¾³îHކ§¾ÿ½<Ìl؈»"¬³1MœÄˆÁÆúù×ì8¥r¨‰‘qR$ŽL5'éì$AsÐwª@ƒ3ô+ ónÆ!vá- ¢™¾CtµBæÄ„‹eV™·Ä£â¡¬ö”1„N áÁ·}9£äðLArß"KÜNðˆ)}äû_q ?!SN9j ˜@¶Í¶QÝ}Ìdω8àïlÃý鳃møšGxXoÎÿÄÒMïa·Ë„ŽWnG V+ÉfYäÈD&FEÑ›]’Ñ%ÿ„.QŒìÖ4Ú@ûMVûïUArøãÛ§@à"OOÁ¿@Q}îÓoæô˜G…ú‹¿¨——õøô[¹EðÏÎáϦ'fû¢ÿŠñ´ãôšE^nŽb# Àˆ–¡1;Æ=Vhd÷pT30#ò‹66_ƒoÎVúÃ4ì/ôª›ëh FÈÕëׯ^ŸÛæ¿ ?„q‚ T޾% Ô»ÉÞ¼ªx|õíó—?ÿñêòéÕë ÿ‘zzy}y1|¤ž=qõæ¢Óy¤þöâòñÕ‹‹N•¾Oa%ðæûÖ›(%\ø?#à]õÀWªóUG}ýµzÐÔIü{D¿I=uTOºÐŒêwðÞɯ ùÛéðÍWÀ–‡‰^õÉYãð¼ è³²£UzÜ÷ûOôEžã–û¬IL($ø½¾{¤ðLK «:BžÝß½:?¤¾,¦Ñï–Ž ¡µè!§µ,¢ÑüÎ47@;í¿wÛ+Õ!¢ø¡3€±™ÆGçãóéùì|.IÿÙ-éÉe˜³«°n HðÄ“êÛ’Ðð~[ïúËgˆ?¨Q¡,ú€¥a_u,þ½³^Ìà¿9þðŸ?Ð8x°°þYÈUf†¬{ä6°âÊw"øækû6kU,j.¹Ÿè¿ú/ u‡¦‚U.5ªQM놈kâü­¨Œˆê4ùÐJDL:6¼ç jê·H2BkïZRóz[”F”WNZz"ØÓÍ¢ÿ%BN×¹ú<Ÿb‚6Á<¹ ³™‡=s v½Ó7s”…©F«U,)ÆœÇ*LjºXرAGjÕsÍÇg߃#ƒÕ’qφìˆNw9p§î;±Kÿ’Í$d‡>áU{<ÿOÑóùÜöhÆÞŒ=?àÌòh‚!È?1 †Ö£Û4‚¡ØÞ£8sŸ2¦/ Pßx2óüùHü•…ïf‹élQgGÍì806Áï/Øò9uÁŽ|ðvhNü¯ù Ü™Ål6ñSî®ß3fWipÒº`…þžüùxèÍ'´.áÍæSð"†”1ÿi䎃ŽÖxìO¼ gq-†Þl!®ùlä§ôn#Î' |±ÙÖ5”Þ wœÏò¢›NÆ)•¨ùbTBïG°Ïâ{4†šó‚tFv:ô]¯vÒ¦ŒÁfï8Xx06{#ñާž^!H¦!Lh¨mx@% §™Nˆ Gôö‰\pD¦˜ ðÇþ#гŠ&•€s7ôF ¦ˆ™Œ|¢ÚÀ›²GŽT‹ãLg–j›ãüøá"ÖïórQÐEòáõ/¢1¦¢Åb$.ûpâüä_ˆ¦`,qãrÇØºÏøq"»?F’•8…]œ AÌØfÁ™6w1]Ðû€hs: jg:!¯OhÜ)Ì}:C˜/êf³9ÔnÞã $hejÛ¼¤uÄ;Ê4¶¶†¶®v-ú”:„?¤¶&³iŠžú.Ñx˜™º'¾E£;Åv:ä13ùO`lÄ¥­×áÄx:Ä8Á)“¬¢0Š*Š;õ·j 22Ë©¢!$ªOô-Á¿‹ 4äö(Réõ:ËK2‡É&ËÁ Úq­).^BáxËé}.ä1EÓ™ëÐ&zÖ¯zÞ¨'öLà ó–WªËZ\¢ø[ß®ñÛ•A0Õ#Òê)Z1êŠúƒ9ŠçuAskž>'¨Ûï»p~ôl÷¸&M àÒðÈ÷küÞ5Pöj0¶êò¨£ö>¼ù™uÒ~¿@¼ÔcõPu/£‡×Ñë¨wÖ½\>¼^>¼ZóXÃÖVÿa*_¸±„DбNþ½2%“0ºÔÔ¦ˆÊn²*‘œ§¥¦ù§ðþÏj$³øÈòBIJ[¨Ë(—wdÊÉNqWç R埋&2‡ÛYYdµSUܧV»%Aˆô !mΖWSŒ]ÈEuªÉ“P”骖I½.S߀|¦4Ǿ¼;K¹ -×ÂÌ ’´ÆBoÇJoq²lrŽòQA¥› ¸ÒaRo'ÍF’©*3L…Œ0áÐsÓŒhëÓ‰J·¢"™F)šÇµd ­¤pš)ڡΣNR2p@:ßúDú«u?ê dI»P‡¹Q n2^ðñ‚L§@Ñú³‘6Ø7Ã… ÂÞQ8P®¤ì9¥ÙÇå¤q1û\<å ^¶Ë‹]ª:>"R<æ„{\GwíîÑ‘Á]Rç<›;NZå’QߢŽÐ·‘Þ—–%\…鮜ÃÙԃ½a›ÛîG:PŽ/·nʦMî9Æ•´Ï¸Ñys6­«ùÅôš¢¥öYèÃ&œëcz—‹?›)½œë„×,d ç–R-Í9ÀÇÆ@:&N¨ñaR‚Sé(¸ÉÇç5˜7f#Ým{¹K[’ô<㊺ÒÂص•fídcé›)Ðä[Ù¹1ÿ2¢œé£,Ëa¡(¨R¼¿“W`7ÑÛ> Q®µ_möý{‡#I€>`ÅäÚÔ“꤬î\ŽK¸¬½‰~g³° 5^ ^¢”S—÷Ž˜æš³ïsÄ“N¶Céd;Èñå¥Ö’«NÕÒ StGuµ­t¡º@Ð4áá%(¦`CîPiÔ‡÷L¤¦_*ÁnõÆ&x†þŽè2„ЄŽÚ]:/žÿåêúùŸ®ag½}Åp8ýúv T©Ž#œà·™¦Î)ô-1І‚ɲ“‹@¸¦¥ ºLbñ‹‰°"7C0œËÎ ‰a2ˆ9Ї7¸Ø¡)oE:a6iýÄ0$‰(7ѦzK½+ìÎfëöÏiõH½ÐQîw€É(/ŦucA,†&cë¢Æêû>Z¥ «UÆûh–˜‡”£Äî©áHö#vÕRªTÔVLßÀ‚‚x­±`gR\%WÝ¿¿èa–½ÎIáKV>m•ÝZ%:µbë6,¦~¡.á°_ ‰/Ÿqÿ™Qh ³T²©C’Sƒ“È2Ñä!êô|E¤‚o³]š8Š)Ï{µF‚Ì >l¥kJx‡ÑüÈh•6—‰oà°wg4ŠZBŽ#ÝÉÝ¡…×­© MÙX#KÊÞbø“p…L¥wñ¨³¼M+Á3"` )-wð¨IÖ ÀǪ³ß†þùäþžûCzðýsÒ¹·Ò–$ËÌÞ—×­j5ªä~BöÐ,Ð]xd¾·Ó;u|ê£íöª­ñd[œîü¸‘Q%ЍNL>Á÷N.žq¬Íµ‚æê”OlÕ×_ï㋱Ý0ú9©·~OíæÑ>]»û\ý;RX(-ØÄNÍz•³wd$Ù¹¦¬À2v×äÇaQR š¢‚eŠx‚Rn-¢pÁrHf˜Ã‘±È$-–•<{'„Á¨‚d~™E+(­ÛÃB+¶,qÓ:æ{Ç,Ûé›kö3ѨMéF€F2Æ)NŠ™‘e›»Ïæ¥O*‡gXW©P@o*15‰êVÆ82¤!„°¡ 's{‹S.EÊÇQ•†^­ŽÜf» )%«ŠÖö ùãuaÃÒ¯/K ȵØíKĈ‰ëîx„è'Ü.ÒÍ5MÌ×6ífI—“Ç*!£ó+XL8 ‘€FÛç:cúèY­1 ×(õ²ËµkóT×­ù°È:^éØqk…›4Û sD«¹½/õzE–w£¼&-f@Ç»1*,³€í8¼í¡KwÕKÑ[°É…äØ4‘»?ÐÄ‹¢jwpÕUv£ºÔ»çèI{…‘ Ööt]÷Ö¹^3½•f¤B’Òf×¢[Œs{ …E¸±¨Q!’|Ò¦aWsÀQ[_ÜdœÃ{o´ñÈ$°ñ ÉkIÑÐQó}£+\Þ¨-ùæ,Œ>jˆ¶dösA`‰Š:¥r¤"ÛEð‘[©¨µâD+2äDb_)äC™Œ¶Æx»ð¾n~Y±ëÞ¢¤:¾X/ͤÝñrPéÉ,«Lˆ>ÅÔÍWHÕ[_/ yînú)Û`øK|Öº%-Ö1>pMøÒó3ù/Ëͽ=}&uçî›O€rauR©pL¡I[•ÚZt ùàZuñºDæµ–«Ò°¤ÝLQ ÜU÷¶EÒïøKDÈ9XÛi–»YWóF ð±8ó£Öë'G0רg BÈ2¬½{GÜ {Ïq –šrõ¥Ø±½` ÅÒ*F—’ ­#7ñH½Dµá.¹šñÐïqD·,G_ûHñ¶”ˆñ¡1ùK‘YÀÄ` °A=[Xß' L¶ŽRYâU«:‚Æ·Ï=–»£$² Ô¹©>[v¨RS£a/Á SqkñVw”û„ÜŽ°î˜ æú-0(˜ˆƒb-ÂOy¤´än:8r øm…E¡­Š‘ôÜɨŒ‹¨*Lލœ…Ÿñš$-¿÷¿µ÷Õ 8733e0d4130466d4951aa2af4436b387//proj/rd/eric/funtools-1.4.5/man/man1/funcone.1funcone7ª8cone search of a binary table containing RA, Dec columns1”7¡TxœYmo7þ+„Õ(/ý`ÔĹs/± ËÅ50‚‚Þ¥$¶û¢’»–u¿þž™!w¹kûŠ;$¤]r8/Ï<3Ã\­¿\(µí꼩:Süávù^5[¥Õ½­µ;©Vß—†Þ¶ÚÖ¶Þ©›u¦>šÊ®ª½Ú|½ºþys¹„½÷GÛæ{ãPê=¤Tæõ¾ ŸNßí ÷ ß “ǯN¶ów…S3ü¼ ¢¿©ëŸo/¯¯ ú¬PXŽçç¼E©¿%:(©®¶­WóÂlÏÕÇ‹çÅû~W´ö÷ÆÖ½Â[×Tª´¾U[ ÓÔÙOµ&SM׺Vé²T®9zl*ùµHÀngt¡rS·Æy¥ëB‘IVäh‘¤Î>ÿ¯{úƒY@8¹æÍES«VuÞHäJ[‘õIeˆÄJüszä´›õË>»YŸïÉe,_*ݬûpq•‘CåËÍú£|ùp}uñÛ?/¾’@Rë×ÿcÛSÇ~¼Ø|¸¹ä°+õ)ê`ܶqÙ6‚)<°7d9/Å$øÓåíf„⥺Åò®ÔunÄÏ$@BÐûÐxÛZÞùòð0ÇBOúN¯$9¬W¹.ó®Ô­)–ê†ì8…%¥ñ›´ìTþ`r»µF¢ÞÁ6g‚7–ŠÝZ‡ k·ë*(µ9¸fçtÕï÷ü”m¨:}Tævè:~¤Ó'~ñ—[5ómaëiÖ«’©B·š5alö"+ í ØÍúýÛœ¶¡ÐÿŒýaZuÕ´:úMDžD/óØšÚã âM‘ õÁNoÔb0ÔŠI½eƒÚx3Õ»÷Áˆµ°æèl‹Ó£÷zCFžn÷HµmÓ¹!6vÖ™A) Ïm‚›ˆûñšÚê®l ñ# 2{H'h0¢&ï ³sÆ_¾60>^vr°¤*m,~:ú†Oâþ²ŽØ™ñ¼× SÀ¬˜Qv³ØE¦f{üd-„‹™ÃO‚Ÿ®ýb©6æQ•.UƒI:v‡CãZò3ˆ}OYÖP’9h¯s ЛNléü}%TVTdÆü_{ø¾óôFÖfêP ­ˆŽ]ª[V¾„Ç G‹qêŸ]C鴈ɰ}..,!‡Ä')I,G1I–>è²c„ì,’eäýÛÞÛ‚{¢Pü7OOz?ñguTeë®5â}<“‡!(#m‰F£9ÿ¤n óæ@Ð à’ecJÕŠ^D0&¬’ àQs 8#äÞ>ÂŃg…¨ˆxÏ¡«HY©ø¹\.Ã÷+ر† Ä9É~hODx’¡_8ÕO•ê)f(ÈG ·t"T9ð*ø%ÁË3¬OË¢Ú Èʄ㪃| š\P˜³¨µ.}C¡¡ä‰x.˜Bô­P³›õŒ×̰h&ÌFo{<õ +iÏY!Ž)ï[¬,OËi²ß7p#é@çð¶!ý%jôÅýîfýÞ0¡AºƒßTì½–êš Ò;ôm¨pTd„Õ,¦?¼+`”Ø›R¹(pßdpÑ󆽫ٽp­vP³ó~¶Gcêçm‰Ì—ëÀ—‚p4Vw±Kú6ÁV‹-NU3}Æ%<|…3²¾©êzô·úHHÛ2ÆÜ¤Œs¢Ð;HÁIxºÞ|¸¼Œ®iQÑx2örêŒPMæ½JÈÿXWæƒr ÑNxm.J.p@UÑãÒÖ&)>¤W ýèã>Dð‰-v+iB¤\:ïA;XÇ”ž$Ôìlhð™-ÄûTrØÈ,>95-]Di«š2)c ýCg²mˆ„TŸ ò ìæš’TI¾ñqÁcÂÖiW¨Ë]ƒ¢¿¯HG×\r¦±'Ý›tØ@D2ÖŒ0ÃÎAo;ôA½É=/;y+¾»5uQiiˆ/0Ÿ”ÇØðéc·-¤fᬸET„ʈe’¾F+PNùŸz4N¨Ç˜EX»7å,DÇ£YU‚z[H¤„†u`TlCÓYt¹È~ gAÇ9×­[ÊpN®±n£ÕÁ ãV;ëAÂNGdà¿{¼Ç‘„ó 1%öe*Ö@ó¥yyæ`áqìÈ&Ü»¦N´ÖòSò¥gNÃà"Ús´ˆI„oR“'Å‹ôkJOæhû©·ÁFt2e¦¾¦5¤ Tvü"b@‚ì¤×¢uýÈ4xˆaO>6=ã3.ª®íø(ó˜—@Öƒ =.æ3:Ãn¿ž0ĺ ¶)­¥ÿçžÊ:E ê˜Ù`sG‘?´~œLÎóÛ“`xÔyuQpoœ…^uЕòyP`À:÷‚ýø"¬T4\¹ÃI°ã4>ˆNò#ÏS‹É›ÒA“h‹£xñ«ó!g«¾0xJ†"8ý(hkêƒ$ý¢ ox(û·qMok(@ ì8ØŽ¸Ä@n:Ð.N¨÷=Zh·eêæVQÝr!L©o¯ø}p:õtò"Q?ÂásD7úWH·•-µn‚Q†cí­ÅŸ(ÙT<}c1-¢KõàåÁ¸ŒÖr€mu(mn[È…·|L/‘œ)߈è!]†9+M”Ôi1_’põQb¿Oa7ðÒ€9Ï ã\~*Bð-ÔX7áXq·S§ç$ÐY-Êê6hq›&î_Bð5Ÿ”aXÔ‘Z+‚~^ÒubÃàç,M!:F^ŠÇ2 º,3„dMËQŸ²Ä ~Á L±—‡‘œ4¢Ö2@}6$ùüì× ŒÃeýìó‚‡vòBmŽikQ¨Ÿ6·ë[îL‹§ìŸÜäHÐú"Ó÷¥"ÌbNËuk^‚J,6sÔnÇÃ+#zµˆýAR ÃØá½ïáN̳~Û• ™{yö˜PàzD3•Á88Œ0½¨Õž¢Ìr„Þ¦W ëX&‚¦ÆQéîå…¹5 Âö÷€ÀéΡùÉž}h¬úÛ./÷ŽCÛ(¹£1Ãß=3˜ ^Èž hï™ë¾Åä |òÂúI(“;®Ô& ë§}^Ð5Eu’Ëô‰]«×ço^¯Þ-g|¾V«wjsq¡ÖŸ7×t™eH_8Ïqª°L„wÍãÍ´TàºrV«%"¬ÖgKµz›©×¯Vpšê•›¯ÿªæYš 6bcc18716f3239e8f3797a4579159df4//proj/rd/eric/funtools-1.4.5/man/man1/fundisp.1fundispt$display data in a Funtools data file1¦ ËdxœÍ[ sÛHvþ+®½%Í€/ðÐÄS‘í(5k»,m"Ç5ID“D \’¸[û»ò÷ò®>@‚¶v«RÚÁ¾û½ïÝ|õÇwJ­ê,NÊê*üH£½Š£*RI¦"u]gUž§%­’T«ÛÏï?|¼½¹u¿tWj•Û¨ú žSü“៻ßÔ?'Y´Õ?«/Ë<­·Y©IµKž^Aý‡w7ÞÃ0Ð[ýNPeU$Ù¿ÙÕ¨nŠ Ì×d­µŠJX]š”•ZæY%öª6Z™‰îõ9Pÿvõ+ôϨž©Jåuµ«+µÑQ¬ ¨º†¥ý†Õu©U¹ÓËd•èX-7Q-+hñªÔ;(¬`eg±^]Bëh©ÏaŒ;ì/ÕŠxqQVQ±ˆ`HÙÖY-Üå¹zûîöͧ"#¤l±¤&à³[ØõÍÝ­z÷Té¬L`CQ_À‚nˆ&·zYaa¾BÎaCdX  1³QŸåY—ÚDET…6Eô¨ôƒÎ*êÖSêf^%Ð8*ÖõkªœÖ³+òumíºxÅ4\’pAŽãÈfaž›•ê”Uœd•”n¯“ *´*€]jUä[¦FÛŽŠ˜çê©?-P_ß¾êJ½Ï«ˆv Sñ{^ Fâu•Bú•À©dÒÀw—¬/yi– “e+pamg:vBgšfÈ/ö øÛD$8hä8ÿÄu”ª",iP„µŽ{êš—¡–Q“«(ŽaÖºÄU,d—™ì²̪ËK¥¾”›ß,ž:•.«ž~øR%[Ý=K²êŸ~î Âß:JÝ«Ï _¹‚?7êîÕ¾ÞÞ«·P×åשOÿé¸ÀTƒ¾šñÐð¤ìó´7˜ô±@Ízaß4 Ç9ýSôn6Û¦òCνÁÍ󬥇 ~ºÇôD·ú™tj,JZ)·7þÜë0kë0ÿv‡é‰¶÷iŸç-¹Í³ßÑ|Ïì7;ÑïËû×—¤KŽåñ) ‘ ¾}ÔiŠŸN§ŒR“UR¡’è‘Þ×±Q’+£ðŽ“Ä:/ö=Ððÿ¾Ñ(›8üšèx­'!£wè@Ò%Gq …u¶Ló’ý=TžàÇý¹†žänR¯ÀÙS„(R´ °ésŠ:-áåœK ì2µÖ™.¢”ã°¢Na L; Ux€IQ;ƒIˆu×+1RâXÿE"ÙÑò~ ?”­ÈýôäxQónû=&У=ž”„ÙŸ'ɾ?5læ üæ-C£zªê‚„ÞLÛî¶žµý´N¦æm0=_¢í"YרDp>à ª)IU@´Àü‚ø79ˆè}–`¢ Ñ.M–I•îGÐhå~»ÀØàGš¥{èÄ’°\û,C«‚ÿÐkU§*Y©}^«Çˆ#¶Îk=OQÏiK%GÌ)Y`ÇUWË%©ÞµI°e{ˆsžTGFì0wÍd¥ï¿šÉš{0MJI•t~Tv¬ÆÖ=tDañŸ‘ဪ3#»ª‹½Íù1ž6™-JE™d§$aß·O™Ú%O:uùÀ…?®—ˆÇÇ :}["EZ'˜µ4þÍÖS¯÷@¨UT§U £‚åcQë²iQÅ]#~ÎxkÕ~G‰HRÖì—üQ?è" ]VO¯aóԜ׆-_ß¾¹úõ-òõ¼ûôÁ¤#1=¸Õ”óÁÙÁº–p^:°ô ú*Í£ Ò!dF©’~2—–*˜W9¬¯HâDW¼ÐÌ…¹öÚhW†yLÐx&}«d7¤˜gÁ`Œ†Aß“1o½ÎЧ•Tjz7/`' n‡VÍ(Íëf(a£;M"Eaÿ°¨Õ³Ì Ìå<÷莯­Î)·] øCuYÃ÷= Œ-y†ìá—É_%ÑW`sRÁR1¿ˆ‰vœ òÃò÷‘f îåQÆM•,tš?ž“ív0§äM^v‘æË¯žXó£Ïˆ-Ë|7]€)/ÃËI0¼œ‚'%,â;—LÿØXê‰:‘–ûî£^¢ßÀ!¸}k¶ùqbK¦ô4ºôZ…®¹´›Ú’=/½Vn,ÓnfKæô^z­ÜX¦ÝÜ” úô4¹ôZ¹±¤4Âæzš^z­ìX¦4‚!=9Ÿ…me²h¤¶[SÁxp‘™¬s²EЀk²‹J«`$5¶)òz½AÞscÊÄDô.l¹øÙª¬@šÀrh¡œú1Rf„Î „ÊCÇw?^Ç©°Üû>¶zßçÂ:÷}`Øã¾Â÷}0´–¦›ª3L‹Ÿ«Œ(Ä$l…­b(z¨ ¿yFté‰ÅΞ‰¥,tƒoIÄÕÅðqÓw¤ªëäÔÊ+Ãú0TU ºq{qØ^wùq“€`S€Žëß$‡ ç’±wº@{ZJ¦!çÅò8çHò{Ø‘a©29ƒ¢u†ÃaÑŸöȹ‰,E,=ÏÍ0þØ·°ÐA“…J„ÿˆeiòUSvâ³@öÎÛW/‡ Cƒ•ºyõr¢vÈ’yoE1¡Wµƒw<t[Q;žŽG„Y×+¼E3µn]ˆjN,ÌÇÓó¶Œíí®Ÿž³ëïoû”àš½góÞî³Eà‚W±rÆ;[¥É²ÂMdð½‘dðvt½3C RXÍ9-²O0ÅBç@€´êÜwÌØ’`Ä·N„÷ê 4ð¹5; œ9†©yúÀŒÀ…wÑpÀÚŸ‰¢8×±Ô%¦­Êz¹aðÊ­1ódÊ7"W’]"{ø„Ø-17‚8R¤kФÄû$bð]ÑW+¸„Ñï®w;I;È2¨ñËyi;/Ø‚›€ñ¼—óEb‘2ÄjR•¸¿À÷{Æ%%!j‡…H }Hiô-ðšAçétÿÌ­) ÷Mø3òï€÷àÝ4@-–æhü§ã[™:ÝÚS (˜9 X*8‹‘ˆ…׸ÒGº]Övi „NóGÃPT[bÅŸçb¹`_Ì @"í±"}kòöúI/ksM(Ñ# LG®’tá zÿ_¸„«;¥³‡"Ï(+õ0$Ú>1¬"Ér>?(ÝhG:\xHŽ_ÉÂ=‰Q· ‡dÌåŽí©²gÌ ¾ë4_Ø“4ɼy‰·$k¸QÉþîÚy–¦ÖMx=hr]?¦š8„äÊ\*‚x½a Ö‰5Ø}²HÒ¤"K ã-7 Õb´…‘Áƒ—7Ì t½15wÕ˜Ü î»Óæ[=$˜ƒµ%k&èBWZQ%&(ð'dšƒª¨³%ùg¢#R½‰NVþ⓸¢´) Ó4[C¹P’µŠMÌÊÈrª„j ÐŒãalÁ=\ìÛùôöµ½ÆéÒÀÝ;áÊ9JôÐ!:tËjŸ¶híD¼<‡‚qc½‚ò Ì e'JðᣇÎÝ7´Gj:×Å eàéi“ÎSdœžtiÃŽJ0ø`‡ˆâ Y)èL£~™­BAr1Q‹DˆyḅõvÇ'2òÞrPÎæX üBb¥9ñ¥”V Ž˜ÜÿìvøˆœÚCYá•Oò£ ªäÀ½n†'ÒGbSÆm›AÁ„Y·IFhCÆ<šw„´–Õr¸B³¸Ó-RæÊI‹!Q®ç¹+è§mkh€ˆÀs¼’lë-˜fÆ h«žîÖ጗]zÄÛ¡z‡–—qÇà—Š€¯ÍµOwü}^ñ7]BqÁ©ÿ>0_,LJÝN´øB0¨Ð[P¾1Ÿ¬j:é,4éP¼H6ìo‚KRãÄ¿H±ëÚ âç-×ÃÝIÁ£ ÜÎ}4HW^>Ђ£t›cÖ’Ã!D ªÝ(Žy>ðŽâ¶`Ôœê?× JŠL^ií¡ŸGºÛÜèP‚«JÙ{Ï`öÎ*êŒ4»;T>™<½V20ù²L †ôî €è÷„ýŸùáã/WúxÃ_IRÿ¾ýlÑ<ã¡ñ:®Æ+ C&ð<¥ïÉÑ|>íÃY8OCi5™‡ñag¬™ÛÎãpöÂÙ|<¸Îsó0:ìŒM&næÉhÐëf“É eæ°­sè:çýÞlÓá3:7—=0µ8Ÿ÷gíË~&O‚þ\¨õÃEp±F>·ÀZâ*ðóÿ‚øžÓà˜…HË8|Ï‚ypÌ,ܰe½q¼#¶ðh¡ß, ŽpÔÌLÚ$µô(P{ú»K^½ÀÇ&¢O Ëû¤‰cnï9~øys2& wÐ΀@Þß$úxÒ[º‹ìã)€‰ð-Âgƒé3i? ]ËoR¿?ñ`2Üw꬈Ê·&¹wÈNž¡ö&#!¿ù¹Àî|5ÂýètFÄìŠklô7èXÌÊ‘'Ëʾwhâ(ð~ˆ’”bÊ™K¢’œM:£Ë ø³¾-fWúßàø’¿æ¢–Ôób¯ñî&“\@aPy`—…Æ#Æ|ÉïTìt¢ú â {æYz—?ø’ĵŸõoz«tA FŽ%ãÑãËó˜¯ â½ŠB+uö‡»›sY9`÷ÝÂÜyÀ©Jcg1­BÁIä~>}Ý…°[¿û§‹E’]”‘”ApAê¥÷Ã|»øÏÁ‹å(zü £åÕÏý¿îÀ¬@d•êüí'û¤´óbйì¼þ„Müño1Œ–E²#^×–Ö-Áů2€¿·ýº®’Eï>í©á2ßnÉuc{íYÜUžÓAeç ì oY*Gý¬àoOÈDÞ_Ž ›B<ž=ãÄ7FÃx;Ëþ¼BÜ™wɉ™÷_ÜD0?yi|;“VîbýÊÞœ9f, þöÝ;uõëí¥nµûqÇYv.þ¿I{Û_~pvà­éçÑÏã½q/TWÀ–T ƺŽ|áRv68ÿ_r[øì f0c43d781d86443f8e63f208466b1cab//proj/rd/eric/funtools-1.4.5/man/man1/funhead.1funhead+%#display a header in a Funtools file1)˜_xœÕXmOãHþ+¥ì}€SHfn™Ýì*@ÂFJÌÀhÄ­:v‡X8vÆÝ&ðËöïíSÕí—03«ÕÝ}¸C"„vu½>Uý´ƒÑÕ˜hUfk­bêQœ˜mª^H/è‚’ ß'efó<5´JRM‹OÁìz1]4û>÷Ô=> Xþ¸¼§$™ÚèŸèsÎIóç=Í®Ãé,ÀÖž"üüÐLSÒÏVg&É3oÜ@Ìì‹ü¢µÂ“$3–Mç+zwLK½Ê Mv­)Ó»^šd{­Û»-ôVg1ÅÊ*²/[-*Èæ¤U´&†š¼´Û[z—n›ÿ (â呱ªX*£!n,ÁÚFY:/ÎæS ©I†wÕˆ7“i¸¨R¹Ur`µx/OÍVGÉ*ѱ“Wñ÷‰B<^%l©â¡Üè̲üi[äPToö†ª%{-…ÂïLŸ¦+ê'Y‡Ó($¯`çWE¾q®Y•Ūˆ¾~£ÿ´PÑ£¶äVY®Ô•!ÀšSû‘Ú$*SdYk !øß#Š´13àD¦éKWŒ®J åäú¨H2…ÂH•|#qÉøâtQˆ4Íw°¾dÌVµ‡bÄË3³K,ìGÍϼJ YlìûZWIr‰í>—:îsðºKkX~ÒköÍÅ9 “å–vyñHXóêYYU¤§â\“>ÝÂ|+%+ô&b,Ãd¡-’Èå™;qUڵƒT­@Í·ͳ´îŸR.¶÷7ú¦èAÅZ§[‡¬ªõàB»4„ß z<5-'ì÷³Ýt_î„ëvhêI ÞÁn™A÷®’çýJŸœ¼‚H­ÏwN£»6ë⎡,ƒeÞÓä&øõz4ÿõ&øg0» è€J:ìÖËg³««qÖ£öúåìbz6ºÄrÚ^žáøb<ÇrÒ^^„óipUÓ^EAñÊÞõåøËÏtØÊ)1€Èªeª[ùå¦s©õÉÛ%èž(Ïx8I7ú‘uÄÛ%¯¬LòW›íÞ¼µã¿Ý¼KÔ»xñ®¼'úlÖ÷õÜë¬ò¼¿J¬ùì6ÞwˆîÂq°Àtü@tŠN/qÚ‘k…7ç¼8š"ÿàt^Oïˆ>ûy'²§Î¨@Á莞Jb(!ûÃ)Q„ ŠäÙË jÁá±Þ&1úñâvd“2œøÐ‰¿9>ùщåf ñÊ V»‰ [éúlvÃà¨â6à×±üŠã<÷Ç Ð5€KG? iy`´NVQY¯Vy^«I¡=—«É] QZ‚Õ=P±¢Å(û’Þ¯ü’Ü.uEÐYíÖ º'â{Oþ˜zEÕ¿gĹnöº~#¹£ƒµzb‡qíiX/_>¢<-7Ù¡äÓU[¾*Ãã½®ð\w”õßêBîvTm©÷x!—eŽ´äjŸÊLÖŒY™d¥CuzÄ7j8i­øDü…9îB’A Šš€JÜ5Ø#$Vz{‡ª8ÒÛÎ’#ˆV=êÌ%Wªqøo¹ü¥qg·0Y©ó3¼ž¢}Áµ ¡fë“JKfà0ÀWÆBm’ãÍZ ÿ^2«+%{Á ³sWP`]íSí½-–€g=û–B#í¸m mÖÏ] ´Ù»ÙšC—_LËßÈ=c_RÝÀ (cüþÂCÁUôCáÚÖÎÿGý‚S,(si¼eÛ·¿I•YSç¨#:~ª2âZÌÝš\S%߸.‡eÚæF&‰«7ç[3eŽ$Õây¡uOHtí87hå|íôA«Ñ½þÿ0 ?QËz®})åɯ>lØÁ£•ËqKA!³Õ-G”¹DÃ÷º@L*ÜýhŸÓû{µÜ²ßh WGŽƒIO<ã‚P¹Ø ì.÷·ákâÞ¢´¿ ±éJ¼õR34ŒÓÊ4›åXý õªóÆdE_?QEͨÇó(ÍóGñm2›á¬ûÙÿ½Í\¬Þ»¹Š+ð“˜wÀOqz (Ï?С†õ¡¬±>të|ÚX·¨R0«†2ë@èÔôò.Ê 5§¦'z°ŠÉt§ßçiÍ=¿[ô|âÖ_˜·ã4¯ÙKu=ÖOlÙä({cïµæ^­î~Ñáü^hMgôßöb ¹¿'òÖa%ç´YîþÇÕWKnöׯ¨ê âb<¦Ñåbæ4¯ü[ ÌEÖ¦Üm.×ï‡øÅô<ÀÞ“'oƒþÛþßh¢•Òàm9 $d_øƒÁáï:Ø’X 9986d9b24db7d30c3068bdf27110aa43//proj/rd/eric/funtools-1.4.5/man/man1/funhist.1funhist@XZcreate a 1D histogram of a column (from a FITS binary table or raw event file) or an image1’d«+xœ½Y oÛ8þ+snp°²lù™ú²Ûô`7]\r@Š´w`,ÚâU–´¢äÇ-ö¿ß IQ”ì$>\Q­-rHÎ|óÍCÌíÕ/׫2‰„, Ëœ³‚ƒà=ÐPºÎÙÒŽ,Ó¸Ü$Ð]åé?ÜÜßÁ“HX~€‚=ÅÒr¶¾åI+ó ±Ć­9Ü}ºýøëÝÍ]}Üc?þú÷_௸ц¿ƒG}Êx|ŒÓE$_ðù>þzóñ×âü¼$Í7,ÿá¤lY\â/Ô$â°a‘Μ-#5M§¨U2ãK±:¨A-†»œ…$ž”›'žÓ/:g€åë1.¾×‹Ó²ÈÊ‚Æóði –?1ÉaEšÐE@òŒå¬HsÙƒ÷×w?ýýFé]›¬ñ•ˆ_šð~(6<‘"MXì ­&C´¶‚‡{©¡¿ÞziËV€]t€ñW’&}5Ñò‘µŒš×Þ"Ïå9;xèÀv¹ ­‹ ­e’¼ Ww?ÝÜèó}¸Š ž'¬[ãb2#˵ø…3ž^š`8ño¾,ÈÔ¡/Z¡U`{.}€{X‰ÁCw”R¼H 9ÿ­9µºpR‰}(“"Mc©ì]h#-cÕQ^ Ïšç߬ #‹P$:Èúă ¥8Žª½V  ,‘(Hþ!~ÌÙò+/à6-˜2œl©X©4ã•c¥¶õAD ˆ¤”Ö\+ù2E ‹eê‚áÃMÑÂÂ1Z¢ZHå5O82V$k5o« §!e¦b“P,Yå¡nSÏsw'¹¬P´^€@øö%Úyè `ç`ž>uzÑ>†ˆ·Á¸s©"†5é#”ŽÚC£'P)æ ~zŠ1èKN[júн'Ò I[ÓVõÆ;ǰF1 &æZZÆ…TÌvˆîœŸT.@c“‚‰¤BŽ0Ç4D~Ø{C¦<ÝI¿§ Ä¬ð¡T×àÑÙW¸<¸À¨i<¼Ž ‹Q­_¢Dɪ”(+-9Ñщ­Lìy\EWWÕ*cTÛõ≠j%ËšP*Ãщvðˆ !—:Ni:gÉš›=ŒÂ†ç&à±l»‘tWÊ(-ãÐÆMl(mã² Ûƒ¦î‰}ëÝ*´öjÑÁ0èìôv íUÔ vTÂq#Š¢2ºFÎàªnZ±dñ²Œ±T„À®Êëü÷?ÿrs;Àÿ¯ ÂÔƒÙ¡òvW¨˜EOð=•ãs½­J/zeT»Ä¨xÂ:ºNµ ó´\Gu@7[ÍŽÀP:ø:M%WŸ±ø¤•µ™ï¯î¯ÈNõm-5†zÿƒš'T„.æ_®é®œ…‚˜dí"ʱŽ0˜ˆA¸U «X’¢ T”À¾Ióƒ‰r«Õ…UœêPÈPMÕ!`šsëNO3ü8œP%:Ä)6Œº‘'QäTëC¾b˜§H<]’4_h(Þè0Ý-¹”¨„v6B]Ûüô@îD=Uf4ˆ6qëÑéf «E¤’0KN¨îcF)å¢îx°o(|¾…,š¿†ÃÅ3–˜vbª-Æåú¨ÑPa§t1ôµáêÁ.R5¼îXw¯€6O˜>€IˆÖƒ¡Øn)8Ê EM×Q‡LËi•/u!¿7šhÊíuõQ¾î(Ê4”þq½7â¡YÌ:cªþ©‹d—Ë™fU$Ì8ßÛñ*MTÑOvêsøžm2:1œö±l9„¸S±]”J[et²T±ÛŸûS"}^¹47eôå$A°Ë¶íÆÔg¥>à¹XhjP‰£¨ÖÄÈ™åíFºGÑ3J!ú /ÔÛ <‘þTˆA_}ÌWã—ûyf³ŒFöü¡þÐÓÌyYQ½¨1 ý©ó4¶¢C-:mˆNœ§I%¼Õ¢“†èØyšZÑK-:nˆŽœ§™kÑQC4pžæVT/jLBè<]V¢cc–; à>½mí MQ÷Œ`ØR¶1‹º²Ö_ƒÆ,*æÊZ‡h³ˆ¼+ÛöXc¡we­Ë ³ˆ½+k}føÕ˜pÙölœ‹Ù©X;?Ú^ˆ7åRŠ(ó=ãíu^Ôî{•Ö{¯³¢o/¢öÝ«œ°ñö:%^róbü=þ¾ŽO9ztÊÑãù)ïMN9zœr‰‹³SÝžDõUI×ÞH=×VÕWV´âùk«j¶+|î{z}ƒi¯]?ûɹ>ÿ}üÆèX¢å.Z1è¶µTý ˲˜%ÇXúÔìx–gðᖮך,9É”™ÌÔgÞfÊI¶Lü þ#q÷ì{z¹XªWHb§:/Ûk!'°5 Ë%]¸Æê}cYæ[¢¢lZ«ˆm©û*Q¨wK 90w?Îõ¥ž¨î‰’ö«î‹-¤éñJ¯ª^'ŸRuEjÈŠÊæÖˆuÏ^Òt×úBŒ°3ÁåÄ\A }!˜—tõ>ãÁ8hŽLãoëñ|Öš{oêÍÔ[áüd¹"ôšAq2VrÍH°¥™·YL4Æ'“àÔ¯oÊbÄÈZ&ÎoýqGˆÅãÆÀ‘¸;2>8wG&mñÉ‘¸;2m‹OÄÝ‘Y[|v$îŽÌÛâó#qwäƒyÕaûæå]”7.)ÎŒ õ¦w^\Ô§Xìu+Š£ÈáÁ!ž^,ýçi¾‡ÑbÞ®/²ÝVƒ‡cîñÙ)Ü×bù¦|t>™‰û£áÙd&îoÏ&3q?¸<›ÌÄý`~6™gºXKæ—¾}S—¾»ËgÃ]>i¹|¼è¶Oi©z1º¡^'e§UŠTÝcÑ“¾¤ËÍ•0Åqβȹ̑.Ö— r™‹¬YbƒÇ¨Kzó§¢1e>Âxe—ÿÛŸÁ?/ÞEHZ}`»¯êûÇë¿ÝÜþžåt3Ø‘¼À®ê+?üèg! ,vŸ;ÆÕŸ;zx³'ã8žWª16hXÙ÷¹ÓÿÜÑÄSºç²ó‡>Þœx1öà3ÉŤ1þì%*„úÏ¥þ«pðnòí )ãFïþŒÞº3ri³Á4)Õ•™,MÓg’œÁ˘âÓ‚gn}ß'\I«ÌÝõ5\ý|÷OæœDÔŸÓºIÏ\œÇ´&Gû‡¶ˆÇd˜±%lÉLùÍ\!1¾qc®šwsb7èý˜ÒJ bb091d8854ccdc1797592ea45ba6e80c0/proj/rd/eric/funtools-1.4.5/man/man1/funimage.1funimageL.-create a FITS image from a Funtools data file1˜a±5xœåZkoã6ý+DúÅÆ*Û±Ó©1³@2ñl´™¢Iw§ëÍ´EÇÚÈ¢KÉõ×÷Ü{II~ÌtšÝ6HìXº$ïóÜCÊwWß•š¯³d©ŸŒ:W3gta”Vïoî•\;»¤+묰6ÍU¬ ­æIjÔýÏw~¸¿½oL19×êM’é¥ù«zcå}2MŠU²{›=6ÓcÁ7»™MG»8YæøPÒ‡ÒØàçfZ©*?»ì‡n?ÜAÑs­”úJéÕÊd±*¬2»$/’ìIÙu±Zb˜Î•μùfW˜,Ol†Á)N2L £R –!3›:Éh&2"R%¿ntº6¹RÖñ+µrö?fV(Z’UÖ©RihAÚTþïÝøåoÆ÷ï~¼eõn9Ò`åpÅ•G+Få+3K扉åDgñ+¬{Ëâ÷І.Úyˆ;‘búì”`f³sÖÎé²!­œÞ*³1™8¦£ÔT™'žÒîi½¤;0•„/žœ^VŠæ|UL'ÓÂQcýÉiÌ13yŽunçê,/â$;£àTÆG’±Ú¯Å ÷ðƒv±¬ÕQ?å¦Îòk§gϦPw¶Ðl5–’)½¯9/Ε"‡æ‘w}..ÂgLM*ÆåÞ¸gq±òA"Öú¼«_‚;‡–Ôîáåpsë’ŠV6É´˜ìºT±™ëuZDÍõP&•ôÌÙ7ˆ*O€Ò‡å ™«IK›W÷%.ìüâÁBgIM· ¨1M2® ×ÓÔ´#5…x±€¦3$ÒólŒsICx³(2jE^Ó) º†‹üšsë–#¥B9+Z gdÿë¨w]ô£sú»D$¬ÖHó§ y?[h©|a¬‡–¸Z]ptàß)å¹3äà"Ù˜´ç×vV™Cš©>!Iâ,Ê ÖÇB^ u ,N‹LS‹4ŠUkªs¼Ada·<|¿¦šanKötCàNÄ™“ Ô>+ÕÿA àÊ ódœO’2ÑHu}ÿîê»1/qýÏñÔ³)·ÖÅ9-ać´ÇBì+1ö(]ò™N½œ6øH+Ts‘LlRCSUçso24®#úúipÐÛÏ-Yh«Ë­•Íódš–‚@q2Ÿ# &yò+e[ÇŠÊò™-¾HMgÈ?&>|†yd5ù™Sú…xeTÍEùoQ wh!‘8`»Hf Lö{¹"ÑoÄûÈ“®Y¨«K$œ%™!,d]k¸"‹Š­Upuº^fTÐ(m’¦Tëœõe©þM(`Ƭºhc›J^šÙå’4„#/aºŒ˜?ÛÚEe;8xÄ=k–¹:›[Û1›Éøï㻇û¨M±‹ðR¶Ï|¯XC3ªùPÿA¶*¤v΀àç˜ì¨ãOFEºL2~Ó»Ú?`à×GüD“òX`2ªÚSØW$)’`ˆ`½±,¿ß£®}R±É×bò™œ³è] ac†£÷ Ý /,­#£2þ¢§@ß*Gkõ(˜Ù4 %u{f5š~Š„¸úöæ§SÁ¼[B»Û*ß&°ð˜ÛT3Ф8¹T±ôŠ&yŽ~ûýÕ߯5GÇr-¿žï5"[¸…úO$kÕJ4Ÿo ¼žûc6¶÷Áˆ £äØ/ ÀÌóÜ%Y`²MâlÆü†)“'°to‰$«´Éñ²'–M%},åãÆãœ€°°ã÷Р-m¡©™4‘€”7‰5õF–ú*0<§³°‘ì‘+馈!‡GÔ”N‰~A˜nï ûF‹1uk ÌlZúöa˜Ñ—Šd¶N‰¶“†4¥ø$~Æc¡ÒsA*Y®—¨øA„08·à>DIž6êã½%Ÿë% nÔ<!òa;)íìñ>Oœ|.Ñ {}ÿWÖðŽÇD苜 )×®QyAoø‡w¡ëŒ<WùÆÜß‘ŽPÙP®Ä”ÓÌ4; …+ˆPfÄ—òÂ1mÛïÕ•¿÷€¼Rýóù˜Ï›èÚø³3ooãŸ=«ûƒ®ê»H¼ ñw©pµÓýûæ„S€x›$æã ¶–hf¬Oˆ©“iª³çšëÎWh™¸÷Ž}p.[ª” ÷=Þ±+ ¿`3ñ Á×~î·Wb@ùÚGœ}Y=³å™uYŽ%ƒ–|Šh<‰}~ÎmšÚ-34REvÏÈ*rs±+ÚˆÁnt;êz]¥Êê¿sþS¬þëÒ‡®o9õ|èàh y“ÜE"Ab@S½³¿èŸO‰ßd²3ë|éuH<Ûofˆ×¸NŸ ¯•w“?ÄBÛ^®Š½£©†Í<²ÄKî`±BÕ½M¼¬Ïm¦Ìù¦.ÿ äm(o—üú5½@+õj¸ò¿|ÃT# @WB¡N¾…(‰ úæc^¿`Ì×/sù‚1ÃŒ¼`ÌÅ Æô_0¦GczlÌÁ¶¨ªÄåXç3[~Áû g·¡;ê[»¥…MMØãT"' ©nÔ%äó"`á!i²¤BGsÂõèðÀïí=™í¨ÖÏ@O´¡È.G4ýˆzQ žW†nNÇÆŸQúÐeXeðÜ÷kG]”vC2õ6šˆ<Œ?>øCÏ@ìgÕá©nø¨ŒÉŸaprXEä­öžN ûdh ;ÃÁCdª#K‚Š†Ú´ãÁzV¬uÚ ‰M4“f7!Ý[ À݈ѷÛ~T' îz›Í+î¹Ä+ë‰êë_<™¢°TÜh&)Q|&îbãü 9:óD^]êü9pð(Ù3 –z‰$«rÅÇe*çÚÂZ)Hó’w˜ê-ÀÙ?–à˜ËÑ ©zÐÛŠO‡¥¡d3$¬©œ]xÝò/ B4K\k £A;â#’îõÚÑy¸Þ'×þë„w£Ê¦½˜=TǪÁn•Zûœ£˜ž ³ôÿï^Ó©So½ý1¡×ô~wL¯sy8æ”nc†/3xÁ˜‹ØÓßz4>}Š€UÕÔ «Ç…þé"ï°¤”eïZ?e¬Ol«‡’²©î„CŒ•ž&iâ¶µîYN“¦Ø;…óÞîò Ô,ÔŒ×oºe¯-»³9â{û B­‘ ï#L ÕSÕWBøíóë¿øuÈå÷‚_ü:äò;à×!ÿ#¿Ãð{%¼>_YÏánÎí=]+î³þ\B›PÂh3§6oЈéSÈ›¼Ÿ¼’øøf#[ë›Ý½›½êf÷øæU#³‰åsÊopWÆÑJžsùNÆÔ(<7©XÊÞ†s…iB‚ÈcOU#°t†ÿ­wkKOLº¯Wú?f'¹×ñ7ŽE§ùþØ€Oû% Ço&"÷xšÅÊg¨NeБ¯\Þ nAïã´jh«s†>Ït94‚ZÍL I4 æÛþq‹KÞÞ}æû5‡Ï4 >É/º&/:f#ïÂJnä¤õð{…Åaòð:¯¿ÂñÉõêÏüŠ“þèut1ú:ê?ž}ÆŸüÓ÷¦“NøJ:­/8Ó†]z˜òW..ƒ/ê~QˆA“ün6K#kmH ! ðUl@¨|ÈyUÌ;¾íà?ÌP1Cbï‰2Ìb•Ô%Ø ÕâÀ O08:d»˜í6Æúótmþ“ü}šßýš…ÆLδìòJ ™‹]Ð *ÖiÝœ3\ûµ¸R…˜Æ%–ÕìTyx딦HÀ‹–á…ïô¸ÝE¹ðc`®ƒÌF…³ù‡à¡¦âŠì#Z¦-f7Ìæ …•9G !v@´Êý½m’€£ÃAˆÆEP¦ ˆ—lM¹ñ1ÊþÁ8ý»i1”ð`õ…î?¶ÍÞª™\˜óž£§³.ƒ/1Õ¦m"ÈÖõ <Œ•^” ¶ö¨yÞuZþ[ÍШaÅ=¤s©’YŸa+Ó,^‚†£Hé 7Ù5–B’OÊdõj°zÌZ½Ì+W²òJV¦!î§NV'újõÕÕ¿#]çku×v#£É7*ê¶è†N¶¬ ªîh.=9®8:ç`W f2fá غ¦G?6¸”ú¶–¡¢8ƒrÀó1—±X›ƒ0ÿŽ¢›†ÐÖ˜|.ïúãI¶±ä­Ìj‚}Þb(™ÌÛœMž¥f⡇«ÊĆx×s*ïɹ?²êdp`ÅqD7°ªE±äádC“ž$”£ÖQJU“,ÅÅ HŽüÄš~(ëý—[n!(Ãj^9 ª}’—bΕ#¡]…ÔßâÅž»ûÍ–=ƒÒÎÐ1[>lá}:ÖmÓÖv1õçN#¿öÕšë9‚®àjºJkx‹àµ¯ä#ƒž›mtá¡ÈßHøfwX{–ÞÊhÞ¹íoL%dH‘x|ør£'ÏÐàõ:{!c ”/u ZÄ8ŽùºÒWHä$!ä÷×ú࢔ÏDWô­îÀN‹~™Wò×H/ؾ^cy¢_ý46› yZËè„¶Û­Æ'Zê%¢^É茒ÏUžŸ£d–eDÊ-R9£'Ÿå¼2'F8±['ìꌰÄÍ ÚOŒVhþI©Ï݈A^–EeX]°‰ý± #~áMtÙ‰©,&­ðfuÙyQö‰é o®póJJI#'´ƒ°EdhT¥/ÓaëêôÐbþl¢'ó|ƒ¶u~Ëý+ýJ§½-ýùçŸg7×Ñ“'Ÿîr¥09†ÐÑ ¿®*ïiýyR˜èüywßÏ|¹¼žl؉Ý5È¢ & Ì0¼ÐïÊTgô[}´ K¤TZ¥xòƒ‰„ÅÅ&¯b0JËD L®³4µz¦˜ ¡!®Ý¶>y5£ÛYè…»—«©ôÚ_„Z%ˆ»æ€¹ÎÍfÔqî¹ñ•rŽøQI¯…¿ý‘þÇG²O®d ./}d{ þ$¿ìÕQ:ôy1LE¹á{ˆ .]ødbBò”Bxèp(â‚Ù¯Kÿ!@È='!ÿûúóH¬Æ¸zV Yà+_ÿ&d.žœ0y@ú̃Úçt‚à_h› •Þ6zû‡Å–ß-åøóÍ™Zñ…Rlü[_¤J _&þ’Nt†ÎYy¢ùã•R˜¦©ùsEo^?¼!z°ò˜üšsQNý‰~8æè~çÙÚ|‡™fƒLæÆŽéY.®OèfWg9-¯fà°Ô°÷ø|±œþ÷°É 44686640ae2327ea61ae72128f9166710/proj/rd/eric/funtools-1.4.5/man/man1/funmerge.1funmerge—&merge one or more Funtools table files1‹*Žxxœ•W]oÛ8ü+ ÷ŵz/E¯hÒ:€Ô)jmQô”DÛ¼P¤¤bëßw–”d9éÝáøK$—³³³CfyõaN´©M%ÝVÒ¥OkðrTY'é¦6ÁZí)ˆ\KÚ(-=­¾-ï>®«ÁZú~q ‹ãºØÐ÷Âj#*ùƒ^+þœ½i¿\¾!ʲŒ^[þõ†î>®wK„Á"ü=#[‡}H"Ô•!¿—…Ú4Êlãδq¶¢ÃN; ;åI>H¨@0Ä8¤¢ü«ööÖ« ¬¡¡k`®=GùònEÊl,¦ÿÏtaJòâ¼è²›ò~¾z÷iSß=Ý,Ö+*E ó¥ÀÓ˜ä8u‡JÃj­$÷6íÄCpïäFéæóòfqÛ‰4ýz1ë¿]NI†"úK·ÖÞr9†áÜí/$RJ_8•A.µ=@@½ ím,wkñBgó-¯gnÏ:ÇwU²1äùN•_7Cø)î#ºZ¦ötóƒ¤ð™+cbÍ»Ì1lýiE rxBÞÄu˜Žÿ{›ë”-|üuúmÂ0WÔ:ÀžÖ–öÒ1Þ]ht!·ê´Ï¦× ±xª«¿HF–£Ò<•{‡sí3DòþdÌ©¢™Ï5……dR’ê(ò÷ F¬ƒlDMÁÕíÁD\ƒß \Õö~Þ ÃE)r TýìY›c—È4ö=èŒ-:ˆ–ãâ‚öè}–i ¡Éø(“©ŽVè:œØþÝb[Þ;Å9Åa Xß~X,Ÿãýê+ÝËæ€@>B³¯58U<²“ÐÇ }a>Ú »ëÈ`ËÆÖQßñb]È©-'Ýçå»ÄþÄŸôŽfó©8:'F“®³p6Ý–ØA&ív¸8m/r·©j¯UßO‡I<ùÎtBMˆãéЫ`ž¯sl0>Ÿ¤Õû"7_w%l=ftwûþÏ ú(€IúWD¢+„ƒmo I%Xà¥;'0œ|.y*3ÔÛ®v:  5öÁºæ#œ£ÚưÎs»œÜw¿û1¸‰oº€AúɇøyÉ_Ò=_žä“v}¤âuX†Îø€ãòéqãŸ:þ’õ.ÝHâ}Ôôd~ïù|{t£”çéî›PgôErõe¼¨5¸B²ˆ$£çc¥ìäX$œMÜùd´šÏéêvu‡«£”Œ3^CÇf’îx8KÑSPoAÝI½Ç¹Äws¸_Di–½Ì~£+4¬¦ÙË)]¾˜ÍøŸ‚.ëñlòÑw“ 24a592d8bf1de84a0278973a0b6bffdd./proj/rd/eric/funtools-1.4.5/man/man1/funsky.1funsky7î)convert between image and sky coordinates1‘.¥(xœåYmo7þ+÷‹Ȳ%ÛImô>ø' ±‹ÈE-9€Ú¥¬Ev—{$WŽþ}Ÿá˾(’›^m3ÚH»$‡Ã™gž™¡î®ßß­êÒ|ÞÒ1%ªÜHmi)í³”%e…x’$Ê”x7Wu™Yó*ôåã´¸ÿùav[§D¼¥ÈŸÅÖPm$$[ù$5Ù¼À~ÞÀ&S% „¡Ô\Rª¤b©öK£ ¾Œ¶dUÇ+Qçöª˜‚™¼^ùõY™äu*I­VFZ¯¤]K*ö9Y¡Ÿð¾R&³N h%tbdÂB6^Hš™*l–ª¶´y —‹Ü¨Ž"qŽª-OReîÔxðÂÛVétI+¥ aið|²–"•zdÅ’R™gEfa–!½½™¿ù0sæ$ºõ¾ '6A›]$P†l ‘Þ0³ÉIlw1„O²òÉYä×7sˆô*±%°Y 'C[ž`*™d« /ngsZe¹Ó\B예( ·ZI-KKŒ¤1ÑZehÓØ1ÓØž¬ ž’™ˆ8VÛ›©QÙYÈ–%ÃnyÈ ‡²OÞQcºSPÑ®á=^• +"¶°»ÛŸ¥² útLÿÜR@ÊÈ-¨´zÒ¢Øuæ‡kÇ..ÐÌ`ŸG÷rÑø ’wÔÓlժ㣒L°áŸ3»&áÏïààð}-4Ã[-þÅïK\ÂMþ˼/“zB«õÖd@G#—š1lYÖîˆ8öȱ  4£ËÈ!lš¬±Z•Š&h) ^ßb.J;:yã¶€âiŽléÀX:õSÇt#’5Ȭ”áì5“ hÁñÙ¹ÜXždÀƒì,µbøàxŒaù¤eÁG~î–9¢|¥ò\=cƒå– ™¿3}Ñ™>vدM ›¶\±nS áÈÛŸp/½uàE•Ë+æ¥Ö .Œ"J™Øë¢t,oœo<ÉÓG³þ³„)õX‚"§ÓñåÓW—Ìu?Ž_¾º˜žyö ¨¬AgŽ—|þ¢‹Ééøô4~“éëFÄëWgç­LœÆùqþä5/õó'çg§“Þü3ž>èßoyLâðH˜(ÁÞêsG@ìý.­´HX¢ðÞa>éã0b™‹a‹ºqà,^Á”’9 ³˜’®çof3JœÚC¸v#̯öŠ#x÷Ö Ž)Øë¢·d>h­Ÿ²°5²ªˆÎŒÜ5+ýÉa|ä7+¿8Ê.jÃ¥R§O:úp}4¢£·7oð%ùqqÄYÌe¡&ßðñý7&÷&e1‰Z2ßÛl#ómÃ2þè¬-¢;$C¿ Ʉē`póBõ®'\õ¢J²ñÁ‡ÏžøF¼' ùu:æ *ðo@ÇñßtÅÃ!óžX Zİ¡ökøêâ´‰ÿÊuæ­üœùäxïÏgÎéÒ³eC‘qÎÈ')»(’Ó¿ fÖ0þGtènZ)Õs¨~¶iÁr"ÀcƧiuª<Ž;£gØÂ_€B®¡]Q}õqM)éOà °éPŸZ<vŠX…5{Á#ÿ¼¹7 ቯÓ#âø_ªl"ÍëÈ~ìíeg¦I<×KdÚNvÓ¯HÏ>);2œsbRwØèø¾¿µðpãaÕqVËØ <åXÓ¹œÍbÙÀÁyŸéÛ`+-¬¯Tå@»?ÅO²´ž#¹–{%¯¢†_3Àû…ã€÷‹¿Šœ~ûŸ¾›þ€}ö±búGlrv~>~}~z~6Ý1Š8›\¶§VqÓ‹‹o5ËUêuÀçOQ·ï5M°Jw×=[·<ÐZ)+¾O“]AÍ …އÇñßÿÒ·Üç[Ϋõ¾R;ò¡c—ñ]Âpõ ?îãÈ[KøxUv@ôýq劌¿;_áÅK݃šf=`ÔŽIw;Üx²Š›‡ÜnÜÕH[k:˸›¤¯Ê'r®>+.z½<®,8' éð5‚¡Jh—oq³–œU؆oPþÛÉ °ÕRµíd¼{ði=´òÆÝ+ÈUužr)\iy\¡‹ð©KÆRg·¯ú?ÀwV›—79€¯ÎÞíÃÐu”jÕ:€Ä޶•gš:X¸q«)Vè¥0±ûà®lÙ·½;~ ›Ñ¹†p ( ë\ äÊN`?!("/® 5$2Eb€‹!Ç ÍåZ(Á¢É#Rèˆë Ó¦Ýšbs”j²ÓG TÚ¹ëÈ´,2lµUu ¹†d†W›I¿Î+Q³†8¡B¥rÇÕ/»úÑ}ÑÁµƒvÿ©çø}¸Û½»îªý¢Ê¿Ðhv;{wCÿ Ð…6'RgÉ _êÄ;LáÚS|0ûç©{vQ¿Ü¡kç)iû8÷aùc|à‘u«9þû&¾ôÔg‘n¼õÍ}8ìúçísNŸº1ØwWÿ©©,\( oHÍeCÉš¥ä³ÿ)Àÿbà.lüïÞÏî\èàÛõc¼fäF»)­@išëQ¾ut7*.Ý”¾¡5R®1å¥,"l¶Ê•ph¥°ïW{>ÇÈÝùrº&$¥ÎÜu{Õ€ÇeÍwÖ‰ÒÝl£.Xƒ4C¸ËJ”ÉÖ³ˆ·@› ;‡ÝQ‘5Ag&}O„ˆ—é6Üð¨r•g‰Wø«ÚÖI!¶K¾¼¿¹¡ëwó{¢¹äÁÒ*•›A9ô&õ¿æÀ$·a<”W`¡'è·™ŒÏÇt]é,§Éùˆ¦§“àÞÁdøZA> 36daa9bc67c8b9bf76b30d1e889fd2f70/proj/rd/eric/funtools-1.4.5/man/man1/funtable.1funtableF7>copy selected rows from a Funtools file to a FITS binary table1—n¬CxœÍYën7~B  •I¶³MÛp§5е‹Øí6‚€š¡$nf†rƲòbûz{.$‡#ËNŠìuK’‡çòë\œþóLˆU[5rY(1™©w©BeÊ…5['VÖ”BŠW°É˜þÖ°³1øèüúJ,u%íN0«7—¿__%4ßNä;ø¥Åä~–øËÁ=…{'~„³¥úIühøó-¿¼:)àç!ëZU9Þ«nµktµ¦mê¶a~¤~øBuÛ¨ÊiSÁa͇WÆ ]ʵ¹läX˜ªØ‰µª”• ”ß9+»cDÓÅÖjØ*A7µ¤St-îP2Û«Ö|£ 3Óét$MXÛn4lœ± ìüto,Õ'eÍäF-˜¡Ö· ÿòìêç×礘D¿l,—تÙÀÓZez¥á0é,êdس*b$Ì*…l0zeª -X¹êFUß‚#•8¸Î8Å×߃ <2ç…3b«‹BdVIÒçÝx5\àµÌHº^Z+wž–¸Þ Y뀦]·%2—£äµ5k+˨GOéöE î?_‰kr] „v2Çd#Ø ò*™'ên@!ÒæBW`¼©ø4æ…•ÙÕˆ ÓÈm€ ’;æ+"Ö±b‘‹FYçåt*3ð4 ªY$”(YÇ6¬ìóuÐS5ìA#ÂíA{Q¦4_ìD®V²-`-½¢$°÷AP ħ–x(Pº a%ÒÈÀÊ˸­uèÕðÈÔ¨&Y mSÁ+¢ S~/ÈÏ€Ê\„Op9ÿýbàœ$€‚}¾ïÑ[Çœ²õƒÝU1s×ôý›mõÐsUƒYÛ×^Eã½Âèp+Ëa¶3-ÉK–P?ÌÑò^ýe¯­‘XÊZŠ~¨ ke‰] ±E:PË[·y× >m¦êæm½‘ÏŸÏ?®5|ÌÞ ãD nÅŒ€uP̵«_@h|ƒQJüþë)ü:‡¨Å?÷}Â71§b>Ãoðûÿ÷Áu”2ÀZb*ôçwGwˆ3 ´üìîÝÈÖ1//æOï,£LžóÅÑñ¾\“À§{qr´¿ü«²œ)ÙQ·ºÙ„LS+L•2 ñ ­E©‘rbmœ¦€OyOóQ0›©TŸÍÆ*<HÐ@}<†èñs?HªÛ¬hså“‚ €|åc¦(uÕBÀ×kÜ ’qÊ þ›ÀLbà ;Š  2¼ü‹¿¿|óôR´aŠBo²Iq2=™ÑúŒxô–àÇ~ïÈœxü˜ÂÞ(f¼1`tâ‘ üF>Ñ:ñ˜ Ð…~#ˆ¸xˆáßÈ"‚£á€"±µx­-ETÓ!"ÄáßÈN“¬(SuÃÐD0û°ØGæy)¶…™ Yô„ÙpÏ¡p˜$OÂ@ ùAõ ù•Çvºc¯x©zµÇ²e÷ÏQi ¾â/Uù´®>mì—Ðéö¤Ñûn›Ö’S‡+Pü/ë‹ÄQ?`9äD!¡èͤ£êM–K½nMKµH´­Ø¥n,Ô/l/™çz¯öLM‚í¿.t¦›b7î4aÍíÊ%²ßÒ-“‘BýT²gr•šl ɸâªkÕB¯¨"ÚJ®Üã¼7&a¾Â«v‘¢-¶£+N³ÌØ¥ñU'ÁÑK°ƒ€w+žâ€­.si2—õe[œ/êߊH«'z‚NèE· þ–è¿—Ȭ´µÜ-{±0¨’FƒÞ­QÇB7Ð\– =—t+§-2Tx’9õ°÷÷y¼ ½ñsLbPr_ÎIÂ)ÈAT…Ûº®ÜWñIã€û¦ýj¹‰ý]¨p—ª0[ÖŠëôvöçÙÅu:ìByuRËΆS$q"¬—ìnÕürû¿ŸØü ö{O\e1WÒ]W©{tðèïœû6ŽJÈÐtþüN…¾û@ïëÃF¼’bDeÜÛOS½‚cA3­€÷L±5EÅÉ!T¦ÁêÅiЮvE!Å£dÈUˆ×ö¤Ð•¢¦ R9õmG#èþ+×@ËLì[î›-ÔÔrG”ü<€Û˜ü•Lûý¨8šx¿~t‘#T¯â<øk0ƒ7þöÇÙÀÃKyVSª¼%,hÌ!†dÆ^ÖÝÖ•…@Ÿ)¿$!ýBqˆÎu9ç8£ËE°Gh§ÉîÄÂÃèc?-à=Ã1^¥”‰V ED¦â_Èœð9;Šm« -(—Æ~ói-¸ž} ½XÍ“çÜCÄX½ÖX {{ˆO´4„Š·²P1=ôJ¿3­HñA…‚!£î]œ1/޽©ø¾éÁ¾gÕxàî[pöÏQ@N…l©-VöÆûi£ÖÊêO p¦ÈÚÇák†5ttXMŽ©Z†kŸÚÀQš8~«Õ L;Fµ@µæxjÐÎV±/øä|Ñ|ŽNWmM[äb#A¸¥M» à“D¯ÿáå ´ÖZG¡ƒs0gÁÞµC-1@ÏØàÞØÈþíx»V~¢‰é¨3²£.Ída S½Ë#÷›;„’NÞ^ •RI9ÞÜS¤9Fûµ£ªCuвœ"™LÒvGpº†-ZX¯¥wf âX ÏC=¥úa†Iv-žÅÛ`5‡ ¡ÔqpÅ2Ž|"]ÉLºÁÎû=Ñ ³ª¡'àCËÊ 8IÌÊ,S>Rßh‰¬Y ÙøTªG_M€ø DÓÖ~:ë:Óì'”‡Þa$G3¯`ŒÇœ¤)ÚLG!#7RWIòNGÖk&9¯©Ë&koé¨[Dë§Ä»À ×ûÕ>çq–꟥W¿](_¼Nˆ¬5y›ÁªlNRâ1fWk€§”*•\$òÝ™>Ñ ”×4ô’»<·;œÉ,àÙ¼Óð²×‰¯±€ÔS#¸À=³Nå<§0õ°FQ¡ñ«ÀÓH\ÞÑT/ø¢Ã­LÅ™ó]Ý©xTíA!íà ¯A1¨¸N–¡k5‚u'>¶¦á tßàˆ\©¹o rñ´ÅGè_àO>²äj¨Úr ‚Þ¯õ¤ðü>}VúiþJ7Ö´žÌcü?ý@.fcü?A¤{’¯Œ™®yÿ¨âC{ÎDžFRæqëŒwѱÈJ‰!<ÐD®AJh¼ùØ~£q¤4÷”ˆŠ®À}3O j~ž\ÜpÛT“¥¢/„Ø:®ÚØ–üzäc«mßz”S‰=v}ô£*”žû¥@ß‚¹ëB¢?&ó.0 Cn›w×›Ö}…Qeê¦ùëκ_gÜyBèmy×âá]ÑAÙ•!=¥‰¸çûññAKpØu«ÿK•£pïA¶Ï¨·Ì¾RÓHcþ’qÃâ3úÅ,ÓË­ÐeYiW¢'@õKYUc¸Áöu…êêcˆô­Íø¥°—•' Á} ·¦]sß;÷ß׉Jm»7„4V â2íÄgÞ²GÅ–9)祲Ù(ê"Õ â+üŽ5zÿâüâúôÅogé…]䡸±ÿÖ“Ë YàûØN˜ü…¾IôšßƒólKß‚ü;x(ºyÖT} ¼À³Am÷*§hÖ…G§âry£MëxÖ†Œ0K¹QÌ@)?`¹R9…ÝH•BÃÏ(І÷´Wggâô·«K|ͪb±8¬F<—µh«î­4ÄÞ@´†ën”¥ÉÌ|z<=§µÕ…˜Åb6§ùwðÞá|ô_Ûᤠ7b21e227ac6a42b780d0f23e9a8fa292./proj/rd/eric/funtools-1.4.5/man/man1/funtbl.1funtbl!_*extract a table from Funtools ASCII output1Œ”xœåWmoÛ6þ+‡ì‹SÄJä—Ä.¶Y×¶¤˜ EW´tŽ¹Ê”@Rqòï÷)ɲç´À°}š_îîyî…ÇÛë_ß­jã— ‰Ÿ¼U™'E^- ¦•-7ô«eY8º^¼¹¹¡²öUíiñáöîýâfO‡Ý‡eØø £µü3QŒ +ªlù #GŽ«Oô½6jÃ?ÒÏoo~»yswKôñö§×t¿Ö.ì¶jCkåhÉl(çÊr¦<ç¤ ­Ôci©\‘_sc—‡ñr,cç´y WWUi}ØÝ HèCYS¦ ™rKÛUi7²škWQ¹Û¸u¥ v4pgzõ,²EkÄ\]K°ö…=ÄzåuiNÉ—™a£#erzêqÉ'Ln‰w™Õ•o`+E]`£šÁVû5Ì š×¬r¶A`Vn6l¼;®R_Aöo­ö°E¤XvuáÅPùrËÊæÍ‰¤±O['¨ÌÐÁ€lMÊ>Ô¢´ëQ¯M§DœJ4Ð 'Q®zä¼3Cl„…,>ky¸ÜŸû,9Mèf•A\Ug04‡G1gÁB¬Dœ5æµûm×ß yg½ø)ö½%ä¼RB† ê9®c Èi8A·êtt•Êx˜s¡7Z¢³‰Ìèj2õfÉ6È,fòYs’Ò˜¦'´ÕEqLëÚ2S™çÃ(„ó.~¾bµ‚¬½m’q‡ô×p¥¬òÈ#çmˆê’ÄKÈ7¿•”{I0c;ˆ Ð%ëcJ”ïh€'ab¸È¡€TžÇLVm8Ú0V’ÌË•W¢­ Èß{UI˜4§CÉàŠ Ä¶Žªº*ÒFoQ”[GôŒ*°MB#1Hm¿ ý…»X¶5âÌ8m¥iIÄð‚Òuéü°œ…ÃdΞíxrËZ³×>m¸ºo Žo’c‡ÙÍ—$µ §C*‘ä?¸ -*Wƒ¹dÝParåÖŒì Ù.‡‚ÌÆ•­ÏaØòY¢Úµ&­¹¨ö¬ª^lƒVwêAàK¥ZJ¬´<Õ²Âß!ŒøImª‚Ï Í8- ¦~î‡Ø.Å !c%E æ¾Fýw¸7Úé¡Cd›ð#(chšŽÂßÍÉü0>!úŽ\YÛŒeD¨T Š¿sXùç¹ÍÏe鼑ö*›9ÎÎ+ýÄEÜ>“…%Êøƒ-k!R¶ FOª¨ƒÜ‹ä"üd½!¿6Ö6bYuÚ£ŽW¯FqÍÕvõyiu·. Ïmbk¿²ÉÕ(ùyÏÔ¡«—!õ1‹:¬©+D°aÿ9ÙÀrá%ÚC)Ù§Åö•;SP©ð ÿÚ½0}tD©(N'WI`ÃQ’Ž&ÁÈ‹v®¥—2Œ3óQ·…ËÑ´=³‘s9¿ºÜÉÙ­Aï8˜3µgÆWÉüê{Òé||TÎh?‚ŽºÅòÃÿÄ+“«Yç•4™]Ž_3÷¼2›z…figÏh–Lg/É™Í/{ö¤ÝÚX¼²_wš¢!²G:ªPUi¦h‹»•¥$ÅÍŸá8ôu4Z{äFâŽT§èêÁ«Cµq!Ë7Y3‡!¦ÿ‘7ý5šö?åëÀ³I/[Ò‹ù!Ãé䢗£É<Ü£ AújÛ¶²¸¡üºw5ßï÷L…’Èà"xnÚm~â¬öü÷ ÿß½L Mo‹àzCàlAâÀ€ÛÇv[zŽ=JïšêÞ–‡ñ–üueÜXšâù ýé®TG¬pyÆK¡¹°MCŒá²vݵmÛ¶DF-iZv4Eí¥žâ}>ÙÝ¢ãæÂ¥Á–7B£¤k†ÂA¹éÛºÓÑ=¡•…N¤ ÎÂÙ“?¼ÜÑ!Ú$è"?Ý…ê.dwÁÚÕô1õ<Øè;i|jëazuè= Ô GÆHè4»JŽp.“RšñøHÙtï!áýi¹ô*4pè“"=ðy oÀnÄÿ'ðoßÒõ/‹;¢s÷ààщ`ÊöÒ½ÛCoW¡Osôˆ§‚Òd’LéM^Ág4ºHcÉl° ÒÓ¿×Ы 674a8881522e4c8b8c9d3f8498903d3b0/proj/rd/eric/funtools-1.4.5/man/man3/funclose.3funclose¡close a Funtools data file3ƒ‚1xœmRK‹Û0þ+ôâ@Ö4íöV a›…@›,õ^zTåÑz@–„Éúßwd§Ù°Ô™ÑÌ÷Ò¶?wÀcqÖ'Âô|ªZÊÞÛ„^eÖÐý>Ÿº}|`§mé _Í¥­¾'Ïý«‘Èõ ßwÝïýÓóþxžzkY!ú’ÙÑB›„7D:±/ÉNw>£þ?JÖ0‘ˆÝ ´w9z‹”cѹDJ-öæV~$C‘œ& Êõâ⬂JI³G^ä…JÔhe-ŒRæt¡’)°¦0aôâYÙäg”H³aZFTÆeFPÝ­Ëe„|†©¤‘FÅ®z ×L.±wÂý8ß² %/©_DJN×R#zÞu¥\ÑEt mÕJÌ%­q®<Ú#‰ eÏjJsÒ•öôÖ õ‡Ä½#hfk3E§2ŸÈNkL¾H`n M mIƒ˜¥×`Ys¶“èèv;ltG #¿mid+jf –S†7o²AÞçE–áD±Æ‚M{ß~Á6D¶ØÜ¯ñéãfùm^›æóê/’òöñ ecc967237a20e6f87cf2ba0649e8cd519/proj/rd/eric/funtools-1.4.5/man/man3/funcolumnactivate.3funcolumnactivate79activate Funtools columns3z¤oxœíYmo¹þ+S9¤DZ[–d[Ns€'89;89hŒ4(è]®ÄÞjW w% ‡þ®þ½›’û"­¯2ýP ‚_Öç…3Ï<Žo¯~úð±HßgI±L¯Â\­E.aÂ?â‡y–%B^b`öp{÷yv38Ri˜‘„¿ÄnQ°ø`©h_gß\ׇp!4¼6þa•(“÷àúÃìýÏ7Ÿïoînî²ECtVä*•É\ê%>Ø,T¸(ë™C±‚Çm%?“‰ ón¯E’«%jJ¶°QI´ˆ4:Î4l´Ês™Ý¢‰Xàú>\èÕç ‘ƒÐ ë”F¥ó}[¼ÈÇ0 š;´m*)yTT›g:…,ŽñÛ«R½f%C«ÐûåôÇJro^,ešƒ"Ù*,p‡ :dL*ò÷Ÿ/ðc\CCMUF†Y5t 4+B9ˆd¢–ŠtPâj¢ät  g$þÏÞ»5+-C¡0f¨ó¦ÓŒ%¢ÔV_):»¸¦ãzƒ¡qäc*–noSÖ~ d”ÝC%I»ÔÒH½F “kL£Î+-çä{¯R`›>%åî„M¨áÊ…J 9§"A„‚Õk‘’Uêlcÿê“qÔ Ž}hÏ .à#îA>‰å*A)EvÚë67„J‡E"¼UCvH¡ÐbD…æ|9TزF]’ãÖ·&]0¹>œ´hw€²CŠèiÓ°’iD¦q¶Ýf¹FhŸ4©Ré¶P?Ù(w^m;íQ&?ÃBkà£Jy£%Lï…ápð*—…믬òúÁi}ó; .¾™¼úNœ)³‚8Ë‚Xåæ®ÄEæ]÷úkÿú¡÷ÈDºã0ÇGËÓ@µºÀí•^pÄBâ ü¨…ưÆnpI)*èrµ·Aòñ7c¤¬Z™=ÖŠ¦oÝ# žIعZ¡0‡e¸B×Ê|†UŒh!ð½ÜšòûÖç­£ÿqV¾/âæ„áRü‚äŽUkŸlâq‘Îå¾§L7qƒ§=,Äš•gðKŠˆdGêˆaà›F‰!0þ H7+«…<0dèudƒ`S/´”5sö0a·¤S0@ R1p:ŽØþ#ºÕ„K«´¶¦½m|Ó“†tçexHqx £ÿv:Þì*1¸[ªñ˜í*½l·U¦p׆ Si4QàÛ%³ÿgq<Á`Ûy±Š‡¬àS³0²žÔ:øˆÂôk™é¨`a•†U H#âe…¹QÊvyÉ »9òý³ëK21©ä¾!'ÃdxÊßÁ©ä+z Ÿ¼Â­~¾±Qƒû껀˜ îuÈCãÕ²Ž óË>œÑã9~MÇÓÑtzŒ'“ñø|“ó \t>Þ¹ Ç©OÎ'Áäb: YdJ"£=‘ XSlål4 NFggÃÊʤ]dâDN§'ÁÅÙätx~ú;"uÇFãÑipr2ž\4;ÂÌln8«6YØQØÌn‰ä¶ ¡:<‡*xlñë ʰ‰ä×W÷³m_˜YÊ0%ÓhyhIg¦Æå×>\X ”yj¦ö9ñ‘˜ÚØsöÓüœø¤nýìÙ”$Þ@L#ý/rþŠÛD£æ)Áϙİ”b§Ÿ­.H™ír¶Ž<»ü³ þb¹Ù;‰jx«N¡å¥E¨•Ut„ôLJªÃkn{Õü`l:Z}ÓÀ¤ç‚ß#trþ‹`thŸøUôÓF—0—´q_ñí`,:Ü´[Œ¥ÔAâ{`<Øùû¶Cì8’µ å•ÔØ>ÑM§qX¹Î¦êz½&w‰ã¦™Z+·ÇîR=Qôù‚Õµ|­»3uä÷™;·OÛCÕY^ÄázKœQcfË%~¼s©Á6Ó(ÏÑq–$Ù ¥Q¤³ÞѾ´Ê£½ì ëáUÃáØ?÷@xäϧþá%H¯l½àûR‡àºááßÊ™„O'…À¶Rø“oS|tzFElëÝ‹¬‰ ±y§°€o\-úyÖáÒñw·mµÝf|»d{ŠïÉ‘Šñ*GÍXg––W:{Ø S«¹ñt¿¸&‚—á÷Bþ_#äý:zöfP}£K7P;¥ã~WXÌi¤¢c,¸ß®M ð2Þ6÷Ä  àön~¹Æðq`g„ݹK³»1T¢¹ûÚÏ#b^M¨Îõ²ºúïr²Úò„äö˧OoŽ_C¶r#•RÙ~¼¹ŸÙÉÒëcwáO]Ô ïhww¸¶‹‡ÒúÛð;ÆV‡È¤©×ƒÀ\jé®É‘õ5~fEq :Qg‚´_ŸÍßS"«­g¡‰¦»Llj˜ó¾vOESz†²!üðÆhv…N²ºÑ÷·-£ñ®aã:çôÛr¶ËûêÙÁº`#築;ÛRj£]ÏŽ¿íLÉA-ÛX ˆ žAQÂt–ì Ä[FÞÕ¸µ«ô­4úáà¦àn¬b7Knõš¸¹„ +Ø&äÄ4BÃ_;³¶‹ˆ ¥1å eg‚Bý v7TNèÿïk´é­GT>…r•»³††mqk4yÇIâ®Ò‚2Ç“¯ÚPK¦k¥³”Çàk¡ûôñËí?Þß}úòÓí¬Œ«Ÿ_¢KkìfPá<Á#$ñ_ÓLÛ ?ärz-…á)*æH–I.§irM ±óŠ Ñ¥{ENÿ ‘>WvàÓ£L›œþáA‚fˆž”;7b{ùǪç×gËÅÕSU1ÿ‚Ù‡põiv0C?ýÿºiíUTWΩ2Y!ÏÍ‘×Rj…‡Á8˜ÀÕJ«†ã>œž ‡ÀÀ±^z wG½ßÓEØ dfb23d07f6c6c0f7aa3a1f8e4f3f82817/proj/rd/eric/funtools-1.4.5/man/man3/funcolumnlookup.3funcolumnlookup`lookup a Funtools column3‡Z‰2xœ}VánÛ6~•[ Vªvêƒ;lpÐà%ít(0` %Ê"J“IEq_¬¯×;’Šew™ØïîãÝÇ»O¾›ýµ¸mÔ\Ëf¯–Zij¸ŒLNki!÷°þ|wÿ°ÎÖ? •˦àð[}†ÕïB¹s¼>:¥WÌÀ¥M½W[‰¼J!n^*¶çÁpéu·Üë—a­ËÒr *þ¶¢pU7‹õ|•=l²û;€MÅÈ!£'Ã]c”ÅðR›=sB+`[4b¹”DmÐZðg^$±ða@-…±ègvÍžãé‚ gAÅT!90ku.˜C”V¸ ÍèƒYƒ.#’z$Ës­Š (ò¥u¤ÜiÐÔ˜DVÂѯ|÷¸\¦Þô²ë*æ ÔRêÖvø_¹ÑW[f1?_!‘¨û§1cØá,ä)ÜÖ g¶Ò,`Û1Ê‹H’âϧ1¨5žÃ ÕÂâ…§²RâAÊ1¡ü¡ÿÁA ¬ƒ´ýÊp—‡²‹Âpk¹¥Pj'&nCá(r QBíNjñIô*™|dq sÌ/—í³)ÌÖó,ó%±+´Áðq ²b‡PðëÕV¸P´·eSˆ–ñ{o¢d½å±Õ³ ”v`63Üf›uüÿ|Az{}Šô©‡Ô³½Š´˜vn¥Ô,‚ÜLáýä|“r a“íÌ5öH M%É9šß/ÿÍ7Ù'úŒ©#ºfËx¢aùãè›}|¼…ø¹îùÆî0¬ÅeÓJ×Ò‹{جº°Iÿˆ“Þ‹ýÝ [-f7!j4Qœá¬ðUâˆJžŸ&÷÷*Û„:F×Þ»5ÂñWÝW‹‡ål¾@MFa™m9u¡áµd9^ÓöÅ4{eÁC¶ŽÇ¢Á:Óäñ:°U³ßb^&æc †|ˆ½ñշ즥M<žïã½|Nƒ+Úé$f¯ç˜•/šSt›üYXgƒâœ++qn^-a:¾ã&ަ6HP ºSM÷yH§X^¦ÞŒ_ªQùI¶-³¨—9uÕ0ñ¹“4Z⌰€ŽïdƒjÖXIÿ^žDÂ|ƒŽ¤ tP‚#Ò–å_¼8z=êé á-nóg¶¯%Ž ˆr?¿’ü+ñ¢®˜½Ha”†<ƒŽ÷¿QèÀŠ£ÍÀºcWã4"O@X‘‡ÔEò[HÉÃÿ¼ñˆˆ®MhíB¿ a½XÀl¹¾XsÝ[~ _3‰@/ÿ*.käfÇ ÃX:f<œ ßÁ¬6BÂx’Âõh<öóƒp!ÑðWcð6ùwÞ· b6b46c363dc1068ad1257cb7efc963cf7/proj/rd/eric/funtools-1.4.5/man/man3/funcolumnselect.3funcolumnselect’÷select Funtools columns3® âixœå\ér#Ç‘~•ZìÕÄ5–0’bH‰³‚BâLˆ£µ¼4c£€.½Óèn÷Avø¹öõœW] €yå뉣ëÈÊÌÊüòÀÜ\þx­Ô›®ø¦Ì»Mqkr³hÕ©jø ¡]×Ïú§vðä4¸ VºÎHsS¬@xƒ¼ ,·ɉ¨kí?d®‚¬YaYvµßmªÔÿ(¥ðJN‰8|g%'ëѼ¦<"Õ­¦½aHo›¶¬™!‡u@ ‹²=¼^V ê¢ÖŽX×–Ž}sÝd ?£¡+„ë® z*§¹œªËÛof32*zÑšºáWSÕ#VPöùéÈ%³CÏfS%OÎ_Ò#4:ôäç`VðŒд N…7mÄã¿w+}:‰Wú`¥àÙÑ•®§vØ2/µ,òíT½¼¿¤ë¸+ZýÈWol¶Ér8(t»†1|ÑR³Å7ôý›·?ý¨*àÏÆƒPPd,B+HW]£™H@% И¸_›ÊÀ—:ï@ö`k*€I -KrtlOT# ÎÏfµ1º í†û— ä}~¦šuY`—ÁµÆnõ în‘1¦'Ê´ Ðù›²5¼z …LYÈX—œfÂ]x0u˶ƒî³˜®4PEÝxÝDëŽöy¾CKù9óS¹ýw®¨¸S—r„4[Õè€ÎÚ¬@”¤±Y{ kç)\µ[ÜHçJ£§ËIK‹Ø®MAá4±öÖdˆhd)&q8øe\¹ À’mJ4ïùVï°èf_lN6"6»ƒúEņŽösÓ¡ýe'ÀŒ%ã´éò6«rº°Ÿ;û“¿[ñf¾šU §B憄>ßµ¨[oà“nÐç#ø$rþÌW¸÷ðæ“ß^|ž ³àæßXvìpˆË` M2`Fà\©YÀ%éY)1O @¼®k½#Z¬^ã"ð ‡ðë=/À½Ì æž(ác’…‚ëXÁ~”zÝ$­ä­+½@'5["äiZмx¬]e͸ \"RV‹‰GHüãcè|U‚î¬7䱬FÅÜ$éÄÃa*S€ôÊbχû‹AFç%¬(ÁˆjÈÐ"pF$ -I{À à€†IOhApJ{5#Þ«.à>qpœL§à5LJ«ž6[]UÀŽ‹¡,œJøÄ"ï…ô £Äïˆ~M¯ˆhÃÊ $ÐE» ~‰Tðõ¢ûÓÈõ¯L RÚ°5ÂC M°§ÿ$1@ ä1©ºÿG \0‚¡Ö&¯&}0¢¹Ñµ¸ÆÙÒ«(…líùË_‚­Özá¡V“+¾´ñÝä>Hïš¡8<4œºùÉã߆ ó™½ÎüZšÜÄߊ¤ï-IOƒ qJúT8P€7|n–!ço­¨5ì„"wãôC™ÁMm7„7|Ì2ú2ùžzNÖ:¤h'$`¸éñ(PÌÀƒßèÀ€ þ‘g>g?*60§-ŸUËÀll 6¯Q„ˆ»\,ºú7¢é"”ÃE(Àà‹ÙÉtEŠHnƒ‰bö®ÞØ2b­–;i|Ho)ù¤…ÁX—`aiá¾-4Fèe6ˆÊ ÐX—Ê¢`Ù^á< /Ù¢Ûèæ¾º“ù †#gQ‰(ŠQåºÅ}Ç÷ ½®NÓŒxO¡~ë7d0W&™¿Šc$ !,7[½âi:n$L‡¥8€ ä:௠o )FRw¯ïïŠû/ñÓ×www€î«r¹¼¿¿›Þµ9Èçn /úñn `躇ÿ Š€èAÚàõÀ²©ªÉ?[ÜŠ®/:|›¿[~:XL\·Áè­*’ÕB³DÕš|)‡ƒ?Ê¡GuRÅáNÃYp(€é§<tŽŒFiJˆ·b?h¥AupÑsŒøqv“àËå/ Iôjvs;ûOÞ±/¨ŸpÊzÙýªzÙšÚi¨¬A·„p Óp]€‡@tÐt`¿„nÏrTÓŒùÙ4xoØ9 V!¥„ ÝœsË;RŒ –š›(­asœ s˜ZèBXâR§”aN²ÛŸM]!Å8A؉pC´enVYQPŒ÷ž†N‚‚$<0=—KàJi‰¬«0Œ½ûìÞE€“³S‚‚öô},JêìãhÔ:æ=˜Ìx*ê ±²›c* ŒÙž­.ÚÑZE»1§L’#·ÅÃZÄ(:åèI¢H8’¡Q0`ÜÆ«±º»zéOù(µÃ“ÐÎÅé·M¬:žÅl€P@wÀ(¡8ÀLÿ7x$qHÔíÕó=ÁXìqæ’a{–ƒônÇQ—Ø÷9³aG^²ñ±ø]adJqL$kºXà\¯g€-üœ»3œ¦²{%5E½$Ø~6ò&­ðz*çã˸‹NLbC0èb•ÁëÉ œé g¢–Ù˜ÅãÞ‰y ·Ç£ÜZ*fŧª¢ÓN9·ÕÆ—×·ôæ/Jðç#yöÝV¯”ú«:¹Æ„s¢èå'³€/_œÐ…î*Úi>"Ýbæ`ä2¨'/öjCNÉKöÔ®6J(—Ÿ(5˜dxÁ73øƒo[xyóóͽ}óæöúýP(yñð šØž¯ÛI…£ÝO†s»ñ0Š'ùˆÕ¼Ãìî‹')ò3æ“3Úcvw59Ã9GgÌG¶îøÕ}k8µâ­_,x†\“lªÚmd¹¨`}+ãc´¥r©Šÿ/k—™pöõÓš¡â†·A4øìŠ.<÷‹† p&:??së&Š“a&WæÏ»6¸ð&o Ù‚ÄÂØ”/ ¦¸Ól¹„GEÛã Jz CÀ™ ZpyòÉ~пÚÅ“Ë}&÷úesO,Y}1uùDàŽ·8çüÌ/ôÌ: nGB¸8ÉË’S{«ÙübÄ.€Ã,Êå„àƒQé ákîLÙÍÕT ™Ëº\æÝ DGì^¡m›gyÖö‡P‹JL²óž‘e“QD IX¬“ÁÁÀï‚EU"k êØ°‚šÅ‰0:K2HÀ„9«˜ÿ4 ‚S5¨m^¸ŸïµÉY®‰a—ÐRnÈßÒÅ?¾²-¸E55.§]ˆˆåÞ XE1K›mŒœ†e;Ýrq* Þ´¯ŽûE0®}v ®#VlÐ åøfÆ8;¹ Æ~Oɪ’¥é_«ÐÀ“/ù¦¢,Äö/¸h!™%jfaú]ArJÇ ¼F!áé)˜³6êsÁíºLF €7r3TC3ï–ê+2êù]º¬÷?^þòÓÛßÛOÿ¶*ÛÑHþB{ ]Ä`¢WT1̾:{¥²/a0¼|ò‰NèB4,ƒ¿DÎ1@’óIö ?~]eH¿ûdüÙÈ~½ÖþûSþþ¯û×xDì#w2w.Ç;Üâ<îÀÙ¾ ‰R–è ­²Ns]÷ŠKîÄ „‚uà1ˆPóB:zv‚l\N„ÆÖ2ÐÁ6§r±öJü\uqѻϠÆapcYsš¿ÓfþÃmåöï°•çïˆé4½ý¼%õÖLö‹Ý¶m²,š#Ã5úé|Ñå!$–ôVÜq 'ëõ4±£d‹m–ÔndlÏ• Ã9r)ÁÉ-M²[×>ê‚}¾³I€ sŠÈ~ ‡ÅëÀ9ÃÒÕNl|¸ìÂt½ø@Ëž&ÂŽ 5³S‘O¡¤™Å ÃþNb›Ç*Ï6ÐÀ„âjŠr[pe„Ʀ*ëÉô¾Ÿ¨ýêoö½k°Æ¨º|ÈÒ@LÔíÌ!¾¸ÄƒS[¸J+ŠøuùûóH'(°%bXYxÌ)ˆ›¤¤&½™—P¾$ðÈq›Ö¬»Éé\«}ßoZÏjÛË£›k¾·ÆýD&ÙY‚iÌjüÉÓ@•žõ³X»>ˆˆ–Üô¶PpèVUC¹367Mˆ8Þ'd”û‹Ö&ØD `w"ÐÓF@l:ÐZxiÎeXaK ].`YU˜m$[)IпŽy£Û ÑÃÎ(%c)ç‡F6-]åzñä>2¤W¨Æ'‡·}úLV¸±Aäõ‡x‘ 1Q¹j1¸™¯9%\–©ÍþвÎV”¦“ ͦO¨aqG#PÂ-æ‡  £°s¨H§l-³ŸÒ’Ž3ÝhC, AO01–Œ° i-›î^GBÏ”HßÔžŸp ë–ÒÞgaÖø»&j ov‚úƒ”²ƒåÜ$>Aàþœx¤mÝ|¨©‹²XÙ›skòk ¯vhQž%7Î_G{‹³w|¶Ê÷ÁPà´¯ï*#ß…yÛˆ½ÞSËyD‡.Î~‹6×-q¬s=Ú láé‘Ðß\x/ipëÐû &R–èÇYv±;ÖGr=G„gäúj¬*¶ËudluU Û¥„ÂRû£8}n$?ùA¢ö#IćÆk^‘#ãÒ]è\lkÖܬõCÆ9K]­‹fÉuËž {¥¸'T] Ñ2&©ìªû?}Ë|£=uÛÉö»Ûà&T¦F£“sß(6÷IÑkÕ¼ìk;ÂNTÀ¬Ù¸´†Ö|©רdš5© þt“Ðu[º,¥×+NàÆX†àˆošM• *RM<¾“ƒEˆ2ZZ•oçCþ‰pqm&l¡+Mµl`ReeCQŽˆÓòŸÀ(‡bJj Q ×[vÀmùÂT®E€‚±)F’€Äð®­5ÈJ‰‘ãÞ+©:c)³µ8’@T­ ÈÅ-±Êhºú$;EØ¢ 6[ueìû™ª²¾QföEÀKÂ*¡kqT$¸ÆUÛ´‘&›ð”¼jˆôñÏuV_ñºåRêoC=Ÿ×æ!“þQêQä˜Ðû¿.|ìãƒÁ´L¹<µ¿åeƒ~v/ýk£ãÉéÈu—šE*?•¬oÙå)™gö«Â±äø°â 6/t)ÂfÇ=Ü ¡?0Ççt…jà´†°w?Û³øêWå|9£òíôü þpt/OËÍK»» óB.‘txl/)ôÜhI áÙyüù·ONÀazç¶›7æOHoÒïcÀ ‹½&Ag¨_Bí°¨´Œ»5þ¼°í—´á)»sŠ#/Ü!¾) M±M˜rOö•GÑž;® ÝZd¿‚•ƒ§¬Uþ0w.20ø´íùzùñúvin GX­{J.c¥{vh sV‡Œ±¶9];<º¯jq½“pg¿}{:ç14GBý Wôßr¶U¶Èwý¶(Q ×n5)Ýåæ™`ŠTV›©/J¿Øí aahc¾ËQU±§ Õž‚žôíÛ ¸káNÐÄD6îĹwÈãw¯vïbµ‹|ià¿01Üö(FdO²´+9µ}ý„2¾ëéí³cCÅ}ýý“tĪûÜàžò¾v–òðø¾ú~GÝ‹¨’€ŸðLjö‡~»a›uÖÆMy}¬³(oFRlóù5 bÃß¾Rf¯Uxú>œ»ÇAs¥°Ž¿‰R'¿®¸þ*È1r4’fYŠ'Á´×Òàz8óÅî=ÔÂ-¨‡Àbo߃ÐÛƒnùôhŸjøØK`ËøË ŒF»6-ÜÀµƒO–låo*ÿ_,ÝßÉùøóåñ P±ÿ1¡—]"‰mà7©|«M^·ÂÏek‚µµŸT¿l¬.v¡ºZÎ ¯”ƒ“u­}Há×ëùÕûéýbz7XT¸Oí(—6®ëG(ÜLóC0€©µrAçm­\:@® ,‘~ê Pe@tM‘;•Ú ­¢Îéè7i½6+ÄB-k|o»û6$é&mÀº‚1Œ¢Ý¦¥ kº‹ÇUíÁá¿­v”—6涬k 8`_Ö6˜À4"oÁW¶­‹'hé œª·‚’ã'ݨBDKH§|aZ×v3¼R%¤Á–Ï?":‰"ˆ8è N2®ªj£FÉ”[µ a©ÀÇrk‚Ò†/-‰F@ë 4j\`­ˆÖn;ªßÅFÕ-î#{Ö¯´1õqTWv8F¹]o/6´FZŒˆUÑS%_vʃ]£¡tatX¢C“#ÈŽ ºJçUÆb†Ö‘%Ž”?“¼¶8‘RH mØsT·;ÚO%o,ù^4ä £|ÄÜGW£4ãífï縇ÍÌA%ÖŽ+#¾ckì²{(m²îyQr¯·Á¢"YŒu ùˆ\3تU ="{ò)¤’QÖµ³9zöY2¨x×µ)«Ü{Rªù¤ö\DŠ'uèe[n9ÀUm=ö–¢ *’Û£„­m!ç )Ø’ë3ðü£xZœglƒŒ]¹­4·önüLVÊu¨·´¦¦ YÚ£‰™¨)¸<»Âä9F¸iЭxMq+’vUùwÛá݀ūŸƒp>G©Ÿe¨Dq‡ãÒ±y$6ÞR¹5Õ~oŠ8êxS ÛŒ‹ù¬Zä^N|PYÑï Ç00èAоԱ™tùÿú)*r¬Õ¾{Ì0\_öjƒôB0Ú7ìÅ.t¢±¢¥ÜŠÚrÇDtà§ ¹Â{WGÔè(á4·(™ ÆeE©ÑÔJfÚkÛe2&ӉαbËÇî”Ü<8Y²£ëËÕC;ð ¹Ø/”‹]­`I›MÍ“yðØË…ü àÍÉ@PåÕSìqÐÁÉ`œ ­\œžÃ9ý¾~~‘+ä†êN·rį©­C™„e[f0zå?¾*>2~l>ž}ÊøLz.Q˜ù“ôã1ªã—›a†qSÈø·£ 'N¤Ë¾I4}&\ ¶Ïé(ÝìÃímšB °t¨bÂF=D9ޱ D+z‰NË/QSZ~ZùD¹ù0û{Jÿ2øN˃ӞÑÐáy™þi©§X%dÅØ…{FžéÜóûë7 >‰1G.®gsúð!j§‘å[Ù@éfiÞ¬OßMg‹Ëw·×£”µâžªP:ÄÄ3°]ÿGô;ºßç1çæüjÕ¦Eºü €µÇ/G>:$'L&ô'{¿Âüú.oçwqLß|‰Iû&ñbe.É TX¯i°­¨·ilŠ@g“·“á’œUÃÙÛ ¾?=;cÚM>ö’Òÿ÷¡  a668d775f8ba9feab686710d3da6bc783/proj/rd/eric/funtools-1.4.5/man/man3/funimageget.3 funimageget0¥get an image or image section3’Oœ`xœÅXmoÛÈþ+S=­DNœ¸@^ìƒÐDN¾"ÖÔÊÚšâª\Ò²îÐßÕ¿×gf–/’“^pýP°irvv^žyfv§¯ÞŸ7åden춦#ºÁoS’ã7䫸l^;_ÒìÓôâÃl2#ú£+ó¢™[z¹hÊÚû"Œ–!ºónN‡• ž "YütÝ,2Ê—¦¢ÃuáBÒÛ³Ù›'.'S¢Ë¥”¤Tù¦v¥¥ÊÖMU6îÚ•¥GÓLU™-ùÕXÖ6w ‡­Åø`X£˜HsSZ¸ÂŽˆ&ºÄ•ë¦Ö¦‚º¢²f® ·k«›d"©;¹€•¶25v¹Þ’½¯+ƒ½Ê›= v#gÊ9±€ZÏÒÎs_Íe©ß[ )Z@¯¯¾jjîËÚ8‰ôó Sm©6×…d®2²w¶¬Åau¡ò› kca¿Î}ѬÛÁö[ù1| §tk·˜JIØ\³^W~]9ævaš¢¦N‹ TÚ܆sҌ̢¶m–._ªâÒûªÆA{#F4A´|½¤ÜÔñ90MíW¦v¹)Š-‡âÎVœ‘EåWt>¹œqHKÜYZø ¢¹EoØH±¶pU@ª›fÅ‘‚âZ¨xY¼¢Åž†ß.Ö¶LÒ¨Žxö¡Yì¨1´ö®dÏa‡Q³!³ÐÈH1â´Nz÷ŽÅ»Èg;õ¸ Yøœ#Ýiˆhf!¸_ê™Öhn‘«Œ¶¾ŽÙÚX×yÇ–µº%ÛªýÚæ¦ v¬¹ƒ[é jÑ5g¾­\U¹“\FJ‡°ÕŠS]`E \½t”%ndG­MeV¬˜”vêŠ5FØ«rAúÊWq‡£¹-ÜÊ1"bOïLÑØ^sàrª¨’½€›sƒ†_1¯ÉÖŒ (äµêµ»ïªA2Xbuh·S‡$ î«—êÀÇ¢>&³Ã˜†0"1Àj.¨/.ñ•»AÑ‘´Ì™³CO_\þx%1dˆÐÓÊžWÇFKð÷ÛßâDRÉJ½©X¡Õê 'Dÿ&¢ï©ÔnX“´ y9~Na‰µúßÓcñKžðÏ¢ð¦ý÷ù3šû†)Îá·½7«uaO¨o?/ˆ¶´­û·d­¾ï~±˜#¡?$\ã§;íI×°þNSJ í¡ª|•„zއŒrßsà¤.=¡?…¿— ¥)NaÔn­ Ÿ `ÖÊÆÕsÂéŽ MøMèE„.µìEçÒðrß—ì^“àç?Mž½¹üùõäòÃä#iñÄ ÙúráwÚr*FJ_cÊ@(7®F5„NHébc°ÔÚˆ—¬ÁÇnk¤…©|±›£]æúVQpô?^|èôy4¢;C/hè‡|Ýs:#úN-ÊèIªh < {^¼žÓ…ïùáz4&‰*M%I}ïs58Ùs6—®1‰Ü¾ˆÒãçQüvЀÚXùYŽíI—¡&G%hp¿ÚOÞNÞ#ßi‡oõíqß` ï׈ºêÍ’à-BlÿÜz¤ ”6 ƒdÀeðisf `gâNŸ¼ ÷’7;T̸G¸ÙpÃ+÷™^ž’²þ~#µ†î®®`VQ9õ”…ä «‚ZÒqÎ×¢ ÁçNF¨JâcŒF4EàḣNÄN\Ù¸‡ÑN¡¡'ºf„sHÏ•ÇïÎv7:ºwlhâà¤Ä OTxä5+ ÛÛHBBÂk\|$Á(!Œ]t¦”ÕÍÃ!žiÖÛå‘|Ú=ñó¦×–3×2ïpºÍøþÁ Nêû¸ÞøîD_/MÝuq>æåøm{!‡:èkB#çO&Y™ýžÿvTå‘\„Óä>Û¦íÔˆRÊËh[x?²wWg;›^βöF"ÁxrŸá×6ý|Ïò ä’mé¶»½h§îšPÝ鸺ç†}uR‹å¹?¹Âgœ¦?ã'»Ú>¸:éÀ7˜*í,"”‘e-õA°ß>ìÍà‘ñâ…Pß”¸3¸p¢ŒŽTwú8*$J„2y•ŽÒP~cÕ#ËLho¸‹èÄ-|›åúìÁeˆâòÝûÉ4ã?¯>êªË·¯'SZZî¹¹RY_ÆÛ4¶SlÌý.ž-@;jáq´¿¢bñ¢Ø™“¸©—› î °cÈõ·{7+Šxp Æ ©ßk;ôY¢Ð^gI{Ë Ÿ+aà [?P ã¶zkµ¯×•­Zs¯%÷pHþB•dƒ{‡Ø#G¬‡WoÀ \C ¹ ]¼lyç*_ÊìÎ@œcÊQÆ)gúæâÝŒ’x-À/þzö)e6äÞ¾¯é Ïà͇ÏÎE?|L9-ÿ5#:ÇYB«Þ…lw“–e¸Ôætðñ@ÂvðIÿ:©ev1æ¨-0lÍ¿¢bp7$ñÄi c›†åí*âŸGi]{Ú9b*v¤pšZ‡e·§ŠUÁî¼PAQgt ›6 æù+NzmZÁ-›B› YC»Š£1ãñJm§v°¸§5Ãáàè°­‡l*’QÆÏyç#/1ó­õ:ÀàÆ6Y_óFý–£ÙQ ïÞ|: sN7‚i§½lºÇÉΘ§R;:¸M× ¬‡”þDˆJ™À‡Î.h½—µä"›ô<çÖ`¥+OÌ¡EÁ‘ŸXž˜$ì)ÓÁ½¡ ÜD’Œ&RPÚº¶;ò-çºÜGlØ–‚ñCJb3©ŠKÖ(·îŒ€Ú·€æÅ¡Q_µ_Ðè;î-_ô€GÑ$ïšSnb$aßò‰ûh9GÆ#b¡"t©œPóÌìP® ­ª;öωþ&¢Á;¯7’ÚØñãâùʺÞ_ÄÆ‰Ïgx)k«†×gO¨°Ý¢_*p µ¹Uxýhw©s´ï+œ«º†“RN½e3¤m¬u^q~³á™~ž¶ ¢óßfyf t ·u¼Õ¶óõ~\™ݯµ“AÎ'´,ÉØ0ƒ; ½×·}ûóe:b¹ÿÚ~Ÿö±®—¶ñºi¥ÓœÝ8ÕÈö v*ð !él£7U ÚÚ;ªõGpÏ“ôé4ÊÛåÓ„M%OXèË1-ÀõQyEeAä’ÔÁ晜ʱ©×°-³tn2ÁÎó)ÙVB©Å;6“ô¶ÊI¢>·í`d>ªÆÓôèÊŒ¾Ëà‡v›·Ÿ_fô`÷`Fן޿ŸLhBß9ë2P^‡ÕÜvu!NDxžÓþ7ƒó½5 JeúòÑ Ò/aaA?|8ù“h>ŸËÑ:%@Þ诣Ø<´OÖl'[×»)¹s ÆIç4Öq÷`)m=EIE©6Š~—4Lð8á"½vêD_©™÷ü{}ˆBªTaÏAüh³ÃË•4tÁ¥êê08‘È‚ºC¶ú<ð=ÌAahsÑO粫%Â½í¢ Ñ,2ªaF¤q‹?L–m{«A:é6›³÷rR‡b¨zÝ‹=(Sª÷Ÿ&dýè2B+æžçëZ™;¨’Š”Ûbœ€âQ@*ï1r 1„ õIìa5*¯ä”E$±YNûC»Sm›ŒDk½9“» "ïÏ"-†%,ê´5‹|CŸ¥D°b·ìΜ. w§TOkð9\~®U{þBw¼ßYW pã•.Ñ—(>û š÷3j(H©ö•t˜Êq”ËŒ@éP Kè÷¶î|…‰6\D–Ò]å Ú­ô¢xzgw  ÃLñ±ÏÇZønˆ¸ÁOêõIŒY\6±fßßö–ç7ÃL:ªòêêŠ^½_ݤr·åÌLú‰ó€v9\¬¸nw‚h¼›-æOæOé]M H×Å£ÅBLÅØ –ÙãÉ?#ë  42a20fe48d394fa0d9b5a5ff19fd00216/proj/rd/eric/funtools-1.4.5/man/man3/funimagerowget.3funimagerowgetSget row(s) of an image3‰8ŠQxœ•VaoÛ6ý+·$×Që4-†&´É` qŠ8VlCAK”ÍL"’Šã û]û{{GJrìaV %ïÞ½ÇËüâæ’èªÕ³Z¬äÙü$=Ó ÿ[³I\J¦$¡IñgZ|ß~^ÌD/”Ϋ¶t^¶ÚS¹lý#Ñ£QöÓ%x$D»¯Ë¶“Ò8Àyaý°6͘(_ K£¦RΧôérññnöù~v;'º_ËœI Œ­WZ’•¾µÚ‘ÁÚXª•dTᨴ¦&®‘¹*•,ÈÉÜ+£Cyœ7Ô@…ð‚JUÉŒfeØ¡tÓúø^ )Âý¶é’C„°VlI9¦¥É—[’OÞ ¡W?ƒ%tÁ5ÑRiÝ…Ö$òÜØ"<šƒÍˆ£iÍè?æF{Np’FiØ!ì–¼XV+6$%(ç2c ö2 l-ü:7U[ƒÔgÇoÄᛛÒïr»TJZÇpEÓXÓX¨¥h+OCáHKYÈ"“(½´´Y«|Kœô-aZv…FdH]AuP*èïWmÍ•€{Õ»¸F†ªE„o·ÔIÚeÀY†i˽4‚9¨‘TÄ”ñ«‚0æ_®¯9|`fg 66v'¸1Ê/JÓ7êiPft‰ÆöRëåú¼sìÞËŒDWìÒwm‹*íÄæ–5Í뇫V½hÎh5Íà ÂÄ««ÙýbÏ¥ngí®šH£n£ þèÁ}&h ‰œÔXnH€ã†<îÑßDôµÚ©g wtx9yOn½ñéíI(*¬ñPVFôïO©0-ßAt…¢å“¨›J"w÷vT@Çgañ¬À*Ë22°l Ï…Gz= “©¿( í9¬^Ç)¦Kà ã†%½¸üxÿíÓì¢ÿá“ý·'ñ-~½IÏBúÁ³LPÅ£Å43ò ’¦T‡¨„óØ¿¦Lbi—¥7cp)¼žKçH H0êÓ$ƒ+AÒ$ ù¡‡DM'g¤è|Êå`ùêUú'‘*úî`þ…*fhø9êºRJ lY‹œÎXà;›ÊŒÑô² —îW}Óh({¨ã~”A&Œäƒ|8Ÿ2XDˆÜ¢¾XFõËÃñä·Ø¸¿ÂOXÞj6#÷¯ÛźÛ‚ïÕ›Qr¿Æs/ßCv×y¡ŠÝ%­Çåâº{$”"<ÎÌÒ&04¢w'ÒÜx> í‰ÓR+xÀÁÒåV-‘T, :ÍVî/)nj?ÑûñÇîQ9ÆÚ–aþe“Ñâò’.®·D )©ÿ++Ñi8J„ 8\ÜÃÔ“UƒBW0 w 2ÉN³wtQSÑätL'o& ÿ/p6ÁQÉÛô!µh’ 790043ce5ac48ea7c151662276a0e2076/proj/rd/eric/funtools-1.4.5/man/man3/funimagerowput.3funimagerowput÷put row(s) of an image3ˆ‡DxœUoÛ6ý*· $×vj7 †¦¤ñf M‚:Ý0lCA›”EL"U’²ã ý\ýz{GJ±ì†Í_:¾÷îÝéæâýѬ5óZ¬Õ»½k¨Á¯³ÛÌçd †4oÓâ·›Û»Å|Aô­6«ª•ŠÞ­ ÖV~\þH´±ZÒài¸ S©a·»l‹!iƒ |.<Žm3¤8–ºž ûÑ4–:4úaH«R84•ö!§wW‹Ëó»ûùí Ñ}©žñÈrphƒ6жNåÉbhÕÖ©ŽHz –žöZéB+I³ùý¢;PèJSôB% ·nkHÚǧf*…‘"ªÐ:ƒ ËïÝ6ÊdyÁ«•5Øi‹'a5$•ë‘IŸ,”ƒ.Û8â^(µ“H‰¤Â¶.”‘|G`—Ȱ¶Ú¬ãIe${²Q @úETHH\݈ª…@NæìlM>Ù%`¬ÆÃJG Gñ´ìHqºø>{&”"bUá±C`8¦Œ×Öø!X)—ÐÊ:§|y"D#´ŸÐcÜÿÚžŽãýÉ{A£pa×(¶.ߘÉ¡Vpr)6IÈ„uát ˜‘Ò&)Þ}%¢¨Ø5ç3Z/.NNÉ—Ö…4{=ã&EeE?==!iÛ%RG3O=ˆº©bw« UÏb¦ÁÏóñxLΉöóqJÇZ«À Pï@G§6…ýI…,š}¼ù´¸º¼ÿônþÕô]*ªÃÕiZÅß«ü,†d%‚ŠuRqÝxÚZößÀPéœêx*ãx¯ÿV¶È™¼‹‚pZm’â³+å=)±*!S×W(ÛÛ3Ð$ñ ë2}>9#MoÏcÖ1|ù2ÿ]¡È蛃â~dɘàÏø=JF8‡èG9嵜CL$Øçìzæ ½ôÂÿaŽR#j•w è±Gâ1Ïqp“áŒ=rz2¤›××ÿb<a{_ŽTeìjjÞÃç’«` o›èe#‚†â5Tæ´AÊÂr¶ºªH´ÁbA¯»?æ·¢iº z=âþ\±íuÏꂌbúÂí"”þR¡x4|Ì$Ån”9-%ŒºÕ° CA‡Ãr8ÿ=¸HDåÕŸô—ÚÁH²‡û75‰š(Ž=·è+®¿ç²²^áæÌWH›íŽ,ns4?¾í;y’4¾CWWtq½¸%Z(Eýk339KŽw@Ô-kÿBQU¼k4åR§Éødü=]4NW4ͦ¯&ŠÄ‹áCYö:ÿ.¡* 5e06fa0caa9ab977bec42fb409ece14d2/proj/rd/eric/funtools-1.4.5/man/man3/funinfoget.3 funinfogetAG$get information from Funtools struct3—¨,xœ­YmoÛFþ+‹PH®ªØn8´ÉŠ-§Bɰœ¦éá¬È•´ŠËÛ%-«‡ûï÷Ìì’\RJššŠLÍû˳³ÃùäÍTˆ›*ŸåkóJ•â[±Á§Æ_v'Kmr±¶fG¥1™®´URŠåûùân9[ ñ'Y•*ñ|hÆÛ¿ H(#±|ø}ÄÏËC¡F"ÙJ+ÎdšÚ‘ÇCq=]^ÝÏîf‹¹[ó…5U©s%¬*+›»Ž‰I•e*õ––ž1¶¶²jì%®µu¥vSí Ñ®&[™§™ò"ö[l; ˆÐˆk·Z=ª”â±—hÕ¿+maB,zm²ÌìñpuRÕü%õªÛrp³C¬–~%2Ë¥ðÅùÑAh•o Žœø2ÀIj1Šíg O¾öä£^¥àoüFUÒûå²ù…¾§3c ؃¸o úIe>…%Ð%«PÜh¨.)÷ü”ÍDŒúÅùB?'g$|óÍð?B¸½.“íÀ›IØ÷¿!z= ÒòýOñü…XyÉÃæ±˜â¿BÌ+¢N!<Ò#¤¨ÂÔ·kWüÚbÍDÞg¿j¼Ã>ñ•7ûEþé-¤s\Ì]H+wŒ/C8V!8{dG{sÆ„A÷ìd×HMÝ5–ëÄØ”ˆ"¨%†ªH=PúJa7`ÂRÌÝ­2™¬% uÔÐ;˜G- $$Q0eæ G¥ƒdeÕW¦0>‹åÁ•jwÜŸ:›gPàD{µ·ze¥=4@ÉÐo4ìG*—“Ũ>1]„álx0xCÅ–È ƒ†Ö[Xó/4Ås£reeV»¼6І… ë¡`Q¨<št®K-3ý;Ù¾7lwãœó×0Ź€Ó—!ò¦N"Ðg†&È þ0ó'Ë -'ãj 'ÑÕS'Šò$Ψ¥÷I”…çßcbÒ¤ÒÕÄœ¹˜b{pp%‹%Õ‡DKÁ<²ZKYdï²û0aAYæä&÷+P\é’óMj+>uÝ#7Fе‘r2?8¤Íá ©Jˆ ?ã1‰ g²‡îÖ¿º4Ñ˨ŠW÷@†!ì% T9Yü¨léÏÁ#“<¸Us4pv ¿Öš†òßû4S“‡ ªÎS¶¼7UD·«0+à˜­¬já®0NûÒZ)CNhÙTr¦?*ÂöKJ©ô½Ý±>?•õŠ‚t‘ã‰ð?°t'£ôù˜Œ q"‡] 9ÈWÎ&³éÖ$*|=UhŒ5!†è«i—݆i“ÔÔ Ð´Û§ÒCQof‡ÙuÔÂë3ŸÓV\ðóCî[6F¢=4„ªnÏ ª5ÔæíAÆÑ š|ZÑíßb´h‘Óσíio¿Þ 6N›Ìð1z¢‘à@O( |3nx (@û#u¹ù6ÌÂyo]¥þNME…ÛÇÁLÌO<*ºåŸ×cDÄxÆÆœ‘5õ~¼×*!ŽTm¬óÀû*2·ÇÿP[ÎËí(CÖÜÇC ö‡8yIç$GF° âÀŸì‰à87Ö.ÉþÌ(…ÀWûÌ.ö¸$˜sÅ÷Óq¥ž;ó†ÚsBI®ètƒ— ¦)g-zI i/zУ(ÅdƒZ‰¢=¢Âî¢Î_ŒühoôX(îc¼$@jQ‹1-th ž²š:;P¾9 ¬˜7&·Û˲* õ-bZÌ n18ž7³ÐiCcK]a0àƒ»‹A¥ñƒ]<è4N^žÔWU¾Íæ…­®PWªæþÚ¹zGCGj{ŽcSø ñ3 ‰oëí×èá—üó#ÂÍœ—9B„Õ WÇŽÕÖ“Ä«ÙBøüîSÚÔ‡|Môótr=½'¢›ÙÃòg…ÅK+ü‰³;taÍòðþÎko.ªï?iwð…¢e™üzÌ"Ÿ>Ë2›_~FËåi-Ç,­–S,~k³4—ôÖ¸ˆøòˆ/âéüz6™ÇÄç/2]–:õâÅJo0¤¤Z¶Û†›ÙíƒÏzTA®¢¹˜Ök:+ÃMˆgøð¦tJ„ÇŒúFTÏ¡bbÖócVGeŠ37„G˜¸Â5!7á‚ÛlŽXˆ=>Å=×Ĩ©Ä&FÍš£™±£øßNç݆]³! >”1ËÝäºËRÈ4åE‰¡˜«z*C^®ÅËÛÉüuÄEˆ¿~T‡=§Íš†‘ŸÚ¶,-“¿“#žµY]Mn§×¢/žO”g«ß•5'¤3ñ„£ûÎBíò€)›Þ{܈)YjKHå~´À«%Ìïï–OÚ¡5{×4ù ç26œÄ8ûmq:`:ñaê²ÄÜÇ¢—³ùÕâvÙ+äB%z­ùVžó=&1YµËÛ¼.~™ÞßÜ.ÞµŠPˆvM;Z£%46§•%Ö â§Úoi­<œô{ùzv×-_L<é‚ÜöÌQ“µÍ¶ì„HZ„üz—,™H Çfarr“ÈXólõ—°¼?¡æòxŽÕüËËÛÅÕë6¿d•™ä£Xˤ4¶GÏM^Ó ‡ëfáHà¦{Ò†Îú6 Ùîï_/þŸUퟹ©m%wœè¢TŸá~òîåÛ›6Ç`+÷Ü Ñ>5°õz‡ª¯i šËªðãêâó!N÷1:K|º›¦ `Óð…†¼D»2YÔ6=Î`Dÿº­BÂóEûöÆÛ‚g«òå¢èrÝŠ#!÷0;~YöïD˜“á4«æŠ.³ùÁïtçÕ­ÚÑ[ô³jXéÆ7bڡҽܞOõ¨ëê‘T=æ8v:[EÜès¯5ûJ‰©!:I½o¢€®ÞtÓºsÕÛÂòݺJxDeée ÇíÌ]á6s=-ŽÕH±’e²­tû—P­êµ±'tê·Z‹²›fÊo<ˆ$®$€$lþà /Ÿš‚ ׌þfÞ„EHyñepa+“ú `j”_»àÿØXšIz-È%9qâÀí4 E¼g¡ˆcÈé:&p÷ÑYO)Q’°q¼È.£à; ^¸k5Ú½ ]ò¾…Mé{ÂN†NÈZ–²Ï[ WJËïM¸÷ž™k«Ùs º¾³WÎÑ[¾Ã(\šRåw%¦ÑI(Ã;JL{ôꑉ œtN)ñ+BçL¢y­Î‰l#ZÔX\áæk½2¿$BÓ+ŸKšº­y_Dùsü†ÕæÔ¸cñNñít‹?•[•â`*±·ºäjܶ=(ë*á×ÀÚÑ}|9ŠÉírá7ÿµ¦A> íP_›Êðøx1þ~üW1),yñýH\ž_àx…,òg£ÊÁwÃÿ·— c857ea8c2616ea648fa720e637f6d84e2/proj/rd/eric/funtools-1.4.5/man/man3/funinfoput.3 funinfoput½&put information into a Funtools struct3‹8‘xœVÛnã6ý•A ñÂU’vû²7ÀØÚhŠl²ˆ³(ö© %Ú"J‰*IÙq¬¿×3CI–¤-úbÈä\Ïœ™áíìÓœhÑÖ×õÚ}n#}G ~ þùJEãj|GGŠe¢s6Pˆ¾Í#-¿ÞÞ}^^/‰¾1unÛBÓ»u'“•ˆõF†ÏñI¸ŸÊyÜ7zJy©<½REá§”eÙ„~š/?Þ_~¸¾»%z(õXBÞµÑÔš ÿ!ÂÖë,YY")¿i+ ç&PL¶©Tua!à]E»Òäå±]:Ziò:z£·º€ÁÙ:j¸Lv½þ£5^¹«t@@[åZÁ¾Õõ&–d ÄÝšEâ¯^%d4WðÎ7P¯$ƒHvz—^7^›z# 0ˆ,3ñ†è¼†b!BŒ®b‹ÿÖz÷¼¼©å>A— l‡ð9nCûÊÔ*"×Õù]vøö…L­¯ºT·Õ Qsº ”ÊÙ] F{v.HJiZk\ÔV+OªPè{³bŒWn«ig€f|Íl,]»)© :%}øÔÎ9‹TݶFÁ*j¤ Ç‚Uã|T¨g0±í™ÖÓ$RcÕ>p/WEY”ÏÇ7´óFjDUk£iŽ~Œ5e„©×8FDŒÍÚXfêÂyØÇÁôYE…È]ý\YËN€À]£k¤ÄH3‰¥.¿Æ»œcæ¿–º&yV¼ˆ×0夨 Ó·ë’\ÃXªH{×x”kǘÀtg—Ūžoµd¯ÓÙy ‚@íR«¤N ~´“ä79JÓ€¥q*ApüÚœ›mþª6#3ÄÆ s†ù¯cÏ¥4>¼^ƒuÞãÝ÷Î(:ÖPº+î+»—ÈPž“€Þ]¼JQ«®îéÕ¦%fãû>ä¸j×S:ógSºýrs3™ÐDlTêw=´ñ¨Ì܃§A3N£fG£ôÌãÅ—Ûß®ñ3¥o\NÞÝcÔD¡qí¨éõýCø»+%©~î÷¾ÁF1ãX&Ê®ÑÀzCuºA"æÊsHsër, f‚\d/ªØwlgþáJ̶aÚÁõéúâ.:c/KÂîî”[§œD?2º>Õ ´Ô¼ÌÏ ÙyøçÑiYþ)~ÌÝ\ÕÇTüèl[ÕKma¾ç#§æ“Ë µLqu-̦Ž]©N”†ì»ý|?_¼?Ë.¬Yy—•±²ßp8Hïv°uöŠüÿÞíDÁÓ º‚ÉÖTl¨¨L7éŸôtZ§Ç¤ f`V¥e5 ×>ü…mC™Ò—†×q(ïÚ Ï뱚»b “>WZkâž¹‘T»õ¦·€tPÈ]Ñ?rÐÒ3EíÆ!Ó²‚*úö/¢Ô¸§¬ä äx¯=m§ÙÍòŽh©õ°˜Ïëô>TÃ[{ J©mƒþØ€Û[ ovt•½Î~¤Y㥫×SúþòêŠØ?Ëáýü‡Éß É 93e963ebb8819471fe0cd4ab14c6f4ce./proj/rd/eric/funtools-1.4.5/man/man3/funlib.3funlib__*FunLib: the Funtools Programming Interface3¡&¼xœÅZnÉ‘~•†¤M,ewxãŠ,%<Ø–a*g/Á¢9Ó${5œž›ÒÜCžë^/_Uu÷ôÐ’í v‘ kgº«ªë÷«j¾¹|}­ÔM_½²ËçªÛzîœ+[õ¶qëFo·¶Z«yÕ™f¥s£?¼¹}»˜/”ºT…ióÆÖu•r«ñîÒ.Ý2õòzqõnþön~ûFÆ}Î[:÷5 ÕSyctg”Öêº.m®‰ÎL\¯*c ¢h«¼ì ÔW~u¶¨+[YZÞª•- ÖѶFå®0Ï•ú]Ø÷§aÓŸ•ú”A©R¹.Ë{Û/×w¶2¤*ˆQ.´!ÎsÓ¶ÃâBw:Ã1 ÐÖµ²ÛÚ5®:5ÐhH†ÿWl‰ÛÚTϕßéYè°d^­Ü_M÷\­ èáJ/A ²€º^åÕéeºƒ^ó–Æt5;ãW’tãUïÜþÑ…Ë„Þ׿í±Üë¾ûÍG–Q¼re¿­¦49–·ü7lD/[²™öçZá„^Ñaë}øDx‡ò·[×§‚ñj²áÑÚ«Òµ0QN}j•È‘jñ^µíaã¥AT÷pI½Ö¶ÂòGÄDô."d¦téàñ{ÛmxÕVã!†¹ÍÊ•¥ÛSXÈkK.S¶NmízÃÌó¿½mÀÎy·nmg¶Þ©N±6¿‡«œ–U[²îü‹¶¯Éò¢Ä_ô¹8TzksU:]_uƒ—æ£ÞÖ¥™­®„$­ç¤ú–Ö­ó|†G~‰ØÕ=ýA^Ž%êÔá#ÿ—áePʱ ,Ði¹UêöQŽáå¯Ì8ð|e«þã¯|ÆáPHo¹«VvÝ7Fmt«–½-Æêµ¾7ì[Ážu©;f;c®ÑÜ'æc×è“Ä/&ºµHcìñà2SûÍ7p—½> ‚Ú¸wJYGµµÉíÊ‚‚«ÛèN\ºU×îÞ]þøjþ—…Ú2EC6ö‚¾*LãDxo‘"‘e R@cê”D—e>A—ROG¤–·ÇÏø?O6]W??;Ûï÷Ùúg[g®YŸÑг)'æ—®_«×d™V½¿Z|²¯+òSÚ»Ñ NYd¦èÏZ·êöÐÍÙ>oY˜³)¤›w¤¼Êu¨4”vˆ % HÕšÄn”¸Ù/Ø12T5)2¤Š6!D!'ÎuL‹lDùå'Ø(ÑR(Z šwŽòÅÃåô®ÇW«Ë¨e*2“i,\t6¸4WÐPyæw tFeE7Fª¢¬«½WH­•ø ¬}öD6‘l¶"•ÄÍ|4ToÎ"OΔ²` Ã,ò 8œ4'3õæï¯^M¿“óyyLoß ’Wë›RQ‘°]"¯&ŽîaŽ{p$aˆã%l±¼xcN¥´ÚpRˆO¯5´iK`¨iÚ*8H¬™¶%¡Rî¨mµnƒ]ƒj‚}6‹õ\4Š„nÖý–ëOBRùxlÆP»ÚÛWTøw&“=”UÁD¹ è% P2Ë,ÄR[³/Z!ó£²ô«d1 çš¼c­/½+r ow"" bó j#àQ,€âÅà°ÄÒvµýøâô'dŒ¹ É ¨º iŠ6CéžN„¿…„gÕÖ-ÇÒRùM-%Õt è@¦*'=¡’†(Äxðé¶ë›JÎÚjÀ.EÆ“Ä9æÓÙ žtKê>æ2†¸€ŒfŽÔ'†Ü»¾,ö*Ó°Çm‘Nˆ¬È: B1lA^Џ—UXœ¯etê…© [}€+)- y ¼r °Os6v)Eä„VÑÏÛç"&ê]\Þ‰‡ @·[rJSÊ!¹ðŽ™Â|ô@ÈË|®4BŠ‹ò #çF×¶(‘†¤êBÌå!,¿àå3eºœkI猓ÂÉLÉ ²R/ûž]ázÂ{¥s5@Ìöù/ôÛÄ ¼êæïo~\\_Ýýørþú|¦~Og¿½·øë@j›Øçß+û§ôOŸNÿO>üD~âô ¨nǬÿ3™ØÓóéZ3}:ù ÏÿÚúOþ¿kþCgzFgšÐb’íbOv|;È{C^GƦ à¤¬o|<¶})É–Ž\Þ¶÷¾„&}Édú|Ô§Ð!.8]Ì”ˆ.¢â¸Cùyã˜NRõ8ßwˆ>Ê@ GõÒ¹ûÓ{cjNóº½oƒźGÞïk–x¾Tke·DÙ„CΈbÀ×Â3åÀ ÿ(Óû2D%¸(†×IYâÆE–M}I@žf¤BøMzÕqõF”Œòˆ¯1Œå–fhÃ:AÒ^ {|7ËÉsÜ·á ÷(:É+I„Tg¾ªw&Ž’j #RE¯Ú®éAÙìä.ä#·CfúžÒkÇ8Ñ“ëÝL]ïÞ™üûOºKqèÖþlÜjÂk¦! Ô ‘>àÿ¼ôO' aööÛ››ÅõÝ„ÈÓÒiØs–þWxà-í¹ MÁ箼¦öj0C…ÚºÂ$*@aÄðCÃR*Ù–ÀLf²YÔy°àç´N$w¦éYzµë¨50bþVI]ŽrqQmMd¼ÓeoZÁ$"LæšÈ@Õ­V-:._“† (æ®)¼‘ÑeÇšyL#¤gQyÑH!‚¨½TA+ûZò#ÞÍ}·£Ò,¸ P5Ì¿ÆYbkš5<l°ŠïbbY‹Ä蘆*Éh.‘ùŽ‘ðV'yB6qãHÅ;!iŽç 1A&³’Ét”O¯. éôz§ 'P³XH3(ÞrzªJÓ%š6@%Æ‚@¥™¨‰‘B„x˜ ”Ô£×—ÞݾÿúýÚuÓ©¢Â¾1Á¤ÌŸ¨'õ‹c¡åÎÀÚâOž;ѳƒ$ÎS+'âð$x&ˆ‹â€ñ‹Oÿ,ß!;(N'áÍÓì[ß½ˆJŽ>SAØÈšR‘ÓHàìüYÆEóŸLE â¸Á„,KÝ¡ªÀì|ÖèHÔ"ˆ#0á#ƒI½›@ ñ©Ø zAqµ[«Æ°Ù%ú¥M›°JÔ”?²µ¼hwñX, E]ð²"¶boHËî/݆a„‡Ú‚Ͱ K,ÇÌqW#þN´Ùo_Œãjüž"ìïý–á `´«Ì®¡Qãy£€y™9ò¬‰§õFV}=N‹/èß’’I)´q©[›3úOxÇ–š`çó†&DÔ®G„@î0RL.ÙâèZÒ:˜ù¹8„Ü ,%í£¥¤7HÕ”{'F#O­VÔ{ƒH3Peø†“Q§ÞcP7ÙOWeßnx  ÿÊmk[¿²Õ=.¿|€Œêg>s kðâRñ n"éÏß(ò¨ض¿Î”X ÈÕ;™Û[íÊ:R"õÇ;Ø‚Üãyñô«g—hyi¡oa“è„:À„¤Á%)~äEäà%1)þ‘ž,B­õÆ'cøi(M_R†DF ?Ù[ Ȥ8æ“–ÔÔz‡Oçb±\ yߦƒ\QEëg狾: 3æo³ò’‡žgïLñ7'P|›}‡ÿþÖ¼4¹º,ë>»]Üœ«ÿþ&|xf‰óÍÝÙÕa Žê<{æyýu~67ÿðÝ7ê»ì[K-6/íº¡¨%˜QA¢pù¤nÊAäSÌ=T¥›+á[¸ñüì6tÂq´˜ñå–Lh¬‰"SÝs} ‰R\›<Î18jà 4˜c•w< ‰Ô¯Õ+r0ÊX²&à:ÔBÄp„zæ#¬eÁáôѹ,§Ì0X·…Ñ´AŒŽtB©\\igl5yÌ: ²i2õáà§EK™X‹Xµe„qJdu©µEîÄ’hëÄ-÷2ÂÕšôyo|m…„o)7ÑÄLÆ%8!J•oøâ†qÁ,j˜ŠÀFïXBG,Hã™;"™Vù-GWQÉttHÛÒÓÍ’H3*ÒÉ}·é¸qßlàs_ù;²0Êv_&nƒsV.^ÒŠ¯ÉeâC°IUè¦ð¤ðõ7”H*·ã*j£wQ›xËÊ$Óoi'¾RÀ¢œûÇ8ƒðJQñãi°[¾=HÇcãHV•ÉéÅy"#Û±¾^'Ž*NÊ%–èƒw|vÅŽ9PžÌÑÃaÒ$Õ_X¢_À…øÒά«Ã`T?<£Pµy¸‘»»¡ð@ÔœmµÅQ¾dfô ìYQ$Õ'QÆ>~¢*¨;!cˆðÎÜÕV”¤«Ñ<~g5Ý<ô]†@¡ ÏgŸ\ÈÜݬ\cb"7¾™šÄ"â?Áÿ_Àû –§tèò¼gÜFò_Êí™îâå” {ÔïÈ—Ú _t|XB~$0¹#;s"_;WH Iœ[Lß2ÝÜ9[$9ƒLT 1N§Ä€¸ì€aÃz'æÑŽONФ/“#fSQÀ\òNì&ÔZâ'86¥†ña¸(3¿ÌïÞÎ?$ms:½ž…âxtgAÓ²½„[í´yòãÒ†‹}"ëùÄч Ÿì·vÈ®?à‘±2Foä*jÊ– tÜ*ð”!'„òzƒ‡?ìâ+5<âàï‰\Éf y%éBõ•àŽÐÌ¢Ùï[A—Van¾2õ7·aÉ$äëÊþìùøÒÊ €ÝŽë=ßgät§½gæ!+ÐÄ_Ñuˆ#´¹Ñå*D¤9¥›h$¨wÀº šÔË*]^‹lŒ‰%\è´¤/$¿|—)ùÍÙŸ±+ ;S(Òšîo Gâáô”6 žä@%úu˜¤  ky:€¶ î+3“‘ÀÝë^‡¦ëèw"$,„ ÿ-DÉIsÅì¬/e$ 2|Ó´lWXãà#ó“n©Í¼_¹¾ŠÃ=ª'¦¥Îm¯¤?ùeXaÁÐ.{¢ÆgK 0‡ÞZ©òCÅÒ>¾iîG—qC^mcÅ -¢šØˆß•6_‰ÌŽªB–?·Ÿað5”ûµ9õ`XK˜ÃYx„îЃ{hîgh?$ó?´‰Åá­ßW!ñð6]ÙÕ2Q#Ω”gW<£ µv»,uuO‹ùgD‚Áü˜“»lúÓ}ÃÆA™¼Q·ùÅÊv|$?ú¥œ/SCt+‹«ùÜÿð‰n(¤Ó#ýD#õÃw1¾ÖUO¿3x¤ýÅîIe*%×ñòLã]î%)±¢ôpy{’úÆóAùÄ-ÙË×¹S¹H±ëC;hÜÿø§ y’Û¯cвñè÷qÒ€ŠÏ®þ2¹Ï‰ù¹_&½×Çhœ™ÑGºmšÑ\4n½DºÝÁ+‡Í²¥ý,ÃWÎÝ÷õ{hÔðÎ;½"ÐÅ%øQ. ü?¼ðOö¶è6©«¤“ä#¥RÜʶ­þØÐjtj¡‹÷Ã!ÒYê£Ä*³“[<¦}†€hy¬‰áÐþ@…Y!ˆ½04ïþ„†ýwhø[²„LñY2~ý”dqB¨ý,!yõ…SA½_Ö ç¶ð•ZyÚdèg"Ç¿¬¦_Hð«æiÒK€ƒüë©¿Rà€¦GQ.!%¬9öñº“É7JgqþìMÕâúZ]¾ZÜ*µ0Ãìt‚/2eáߤccÊÇå …‰‡&çÙ7Ù·ê²nl©Î¿™©‹gççr' zè„&˜þ 2P 48e8534542b197c8b3b70c778d9d86cc//proj/rd/eric/funtools-1.4.5/man/man3/funopen.3funopen*™open a Funtools data file3ŽešYxœåXmo7þ+S¤TVj_û%} Ÿ3³ƒ:iQôúÚåjy¡–{$׊Zô¿÷™á¾J²¯-ú­A“J»äpžgfžêîòß×D7Mu_ëŠÎÈñÿ?ˆÎÙ@¹ŠŠ c5=üpwÿæáöècSe¶É5}U´ËVå7b¤34ÏJåéE¥¶zIéóÖåøÌk¼._Ò?¯®¾½}óööþŽèm©û­ ò®‰¦ÒâK8íLá<ì¨ÜTÂGUc)Yò· o¢æ•ÞÑÍíÛ‡aÓÎØÞ¬äHö”ß4[]E µÎLa°1vï\!ŸO8¸·¢\C™ª¨ šn¿½¼9 q÷k¯²÷:Rå¢:#ŠÆU¼'±,ÞÀXXÒõ‡¬X„ϪÊùqÔ>¬ˆ.)èZyÂ1ÖR(]csZkÚ*„@«¬„uÆA¹) íŠ`ÖM2à"Ët:•â„À}Imd CÅ·Õ Ç™bNÍñš¾î#bRg~¶¤»w¯_/´ø…¨¨½©b11×Þã}&žqŸO¦ª›(„½¢OÂ*cˆ?Ü3q~Ο~%º-ˆ„=•c˜uá˜gCž8ª½cLœX@vS3Çk½1Èá(Fº æ+º›’@sA) ˜Š}¤]i@l¦U1q¢òy‹çñþÕÔñÝã)±§ )wÈ,&ÀC”Dm‘1˜è›*“Õ£,ï”]+z3€†O>†¨ ®¤ŠÞ‹QšQ]ÏBÄûc"©õi û¶ú“°ÿ8÷_ëITß—Sñ;‘]d¦¢£`G?×»ïV÷V w\•™¦®ØÁç>5U’œXøÙéƒÄÙힸ¯ ×ÿ^Š9—!ygb)›SbN]%øÛ¨Žc…ʹ>6pOô„·%EþÒRÄÏ6÷;:ÇAwd'wj¿[•r°©J Êäå¼/Á•ˆýP¶­f©£Â»íIN¬–üÏE'R/_¤>5¬¤/OkØ|üñü§õ"à½óP»Zc¬Y #Ð"ºf«6zÙÁæLˆ-¼dsâëÅ¡³ì,K ^þ^_G´O½gß–MX¦`¡O¬Ý#*êƒÚÖV/¬!Ð~OQ­­>GnAm%Žb÷tBNÌ$}MŒŸ(-± ž©eƒëJ•´ÕŸž9Ûl14ÌÍ *Kèžeü­:¨zTÿÛvù+Yú Ö†Ad1äæA1 pÙ…\ª±±;iE©t·ê½æhÒaßM PûI• *¡É0Š(U,Ô9ͤD-³Ãa})ß*œL1a²%® øÈ+º/°¤ñÇ2YÚRÇSË<5ÐÈETÆ:J'a”9ÍÑŠn+Έh²Æ*d©©íoµßhV ²L5 ÕAÂtÇB•¹„àA'Ôú1Ùäp*ìâlŽ}^s‹ÕynÚMaªìG9ŲÖÔµmUMÆQ–ÝOí5ë.GNŠÎù!ÓÓ¹3O+±q¦ah[kQ”©:_Œ&?À­¥=aú8YÚf‚ÿƒ¢æ­A,-D!­öj9½Fu¢NÈLˆÞÉÃ{v Ã'N‡û±T‘r*‘ ÚÚgvcçÑ..\½³è×{ °ø6»š±7³lÖ™–ñ$D?šˆ¦!íž&Þ§ ¦ ‡ŽÛˆeuì3¥,Ê7tùY&`\gÉa>‹fΙ¹hOÊfmlž=¤µn’ã\MðûQNÞ3Ö1+µmà¾ÙT4û´'fÈ0 Z‘èî+-Øäœ»§‰Ì_(! >rcƒ@(k~†Ð1J×¼yLÚÊÍA]‹Ä¸¢÷óT­¼:ÙÚÏÎx±Û%ÀÙSÉñ;&€ìï>ôÁc­s<`k#<¦Zf¹Ýr5[h4Çãã–ðʦä½þîúnr·¤,àòßžáâWúñÇ´p™ŸY=ÿâübÉÏ?[ü4C=8,é_¾~=äó?}Þä» ·ög¥~Ë2†^;ʵaØ_kT­>ÖQú—ÛéGÝw8X‘­î! íÔmR¦'šsi°<]ÍÓº›¼R•©,6ÊŽ=“Tã͹¶jÏ}¹BáÑ›€¾SDíµÇ²„0þ4 ¤òÁÝÝý?EŽ2¿ÔVeÜøIOª\¸õ{™ ÜÁEû ‘uÓÐíã£ÚÞÆÍmÊ¿ªötûò^€;þMèp¦a^µ #t2¯_pò$õêa²J „fX<«qÓí.K)Upk¢ÛB ÓÕk-?Ü\YÌ‘h"­ PžñÛIúŒç/ºäßu*X|Ôv/9ÔÞþÀÁÄþ¬(x9_,i j£ø× ¹qaâÆ-ñt‡({h¡¢wµ“!“[ùøg6ßýÀÖß3%yS+J³iÏR|&Cî=ÆEV¥¤©ébÍuŽ)íúeýpO2¯u?ÎqñKóšÅ}ŸƒÐÛ,µ­¡“@BqI,ÎWŸ¯¾ Kdª¥óÏ—tñÙù9ñ˜cdó,~k3 be8340953f3e9f5685f6678d4b7bd8083/proj/rd/eric/funtools-1.4.5/man/man3/funparamget.3 funparamget&>get a Funtools param value3—%xœ½Xo7þWžŠ6%DéÆ$)@ÑÚ¤jŠ(Ú&äÜ9‰ÅÅ>Ù¾¦ÙÄÿ¾ïÙw—ËJÙ´U¢M|öçïýúÞ;ƃó!Ñ/…¾V¬ÞHO]Zà·à5oLæ(ç't#²BÒôÃxr1M‰(dE*éçy¹±·|A¤´o¢ÍZøBØÑ¡d),=Ôb%;a—ŽR9tüüpa|ûCýŒÔ³L6aÒ;aÊýGâæ»(.â¼N_]Ž.®F“1ÑÕRÒÜ–¬)¼ÒÒíú¬ÝÙµ÷{Êß…Ni‡Ö¬ô…Õä£eæÇÑÕ”–R¤ÒÆPJOÂáÑ a“":±rA„vÞ*½`H—ËÄ«™mzv|RÞ%Sšmöxrì•È2“v$&ß0æUòˆôÂEKSd@?¬ÄæõRjÒ†2£ب±&Ó^é1e2Ó.Š•„_qCr0–€Bô„s&QÂ3ŽòËø¸aþL2u‘$Ò9FË47&7À~GÞz©2ìdáic 2¹ÔÕ>P™àk«Ý£·f-o¤í„=‰ÐT¸@u¤çæ¢ðp“7ľUó •”*'åV­„Ý”„z4Ò8¯’"@TóêP¥Ø»ñÇ‹ËÑùàòÃÛáàõð²eÜqŒÓG€ÙR°J‘‰È‡,kfGäƒÂVY#Ÿp Á÷ê÷蜓·b•gòi¬Zl{F»¹êäd<¸MO:̦ߡï¹"°1ü< ¤°–ZÒb”ç§§rW@9°H¡Êú 0‡H$KfØëõ¾ ÚsÓ]?܃mêÿK›f"ùtÃŽ’Úwò C µˆ¥½›¦{Y…RN¬á‹Ë´¨óÄ¡hÍêXj¡BåÒv·95N¹§_&~zhï3?B}·7l‰2Zû‹pb2~ùtÇN¤w*s+®|¸xäaú'ª$jé"33±S(0˜o%jHBPEÚøðOä¹5¸`¡ÂüÒò½)?È¸N¼µ 7QÕJËÍ]'æ²Gï%Ê.1+¨^Zq9’2E¤_˲ÚjUZ\²=˜PÉèDy^*¼èT‘ðqÝ0:ÛPnœSÜ5·:±Ý±¶Êãz†e#È®`µ%œšg"‘Ñ|_‹;ß…—ÕñRùÌ÷}éçÆ[‹fSô"ýò°_*›’®OÕFwÿ”Öt‚ÞkV/É 'èzˆ#Z’HC¼¸Uºb>W·µCê˘B¸01Y”')܆·r¬pT±B¢£™œ‘*ê…BZŠîM îØ*k8xCf; °œqTäA´ƒ2‡Öquv>‡ãÓà:$ð{b²bÅ&rËWš#éEhõªGeâ@K=GÅ `X€ñç©GÚgf÷€Üoêî Ÿ­€öœZp[ûHA*(@õˆE¶×¨éq{7Îàú(Îçí…ÆÇ­ƒüÀ²(2_v/¸®œÔ~ʤ.䢕·Êy ¼Œ©`8)ý&/sM50h†šÏe¨Úã±±«¤)U¨Óë•£Œß…iŒ3UÒõczR9w¯‘~°RC&÷µ*z•Ü%UÏgá8F±µ+ÅnpùñÝø×ñäý˜ZTP»S/¿šœŸÇWXNšËg“7£Wƒ3,gÍåÑøjøÓF‹Tsyzu9¿Áªk®^€åµæ}gÃk¬ßR;«“Û‘øØ8ÛИÚÜu••×aônàÕñsQçÀÔ~«'žæ([¿ß2¸¾ÜTl:ûƒr¼+¦j‰¼c(—ºå °{M•€µ Û†kzÒïò[‰HØè0Ç&Ѝ´óp 7º¯˜—ƒ÷ˆØàü`¶ŒÃeÄ[‰Zåño_™+÷g“2~%ráÈp#Å¥(Ç×°zØÝ±šÝа¼Q[/Tãßñߎÿÿ,pÿQ`+}Ü/ÒTùðº]<“ܧŒeï¸Äª›037ÑïUéî‡;ø¢QÍOú!utêÍïPu”Zñª¶Æ›4Ë#·HÄh[ñ¹ñ»³³`—æGN'Ð^ÿdKb'^‚íbzhó‘¯v±W.p\7\ÇØð´vÖÕÅ:;­óYÙ6Õ¼E-‡·ã’Ðܘ.r»ú[›B¯ —Ì[Χaz:ù®÷¤ï~×h„.ôPNË•]PfNâÌ 9ò)®|¦épHƒ³é„h*·‰ÔÒíøªGä®Lœ˜bK™åHe._ÈK0ö´÷¸÷ @%£ÓÇx©èŸž2THøÚÙí¿»:ç 0367d01b1eb56995c68ad7c25d32f9da3/proj/rd/eric/funtools-1.4.5/man/man3/funparamput.3 funparamput%Êput a Funtools param value3Ž~•Uxœ­X oÛÈý+ZH­“ÜEï.„œÓˆeÃÒ ‡bM.¥­É]Þ.iY-úßûf–¤(Y—E8ÖÇî|¼yófèåüö†èCcï•Wå}SÓUø_ñgµsE Š¿¡gU4šV_–w÷«ÅŠècÓ¢É4ý·'Û¿[­=Žð†p"¡t«<]ZUêDNÙøKìvߦ®,“hDU•¶Ùø•Eó·˜}ÕbæšÇBwFùÃÊë&‡ö¿f>|Õ|üè?…üãÍêýÃâ~½¸[­·šr×xòpXŽ'Çp¿Ïø½²Ùq„ølgŠ‚‚®©Þ¶Ù’Ë™‹õжZeÚG&è¯TÀW¨ºVõ¨h<ÔÞØMB^‡J§µyÖÅ~ÒFn|@b~Ó”š ¢-ni‚Kªu†˜êmüzÄ£†iRiªCÐÙ„–Ηª(ö‰œlÁìoÚÑ/µ¶Á8‹TM{×ÌÝ9„r‡·£ñ„>º~Ö>‘3©²Ô uasÜFcªq†&ßS´Æ'€;«¼)•ß·!MhaÀÚ¤M¡`Óäb¶ƒüÃOË¿Ý?,nç_>Þ̼y  /3IÏž1̹ÂkN .(â J¡?M1¨+. 0ì×ÑtBpO¿¨²*ôwÔuÐ÷tÌ"áïÅrþy±š]$4Mh†ŸåOŸ>áÕ§ñïJ﹪mdlèÝ,šê0C¯’Mè÷8 »½©€b¤[q2™üOÁœÀD£/€[Áõ¥dH2Íý,4DE¥J½KØ} bj Ü»ò\…Ç‘áA§=pJqnûž1d6bbÀ‰ó™²©nIÈD 5:Bù,Dj ÑT!†½¿»½½Y®¥Ý>.V뻇/ ·åNƒøýX(ûÏâs×MÍÂÎæñR,^¼£‹Ž63@T0–RW4¥ ôg±>›¶­[oÏÈö™ ‡­³WÿÐŒ÷œeþè s–»ADå=eÀWD#4yn^Ø# $Rñ3¥zB†¦&­Âžr±pÕ0G©p®â+ïN+³UÏ,‚Ãí«;ËšK]ZwEÔÀ!гþt»XJÖx5ÿ,=¥x!ap {ÆrÕk%z7д.ŒÌ»é÷d~ظ¿Þ¼ÿ“Ž8ÒW\½æ ÷vQû³ù%¡?᫲¯GwÑ’ú¼ùç õr°¡^ÎØø×a|€e™ÎñÝ+¦FFDˆX_k«)í¢jEõ¾j©Ì5ÜÎLžkQ€¸(&†áL¡T‰…ÇÝ«øC~‰´a–EÒàÄé8‚¶Ö¡ [jʱô#Çr–2Kž2¾YÊüÜm5œúFrnÂÛ–«ÜæÌÌÌáž»ô‹ @i‘S«¨ªo‰ni\>Xï[CÂú/½°›ÎÏ4K¬9[ìÙ¤LœÀ:a7š›R®3Cá9)lÜsX Çv»8YпUå|¢ÙÚ+¹r€Uåu‹dŒl – qqœuC3ªhçrÇ≙[w}<Ü¿øæ|õ~±aºÁÌö\XºžN~f+¿0íJ%,Š(Œ‚aM½žÊn¥RQ VCÐÏÕ&EyáT„ÇÉZÖ”Z„ex̺•;œß…ï¸.¯¢Š ‹ëI ,PÀØbÐÎ>m¼V ÅpþµA <à§——£ëéÕõULeÜüßõÉé×Ù™‰ž$R€¥ÉÀdâ,zÝ1¥wÊy0‘L - cí‡×A9«µoXâ 0<ŠŒYÆ4|Ô°öyÓ×KT‘3Ãhܰî.Ø[BÛn—ª\†Ï°®WÐ}²rž£kK«ÎÏ6Ï~¢ÃÑ#àçNi¥]¨wèTV tH\ñ]éÚ9ÿºjܨO¶í™v|æ¦*hýõŸlÛ•žâ1'uÆó6’ÄëÌ =óúÃPGð9ÚUG°C¯‰,oyìkp†aÂŽ›ƒ"ù"¾P)tŸžk‚¨Žó2èŸy—^»îM<ž´!Äeb ^[Ûäo®72Qv[7˜±¼¥G¥ŠuýG”ÒöCeœôb¡$¹–Ãg[YÏ µ‰ódek²S2qŸ?°C< x–s²N5ý)ò~ž—&ê3OT›ñÃä6CØ-öWqöÀVýƒV>ÝvË;òðº*|v¼°`±øöRj ¥Ø 9üNìe³’‹è³‚©Áö÷ó‡Y—âå·tüÌ'DÜ™1J.äð¿X®oþŠÇ9yѮ䲃#†´×7ŽWˆ×Ú^sC<¸]¿æKåÑûØ„Ä {ZkC‹`€ÜJ×wºØ¿ºbûZ¿Cù¡m¯rê 8^xz;žÉèšc8¦Jÿ(íuÝx^òf]ã÷ìÈ¡‘‡¼)$yES´åÊ×ágs©þŽ2@QŸÂËödì™öÙ33™P¨ÛGO÷”3+…8?n´ÎJ'`‘« j-+Ìêæ†æŸVwD+­©û³ÍÈŽ#û¨àh®þ/?[]Tð±.nѳÉÛÉi~4{ ,§³›’H £?Œÿ Ø:¢ f55f023c147c3a17eb558863852de9da./proj/rd/eric/funtools-1.4.5/man/man3/funref.3funref,¤%FunRef: the Funtools Reference Handle3W›Xxœ½XmoÛFþ+SrF±}í—9ÀçÚW‰mDÊ]‹\P¬È¥´E²Ü¥]Ñÿ~ÏÌ.Å7ÇmïC‹Ô –³óòÌÌ3³¾»z{Ct[çïtúŠÜVó¿]Qd–p¢+Çš¾Wy’iZþxwÿ°\,‰®(Ñ6®LéL‘S‘Ò¶8+¨¶šT«¡:iØz ‰‹<ױ늙¼¬¥Æ ((¬]s2§ïn–×ï«ÅýѪëàH}ÐmŸPÞ~è![ tå¨T•Úi§+KÓ¢"½×9¶$ôg§s‹híŒb¸¸fk¥Ñ ¥U±àŠ\LÈ?ñ£šÓª ú¤å(ø Qæà;@”óŽ¿ÆÂ!ka#¨MM®2RÕ¦ÞéÜñ• é¾Ôù”Ë2Já¸øÐÆ÷ŠÈ¤SújjÒ:§×§дÿpþ1¢I5‰èîý›7³͈6ºªŠjj]‚àk\ÔYByáš›/_Ñ3ûŸ׃²Ùec¬xÄØ;@š=ù½Æz‘t­]ˆµ…£¤ÐV®ì”Cö3$ÓKÕû Tº—ô691ÔLé$bÁÃVsÆ#,ùZT†èœÓ¿·ðªƒ±Ù©æ‹k$¨:’SkŸ¾CeàO޾0ù†ãY°äCí,ˆã`Ţ?Ca©²¬Š²2Êi¢­V ‡cWT\£.5•uŽÝ¶[²Ã‚ôŸ¢œÓ} ™º²øç{•™¤{½±Ré]±g=ÞŠžo术ŽJÃÖ‹5ÜÄr(‹T{Þ—öF_ àÙ®­ã-)K«Ûûwo#Z½¿[¬`ÖÅó‘wœâ¶óšf›s¢÷Vò­ÆÄ 2t8š£8X0WªêÌâ¯Q5P²Ö>ë'É ú*N¾0úb­CQ>ó’ˆS$f¨B`I”S¾cC¾)Á¤ÉçÁ1;H jÝûJÜc‹æG|‰´:¬Güó"skãJóyN·RàjWJûÿfß_ŠÌÅû•Û2ë:õ"‚Ñ?µ›âƒWÑ*šÏ‘¹ªˆµµ Á€{ð²ÁˆUFtÖüittJõXÔˆœëþ ÀzÈÄF¿Ñ£Ýy©5gE0lÁfèÛL®ôî0nÁAôå\¦ tì¹²i\ýsmºöö„{ .ˆÿÙhògÄzúzûþî§åÍõê§ïo‘ù¿úèž^øSüÕÿc±zXü€¾>€õÿ™©n½5ºWÒùeX×aÚ£7¾¼GMÉYP´1û–â‡CÑófrŒ‚ïÊ â&çº~ùu;as}hÉîË&³‘¾~I]í>TÆmL@´í#DüI0î£Öa[êØ€aŽ0jµ³#3Ã:UñâÃŽ†O'Áæ[4¶ÙZ‚cyOÀæô#šƒ÷O"¸½ÓŒ¹±;¾Ýäv^1e6 ¼ÉVœAÇ›¬ç3|dv–>ÙkÄÆ3²É·ˆ‘û »æø‹˜g2š‡Ä„²Ò>*·‹Õ²MŽß&žì§?²ºüÆ6‡Ô´â„ôã‰àê*ÏÚ_^Ÿ]Ò%þ~þ|ö‹(`~êWc΃¯XŒöÜ¥S'Í4yf?¶ÛSÄw‚‚‹qôâO߃æv‹{ReuC´l(Cµ}ÚFP6sHWðúgì´N 9Ô.(%JD¿É‰&ÏOÀ 8Êøî_W*þ„ê Áz÷zÜík VúªØ`W' æÌüW‹÷Õ‹V“ÏAxj˺¬‘¿¤Ñˆ’Á†å}Š³ÒÆŒañ—PJyæ¡»ù×Í&EÅvû÷Ö©‰s½ÿà£ØTq¦§ßž_DüÿùÙìãÙ( rR~õæMè§5>Z¥, ­wMþ[TÚmxT¥ý[$Th1Äk!ã “ Š]­2,ÃÞšlÄhòji_À^pñò¾G'ckÍv¢÷(²-*V34BŒ3ÏŒ,Ñ÷Y4zä—âPð†ùi´œtª|Ì ÕesÜ”iìµ–Víszh‰óô69>Ö÷ªëP¬ùê0‹}Ž .]‡§³2²!u4æÚû?ø•‘wçÍûuÅó(P§Ìtý™™Á8fÙÞ&ì‡`à­ÓãsÂõõúä o¬{Õ›ÑHŒâU†“£ÉyË‹üd”>ô¹&U»‚ßZ±§ü@9ƒDû9ïQEzn¿éñ#ûXYXNxBÐk茇9ô ö€G" ‚k~hûÝI„àqp1<¯5êÀ{Öú~¸4Z!.³¬»S,on@Ë{¢¥ö´ÈÏ‚i> ÏN—^ûÂÑY‰gªDSIeÏ¿™KWØ3:ÿ&¢‹³ós’ÿ iú·ÙÿBgnÛ dd7d9195a153d495abfa34c8537f01366/proj/rd/eric/funtools-1.4.5/man/man3/funtablerowget.3funtablerowgetÆget Funtools rows3‹LpxœuWmoÛ6þ+‡l¤Äv’®ûÔ,è²!@›uŠm)‰¶¹H¤FRvÜaÿ}ÏEÇv²~p$ê^Ÿ»{޽½útMôë`ïUÕê/nó›Ž4¥%~qky· 4ÿóöîóüfNô±u;4šÞ.F‰Ùê=ÑÚ™†N-x%HMƯliBÆFêÔ#^&T¯”§Ó¾5!NH¾œZ|(é—ëù‡/7Ÿïoîn‰îWú(Æ¢DXC4V“×ѽÖc  ï:ROÑWÆ*¿¥Èºä—Clj›”*gCÀE…àj£ØõÆÄ>S,F‚F|MùØÔ‹Ù'l6+S¯R6‡P¸j[ªð!:¯›Ý,èöëÇl´GDº™ˆ^.´ˆgÐb„_W#n@…2)v hFÅ=¿Œ «ÞõˆoT2ÎrȽCœÚÉÜXÒ ñ¦Ы áäç“,— «Hµé½ÔFƒcz€íÖ!²¸R‘ílÝ i9fE5ã9©°rCÛZYë”NÊnÆ.“ZDÝ”oD]¶!êNÚ€k+f¸ÇÆš°z*ë^©¸³2ÕN`, åSqsû¥ã«é†ŽìÐU€a´À]XÉÞrïWCÜä+—b,‘ âD¤œ(ôQ«šfƒù¦ÇXNùÙ- ½N)sC»Á#áƒfT€Ø«ŽätT> ÞC Ý¦†zÐÛó͹Ì"Œ§“N…‡wÑ+ ¨Yö„­…¡ï äX®C‡°|³ $®ž:7+HE‘žDa˜[Êë…ÍQP¯¹—IwdùVEÖ3\g;eGÌ7ç§r’$¦SÐTÜE¿Û>iMmƨOω²ÕÕ° wT\¯Ë£ Œ\‹ØÇ„>]ýñåî÷üöÃÒŲ¤òqý¬êlSX˜woȼ…0þœeqÎ=chð+a±Ž^#DsfÞˆ$ÁÚ%àp]¾÷ÌHÇz6ÊOßk«ýrËñó[oÎäÏJ•ç¯fðNã+¦ãc>4»3v÷¯xÜx¨]¢ÌJEŒlnv¹‡ÐçAz5á'„,'t‘*Sü²óEÔÍ¢`i*ÓVÄc™|_Þ4 HåÖ˜+PcÊ7'ægÙaÏ®—Ç]mõ#6ŠŽ»ˆå¢)0Û~H·IÂ¥Ó´Oµ^¨4}6Ó³Ã;M¥Y&`_=p_þ=  †ç«5ts~7˜H–}ÂN®œ#y½îPô¶~T]ïµkÒHQ‡¡Á;óQààFò,aY L4U‚C»æÛr¡‰˜çµáÛ;À=ª2­‰¸mͯ¯éêãüŽ$¼ü¿ƒÂ–cP²ßîn¾ÒmFZ\|“×åìõì'ºê=p¼|=¡W——$ÿØ d1Åå*Õks ed48bd478dc59bab656911623dc5c2ab6/proj/rd/eric/funtools-1.4.5/man/man3/funtablerowput.3funtablerowput-0put Funtools rows3eœxœåXQo¹þ+óThY±¯w/½Ëƒ›:­œÄ)r‡¢”v¤%²Zî‘\ÉBqÿ½ß É]IqÒ®êËÖ’3Ão¾™ù¸w×?Þ½º÷fÙò;·;Dº ¿ñet® äÝ>ÐÃÏw÷onˆlÏ6Ìð/­‡nN;gkz&溮ã]úÃÖsZ5ÆÓ³¾µ!Vô—›‡Wïnß¾¿½¿#zßð¹Í ~‡h;¦½·‘sÑ‘¡×·ïhi;ãeËm·!ÜIôkï¶d:2Þ›¹5 =…è‡ÖÄÆDZ¹.Ûá³¶íL;ÀMà–W‘kZàª÷¼³n´2m+Þå+]ÿ ëfÕ‚è¡l9µd<“¢» ÚšhÅÂAœîØËb°ÃƒSm¢¡µóX§Nä€Çß™(W޼Hp­­xà7Ö`9”‚Héê®Cp+kÄÕÞÆ­‚¨†³‘Àˆ§NО›ú rŽ ¼P0êkêÄì¸?ô¼²kËÉL7l—ØŸ?`®äQÓšãSmrz’Œzèk°)D㣤Xaí[<×þ4eb½ äsƒzŸœÍv5?J0qDÒ›}¦Žø-ñ {uÑʄװçt€1 Eg9¬×øŒ/Y¢Ü²ßLÀ³õgöWÕžǡÍ˾ÖíÁ¦;9ñS&Ñ+Ÿ$ôFxàbs!U¸‘ k7úP»9 ÛM‡¿0·Qbc0¼Z59IºU—SGî’U)'àï9ô ‰<ž5¶®¹«ô8Ø¥PRík:¸ù25Êæ4Ûs”‘öНíeYË_]N´|)¤")1œÛu+¦'žò¤xÃê\¿KÐÀà7´`Ó埈nvÄ€cN¼ûžèÅ3ÚpL¹»¸ VÿN¤ƒ[¡H$æ?{&6¶åÍĽ¤ÙÍ®:jSå8Ó¶w÷÷7oæôãõOïî?”ÿþ°q±ª¨ú—ú.È5±ŽâžÙ——ß“ý‹ññüyYî¤i"¿JVüÖ¸dóÜâT‹ð«nIX ŒÊ›¥dwJÀˆæÈ–„¦˜Áê¬U §ŒãÔž^§$Nr¯`Z’úœ/ƒ^ vL5£šq“¶hø_¯«o×Y¨?½äî( ÜË }-9öÜ·Èšé¨ÿ™Æ…ŠRµžÏ„Í©Lšî£ç–|Œ&tð¨Ì€÷eý…Œ> @óìÚ)ýnATLXgó\e8—‚Z1Œ|IÚgnUÌlÑA›Pª–<´-,ÚµÝ?RÐ1Ÿ„g¸ãŠvk°u p…ï€C1騷,Ç7fk…´V=\°ç’¯YØ©m2¦DWuí|#™FÞŒ³«“‘lY(X`õîñêV<3tиÄ;æR³úS2e3ø R%s‡ÔÁ‰Ká‚ 97méS·V——³ªÓ——óÏ$ð„É­2ÂHt_o¥Ñˆ†Ýßð­ì®ÝŽ·ìsÈk½j´že- ì7Aˆ°1ÔÚ×†Ç³Ó ŸŸ&£»Àãùi…ÏÏÕùä;ÈŽ þ^µ1æ§š»XD¦K”ÉU$@…ªz=@†ÃD"%«¿$$¶‘Cw+¯6BÂfPÐ&[Û&ÐÆãµ?hª7ßBäÌ.Î-Dªí×)^9s9^}—qBú½Ê‘8@³-b¹Õ.Ñ©é¾ !ü°vÉ4”¢6ú/ƒdN>ònߢ>r)o©4R~©!¯!„zíà¢7áÜ? ÙÆ¸]î’É ÓßH•–î„vø¯–ãlTZ¸/Ù¨òñ—f€Jn…Ä0Øp–iŒwbkr`l&hâ\ ÿ Ý\j¥ÿK PºmÌÐù…Fu—<÷fò‰²P;“6/#jqó swBRÀ*u¤ߪtÈÃ"ÚPM´ÑOˆ&»û~ͼ¨F &/WG»±-3®ïUéÅɧûw…ž!éÏ…(ÏQuÏ2Pv´iŒ'¨šÌfÓùæÑ¦QNh¥1—GŸT13¢}:‡†ÿ¢WÌü?IäbBó5[(Ýõ›ý~ÿAD¯óT’\³g} èÿ3ꇒœ=,¨£Ã˜‡ªbˆèæ©“±n1š‚´ãfš¹¬í‰”p2á¢gsù¹ö•KFvØ7¥Äb8 0YpÅµÜ ÀX21L?KE r"óLÎm wŽ} ½ouÈóà"o…ïRx€6t~„îvl°’{ÄšMGµŸís™*¢x¦ôŽc¾á  ŒS‘W1Ùìï G€dpo‚ɽ:·èR°xjñÆçq”ïAF×è…CátµÅÍ ]ýºx Z0Ó Ô±ä›ž"Ó߯n gf ÌÆ,¯ÙôlzNWº!ÍÎ*šŸÎveÀÚ?q±Û 660f237aeb0d1f8858ba54f973dc5084./proj/rd/eric/funtools-1.4.5/man/mann/funds9.nfunds9M&FunDS9: Funtools and DS9 Image Displayn&XxœmW]oÛ6ý+YâÁv–¢{hH›d5Ð&AaÝ#-Q6JÔHÊŽúëwî%%dEÛy?Ï9÷æáæÛÑ}×Ü.?\ógtÎRMIxB‹Z­5ÝšÐZÕÓòŸ‡Ç§åbIt«CáÍJÚ¸UõB5´Òdš¨×^E]òWGq£© è¦Q¶&P­›nN·wËÏßOϋǢåÍ£8»d·†# ¢w«M¡,¼4ÍZ"+UT´5¡SÖüTÑ8œm[‹sò½ p¼êÇûÚÜwnr$;çm9'É.sv!¶òå±ßûÅóRœëT••i”ï)ª•ÕaJ«.’²ÁÑF ]Û:©r~°Ê!{µ#àá£2r+l”GŒµ®Ž™ÉoR]t5B¶'¯£7z‹K[£èþùIŽy~~B&Ë!r4¢à îBµje¬‰¶LSØ®ÔTw6šÖjª¼ª5‚¯*gJ…³Îת£^¯¹ŠµjLÛY)i Oúa@PÒ »v3"oâ¦s©(/·ª)i¥UìüûgßéÏì*7žK­ÛÓh"ŽÑ“ q Œµ‘ZÁ].Qn—«R[¨vA™îŸÑÜÖ; ¯¦}3ÆsÑX1r¶Âç ¾žÁ _™è¹¡?«§ä]—óÓpöñÉk¬2[P˜}Cú†~Þ³7©xJÑ^<|ºF5^x@±8Ú€¥£ˆÿgw©Ðêƒ'¤*äÊð‹§ÑÍ'©y¬ aÔ?œpšÈÆù¢[°•ÖŒPÌ{` ¤{™aŽ 7²óù(ù 0Ù Ìžô †'…À¦$È<8±žDàÛTë^âs£ Ÿ¤ “·Ë I`S$1s  uØ‚’²I\¤¡~°\ âR ÀÅW†\`„#ZYyT!µh9™R&FÀvœ¨˜z“k®¹Hg-_oºpÞñNú“»•\óZ!;Ù>T”ù{.웢µæU'Ña6îÙ’ )!æ».-e-+y*ö‹Ç~ÜBÈÞÝÝ|]>’à _Í$m´P› »ÄHò¶-àÆ% òq5?ÿn°½[ºz?¥w¿]]‘üƒ=!¬ý]„9 d0be5f311f329730e3705cbe9844f2fc./proj/rd/eric/funtools-1.4.5/man/mann/funenv.nfunenv:£&FunEnv: Funtools Environment Variablesn“l¥LxœÍYmoÛ8þ+<²ÇW÷Ú½Ýû!mÝ»Ü5/ˆÝ·+Š‚–h›[IÔ‘TßÛ¿·Ï I[rí4í¢À-°"‘œ™gžyc.Ï.&B¼lªIu{J?½1…øM[S•ªòâ´ZÎ åÄôýåÕõô|*Ä å2«çxçWJ¨ÖêÛíêõJg+‘ÉJÌ•hœÊ…7ÂK]˻̭²²(vB[njċÉôùÍùõìüêRˆ–/LQ˜µ®–GÄI«„kêÚXQóÍöÜS!~°ñ|6ý4y7»d‹éÄΛC‡ W«L/t43W Ùž÷ uçUå´©D%KcUE¯jUõB;^P ¤XhVÈì3©/Emu)íFàߥA—Æ …p 'Þvµê]NÞNÞô„Xk % ±1 !™Eì¢DÈ!)€]û•i|Ô}Cù¡+¶b ÷ÜB!•êLzX3â|!*ÓUc ì º‚a²Êƒó»@ÈÂZV/jéÈíQðAy°Ûtm|ÙVpFÆ|†ç­pò¤ÍÅ»+7BÝ’Ÿ<ëÔUÀ‰ÞäÍär6í lëMg/&of=Ñ_+bÈPÈ…W–²á8é<|oÊXZÓÔBz±RÒú¿ F{äy}±Ç¼øÔiÊ9´ùäZÿÖà“©££»jéy€S´0ªÿPbm|v~ùüêÕ”œµ}EàºÃå¤s]U¤Ðgµa¦0ÄxIù˜ ÇÊud <VÑy^ߪbC0b{ÌU”˜N¬ÎsàѸd,ŽÌ`ݯ*y§ÝxÈ?$¹kc™åò N@ôÑçV -„’È‘­ àl©--ËLYÊ“\ºÔ”Þ ISV°BUYabÕ 8üüðEÎeD"Bý¿©;YÖ"A/˜kI‘dhÑ!WþŽÃÆÒhÄyâgžvÙ–<×ëÓÖ!m a‘>V-TÊ8”ežG »ô Œy‡âRƌڻ ú–„:Í®ÏßuÙÄo¾‡L¾ÖwÑ=-ì~ «Hà¯Xâ%“©x xJ¦ÑªÍNôŽþíñð„þÿéÉà>Ú$t4=Ч‘Ì*éå­ÂÀµär‹{ØWw?iXÉoá ‹c#UÎnnÎÞÀÂã7Ђkžf™€þd“Bfæœ=EÕÓØÜîhFÛªPãž®Ý Éz!+çÚ\šê„=uöå  $ÿÏ'X§óƒš¸@J·sN©çÆÆOõ¶Øú!ªù‘Ds­b~§¾à˜™xqßND’¢=Dw°8>ÿ'vƒwÏ‘Çý%ßçȰäO:c?šâɃº|áʸªwwú¯Óñ£ÇO†›ôPëÓóa½’ø×kxàÅ0¿;„oÛ§èzuû!Ùõ£\¿ñªÍÚÃ$xJ¼ªT8¿wvx5›Ü|ºž½¿Þέ7_!á íØFyèç Qð¶å®Y¥DmœÓ´µTh·ò$¼¶&SÎQ;[GëøîMYë"vã…®>ÓãRêÊyF}‘JH¡QDP»úa*+›°Þ2ÊŒ„°øHbcõ¯tµÌÆndÔÊ›Œ½+$Žß—V–£ÀŒøé¸ Ø)ÌØn[E.½ TùÆVN$›P?«.v‹ùäÐíËE™á©* þÿ…¤«[Á£hÝç¿aÙ0NÁPÕ0ç¡)¸­T‚Š”G™UYC$”ä®™ÇÒ:ýIhǵWŽ ë ‹ØEšJÈÊLåÙ> ¯;êC8Ú¨$ŸZÅ,¶ÀÌ£h—©i9’@ ‚èPÉá /dèIc‚$†wjIñ™\óL&:™â ›Ž³,yð¡ôê²kIº§›u‚ƒÝN´~m† E&©•Ž)™’Ð4|~Ž O°‘?Fóƒ8ƒ€è$n¿NdAY´Ç¥¤-r÷K"MnxŠ^‘ݘÇB¸‰öq¿uhx LÚ:$Xsíj~È@(~Q_|Ý’§d{|[œ—£øÎyƈñh›ïƒŒyXVKu}|¨òQ§¯}þ¼ÓÔâ׌U©D´ošÂ»ÐLÄZ±7â¼G˜òqÆ}GPòˆÀ_E+͉z¹"À!bC…,RÔä­ÔEØ|EûÖ2D–µ‡¹Öš6 “w³›³áÍW°@…³R˜š;­8ôð„@êø/´AdÍJ+Í—*”½Újº¦Û$|/š\¥Ë%Ú½…Ý¡BÁu1Eì4Cs…<’0¡n GÛ=cg×/Îo:ÖÆWp½W%ú=êжÍ0»¿cpôÐî*[ª\Ó›q„Q:™ˆÇÝl6êt6õe½u¥<ªM×ÖO&×KùÅWì\¯ThWê #ÈÈÐÏ„‚þy¢±Y0°í%4ý<ªAË-I2O‡hM1ÔUùÑ~…ï-•ê Û©Èí©”š+K; Ìüù>)d‹¦`?åjÞ,1Õ,ÑÜ¢ÏxüÝêGmê/åªÓ!}zš Lø{ÅöÔç“`”ŠÉDœ½š^ 1U»Fµ_ X²»7Ûc¥Š-È žóŸÆ£'£§â ñQˆñ“¡xüh<ü΃ßpÚCF e15bf6096d840d94fa15d3e5a2c52e990/proj/rd/eric/funtools-1.4.5/man/mann/funfiles.nfunfiles¨$FunFiles: Funtools Data Filesn·OíFxœµß®uV©….çE2ƒÕJ«NXµ̋u\•ª{=™Þ*.Šx¨"~Rúæ•=—êI§)þÆ©4«ÚoR÷þÏd¨2Ÿ?è*Pºš‡=Un7›¼¨ôBÍöÃP]^ݼý4ù8|x¯â2¸T¸ºJÖñ=€3˜›dq±WU<ƒMþ£%msžgUœdIvÏ(«î*_ç÷:Óùp¦ýåïÞéJõ·¡R“O×Geµ‡ýÌŠ÷kZśΰ*·;ÎâµÆ¿Ëž'˽zŒ‹`©‡$[”*_ª$cJ&y¦T¦µÌŸ¯b «'jV2íÇŠ Þê]3êâÓ§‹¯Ýžºú|õ~zÓí¥ž#¨»[³Ë;…Ûù¾I›ó´Ò…†ÅþWñ\•ð!Ú ‡´9C ežü­³÷äÆàÒόٮgºàQ¹ÏSΈ‰—Ì…J8Ìà.ãø¼ZÆÉÖÌÂÄ)öaËx!g¹qª }ï‘—ˆ¯T·ÈŸzv¨º±œËò$’ስ*â50>Á<¶À'EºG6L`¢"Ñ¥fžë`Þœ%+tãjrÁÏŸ• CvàNO8g²ä* uT›çóxMŒ<8ó<Ý®³£Y\"Ó#ÈØ/™¯è Œ‚È’¸÷4)+Z‹©‰'VNª’€B1Ä)M&qaBžs ÆLN(ÇÎóõš×Íà4KÜý¡ZD+Fá9Õ€òœçá2A~áÿ~P9ŒåS[èe¼M+OT7šp;¼k›ãÆþ0Tr$<že¦9‰ŸúKÐ釤2X˨?õšñá¨r…\ËLãV„é"¥»1 öô+ C%0ð$k¢=ž¢Rïó $Fm¥€Ê{õ{–ì`°&Àê:¼5/W,‘ð¡X‚–j½pd:›§92ù×@–H|Å ¤ŸÁ*ïe‘¯<¾ŸëÏ3É™8ãò†ù~*BôÇ i¾Í>ÀN@á†`Ï"y}JªU¾ÊX†0|TlNå|gz?&Èy„dšç(ì0ñ1N#Ù ³Þ¦€?_.ÏéY<+a¿ ¶hVàÔÐS¬P äL}Tœ5E½PPFU,\8ÜL/¯>OA¨—Àû´›#½C‘ Å]hnÄèY^­gÈGïxÏÍøÇtâÍ¿¼yÍISÆdùžÝ?ðl>y“Ë6Þ%¥/€e·vÔÕ—éÕûtÞV:Æ#Ù€Ò]£=@¢Ä (=Rý)«cðô®@ 6Í…>_}:€ŽÒk-( ;u¤òÚÆààJäETc•ŠBnÁÏY`` ¤" Šg‹"|ÖÿV°l;“áVBge[åh—æÀÆ{tp>`H̾Ѷ;•%èyÃd%8CXdà’FeUlçÕ¶Ð … 4E“~üŠÄèÚ˜B/ Ù!€MƒŒ|袰Q—„Ìl¸$ÑòYu}`úë&žÅX<PNvÊ-vã°!˜wí¹šÆhЈ#œ‡–§ù¶gœTåÆy‘*ˆÙw†{aÏD; D8>È7H ª˜ýd-þ±Žaj’a<{‚ù-¿ß‚ç áS7ÍÔ¸·Jà`{i—ßÎé> £áKZóÐc Ôl‹æpžnÀO92UƒY&÷ÈŽX)P¸'õYõ³7êèÈ;;šfCׇßN𭼋Nè%0¿ûÕ{7Ôßý·÷îdTw…ïdÂ2Ícy|‰e¬÷ø÷~M>×ÞúX\dÞÉ\܃ø³zȌ׶)ô2Ù9¯ ‰Äâµ@§_œ :Q9`?ê€ÃÎ"°ð5²Â.^oRßgsμ›I'ZmËñèWdO°‰à–jG'²Ç8Øí®4ÖÆãÕ‘·Oíëmg ,L*{« 8Õíµ-"J<»X¡·cÅìgâb°‡ëçˆûœhö†wÙ®³­ÕÉÓw¿MÞ¿‚Ÿ_ÔƒÞ?±˜°ðàlo “joÙI,Y`q+È)B¥<]mMôóéâ/ã_Çø”ýúü›¼£sì)[ª± '¥D ªØfâF´T¿õÍX¼€Bÿk›¤ERŒn"jTÐ2µÐ@ˆÇzŸ´nHx£i“òTÀ3˜‰~áÓ*›òV9Ò»¬À¤pZ`‘<&‹-…ŸOXà܃ÝÆðÈ8»Uü 3fmQ£l@eG€, gp4…C|4}.Ø…G¯ÍyZ™¤Žµ±¥&õ(uPñ¼¦Ó¯¯"¥^+õÅê•zÏtJœäKAiM¯?|úÇEo UµÁÈd<˜þ‹`ào ì"ÇT4"tƒ¢>ŠwAˆÞ€}ý&zƒ¿‚ÞÀ¡7x=7(ŠžEoHƒ>þrñM‡ß‹ ‚1ØÉ7¡òÀè×ï‚zLƒ§Ì:~..¿ î ¾ü6ñÀèê›PñN¾‡‡N¾‡‡N¿o3Ñé_ÁïÔá7|?7(´áÖÒæfÙ•õœ7èJtîÉ9zÊ·°:Drú9S2¶¸/ã ¨Üà+üŒ£(Cøq2þ5@_—_ÆW8äò+üŽ£AO¡-ÈòV%î[RU¶ 0Z”–Mû±Sšs=oñJQ¤Ü¥³Ç¤È32ú˜“E­6Æt!¸êfPÇÛüúÆÖ¢~çÀÙ~ÈX;ÚܹõÙ[#LÎ{õ‹µ&k±´ 8½FÖ„ÂPà4œv¢hë{Áy0̶³ù‚ˆ]2Þ˜kÌÅ7®’G“ak6i\á3 óx¹Å¤œfk „+µsYëù‘™žÇ[´èh¸ vG-˜fg†PÏ­üfËÙàƒ©àÁ }C³ØÎ9C«›-˜Ú¼x(%‡îsA¶ß¾K²íN}|K©Aò.À†ªÙ¾ÒGåæêÀý€˜n®a cœ&U•ê&ҵЦ¶œC9&s¯©¬ SÔÈ&Q6Q<)æÁ¾™üãêýåäâ=>—gò ‡ËƒøZ LH€£E¸Û‘˜¶C9‡­w€+uWè,ã´Ô?¯´a1X²Ót(b¤8ò^eSl} ~|tw¯ÁÝí¸|H6w·|èwþ24 dö þu9¶%FÂR'Á |W"4ÎhCü#ï¶Þ;;·9(ÁA.t“§E°´O)ì•ç í‡Ã=–\ÜÜ¡3!'p看’7íKD4’çÞ³3û2͉¯C S¥,>3uÇSÖ«a]·- ÔXkWAÝ…Æh+õ=ã˜a‹𠔆@Zõg[¤0…S‹cð^¼:œÝ&Ù½>ˆâ¯á5 }h™Žú}3ÿ…Ù# aÛgßõþÙãÁÙYŸª//ÎF–yCÛà¤ßMÑÃl¬ŽeÚwj(uš }× ToXQ)Žò 7\æ¹þ€¦<öò¸T/…è¶Lf˜ì?ÈCS€;Ó:kªú ³ã]#=L8WœEo”xê‚b»%DñóªQ†öZŒsçUpÕ]°¾N¸Äi22@ š½³4Ÿ? !–ñ¼Ê)ßÖ%ݳ`bb”gŠ[ç÷ ˜tÒBª•X~#’Õ÷…Z(Ï¢ÉZ{M‡•ž"ßV˜ Ý"QôûK5yÔTÖøºlƒo`vûþx·Ú³o\vð< àíó/<|ñãs3ÜX¶.”ËÂ3‘¡¡%÷Ðú±CJO”b¨.Ð¥¼JâŸ/¼´€ÿÌËSúåP{¬˜¦„óL\ºÏKdZPŠx^‘Ñpj4/½Öl/I:Rè«Äc½ 9‹Ës¬Î(Lœï9(™û‡…üó¦(Á?ïáSíTè)¾?xÕ2óðŒà•›m_;âÖºblåÔ舒u@º…~Eë(b3l^؇TÜ{½ÛÈã@U­ÁÖ‘²RÿÓär—”ÄGŒ^4¿`µ!TG_íe¬¬KÃÙH&3͉×DÇ6´=ÿ£³ñÑi@?7wíσ¾¹°‹4x`Y2Û·t:Ù 6»"I|6NãÊV EOSün¦x®J]ÓQq5B•`ÝoѲFÛB§(I » ¬žC¨×®Kq€¤¨.sâÕå–¢ÁýÊÆàÎûãÇÿ4ªNÎUe±j2°tž-êåe[@ªˆþ‡ø§ª! š0‡Åd`t[Mí„Myn7$¶VkÓ4QiŘy[®Ç¦4®ÿ²gв› y­`RÌgº¼|†Pwõ?*[ûà(Ó§×6¹íå³/Ü£7I–Ùjw=ƒZÆ’õâðò¹æˆØE†Ìab2&0%#‰A?A .夤C‡ÍÙímf]ŒH{/¶WP¥î)—R‚Y‹XÔT™f¼Õ é÷xe1a=S»òå¹ÖÀ›RzllSN#â„U‡òu÷vìr;®Òu’ѯx7¾…·eòçüÜîÞߎÝûžò@T¹‡{Ç¥gØT) *›pSµÚz&™ênŠ`Š`Û¶V€ïÇ&àô5¦œÔ¥|ʘü ÊRû²=ÏÁyaI<ëL¬êdn¥šº-µòr A&¹oýÉ>RYøÀ£ƒù_e XÅ4¼óOà´·ÞÝx‰Wó¤-s`ªø)µèP6Õ"×\fÇ´ãiB&®Ÿº½„N³®‡Ë&#K"ň¼K2ù¶æŠ›üˆöpÙh^2'…CÑcÊûÈqdüv(±Ïîo?~ºº†h¹PøáK×ÓqA K2¿/Š*8z1¸CDÀöká^ÅÎfrÕùÚaÐùö~UÏIrµˆô2ßfÀÏó…ö´¿X¯†9µ´«À"ÒXŽG9Në\^MÍ(þhÀšÐÒå&ü:: Šäæ¡ ª™Aé­‡pCÅðú@>w‘`.ƒ–L+s‘? "ïFs4=jTÊkíP›d§SµØf%°å†$Œ7M ¶X?Úô—l¡*ˆ]ˆ{6 <[Ä«p9Á%Ãe ;À*v%\ ›Ô¯äkj÷)b'v›͵n% †qîÈ#ùõ-ü ž-éã'ˆ #/¹˜*yÄMfrP~²ÝH]$sA8Ã[¿ RVߌ›îLlŒ¿‡¸¸ ñdŒ×«Ò'bX· Läåú~-xØ©ËÁØën¬Ç#0õ{ù­Çà1Ѫñ‹ãüL[ûøŸà_CÅÿÔÿBX¯ýy#ük*%éwc~C¢œ„e‘nD=¬næV|g´•­Fñðd¡©\æt}bΊAð¿yÿ–øæñN±¡¡£g~'„Q8EMy˜GŒ(Öæ¸ÁÈç µ‚²ü &Ia×·¦Oà ï©¶,8#?á×jÐ;±ÝŒ…‡¯Õˆ¯fQó@²Æà'6ÖƒY•÷ƒ¥NÊ€ú´i:ô5·lŠ©’²EQw·Ä³5¨‚di­ÔNqZoÌô×bIá^/p1Œ °jVyLÛ.HL«WªKMXš2.=òËÏüúž÷¡–ãŽ{òMá$ØÁsØgð¶<÷‹þü{¾Õÿ›ãuÛ+-~ÆršëP¶DL…0{üx„8̪ªÇtÊŒKü³@ÛM¬)Þ$•En³»Žqõ¬sÖVЍ«ŒqýjPK@¸º æ¼éü°ñi#4t¡&·_ïý çŸ"\‡sÍM—E‡/ÞB $š_ð½ÈŽPN42=â¼O?N¾ÐêÖy§'íž0g*ÖÎEù›ü0mIz0ž1Zá’ðÆØÇ4ºtE“ÿ1©ü4§K2Ö-$%ËîqÍŸ1‡wËãjˈQ¿±sCcSh7(M—o»ôJeÆ“½æd³;Äu¦!†~Ýi¦9w˜§‘[p7Ú£žö=×JT ÐÀ¥&Ú!r€âfĨôåöZcq‡o¯s::gÓþå)ìuÂU,s=3ö:‚gƼ­×€sµ§YØ*Q`g•?›6]-8ãj€`rÍ^pw6žÝ“ThÎo̱eÅôõx“S†©ÎîÑ€ñ}<8² ݃siYj‘ÀdGYbfƒT×<ßìÍÕ,æ"ª"&ö ‚ÛˆÄ ¬QËlZ¶´»åPŠ µÇưœîo&qŠòÂJ½‘;·ŸøÎíµ¹ck³ dÖl)ËN¹°¦@åµÂ\ÈlÖe«bi\þ•˾¡Égù÷„ãô ûd6iŒ}Lœo>,lzÌPö¶‹â …œ)ƒs.W¥J¡uå^$kPŽè4¦ûöÒè_¹%þÝ“þ[âÿÎÝnÊpµ þÏÝ<ñªx•›rêß¾'n‹ðœÐÍ7Éœ=?Ës5^ã,Íù1f…÷ o»ÍYl®ípzØ*Aôö¯L_Û+Ó(_æ.¯ã5¥{DÜ8d¹’Žq[n)µÇ‡"ÁÖ^Ù{Ø¡_c~Ń’¹ nÅ°ÈØL²Í¶ò†×/Êm3¼Í€µV‹qê›:95lq¨Cj™IÏñ*0BÈ7=Ú !‰ð0Äš–0 µÔÂü§X Yñå©&Ô'·"WGÝÐí7s9^c‹*{6‡]{¤nqj[70§c#LíP¾UWªEyz‡\`“€²‚“ü|*uðË= ²AÂ7¬=⳨ÝÏeª6=ZŠ;¶;GÕ]í7`Fzvïö^ÊZÓ$ÉøÂÊ–áþx¹Mƒ"¿·Î Öe35y5•ï1áj)•¿8cJJšçOq…dL^ÉžIPµ¬ùР‘7ºG£Á™Óã%û“WüèÒ4u9^Q@O`i¦ fP¨Öc6ÏMþ©Ù~êJý@iã7úìYÁ’b <ÒÞ>Àä Iï†ih] šËþ9² $׸€øoƒËHC&Ìí€oWÅåCLÆßlòV rØZÄ{c‚:pƒ8‰ÄwŒÒZÏWq–”k©›¿®LðŒ(¦Ú¿Ù/Gm˜º#& zuç§R4W›GÇbÜc·Õ¦Ûº%¸·3 Ôë±Ö¢X0úÁÿjùþ LyJ{YCÓ?ÃïŽqp[®b´k îó¾¹ËÕz|›,ÔÏ "°‹6ùSscDmb©ïÍÅHg$?‚$iˆÂ±wA¾-Y˜îöús@/ùÛ¶*îÀý›”ŒøÙêgå2ß=£ëðžtK¬û ¿FÅ´•47rMù¡8³IÛWÓ…¥æô=!f©q})ÉÒbôý •Wa`w¶±Þö¯×f‡î›8–véøÈ ,YèzºËèÙ§Ÿ:^»G㜌âåÈ’Š¨xÒô&Ñ—6„ª;©˜sÌðBS ´~¤Tã\›‚3š—¿P#ì™oÀŒšéÜna˜™¦Ø‘1 ”¿sÛùc›ˆªµÉ<¡>YØX”¿p ¶á5¹Ø‚éiaõk"33.î#†!~kÄíÎâ4˜D«kr2æ›8¼V.J¸Ä¨èÞÃïÿpŽ7%¤=ÈCƒ¾cAŠ×19(óï¼BvÀ~At}ÄÚp;hDP±³%R³Ú×=Ì“Ba‹,þ ñ&ŒeÅúmPš<à¦îó|ߊ+馩01HõÎ|£ŽtŠXÅ1ŽÑ 1{çöÛwâÒ¥Äw<<œ2¦×ýвô=.r& L|*Z뇑 ‚¢b#}±onoÓé”òô¾qÌ ÷vÂEz qЛЀó|@rD…mZe/¤¾xt X{wñœÃg]¦‡ƒÊŸlhÙóOWˆc°ÁCíÂø/Ân‹š¼Šü‡¯:tÉö«ÜµW;ù6&ÝÄ ŠGòß÷|¨ý×2ŽXþã'øñþ?ÏÏOÃÑñÙñhtz¬ŽOÁÄŸŽ¦œáÇsž2:>=ÏÎGȦœã”áÁ”cÅKÑ*'Ã(ìÏNN"·Êqû”c™28ï‡g'ǃètð±áh8ûýóóþY±ÈL‰ê«œb磓Á ®‚m겊?%ê+ºüËSNÏúáI¿ß?99µSWá:™¡ØÉ NÁ“gWás9‘UýaØŽO¢³«OéG§!ç~¿°J ±!Plt<<>ŽN_Xå\1 pÊàäì8<õÁá£)‘e˜g‰|zÚ? O£ÁùÙð¥½ÔŽò4:‡£ŒNúƒ]ˆ|qc›’Ë&‡J>~Ì“…Qꉵã›;Vc‰¶ÂxÕ&¶œÊš:#ás¶‡!æk¬œ>øJ68‡Ú£®>ê6¡]}„ª›«+uñîæƒMÅ’Úï‚iåv9£ëÝ—GètÊ¿%눀hEá(RYlƒF¿»›Æîkí½™ãeåšåŠÝ‡sg$R.S¥¦A´6õk“Ù…ÅʆÕ¬ÒÙƒ©Uéj]“Œ^¯M9'ÍŽ‡Sê´×6×µV3CkÃ~f~ª°¿K¶öÖ+=™Œ_¾\ÛÉäø£R—5m«sïÔÚÁ :¶ãM±M±, õªhp3x.G¼Í•^wH¥yªMÉ¢íl¡—“sàÙ‚µ'ê‘,ñ b"zLÇ##‚R?Ý~UQйjNŽ´QÿUŠ ÿ@ÿ£µIÐO?üòëãï&½,©L¤˜Œ £ Ykçr/ÙO ©à»(Õôövú>Qÿº¸ºOÔ»Ëû»Þ 8?²ˆƒ'YYÑnµë'\)4à>ênCv:…ª_ÃQ:oï›ïTrÑ>ìD¡Á‡LPw&: ®ÏxŽoκØóø¯‹’]svb À‚@]DYt 'MþQo‘ä×]DO;yF¼ÈŸþ§ðë`¨Tn59¤²ËJ΋j.›Øä$XR½À²™­-¨ ©AÃ^زñ‡ ¾Têëƒm¾‚-_«×u¦Î&o&õâðéËȸéð0ÿŽÌ0Îc@‡’*’d4ü¤äË—½ƒžÝ”TµÏ)˜x裰Ó(g&Qvt6ÕrË7ÈyáD‰Ð¹]È&Q¡¿Qt!4 æl¬ZÅð&éU~<ä#ɫדc\è'z•ȳáÙä8=QÈYJRë]—Ó!¾©õXÒRã‘;M¹x)ÏBf?³¨§Ï8Ò?Œ.Y ¯ $ÏÔH!ò)öi˜žúWOñ;Ú9°ˆN` Ÿl|²ï­<v IÒ‰æE&×Fª+༸óÕþî„__ªñÉÜù’?_´G‰eF㿱Ðh<êÄä ±ÐÓB„žz]tàXd6Æ‘šG£É„c3_n+R[Œ¸2…Š´u w R‚ö Tè©xAÜÛ$m§Pó]‚"ø»ömKƒêc—%×V.\±Ü‚µ•Î÷•’ï¨=£ÚÑîJVÿåË¿ OÔÄxi“€™`)ö?Ô\ˆ µBÊ€¯¶–@"®61‘ ­UfêÓmÓPp]…ãNÇ£ïUd#î…äºåб™á˜Ži5ȱ&bDTÄÆCê_@~b¹ö”d°®9¸¨J‹+Ò÷ß  $Ý#TAv¹ýëÆ=z-Ä©À»pØ~ªCLKžxK¨£–Æ¡ÐS=õ+½6ÂVÛ:'å/Ôz¨‘TpKs¾ä¦îÙ!7‹Ö8xMHw¼[9^7ÿ “K&28%ú<…®{~8EÚÁd¬B8 Ÿ7Ö5žXqÑäµ]?ÇdžG™ŽE÷46Ùe‡Ì ÇJóxÄ<:d÷ªº¥Žýûv½£þ”+½¤Lë»éÕÛžiRÛÒÔŽz.&ö ~/ìûÐlKK-Ëw±31! ùd2NÖvr|úŠÆÊüÖX¤üÚ ²CD }mà4Gx=ytÿpEIÃ1Ê–š•†K9)}4z²‹ø$uaÝHiwz÷ZÒèu* Ä`E®ñìЭSB.ñ³\×µˆVêú6åîõœƒe}Ó+ý`;Žè:Ú–VÏœdŸ'H/7Bbô ™7[IÅÊð †&T/S¾e„ü‘1¢†) ißÛ¢ßxJ>……~` Hþ½¼¾;òõ–ˆ>+ÏY9<€«m+QÍR2&eøW]µ ÓÏÈdD1kË›Ä3¶'ºA „]h\Iìt¹ÝGsÃ0K˜ÎvÄ øJ^F”ag¨ßlTW±ø ?B<Ëò uº/öúY±ÍætWììbc(<îEñ€4vŠ£%ä=èð uíôê ƒø»Ôæf+ŽmºrÆÑþ¶èNQuº.Sïø®Œ»¤@—l ZïÜ>S¥–”mÁ“.í’¨?í…û‡™© ñ½G×uX‡÷#ÑsöÊÃaýùUB0CÃ¥O?oVævÍËÅ– î »Bwš5uŸ2¡É] 23NcÊÛÒé7É·§ß%ãÑéó˜©É·„h,> ƒwyæÒ¥ƒt·GìÿÂto}¸ïÚWÏ+Ïfš\}ÈíÚ°ÝXƒ^g™Pl€TžÉ¸ff"¾Ø-ëPGzÝ7Í`ïº5Lwñº°ýl·…„óý~–˜-¨J—a:Ľ~î:yYÂT4•nY‚V‘‰­2E¥mG½W›ÂLHК¶OW2òåC7†åvV!œ»˜³r˜hJÝZÂÔ¸‡_(l‚Õa‹¢õjØðlpüB¿èwy ïãIB¾¿: £Un[äédB ÆA|a~k_ȃ¹Ý´ÎF¡Lµî ăðVÝT0 ;(tÙ0·e13]RjáKjPìK:ËÜ5trêã-§ˆ@ùü’žÀkþDP¹'ð¶ÚÀããÑÅÑø$ݳ‡le{ðƒóÕÁ³„Éek㕾R‚%(6[;£ÝFi÷éýͨG@šoÚDî×ø„C§LUQñgÌàýÚ¡N9®)<¡!­aj(såäM÷q¡mFü˜¸jXËCÄ~TùLMå;X;›ïgh{9h¯ˆsp¼Ão*É<@ÿA úöKTB\gS;vóq_Øß{<ä’QM[Ö­Öð’ëÈÁ¼Û«Áî°Û£ôlh²"i!ʆ!(öUw/§A,t‹JîDBÞóu{<7ø—/†Ú[(é§Ÿñ€p" çŽ?‚UòÉ!гÝA€8JFsM÷9(äðý%}¼¥”!¿ô?¾_t¨î©›ËßÈøVîm´æíûp¨îêÚ—ô¤e«2ë‘8ã×ÿ¼¹¾…;„%µ^eû­ó¼‡þûƒµ®P6ÏA{xÎÉAÀÐŒ»F>F®§ Ew ôKüÙ÷qå`MŽäÞ¨ˆ†ÛŒ×¡~ŸüþÊP@:ª ¥“}= 5àZ—ô\¨ô€$»ðÈþñá|Ú‡â /ÅzAmJÀL.úâBM¼»–¯Á‹ð5xP™¨k1.꾯L¾FYÂA¨©Ì^Æé«ôDMQ;r5~•ÀQcxgÑýƒhûkçœ 70d700b958da3900f03042704e1d1a16./proj/rd/eric/funtools-1.4.5/man/mann/funidx.nfunidx9€/Funidx: Using Indexes to Filter Rows in a Tablen‘¦kxœíY Oä8þ+¥•fRoH¿hh‰“˜öZÚ…°/Í;q'Nœµnú~ýU•~3wšÕÜVƒPCb»žŸ«ì¯¯Ï¼¸jk•?Mág§êfu.Ÿ¤oàJi/-Üš•Uƒ€{1×î~¿¾ùénvp_*¹ÉÚJÖ2S{¡j‡][U®Á,À—Z‡bTÂ"“°0,›Ú(~®jZâI‡ƒ•ò%¾e[¸¸¼{w;ûé~vsÍözc´‹æ\m$ ­I–ÝØË²È“¹'µÌ¼Ìa.~šš-[ Ý¢6´ÓÔЮÊX‰žè¶ªYMB ¼•™@?ø…È|+tôgç0™©¥·²zÝåih)Ñ3¹X¨La¤ø»YI|×ãPð ¶@"Ñœƒ²­s+s6ìÇ9ÙÅãö°’Lžüe%ÁùÔXéœBÕø+EV’Õ 4E<¢Å  ­P•L0mÒJÔ,QK×6±Þ…˜G;Ⱥ‹¬J…R…åtæ Zo*´#è¯!o9Û¬bÐѳ[±Ç6×m5G›Ñ7²±sÈ`ÀDˆ±•Ì&­‘¨JÕ™•˜5¶'`"ßQENb‚ñÓØ<È­DQ+ßæ›”ö —¬sšÓãÔ?ePr7ªÄˆ„4Öh:nÁ@ùa€cü*XĈ¸2”Q5 ÀˆQ[Iä©" QâÈ(ÛB& å1öñ)lMیВ° WJëòk¡äÙJp“£¿–’ }‰E.(¯„ÆÀälÛ~zvТy ðØúB&Ó_ôhëξ²f œŒ(ï¡Ìð6 Ô\áFa•“?1I;zÐV-H¤/ á¥ðÝ$ZÁÞQÄÉÕíJÑ<Âw‹ÏˆtA !=:ÏÜñ$ Q¼k… neA¶n š×»±iëwo'݈(çL¦X<—;®5A)ÏJ™=ÆL¶Ä$bôökƒ6/…Ò\ô87P¨%ÚôÅx #…¬¥ºG38\µÎSh:•«9á7‰Üzô v’Âh…·-F¿ìjÜ* ®6õwÝæ}Ej ç×°² +îýî9¬±Ç5A~eðÃîÅœ„퀻–!ç[© ¶¸µ0ÎT’•à㶬„Ú“qœcýq Ë a³öh‹¤Ø"r)Š›”bÞ(ÑQ ̹v†^ÉOi©I‚_7¡ï¼Üˆn}ô‰4“¤ŠÊ75œ‹RUFØ+,TY¹ø¶uÊ(£)ƘjA M+¸Ocšp’Ì?†QP3÷öQtè— ÜÔ¸qÂŒDó.Æ|mf¿Ìï³­@¸Ø *YfÍRòq‚Ã)pž6.É2¸’ÀËſͺr;‰Ø‹'d.ñ¼Àëº4¶ +—Âf%Ÿ+ ßÏÃFkù½ ¹ë$0̹1,övùASŠC(í`–rjħ\¹þ;ý=–é<`¨%†³´G¹œ·ÅY¿‡’ÎÃÑÉ·ßfÊÂ(MÓðÑÿ$ä›'XÎùký¬Ãz ðÝægçßÝÿ†§§§Éè„×äd4 Hë×á¿Üðh [è“tâàxŠÏ'§ô8yóŸc´ÿßÅ(*“Láýìúâòê?ÓÂáéu Oïoo~…“t8IãéI:Iûƒ“°æ×ãÉxr|<žŽ'§ƒáx°Y{Ð?œ‹C©¿=ÜÜ>ÜÝÜÞÇq­yüÙÈÿqR¿á~2·&CÜ'ýiÿ49IaŒÞtêgg€ØvzñøÏ›–¯,Ü7øÑ5 Ïo êl2I?¹éÔË=Ç÷‡?Ó•~þË c8N±/àŸ¡ƒÉtp‚ÿÐãðóûÂhl 8Ûy<žŽ&Cì=çMƒ§ƒÁ(…³¿áîqxGþ|Á³%-=ª¤-äô£j^¶^p0~Ñ`‚„ÏkAÿ{ü|þÃýäxÂ-(uN£dr “äôMà­*eE¦»kâ3Šì€I|M-‰ocë0 éšä7d[¼½D"+\‚:ÊŒ—tL  ´)SnÚƒƒ%á…Q ‚÷÷ƒÈ§Îh_b%}irVÜÖTXJ¼o¦GG«Õ*ñs+Ö‰±Å‘© ƒvQ£=¤é} ðw08zËR™][•(¢°Xz­‘=Öf¥e^Äë$ÞpE.“ÃÈUTRÔñ L®~uÃB…Æ=—ÞÇ—‘™xñMà©ñÂëd$x]ñwä÷â*:0_ÓÛ^#eÃéà,Š))`ª^½”ù! ÝK·ÙËÍ*+”Ž—ïM’.pµD”EjÁD^OvL|¸».$ÞqeíBfMëP¹ë¨®ÞÇùÔ~JA¤äzF$«:Êm—ÌÙ¬ÄKöÍ•·–øš5þETj) ¸·%å?rhyà*°P38w?ûåüþ^*kjFúKq´ªÐf.ôîÄÃ.¨9llë›s\š=–‘‰ßÀð™6'Fq{ˆ¥c€ëÀ¯9åÀ¾æ-Ÿölëþ¯ŸvõâòíÏßÔÏþ§ý„w­µ’X»×ÏÌâÊØÇÈœ]Íîïž}Å0+>±ûކyÜš2pž´<²¸òi3ƒ+ :å­ ŒX¥Š’Y6‹p^^Ð"tè¦kBw——pþÃÝ ÀÜVP*°ÖÕÊñîØ|VJÝ@ƒ¿jbŒ’1œ7Vièz¸‘ûýÐLü}Jûó*  cfa3241d92a0cddd6f2950fd6bdc640c2/proj/rd/eric/funtools-1.4.5/man/mann/funregions.n funregionsŽ&!Regions: Spatial Region Filteringn®oÜkxœÅ\‹oךÿWN¹’ê˜âdW–J'å^ǶŒ³M·Ê^ p€s3̰sf Ü¿~¿×yãG[i×jˆÃœç÷ü}éõàÓ¥RwznŠÜž©Ñ*­LšÉêƒÉ*]š|®F¿]ßÜŽ†#¥îƪi1©—:¯Ô¤È«ÔäV¥ÊÖËeZnU1SÕB«ÚêR™æÏÒ‰V³¢TVV/yõ™_Ý,Ó¹†5ò©ªÒq¦mW½¿]Ü oï‡7×Êë`bšeÅ7_•żL—ª*”Õ™žT2ÖâqÒœwPp†Çãw¼“jëî¼›¨/ÇeºUúîd;¸ ,8ÑÖÂ5pk–+<×ÅRW¥™(»HWrâqQd¶˜˱Éá ²+é*õëBçá @=>¿ž&ªÈ³­R+³Ñ|]Ô°ÜÚT “# ­öÛ”ÚHO»² \àp=ºâ‹{œ¸È²Îà~éîºÊŒ]h¸þV-áúteY®ôÄÌÌ„i[ Ÿ ðXc+šZäÄže§“Áz³*á¸F¢Ö 3YÐÙ÷™0áá(x®rŠG¢ ª²Æ#ÃòŽIi6×ã2í:™ß;+<·…š7I°‘«(èL‚¬˜¤Ù󬽄†¸ÝÔ” ræØ}¿]ÁrY¶MšéA—¯àÐ,`p¦É7]©¼¨˜6éj¥ó)<—«[tž.µS¯iZ¥j¬q®g晞ݙ©ìïSN2Ý~Ýë'ø§wrÒùªÔ°"þá%Wœ…½®š9šm¦d ·g)@Ù[¥ ;§Jí_!>ÍÏËm6ø*ʰ#j"‘)Þ iE Ç^¦y®ËÄmìl‡¯T½Ri]K˜BÄѹ?#Ž*€ ($p ³¯˜Lê/Tõ|­ßU·lW"Á»P™ó‚ÕÜ‘’´‹¿Hpf&¦Ê¶Aà.ƒT+õ©²ð¤ÌˆªìkJro¬ÂU€æs"«ê¼2™)ÂY8R)]¥¾éítåü!Íj½÷/Õíva¤ªŒ§ïÛ`ák“O²z*4(Ðþ’­ "3ÁåSm'¥YUpVõ3=‡ÙŽz†÷#1ˆ)Úïej¿©6иbãØz©†—Κwh©ÊòLXO§`ìEpKbó¬^¥eZ±¹ÁïðGýÎSÿ¦ö¾& ßöá[¤JãÆñnø@¡€e &-6~Ä58 ÎÙÌ SV‹b…üO³ÉdX龇Eç9œåûã¯t¿v^/U¢øöí¨›Û_¾tnnûò-=lÝ~b££hþPÊ¥¡$©:¶`ÒªGên~| ¿$x c!SŠJ̨Œ¶O^v8?/†Nè°eV”çà Ôà/Ò1|¹¿!¤À"—ì Ü-…ïr½>&åKp¨ÕKsŒG@ow‰äc; ïÃoT iÀÉì±R( 賩”@j»ÒØ`×R¯VEY!`]e»@#Δü¤åœ`>` ü¸Ç/üÙ¾¾þ|õy$ó6XOmåoƒ¶úŸe:55°®Â?Ô»›/ê‘Y›µ™‚ÎoÚÌ•j§¨<Àÿ‹áÝÅÕåc³Ü—WWÃÛÑå\ûÃðòê½[:G.©«áuج§¶=µé«m_©Ûᣇ åzü޼^ßï®ß]ýöñìÁ¨›\mA«‡àû§SƒŒNöŒ¬ƒ´€sôª¢¿26eÊnÁàm›wYsø¥ìÝcp3Å{ò7ŸŸÏŸœ÷¸Tä翃Âuù5È!d  Ùˆ¶ª­l‹<°óñÉY#ácX~ƒhÓ&Q;¸5\Xîš ÁM"üAkçu†RøÔtèxó+7¬IóŸ"Ä“ó_F 'îOË:Õ‘_NÝ/¯;ìg^¸J8@'VŸGÔ亨I¤é£ÝX#ÄbܶðfR«-9îh'«ê}è-M!“mrøu)à| ÜŸý‚?Bp»J‹ÇØ WF3¸™šÙ œøM1àmDàZ+t-Ú¾u Ã×ïÕ€ÝêpÜKuj·{ 1P*p£ ì½ùo0ü‘ÊßÂ6æ± ™C꫹d+âQ‘ !àÆüXSR`!Øö@Ý™£Ì“\*œ”WóX<:Í9Ïns8ë"ï/Éosñm¤4IYÀ€öí/ƒävØ9—4=ÃïßIÞÃ1øô}šŒOH98‰8Ï 3ÐPòjï‰÷”ËÕÕÂ醕\€*tqjUÌ5ef˜ïâ8\o´]Ž‹Ì™×zBªO?ŸÑÅû¿ç^¬(õÛ3Gòs¹q9*#) gºŒu|TG¨ÍGGÎGåS7{(.J¦#C 0Yº-™tøAMp?m[4|ü­[- ¥ Á¹™ÿí&éMó¤x4ŒÁxö6¥?ÌþÎå IøÔÕ8æ‘4³i¨lE9E‹CÆCã„TRÂ`‰1Éä­”™Jòs™÷8Þ€†ªïòÌ 9@ddFª2=……±ž¤’þ+5As ‡-`ãuQ~£ÓÂ6€¾Þ¬"‚’e|‚ß‚³wIö c ß–†·;œ:£t4Lo<·Hüˆó=C PqpÜ›3X…VFj¤ ø–¢¶ˆû—`øÌª)ÙgmEìBŠê0Ùô\¶‰ê¶Æâˆ›Œ†Ý’`Çã’H7w^?Éî ‚q O´7œÎäXeXºž¨:ÏÌ7í3ڔȯ-›Ä `ÀJ)?)É Ã²m°ÉeEùbTÇ^æØü;¿çÒ¶1¹Hye$‚@kØ~Sì,»’‡}²œ–ïNONüÓ§âÈ /Æ*žjzpðn¤LâLJ>ÁÐnl2SmYÈf”fŽé5¼|øbÙÅ'd÷$ÈÆ¼;Z"mÈÒLR‹ “Â#ÒS´štó)A ÷­‰Ý•HCeÝ`Ép1Olô֛̔"Rx_"£ÑƤ¾âÙAí©<ú ý–Ó‚Ü:žl]šJ{ççG˜°=yÝuÊ+ºcµˆP2™u†¸¹NÁ›b ’O ð ÆÂOaPû¬„Ó‚=éJ w%Ðíð!!"‹©k,a#`3à ÉðÁ¦”¤–nƒX©Äô3£„Ž×x ‚&[GNí{.ḑ„Kæ×`(\tæÜÈXÏ€"¯öY##Ù kˆ3å¦õªå"‹,­¨*jÉQ“GRrejX‹·p6ÍpxÊ^áhä¥-í#˜7wqÖÒäÀnB†rx7áL«Úœô9„ù”|t@øãÞiã3F"ø\œÊ…PºÖàêÊ3ì7°A %m·‹+ÔEª ÷“¨³æU´B N<‚D\ƒùˆÁþš¬­6¤K¸xé·)xO%0›Í@¸}ô˜sÊ ¢ªµ¾k Ç(ªÃ7I«½½X8eX€A,—¥¶ Ü»2vyÒÝâ:H.†ÏØ…+î^Aà%KŒƒ——$ÚðFZœ¤×VúøtÐ]‘Š0~¯CÚÁîlJx™A1>xß®ãÅÆ‡%Y = >­ËÆu–ø´yq:« *mv¨SÏÀÀŸááW,i2Ù9™Ô4ä;°pzSù ˆ2,(a$xîhV‘öî{$Å(Æ3~>"Þ¢VÆMHyqÅ\¸+°@˜ÖïxýÞÑþÕÿÚRP†!Ôf£hó£#Þ ‡ÁWø{{Ddæã•Š'ÒŽIØð‰‰I˜÷.øŸ6t)CîW0y=‹-¥vÄóHb*R=¡v“,ÚaŠ\ø—ÝK£ŒžRÿž4TkŶ¡…–’ ý鄯ú'ô¿ׇw\§L'J¸wRµ}´Ñ‘´méƒl€(1€è5Až€TN“ 0“¢D-u ƒ§Dœµ‘Q |"pŸ_n0Æúí†Ë5\¯ãïöó1 v8…ñF! È9&LjxßoËh£á íÇ×ê<¶Ø½Ç ŽtÄžt…îŠá¼Ò¶ !BÀ†S¢÷ØVÛ,º*‡ÃÁŒÆrøõÇã1À˜Ü{C¿…¯®GvìEù èB:ÜÃVi sÁ… H± 8‚9ΉûˆçÎ#ÙòuÞ®ö_ºMŽŠ$»Èȯâ™ëyͦá”ÕB;F~›÷н›ô€C±8c=$ý†õGrçñµ];%°¡BOµïÐEkà ˜Èg<´0ór.Z†Éåêw’õM`‰LSß&æiK6ì *¢Á‡,ð´§!gXnfåZKĹL« c|kþ­÷ÊmîÌk’6ªxrÛØ!g§ûT®ˆCQmN&F#(«ÓÁÂ`L]òøö{N.Í·ò4(qá’ÓÔ Q 6€#QŠ(LšíJ‡žrʵt3Y>eâÛÓžÙÃä®ÕÚ­g.€‹z%ñ>V=XL޽»ÔÀÑ$ N(V;Ù¾Û=¤Ìš ôQÞgjì .áÙÛ:rH#zâ¼n~déÖôÜS™Z0“užǰkdW²o}º.D éWGoC; ,/o1° œÚ·^¨éþbŒÂƨÒjQpOmÔWèîM…€øÁs"îßü0+µ@*pØÕ¤«F82šyãõxºí ¾Õu@ú‡;Ñ.ëtw"iÒUh6G¢ BK(··¡k8è¢Ü-§ÅýîE”Z¥TÊŽ%>ó½ÄQç¥ ÙÞ €Ø¤ò,}L±$¯:Ô›Œ£ÇÔf,O_Á£“äT\;#6¦t½6² >^>6Sø-ñÿ‡Â|×{ûúÄ·ß¶‡|@^þãu¢þÞ?9yväÇÁÕàâ~xñܸˋ+|éÙqË;×SI«ë”#aƒêÀ7¼ z¦¥ZO,‰Š|ëÁ§Û«á‡ahY65“gè;ú¾ï/ï//îoþØì÷0û=αÀãw·" a#$qpî8!åohvÙ«?ϲ"­ÈIJË‹uöœ‚*·ƒWihÚç”d_ î¢%ùè¾zÁÕðj÷ø^ËB‡mƒ"ì ùs*¡ö?~õ¼gå>žjzd¸m5–hAC;2Ö—¬]£íkÒÔ˜»¯W^I[K9&ÏüظÇRuÏ΢O³X²QÅtÚL‘æyS7±Ü£ô¹¤O"¯ç î,·t îÂöo‡Eϰ©Árý ž´Üà´œˆ{²{Ëà̤VžcÿŒ”·[‘Ô·$‰ùñPVg¹³d‰ÔT1óÜ))êU*¡ ˜w3œü`RÙPœa—åSà[)5¬èã7^þ2LùCØâ¹äC ò–TJ{ #€ †  Hý¿âV¿CH¼k`üý0îd%ë†/QöÕ¯E™Mñ¹7bLC Š±Û²”WB— н©<<Œ¯•¹b¾¥ l–¬1 îV½p ‘ôá;Ú¡SGB«¶/uw¨È8œÍcê+â®÷‡ŠÔ?)~q=„ab@½OpAÑ›×pß·¯ú'ªÂsÏïæ“k@^ôî7+ ëôn[[U«~½¹»z‘Ć;RezâÓ<òž$²×ÄŽCR6ÏF¾ƒ$ìîÐ;9ƒÿðgý>üýê0CöÔà¿©±ê„ÐW5åÖH¢@`'{—ó-ͦI'¥Ð›TR=o8@G ò§I¢SëÞu—·¼BÏ45yÂ=]»{gLTÙƒ?ýDÉ[;ãb#Ö‰Zø¯¹;ÎõP—:ãì¦xÆ`_|#z-ìÛ¢75èÏæ‹Óçû'¯ý„bÎìÛéO®C4àõÛ³ÓWÝ·?‚ùþõg§¯Ïúoºoû d+Q½7øùŠêx u3yì%©ç¸ë*Ž¢Î õ›ž¾½^ÿlj:MîŸÈú„ù)‹Ø8w̹æF1uôðÝw”)’à ÑX¯bØsOb@.É{`z•|Ý*2Ð’m~€”¬œaµVú->Ê«4É^3µÿ÷E,øx(ùþþß8ÀÃ#7G——jp5ºá—t\fªw¼Gàœ¤ëƒW ­@¢PPLáz½îi÷µ¬J“©Þ)’¸×ÃN”\L¬ö¿à=ç e0eb7d99645199cd844cc7882139b4e3//proj/rd/eric/funtools-1.4.5/man/mann/funtext.nfuntext(,Funtext: Support for Column-based Text Filesn¯GÚ#xœÍ\ oÛF¶þ+³j H{ŲÓ×€÷ÂMœÆÛ$.l·7©ë (Š’fC‘Zi[ùcû÷îw3Êrâ^×@ügΜ9ïóöøÍ‰1/Û²ÉïšCsÑ®×UݘyU›çUÑ®Ê'ÓÔå3s‰Çæ¥-rg.Þ¿=ûùâô˜˥ufVeí*/“Ue“ÚÒ™Ô¸vµJë©æ¦Yæ¦Z7¶Â‚º®«,wΖ lˆ óÍœ›'ÏÏO¾<={+¸UUáÌ­- “¶MµJ›¥E±1./]nÒræÁškðgZÏ7©3–ñÚ˜Û¼ÎÍËÓË 3µ%!ܤSZrk›eÕ6€¼1Ù2-¹±e‡‰Ûà¦wcsZšuZ™¶HëÄlªÖdiIÇ4yÙò}‰.]废Ùqø¡1ó¶œY·½ªq W™­Í·“}þ7ž\w+ž\†EãßêÙ”Ÿ2¬Àz™M'{I i²G°dnGÜÄ[»ÆäwéjítD‘nˆ£r'ÒåEž;‰¹iwÉ1ïw9¤`à›¼n\¼Ð4èjÎ_ü ûxc³´õÎ}_<˜áݧ#Áí@lI W™ifZÌN»JÁ`HТNWŽÙÚdgáêªU°àÆÎr:¥$v‚õ`&sf˜ŠÌ˜:½5ù iŸ;J"Öc_FÇ}Ì7·.ëÖyfç6¯Áq}v4¼º+ôê°)V¶äéÝá;ûé_ÉÕæþ‚«Ã°%S:Š(eeCªW™«pÊDaÿY²á#l¤eäb’aÊ£ÉÞÀ˜ U§ØtF"¾Lor¾æ¼*Šê–õ{ e uÐìcÎØ¤˜¼b»QØû¡·°;Lį¶N‹´ü¨ËÒš¥Ã$ ÃÉŽãRM 6‰,ó e‡Ã25HŽC˜‘×#EÆ Ÿc+Ç¢V@yž”°qµÍÔ¨âšF‡ú=miܨ$çíbÏÜxa)‹Äƒ€f©[æñ"mR%”\12¿€ªÔ {9$[L×u+ÚŒ<à‡àâl=é©€˱AfyaW–Uµْ»ušA‹ÀŽ„¹•&Ðä•}xU™0.Ó”ˆÌ’˜|eÈŒ±r“àNøû>¢ŸúW~‚/ÿ}ûç„~5ûcÞfx¾îðeH¼éÙž<<Ø“g|ÑÙ«¶h¬Z!س¶±ìÛ%®Åwa”•/‚#ǘ´‰î¡C¸ô` øx6SHÈè„6‘ìói Fß9m’prx¨ AMöäõY½Ê~ô&-Ú/0!‚õ±  ãŸälg$n=Jܧ0î'{ÉÌÏòy òBXКêc^ÆR+*SÛ±è8• é!GAáÝÆûæ·Æ_°ÎŽ ’Á`‹ï,16-óªuØ ¥ÅæÔí,ÂÌÎç°/0N·pÎ3<ǯlx©¢îƒ§0Ø Ò·”%?ä=Uÿ„°Ü„öÀ¹µ$J䨩ñ $1òêqlš7·9ˆ gGÀÑF°‚‚ÖŒ® &˜±n«^L¼˜Øå4äÃõôÄØ1|麰d§#¤Í0/ÆÁãGsLö¶yëYEÈV%k,G7mͱ¤Š1ã¾5"+†ë™ººr,ÞyŠíj¦á”„QÚf³¦áMU“Ó‚åå£ ˆ5Ã1;Õ²ºÅýÂ3uˆp)ª\¦Íý›8A‰oЙR–uÅØ,@¶’Ågl†P à¡1mB;€Éí:EZT æE#tG&ÇÂÀ±II2ZL¢éL™ç³|ÿÎz:@ÁÖá!®*N°Ø€§óÈž#˜ï @ˆ @.ÆÅ;»h:$üs?ó&Ãv jØEI䨖gN=‰áÀ‰1…ó5]p…'/„.1ëðŒ¢+„9=Ý0èÞÄÀ¤¬ñ‘Þ¿s+扈¬Š'|­T×ã8àP½uBz(«gU;•°¶%ŽuS:­ ób¹˜Ï]X¡‘s?–7Wdmÿö-iggb6é·}úvþ¼&_ѯOv~Ú[à ¯ÚÞ=ùºçãžû¨é¹ÄÙÄ©W"?SPë¢%"oˆ2–””Íb´Ý[/•¡(.&:zQ½­m4œWi| Á1H$!8D¿6Æ5¢0뻢CÇ—jQÚOù ôŒ9öÂk»uŽ‚ß9ìkaH>Íàh¬'qËÇálÙNÑoqæ Øf3x:`{v¾ O‡hƹÉÉ?ê–Ñ-½ ¯+g%ó%´Y­JÈ9(ÉIF:›ñã$„ŠU ÏD*¬ÞÁü«­˜¼š¯jE#ã8ÞO¶¤NÅÍìl‰8΢ÌoÏAlöüŸüù´uõÓ¢‚Ùy _æŸìãÉ`ëÑS«ûsà—d÷¡ô—ÊÓú³ìàŸ²M„zÕÆ¼iÄ‹Êó©>©°bÆ”~ÄX6«s2ø”í í³êt%ÙBaà7Ç »¯2kM„Ê"!„˜×ÕŠ(2N©÷Sôd^Öyþø­:!&ƒå¹êÒ&xo8rR³¼ÿ¬Hk2KF Q~ƆÑ‹¦>)s½"ÀÞ§n¼Íc`êýË*&[xhÊÊEés¹¬zH“º³t-Û‡ʵ•Èrl<Ù!™øxÿ1b‰u@$±ùGäQ0œîÆq²øH,'÷@|Ïɳì˰wkEƒÒÉA0SžyNú-¢<âíÉ€EÛò Tóé×:•¥9Èwg©$ ¶/* —¶J Qâ­˜FÐ#Ò ¸5Ùé{-ÉI­e£ö‘VwQd€ZØ|Ö•qKl›¯x­àd¼•RÚÈy_R\€Òb—Õv-«ÌŸ_^J±¥æBLÐKÎyà -G5ÄBž 4R=®¨©‰çÌ|âò¨×ÁÔü㵆€ G}ÝËAUbªTÏÎÈ^ÞZDZSïY\gÀe~ëé4$!Æ… 'ýº‰Ñf ÝøÆŸ/óVJE] cô‘©©÷UŽù2-GÊ]ü§òàÌñÅóÓÓ`¸k>G$ÎI-p™ªÇ¥ˆP ŒG,2ü8–›PÊróƒf â6e¨øi…±(u"“WÍ‘7­Ûb"Bâ"YM9à%4V ¹>ÆÑ¹“ÉHÄ€kO´ØK\Ÿ³¢ gË3Íœ°gŠ{|Ì iµ ÅSè˜ Ä·ƒÖýkÉÝ{q¯ˆŽ†¹bÎ¥ô«"¢±x‡§å,¿ó¬Tú@Ä -«Hjí¬ uÛ„|§ZÁbÙ©-l³LO¶ ‰ò> ­7TÎvGP²yyòîr82¾ÞŠôS¯~|~~üHRN~=y{y?B]V’*éJxšÖ5ñ¸«ó\®¨sÚEÉ0ep¾кÜN9WgÑpß5²&’‰#‰D|‹DS(ÍÜ(›7ùjÝl|ÅD¥ˆC Ķ» l#uÑ|× @Y»ÕYØâ²l¹–Œ®ƒ zBf™“^œà ¡HÏ$²"Ôõì@E_1”œŒ#ŽD Ãb—"µèœ{2˜0Øñx<ºö n²ôLp„Pflã“øØI²ÊÔW%+VÖèÆÖ9w—d×™m¤JÔUÉ@œ-š{ø_íZMåu`ù“Æ_g*rÕà&)Þb‰ë‰‚xrIn¹ÔE²­xÈK„œÌoúlUá#»"'“–/‡Káðhp%¿\SKÀûÒíâ””£¨ý™Öà©´¶¢Š]¯nä³DÆŸÔCûy‘‰»bܱx ÿ2]qÑïÍ7¼Œ®¾“Y§Ëù_ãëù·3ýc6ÑÜ ²°±-òáÁïå «sDÅZik¹|˜þ]}Ë÷-CÑfØ–RdÕb0Zض)+©ÈóÐu»«ýv.è²BMÉUN 2¾³TzúáUWmKr/P×vF™øü°ë)ù³®Bœ@(ÆÔ û<©ï8N¤(.2‹¯ÿÜ]éVw‡§ÉÿrÐw‹o]å‡/’ÙÝáI2ÛæL-wi¼Ð©…f‚¨biܤËÝ‘Ï)k²ŽÔ|²½Há°Ô?y2:|ÛGàIhžÑÛZ£/1º]²%”ÕåγÔÞ<ò4ŠQWø.KE/ÄÑ, £ñk; q]µ×…Bò?^KŤ.æ@È}äÖKyû‚EƒÕ2ïÅŒßòa¼7ºƆh½ëP†`]S¨´ù2¿—?¿9ù_`"îÁ{³xQmÀP©Ð{¯É©:+œh(¯'ª•z8Ôÿl¯ÄaÙ¢VÀ„|´œ”<®ž¡ Þ"j@ÖÉlL(1´„¹ênd2v׊ÅîÔTµO·²Ç$¨|IodÔû×u%-Ò”5=ç %$;MVëÇYÜ'c²)‘ê 'Œ¿ŒÄˆ3Š C½ÏAdíŽ ¶÷´t ŸpT©¥ãñ^«¸ÁÁ}eÄqGWåuGsg?1¦›F ®$L̆pà®Á¾”Wè¹½怾 Pš!èfûT΢{å ÞkÜëB`&ß >‘ÌHÂpt5hê÷ÌáóAt%÷º@üŽð¸U@?ZJƒÀˆëÏØâwÇí5·¬Ú‚âÙ®°µ…'Eè5÷ƒÈiÔãë|ĽEW¨}Ä-\ Ù##AU1Ú(Íçùš‘÷µŒRÆÃ‘?lºëÀ,%++øð™"ì÷º¢Ù#¸ºA"©¯¶øÚ§4¡XEl"{$±NÝÍÑôL9ÓÖtÅê-—Fû(1~NC+ã’Òƒ9à¬b­‡¢¶ªª{E+á16æ,ß61«<ÕI‹PZö ½M”ý\ñ¤u€‹¦2N‘øÙŠ[µÎ£ ®DA—´°By@³#”ù޼Iû‰”zA] ÝW`üÉ `÷绋DÐVrÙyQqq’ÚK”Ý;iT¦]ÅNÌh4sH6ùÀ´"ÙkjnÂ@BçÝø@K™®T°[8H˜ý²‰E‘'Ñ)ï=¸§+À’Îotp¹@$Ô#Òi3IÆF"Í]]1ПÔqÂYJÅih¡nËŒ3Wó/®•®1ù>ü6%V{„tÊ@± áH(QÄ…ÑŽZ‘C3Cê1lŒÌAöjµ^›¶˜2‡üŠb›-îÓt™Ùß!>Q’(ލÔ/H{$ á7 Ea9LEå™”BvU5ã.0IKÛ×>aîz›cŸ%tM¢ºåîäDÒg¯ \˜ÜÊÛ`ª´k^•Oâé‚ß§ùB‡ùdó•íFxÚ6’UúP#=íùìÆvßW|‹0dG“œ²Ò™VÉÕ_f`‘~ÚìààÞ hé`+²â»&#ÑÔc3B4íQPªðÀ)¿ËÈÑñ˜ë}µo]ØÌR*!~L±ÐcoC30Œ;G·Äî*ËÚ:Ž`}*“ÒŒé 02Ò.©q³­ )‰< ^‰Õ$-úñ2“-óìcWùà©ìËQàt[ú£eê£oV:wè=ñ霽]×–vg+ë@ŽlÙëúuc1ÚÏÓÄ»ç~HôGŽˆ¹Añh=¼b `/¦k< SI<%èLo2‰ýÜŒ*ãðý@'Œf ‘62:ô.šòrú¾ošû›úƒû{|éº{ÆŸ|‹ïÎÞѯ|÷€s¦ǃϲ§ß¹˜þVü±Œ´yÈ/²L¶îØûjßú 4äEž´²EZ›@]ËäÚAã˜ÒûFK‚æSŠ õgüx¢&œä—Ë ëÃÉ 9LC­Þ¬›ÿΣQ¡qò©Û’fvðÁi(cÔR,0™àPsÊ•{5dÅÆ lZ}® Æ«0½ÌþULáõŸÚí üj?Ùü³¡š–•¥½~Z5Ëø¼í|˜ºõòòˆÉ?ü´Bäc†/¿CÌ ?~XÁåÀ-ÌO¸8Ž2XГʩˆnòšŽ´ ŸaýU›ÍŽNÎÏÏί; çóbA’5<&øYÏ>à£ÓÖRÚøû«Ÿ‚—&†ßy`ç'/OÎ?ßüu0Ú67t/59žéÒb^±ØÅÅ"²[N»i"ûÐèÛi†o†D@¤¯º±/@ ã@¶ <‹ “ÐÜÁW¥3ßüÕɢݫÜP®*dV¼  «Æf@äiÇ=Æ¡GMÝÒl×SJŸwã:Wà}[GssAßä•"r¥³V(kZ™9ã’++w&»Ð˜=—Ú–*Öp–‹”ÿØÅr©¦DÔè1*QÉæÛ Ii}Ý„ßÇ‹´д…5‘b§TÁèY¨ÜqE§8Øxªâ\Í-z…ºÕËæ »E^’lúñp#ˆ=|‰Ê+ˆ¦7@DÊGÕ¼Ê9+iW¦Q´C‡zôÞd½¢ œþû¾ò^Tô©•B*ìG_ŠßLó20¸¯T @%¢‘Z5j{5£j4”˃ˆ;ScßBž¶‹Iä áç ™è"•Y[ëKvNÇOÊ%‹è¯im¥²Øûø&|,¹Õ©t).­H|Ä vƒZ÷Õ:IÞ„w?}§º Í^ì[Ñu'Ù#ÐÛr|èG®´oÍ£É~˜R¾òˆ†Io]³sÖÛw€õ‹Nÿ'{úæ¢ëaGžŸ½yþêøüÂè{a½G¯yóö‚›}½·JO¡÷ñÛ_^¿žH¡÷ùñë“·áÅøÁ§oqÆEaãg¯ðäåœsžËÌ´ FCù~®+Ђnx¼û5J1æ?`€³j½é¦~ܨß@äÂO”Ó×ù­Îð>š7–Ò$ŸH°ÝLùmiöh @N7*BöK0¢j†‡i0üKƘ^q e<ñÍmt[gíŠt2Ó·N¦<Ò}#Ä8TÁ„],ýÜx5§‘ùeº^“UcÚlEéá\*Ñ›;¸kAïxœ•ú.•5µõ ^ni]g€âÛ±·_ä/Íyt±—¾ààc¯T§Î½áì tµJ¢p%l”WŸyEä¹·öýav?Äï—~_Ÿ>}ÚýàdB²œ¦)/›N§Ð‡,£ u_^ œÍfqÀð¾ÐýJ²¯kK»gù 'v&„T‰>ªÉJ8};Zg`¤½[ÃøwÑê¼×jð¯À8o„âàu»• ºóîÝ;Qµ÷ïßãûo¿ýöàK$Û/ŒLDç™RL¦Éwß}ÿìÛï¿ÿO¡Ó‹‰uÏkúÂodöðY-å4ÕˆU«£µRxMo*;Ó1VØã.-§À.¼h#%ªÓ¯M÷^ññsŸêî½õ‚©æ3뉬¥àÈ Ëò–˜ö‚õÇ‹Þ4|Qô®Üòú3Œô¬¼ÇÌϳ3ð3È>Ÿ¯˜ ÆáýcHÊ/±@¨sxpì ¨ÃXL{йMšÿWt ‰ÓR|¦ø¡Öµë„ûx‚hJ˦lçUuNˆ‰IïðÒóð ¥Ñÿ[:Ѳεú.ºçì.†¢©!Èâ^®ÿãOy"Ä5d÷p[zÏк¬uNÆæONÌñë‹3ÓÑ>v–#£÷óŽáÿkXæÅ¶tb«k6“ñ³ñ·æx]ÛÂLž%fO¯9—ÿÙÐþÊÃ4™ 9f440598e0a91c6d4018063e2fe74f4b0/proj/rd/eric/funtools-1.4.5/man/mann/funtools.nfuntools)XFuntools: FITS Users Need Toolsn2˜1xœXÛnë6ýâ<%@âÓÌtê7ÇIZç$Aì¶} %Úb-‘IÙq¬¿7koR·Øž™‡Ä–¸¯k_éçÙ÷G!ž¬-ýT<-VKñ«W΋g¥r±¢×bùïç—×åb)ĪÐ^ä6k*e‚À÷P(±’ëR »skÞ{±±®:ËùÛâuµxyîuÝ·_*mt%K±nŽ·Ú|‰”zí¤; irÑ]êpµÌvr«D®öª´5Œ“ÕÓß/z[ˆG£Üö(f>8[G¯3/ô^{m ™·œ½LàêlèôÔÎîu®¼ðºªK½Ñ$=Ë”‡ƒVp(¤sòHr6î†c­˜°Q:“Ö[!Œ­tØx¶…Trc­ i „œwòŽNá`-µ ¡÷ô"ñæÙr¾XˆÌ–MeD.ƒœˆ™ðpÐ`¶S[r6å´Ùv>^e¶ªeЫƒ…ÈýO׉Î-MêOÜkà¤$à«•“p/@¸k –m•­Tp:¾5ù固¶.ˆƒueK­ËáZ #²I½,½m©ñ”ï¥É`~&k¹¦€kŠF“ʃ®ô_8&Ÿ…WÒeYmÔ&W$¸’ÆY„ …aÄé?UD!É ×¶…8“qœ‹”ÓNE݄ء@f8ä}–IÊ0°]­›ëœ¶¿†ó9è`ÑZ¨n@§nN3¾¾^|QÒÉÀí ÐJ ñp*¤0â–i„QAT¨¹âËDü®àÓyé(y)k‘¢¤š±X#Áªžë¿¶p°ŽŒÓ8ŸPÜhç»"‡Ç!^ Ý:YyÎ) ÿwÆH|ÅÁ[Ó+"D½OÔä¦#ƒ±l‰ƒzÎHÒL3i”p %!¾U¨k$.¨%©C&–ŽJÊx6ƒ¢ŸÌö*³ÀKsí¶ùH¢%åƒ,’ùñv#+¸$˜ýÕh$Ì’ÿ@ß×*,P4G»& ±8˜Ò‡\[´¹ãÚ*Hw7¤ÖqÃ_Ô„Ùƒ¥G{ç¶ÜÅ´êƒ*ž&X+ú®>àrÐ}(¨õp¥Â-£bÀÛ¤8°¡Tí%ÊYH„ 'šÖBÐÆÙŠ™7–ÌŠ‘¨Ñ0§Bü-ú.ͳ@¼¶1æ³McÐà²iODM)‚uEõºkñž8®î®ÿèE(3EÔÈRd ³:¿Ì«Ì˜#f Ç ^Ô… Ô‘P­2nݱúÈ â1·5ЏJD ]¾ÍnăÊRkMœ qæÚ×SAÿK nEP+{øO‡÷D>â/v=¿ô tÇ2:v:³#5`8’7 Å݃ 7Nëv.¼'Ú3÷÷w?žb.\ô‚iÆ¢¨Ýö¢Lê¿Öô&°KÃHFQD7õ§ÕÈúÏeƒðW-•%Iïã;Œ1dVXà)Šr'µu0ZÄó‚E0éH†ß9EP›¡v-ª-G[œC¿Ï©ÙØQr#ù=Jia;HO}D*–K”»öàOB7ÛÊY6UE>LØ«þW9«½…¦Ô ùL, êïz‹Î7=ékÇ4¢ÿâZøG|s´G4hš)ðï›6;ú~B6ÚßÔF9…v$~S‚þ2ùОõ»4 i}}©©b¦ot0ÂfAQøY¡8Z¼hÀ§ÀPÕv‹‘tÊöÚ€-ÅûÞŸ2½ÙÃEuX(®½<œU tŸ‘ðÙ ¾]œX1,“OupÆŠVÆÐ –À5uÊÿÙ†97œ%×è4Õj×…¸Ù¥C¯I÷†8A˜‚ÉÏÈ›eAïÑ@¦à‰ß.ɤ…åëÁé r[¦3’¿Y»k0«JþŒM)®b<ôÏhéÅFžqÁÏðס0Ù6E˜8ló{’xÇàsüÿ ŸCð*QK©«Öô’YøÛg­ÌÓ©=ÏóYÏSÙø› }ˆÅ×—Kã™ ÆÐ—جÐÎéã, ŸüN÷ø!ioó§½EíG“ö¼6޼~e<ïq|úlÍ-S¼áêüÈå¨e|:ã[úà$VÄí—¯\¬èÊtÅ“ïzHDÆ…øM«_µWH¸‰‰%ª˜Í!ëîK›íºw¯¡¶à>bšqg܉ÙÚïÒ3¾ÐEb€ƒ±¢_.€œîøqøpýô/út½Œi‰+Ýgʸ¾,h=KQÓùÇ fô³fÖ[üia¬!íÚ=u¢ú9þ4€ Šô;Áñ„jVn®×L$ã÷šy¿i1o^§ ïqÈ¥Ó‰jMª½I#Ø‹û´Ñ= wœÅÛì)ÉŠrpôüXP,¼Œ0zÄ2¤mùD¦z¾ïÚgªD))Û|Žâ£Ùkg ÿ–öLCb”ÙŸY­æ…4[õÍnSÞuî&?Nþ%fµÓ¥¸ûñFüㇻ;1ØÞ ä?ëñö 8d5ce92208f4f4fc963d98500dfd093c//proj/rd/eric/funtools-1.4.5/man/mann/funview.nfunviewh#)Funview: Database View Support for Tablesn£SÂuxœµ[nÉ‘~•o jdÉ^`pG¾°¶7–Ö‹ÀXšÃ¦ØÙa7w~H1‡ËkåõòUUwOÏ\{ƒœÙ§§»þ뫪ֻ۷wJ½éÜΚý\ýI·z¡£>âWõÐm·¾nÕÊ×êQ/*Ó¨‡¿¼{ÿÝÃýƒRkÛ¨¥/»q­*½kµuÒªé6]”_©vm”ß¶ÖãmÒµ¶²³îI-ÃA—xgkk³ä~‰O*ÔŸî^¸ÿîñþý;5$¬QêÞ¥-ÔVוv¥™áp¦{iVÖ¢e²³uÛéJ6Ì”-LAë–¦)kˤљµß+í–W ±ôU·qª1•)ùñÊV­©5]t­ÚÛv­œW[So´#ΛÖ×úɨf«K£tUùR·fyQ¨ÖÆ©®oÖ©mEq”Z±rPòj¶¦´+‹7ˆ¢fHDXûòÛÔjãk£jYƒ¼D2ÆÑ¯êà;Õzlnðöf[Y&Še^ ¢´låíŒ³Ä ´´Ñm횘i¼*µS #|hÖ¯)»Ú¶µ1åZ;Ûlfjq-M[[ˆ ÚÅâZé²4MÃT[eb$2FLJ}z0f®Ôºm·ó««ý~_”MÑ9»ð…m¯þ^ZleõÕë÷ßx¸{¸úp÷€Ÿ^㧇?ûØAþVWWÍÏU¹þºX·Ŷ¦Õ“÷àØ6e×4AÏxAäTüÈVßz_5°X¶s’·2Ï[^Æ!‚å=+wWéZD9}sÿø:SµÞ«…udüñ#ì¥n^ßßG»‚5™Æ‘—ÝÉnöQkÛÚ\6¦U;]uFN&ëCLÒÔDߌŸD¹â] ì ë ™Ø‡å‚^Õ´]ûîiÍ/Uº¥í¬°ê­…yU§L˪̦ýáP r[û]µc¿ÑÙˆù¹ÃŠL ĵkÐÀ>PVJ)a¾Ëܳgj¿†€øT½°¼›q+„ Y5vcI xÚïUŽW{˜'Ñ^ê­lbÉ?†"W·-Ì. ’Õíè™%;oÍsËêŠÁ¶Ì½/¸•'Ýñy¢˜rSeÔ%…ÿÎ|)EqX9½áíù¡Í’‡àÜÀ¯¡iõsÊ>T²6¢¢@£òï£naõW…–¶Óu ñºBxueÕ-£Ýô¼ØanUHÒØMt-„b -]kã õ½üœ„–ÕfeXëº+,vù$ÐËž¦¦~±³¾kªƒ²+å â·©{êðV4ñÈi?bñ/불ý®²Ù[ÈÆ™¶ 1¾óx1‘*KFÝ‚0E†RDU³p¢„‰ |d3°L§PÓûV‚0HÚz9…vâ}»?DóeS‡gždæÏñŸ9Èà“µßÚ!oa`¼ úN—ë(€µÄyû7 ¸»ìõ‹›W ñ¾†ñ0mê dgž5nˆ×Àýë‘GðADË\åÆyíVâ çïåòs‹Æ€ŒƒŒX£^.‚Ú…Á[8NèÂ$›,rÂVV²ëà_’a u ?ÂÏ6fTαYN À± àŠ°ü*¼Ö–qÔYzä÷pR~ hkÅ«)B0œÎ½R?w¾•ÌÄë í¸'r„GŽuCÙb¶žPäy~9ƒ=áûš¾5þyqÁñRbZ\Çh•1±Yé®Ji?Ešª:$ L e„ÔÃVÖ̘۽ïª%óŒå /Ÿ…h”¼’ˆÀ#¢€ÛzÇÁ›vž¥ u*Jå´ú õN$¤%[Ã~c6…Á®eV¡DÝãš­n×1ãµdAÂËÕQn×µ1Cy™(­HB¡ÀHð™b¤;„(·QJ'ÄÂ`+Eûk0‚õÇi† R\= ¢ªñ=ó€$ •@wŠèÓæBí §“ßÈ8˜É9>UÁ£[þ»Ajä]`ÎR„û0QÉ€FtÊÜ ‹Œ˜-aÄ÷.ˆ£ÄŒ[!£¬{@À%U/ØA¹Î0¢éÓo² ÀBò!ªh§DÓ# ò¨{·ó?ÑÎz̦Æw©’rXH‰ù ξ€ô|ðõÁ;​”2 YoM°ùÉn>¡OVöYÅÇ{ÕN÷kÒÎ Ð?蚎*‡ Ež‘÷"¸ÚÍ)5õ¢L¦’Ž]Ròš²œ(æöÇã’ìÉ6™Œu“ÁшçL5QY12G›‚¾~gfâ~ä¯9lÏxP—+5áÔ39™š> ³Š,5éS΄,œcõl繺dÆãI 5•ð,<+×yu@Ü%Ù HÇàF×RðzÚ0€VU Ûð¥Ú<õå=U¹\ûº‰÷mŒ::ŠnÒeÑgƵ)ý“‚‚ïë|£ër*êØ+Ša• ±¶°¾¨ÿÜÕájˆ¿Nvò×/yié›ïßýÏÇû»ÞÜ{^4ngk︧¶Óµeˆ3¹ŒEqWÅ*0UìºðêÚ.—ƅܱ[»úŠê6FЬÎÓ«6T3™e¾=Q‚mû2ðÁxÛ®h%a ÚÓPQE½ÅQG¾¥&ˆÆ 8‡€¥7*-½»\TÚý¤w£w†¡5q@fG[¢Nq&J " °ë(Ý `g˜«^lëQIç܈Üp¯ˆRó Óeî$í«ø 5 2/¾Yô.OÉÎÔd݃¯Ï!ä·ǧ…”?´ä‡½XÞK‹àÑz ¯ií=™YHx³9îdÐë´|h¶ƒlË·,YèSÖ!J>ä.†'vY}!t CCMÞ<柕×zÇaÖ§ÆÄ‘ø¤, ûàBûäl¤×q°9âkJçbÌÞ\jô³õr¨l?Sq›¡mS7“ΈÄÖ%* †ºI„"±þÙÖ õÞ•ÁggÝïÈûúÒé³>¯y)^ºO:õžtîF¤ñ…¡œÂã> cµ’ÏW#Ü7ŽJ±d~¼Dêï{ݲ±ˆgçî[SF=U~± åS*“5a%nz›gòJZz14ƒýÉÒ˜ˆvuO› òdØ÷ŒðÊäø4¬Hð9Þœ|*ŠâG<®µ{B’…õ*ž‘ ö:ÄÏèÄYXþWe˜$Šy_Ç£OìÞ#%±@ý]sœ7’´]í¨>Po¹}ìNš9p(‹g‡“ß"%["œ×Ú¡,˜t)IP°È‚X O©m–¾2óœ‘u½¬´AÕ(kB7TGNmülöÀS.H3<7¶0›¼;pÁq„+ÉX:%‹gÑÊY}FUÙIY7fÐû”¦ñHû´¦® ðBý@V)|JyÝ—;C0“JCí»…{š‚H0e¥ìð±+•2L@*ý`¤Iž÷GJ=ƒ\ŒÝÍ((ŸŽ#~Éõr”C†vVóë‡F’Qã%Mm¢Ñl²´iظV¥V‚IùSøP™¶,²ÉAˆÄ¤ûvïÕGÀ¨¨NX ¤® ¤Ä–ŸªùÎÈÏ]¸)‚¥3¹çgIö½H{b}ì†Zêíæszzñ¯ŒÜ< Ñ@l?ɆÜD3Á/jþH(XÄêå÷!é§MP …˜†Ú| êö¦‚'uOÇ#É/pÖùó õðb?^ò|“Œ)¹/-š²ØUߨÒyëK.ØÃ©G-³-ßÕG­Ö‹SíÕâ*ë¯7QÇ-T*A6&u&ÃììV¨[Í2®EåñþʈïëÙóµÞj“Œ»!örãÎ’W’¤“w&‡ýƒzfÀ36¤L¶ùBEHkñSG\vKX¸uqê=ºŒ±bßNADFœ%œ@uØbº´UÍ]šsÛã¼ÃÙ€.RYJŸý¥¿·jq™ºÛlù£X‹Çº ƒ·GÙ)1!øZS=ÁÒ?žù:AÂ×ÇTá‰_áçDÑâ0 %•)qlw.=œ8øü,#Ó²n–ú{Ezó‘¡LfÓi φ13kŠ®-yQ¼H¡wÞ.Ã~2iEìýõŒÕéf‚~PU‡øæ{“ˉ܅KÊ;o§—®É)Aù“ùo'Ò¯OüË•®3dQôˆ‰lIýY‡¾AÖ©ˆYÏ£ÈÚѽÇ&^â æNE·ø+b·h×TVÓ¦•Y­q*?ä ÊYDÛJ²O$ÄÚò'Eз£IF0E¼yYœê–ñÐC‡tæpÁ6ØþGohÀiîMÆ%âU@­1=Ù‚µlR:¨Œgù¿z0G 7ç¨_8ž› G ¿4ž¾¡€ÙëÀ-ÓÍñ嵦¯´£fâ¥%nä˜/ †ë±,ÃÔ+§:ï§ç隬´N-”>Ðw±c3Ïz.Výú°d¬Ì£ÉX¶ovu­¿Î0š.¤xŸÅá›®æ`ødl:>z0ƒ£1Wºl§UJ;|¡Ñ¯úëOq‹ í—жX%o!@§;HZlËeYúQ(ßi˜eXxùsÒ7·½™êržº;H×»Y IôIîQ"ä‚§&¢Ÿ’Л6}ÒèñH”3u ”|½ö‚L“W0/6º1[3%Ê4ͽ˪֡j !»Ÿ"*m³¹cxM¬þCõs»w|yþ1k$ð'' æ<¼da#Ís«L)Bï±óYÊžÍxHžõq&Ñ'|¨ncÍV ™’^È€«ó­”Œ­ØLõ?(Þ :£O¾†Ö7ùQ†ŠÙ}„Âþµ–Ä/´cþÿû1šG’SWä1C¶‰ÕÐѶÐí‡x/߇÷]í!® ‘ÿ}‡ï³}ô"5D…všÏDþëE,5CFݱX+Î,ÿ*"œÉHl*ö's4–оsekV,ˆFGÉf`W€7ÚTAÿíI@É•¿1Õèž‚¡ú–ŠÑn»¤X4W·ÝS‡ß‘ëo^¼ø]šŠ\¯Š¯Õí¶¶•º~E¯¯åªüÝÌÔ]üÔÅ 3d53b106edc02421ded7c946db987f782/proj/rd/eric/funtools-1.4.5/man/mann/regalgebra.n regalgebraL#.RegAlgebra: Boolean Algebra on Spatial RegionsnŽQ¼xœíšÝoÛ6Àÿ•kŠP Ë_Iü–v) KŠ:C×—´t¶‰R¢&ÊMüßü)É%°í¡¨ìõy¼#uGžn¿øŒË[µÄy)¦ðNk…"_:‡Y!*)cRçf_?ÍîgO+i ÕÉ:ü‚MRÊ9¨Vs_‘(eµÊ°’  ™c ]Bi+|)J4†ëíÁow³÷Ÿï?=Ý?>|Yaîîù„¿!ƒß±$iÌJÔTBMÌ ÑÙÜV¾6Ì×­ë‚àÊUOââÑ]á­¤’2ÅôH¢S̼˜Ì6Ù\+ðÇ£¿­>¿5F'’Zø.« À¥=ê‹——Íç¾ðU]žëªþYÊ媂JƒÂ¾©ËEžÖ?í" Õåø’(êüw„xGl}Èü,ú®à‹È …p9$%Š É™0ßHß¹‘¦b]³Î(Q.Y& á™lNe&J‘RIë/Ü9ÌôwL©>³ÉÈ d.úeŒë$ÿ±>¶ö!¼¿ÿüþãÝÛ8Žø;¾ µ¼z÷ø§/F“ w/×B£i­¬XVLÉ÷ǃáh<¹º¾éwÿ:²PÇAuNãÆ£wr Øa { ŒÚØ`ÀNZÙcà*€½`o¦û׺ٸÇ!ð †À£¸Ýz pˆùâvûõNáv6À7#yЙNAs¯eò² §G¦hA-<"ø˜ndOí¯³¨…'Ó¶‹ ðU|ßÀÃ~‡ÀƒxBàqbÁaˆ‡!†XpbÁ[r¶%âåßkQVäá½ß÷ÑXè‰=ï=èGôûÖ{º¯ Wýh8é{®´þF™¡Q)ýüß9ïïiÐè Qw2ôBF^ÈÀ w!Ã.vñ‰åº<бéÚ¾Öy· '¸uÞðõ:½‹uÞìmw|ßÀƒ~7½†Ã:ïxBàf ¶À“ƱÑ_…ÀÇS°>™ƒð/ç}ÿìÎûéYÓ;¿”9¹nƒ‰].£R²0»•L¤Dh»¬6"C¿C>ùîãÇ­?çÿ7ì¿m)­È}ñÿîÒž?Í×<¯l×XÑG’¸ ž.8#ôì*Á™ikRŸPFïö÷ØNT¸ÎüT4wÂT¿—‹®£øb{zM§WV*û{B+‡A¯`0êGÃ~wG<æR:aCÁ&p×pý½2¸ìüp½Î„Û“ÁÁg‡ §À‵¨!€Ï"ý³²Üvèðê>í“‚Úºk‰«³uLÎÊ1>Û™ÑYâ¼ZçmsÖÀºÂ탪íh÷nÎlÎDm;:#?ílu„{ía?î~0LÖG÷°p­‘»I#š|—~RÓ3îèIcELùìÚ9ó°%v”JæÌ”ÛÞþœÛ+ù5éþ•Ig‰ë³]îœt–ø™&Ý“Ÿjõ›!û®…Â/Y¢ 8óJlcï[ù®zJlý¬©ßû(qÁqœ­ÆA),JíyÒÌîîàöãì`†ä"×yEQ…y›_Ø7’8P3»Âþ ØÈ¨Kj‡æÇÈ÷F½1ÜÓhh¥ÇüfËR¸¦¨¶_HŒ add3d37d6340ef15ca2b186e4a87134c1/proj/rd/eric/funtools-1.4.5/man/mann/regbounds.n regbounds.¶RegBounds: Region Boundariesn’ ›"xœ­XmoÛÈþ+ƒô‹ Ð:KVlÙmP$9`àÎ â ×CpVäJÚzÉe¹KËêëß»gf—/’í -ê8´DîÎë3ÏÌòîý/7D_ôæƒk«Â_óGã*’¯ª1ÚÓýowŸ>ßßÞý¨}Þ˜îmÝŽ|­‚Q–š¸c5ìP¦­ª «‹)ýxsÿñËí篷Ÿîˆ¾n5mœ-tEMk5­]s,gmlЩ6´SßHWm•tA«=ý¬±ìoªº¯õ~Õ8?©hvµ¼¸&ºQù–ê­ X³3ÖÒJSÓx¯«r £Ê½¶¦t0>ÀzY=e“§R«Êóí@;Me ›x]·–|]öU&Àí?ÁCý¤ÊÚBµY“¢Ü49\‡T, ÊTÐ ûÿV­m=ù>ˆ²€x™ªÒ 5ª0xäÖr¯[i¼|õªÄ½øùpaT–ñç*¹ŒgU”>˜,)»S{ÏŽ)ï͆í ‹5ÁæpiRž¦ D/²©jËžAk§Ä0$Â6-÷Q…þg‹L‹ÉmÙÙøâ^ÍyLêÖ{]«°{„õW8DFÖ–¦*¢ */¨*4P„¤­ËÕà°)ÕFSmž´ïÔ )i€jÆîØ}ÕÁ ½–t­´u;Xq+RFÈ¿–ð+k÷§~_–:4&'¿U5žMº\HòLFÚZS{}A-êÑŸEã<ŒwyÔ@gCâ¯7…o{oØ6Så¶-¸â"d•õ°¾®-ÛU¹êôU˦ô+£C¥p ª€Û<Ø}ÄË .†:.Ž¡*±%´…п‰"^ZÔ[éýGÊ©pb^èìàO¾÷’b |_Ò$ÅI'Êʺ­"`òl\m;†RªšuãJ:ã¼Ï²¤{‡¤lÐ1Ä‚Ùdk Ñ©î´=£Ø¡’:ZãÜÕf³]¹ÆK®´ïp«+ßFö ŒÙ*âœ3U£œeBaÑ3ξ+MzÔa§±s´¡+ÀŽ÷†M¹U¦Œœv®[ÈÕ%xìHøÀ9xªü|ø p1(PÞ!ÿ wPÓε¶@W¨k]Å¿‚I ÅQ` ³^#ÿ’Ã2_¹§SÖÙ›3ÀÞ “ØS;/¼ §TñÅêNUBn}MýïúÀÐgA Iíì~ƒ¸elŒöÿ÷r~^Íß©äÿ²”c%½â`ÄøÚ!¨7Œ‰Wr,æÐ©múMó±ƒY½– ÍQÿˆŽȨ޺Ñ.êK#áßA88.h]°#äucU Y_@Ý'÷•²û?bL†¹¢'û„à>VªÑMuÝeËõS®ë0ôfš·V1¨88ìp!…c“â/AN¼1ñ >°AûZç1øGö¤±Ï§§n`ýV=‚+ æ/ôµŒÖÖA)|¦ PÜ!èãèHq'ÓþµlÐ7»WðÇåÉ ®!f-èÑDð_áð¨l«ÓŒÃÆÆ¸°òÆ<SûÀÌô¨G±Í˜‰‰Gd‹O£A®ã³äÇ«óÛ«ÖÇæ~4£ŽBa‡ÑB3樵s;hxZ£ºq›F•>ŽŽ#‰I»á«omð‘¾Gëð4 ¹°  # #$ºŒ¯ÀßI$³6‹¨Ãáhv%Ê>åzÜœ*0-Ÿ»Y9c)‰JëüszbÌ lY³?yéürXg×ô¹A¢¹^é£$5R à‰ß\#书Ñg¤< '.¹VU¾ï;VÓVRëÅNFâ•©‘15Iûh-G¬+7‰°,ÚÅñp¸„Û†ñ<,ëÖ΂ ãK'5hfÓ5°ÿæ¨}²˜Ï®²óåò2»À¿³“ßß`:Ù_–Ë«s¢óùÙl±¤óË·óåâ‚è^ ½¶“(š£Y¶ZA±CŸÿç¡€¬Y?K Ô˜±¢ÚzÄz´p`¼¶:/VÜó¶zT•IŠñI ’UyÂf)Ì%‚+Lþaà%sYBt„$»$­ï À¡U 6YÐe ‘@ šeçHê›z»÷ ³?ÓK& ߦÓ)LcDãr #Lm¨,<ûèO‡™0Û&ñÈJ囆q X”5(œ ØqvÀÌJ‹cýN¸ËŸý€‹¿k$ñfâá*ÏŸºÙTö‰aáårq9=;;ÃÇó Žpfg‹ELó$¶“#Ô dÁIîà8A%tŽ=c­Œeö-qØâ 6lͶË#ö'øF+äå\ŸÀ( 7¿x¤8Ö“¤8id•†îçÝ¥ßG‚–ËÛóå|yuvD<]u Iuc3•sûÓ;:]ðÈ´ÇÒ¦gËÁ ¦æQ°Ž˜œ{áÐŽL5Ì* kñtñ¢w2dÄ™dàݱS³ËŒ¯K¹^ñu~&×Y–\Þ{º|›ñõB®—r]Êõ*Kq¸sA÷%_t–u§þÂ4 1™"Aš2­M:¦ôÉ–ùrFof^Nžþnî.9G€ïä0oûû£,~þßw÷ék—¼ƒ<gÿ>½™DéÌCÆÍ0¾,â‰LÒ7½ð–ŠM™ÏaÊ‹™>Ïû’M’Ñ õ·ó¸KhÁÈ˪DÙ|ê§“—9P§M|Á]»™á2>ϤW]ãrïlⱘÔä¨|ôJãÛm`Á¶×SͦeÆé§p×0bºWzÖ”Ü3xnïçä8&s¹*ðHÏ:Û$2òôíA)ã«s¼ÝoÇ)^à}ÔOÓ‹¨ `FЉŒ×ÝÛ8©- m.çÀàä~ÜqX”Ý c†m)29´’óSöv\ðÞÅHtm3ž´e.eÙ2ŠwÃgNã\/çu6¼‹ýž•Qß•ùl¸².àLøè/­õþæ†Þÿ|ÿ #–'8gý¤:‰†#^ÚòOé Æ[“ž)A5ŒþÙ”£ü¾nЄf‹Œ0KqÛƒ¥2‚³´?ñ±Ûø 98cf90baf564850c0ce8e145e907309e1/proj/rd/eric/funtools-1.4.5/man/mann/regcoords.n regcoords8%RegCoords: Spatial Region Coordinatesn“X¢_xœ½Y[oÛÈþ+?,l@a$ÙJ6ò Uä]µŽmXF‹¢#r$M3¼t†´¬þú~gn$mz´@…XˆÉ3gÎå;WßÌ¿.»»EYêÌ\²uÅkÉ=’eÁìcYðZ¶þãæön½Z3ö°—†eeÚ䢨Y&Lªåõ^0S‰Tne 68_nYY0s4µÈ͈ñ"³Ä²¨…®´¨‡¨¹jˆ·¥W'–vbm¥ÂAYìöe¹^ܯîV·7ŒÝÉ'¡n$‘ÝòFÕ/ßÛ+kàÚÝo¬W‹ùõˆö2ݳ\ð‚´ãu *´"“&Fþ;H˸¬æßdÔen•,µÜá6Å2^ó„Þ”¸Ø2«ÉŽøÇYºçÅN œYÝϯÞßÝß®™Ì+%ÈàÖV#ØÎKGôlõuþër@³wnñº'g,jס†êÀêm…fuÉ*kÉ ¦aPµ'—Ì9ä=m œ`…d×_­5®þƾ‰ãðt–0ö»¬÷ƒwB…-T7¢î;Þ yDµÆÇ÷æŸ"­Iú%tµzX.ÄÈÁç¢Çó •òŒ-E—×ÑñȬG‘½ôt¹Û  ­ú¦ÓäG®%G4HÝ*ÓodHƒ5aƒžÜêìºeΖ0‡xäS|qÇRxBBÉA˺ÆKx‡³B,Ó„ ÝPH©z_6»=ÞY(’NÖ‰Þ© Ù FÄ„tð‹GΈˆåüØ1 }áñcÃÙ‚â%Jˆb§Ê ÌC@?ü§Òe%tM®NË<~ƒ•ež/K¥N•`³ÉÔþLÆcבÜ2ð±ä°3ê\©îV«m©Ty°á®„=èÄû>–e¡Ž–/½ö Bæ¹È$ˆì+â@µÀ÷mÍü³ÉxzᾦN_ áÇÅéhi™•‹f¾)OœR‹‘–PØkŒ¿¥ë‘Þe§A-ºlÔ—ZeòÁÖ!¯¶¯½d!vÎà!IÍe(N^J õl#Q® ˆ ™¤†SMI§€P#7䯒Âùèk‡C¤œoÇ—ª$lÝTU©kŠ:/¬,RÕd~+([ø+x•“½Ã'¼x×~:iÖª¶6Ù°™Ë*äDC}OùÓ§óWN¦ÖTxíAvõ׋ûeòi6ôƒê¢œØ_£7)_Ï«Å[tËÅ5•Þ7éV‹ûu ñÒ£6£>y‘®W7Ëù} Sp×ì"qŽ´@pZÁ<ˤ+…õ¡dyi¸L‡nßóG 2gàb£¡©¥¢ÂMÀ:¥z„Î\-óÌBû¯ü?ÿzw½ºZ-£F] _EÀ˜¾,–‹‡Û;ý§¿Ðéùc³ã„ãÈ$O©¨jfIcLôº^×µû†›ÂÓßv{DŽÃ‰¦Åfï·Éør:¾<'6±OÆÎ#t Ìk0bçcÖÕbbê®êí½8íåùÓóS¨ÿÊùýtœ·, ÈúôoÝšd:ŽÁE¿µ¶–¹T\«£NSÈÚ&Ëç#Z¨7 ø¶(Bk¥á3¡OÍãuÍÓ½Zî&ß 'Yf½\òF>¬?œON1×ikzãmöLBWÀƒo"ÿÞ4âÎý§A3Š6(Š·'Ý×Á$íë¬û:`2®†î'³h•=W[ÔÎ>(¨EP‘žûº3Üíø6{ Fú.íݦ|b“³dv‘åÉx2™}Ȭ²ôólDðÝQ%1 |ü”Ì>âÌ4ÁÉ1;ÿ0fÅç öÓOÈZE£óŒäœ1  ™AƒÚBí"³btGØ Ìý|ÔèËr¥m KLB8RÐt~)Ÿì JSk¸aƬÌýœ\÷s/1Ï4?ۆö2¡[¯~Bn¢¾`ÿj8è)à(CϜƇ‹9ÃÍëç$Y¨~CG;r†aüAMèM>¯o‡@‰9Ik™!2Cʈ=‘ŸM‚ÔT‘pÅÍ/—v6ý*xáw ÏM"†Íñÿ… z¶%Rt©ìw7ýŸTDëÎ ;• æ|jâÈeƒæ3”Ò´ ÀQÓPQŽ3W{"ÞÏHþ¶eâ¦Sô¨]¢lF”y¾s¹(®~|Šzž:[ †v9!ûîD!4WδºQT¾sLÞÝ|sN«-ÛÎÙt–L…X¶[·Z3ÏÀØF½DQû-4êØš ïî–ÖJáh¹1Èa¡É“œCN¥mMBÕ YÝÍmÐ8þÅ&»§7!—yv yôA1ŠÛ‰89•ôŽø~>àã=ØD짨×oõx¥Ñn;ܰ-j· Ök)!ß ÊƒU¯©'ÜÐ.an÷—¥FÖãú8 ,$Çw¤4P;b»gCš.vö‚د/¢Ø©k˜ü,núÁÊMÈÁÿ„C·ˆî>uJ|_–¾›‡ c‡™{ˆîžxøQ1 ân°Q3É8ìvÙ@^²×Ò%Š·â9M¦#ú™ŒQê…R²‚RÓ1ÒäÅùÏÓŒ]|L&?O>PJ¦Ül¿ñ¸ÝâQ¤ÂÕ«6Ð6zVv·VŠ›`É耨˜ÏÚ¥X­U–OlÙ*R3ÇÌv$›îÊÖÑÖ4CÖ{^$?o¿Í:U©?sÌýðÂç ÔŸ‚ªNâ¢,¬µ—5ןØ^À«E~¨Fö G“Y5š’G~üѵkÚC¥‹æ ù6LaVˆsOã êû oŒ°oC lÌÙÆn÷â!u“¦RüØþI&vií&ÙâcÌ:aëå’ͯ׷˜Ð>o›¢.KeN‹3—Y‘èŒÖ®ü¶ªB§AÛTJtT÷&ÉE2cóJKÅ&ÔM&Ô)‹»Üþm- 4c6db9fddd8ac83bec7884e558a0f1b4//proj/rd/eric/funtools-1.4.5/man/mann/regdiff.nregdiff 5RegDiff:Differences Between Funtools and IRAF Regionsn†n‡xœmUÑnÛFü•E P+v4@ÔZ$²`%(úx$—Ò"Ç;âî(Yý±þ^g¤(A:îÍÎÎή6˯+¢Þ?J]ÖìJŽô§³£§Î%ïm$ã*Z¿,Ÿ4Z¼‹´û{ó¼Ý­wDË n¥Su…Rü„ò¾Š¿QQ/xÛ#¿ß¾<ïÆ§sz\íþ|Yo¿­Ÿ7D1Ì‘)aÜòÔ˜<‘!Kß´&Ia™N’ /ÚÀƒNôaö™ž| (M‹[×܆£Ø82vÏE0—š†Ð™& Lñà;R09¥Á%\+M'O´a—À3g§oxBµ·ÖŸÄíI¬ÄD¾~#¦r7–(V’\I<à&ú—ˆÖ5@Zye«x¥?äΙš.åò+4б¯gj9Nö®ïjcâ:Û±ÒÒ“ZBp`Ò *Éð+gÏåá‡7v¥6AŽ“Ì•‡Z(ôNAk«Žâ»©£â.ég Dt2=¡ÒÄ©ÉäƒìÅKo;‹ä(¿AûRÞ«ïŠkÁwÍlMÛªð?¥Q¡+zx:H™³é¤ï!´'9ë<«>è±QÙëÎÚó¨ •­ŒÆ¡¯Ù9:XG½3b\{¤@ ¼É4$á¾µônìg×¾Ë=[kRâ0ï .ÆíY)¸ì{Ù†ö#´‹¹‡¾MÒÈ?8¯Åân±Ù–3’9ϯ¬à*I“ÊSÉQªbŠ!J¬.ø@IJ…7Ï{CªÉ·ËÍãr,ÿ`´É­5%Ok w/ž!Øë¤¸¡ízEæ±L‚ ê°-.ªb6h¹Ù|ÿò}÷&°‹ÚX¤O6o>ÜÍð¾›->ÎÜï·ô‹æ¹œÞºÃñý-e¦E?ñÝâŒ1ËÕ¼ ¿ïÁÕ—{UŒ2ÖÙuƒ­“wq®šSISPR•þ•tWQmc¸®)àNºéû¤h¾KØ"âSl¹”ZpKÃũҚ Ï«Ü-¤/T¯ hÿw…g f03efdbe8ed213426d085ebced5d9a223/proj/rd/eric/funtools-1.4.5/man/mann/reggeometry.n reggeometryWù9RegGeometry: Geometric Shapes in Spatial Region Filteringn‚”xœí]msÛ8’þ+(OÝ–¼§pDJòK¦æƒ'›ìº*›äÆ™ÛÛšº¢(Hf…"5$[ûë¯_ AZÜ­Ëeö̙زøÑxyÐÝ@¿»ùók!~”Û?Êb'ëòøR¨Oi"îî㽬Dš‹»}\§q†À´ÈÅ›4«e™æ[q÷×wï?ÜÝÞ ññ>­ÄºH;™×b-«¤LWðt}/ÅV%.Š()‰JÄŸã4‹W™›¢•Ê`Ó¤ ¹ÞþxóæÛ?¾¿qgÇ*­ñ‡×w¯~¼ýðñöý;aµâ¢Š;ùY–ŽÎÒÜŠK)Ä¡’kQ¢)ŸÐå à¤øgéÚzâ¥à?à7_q¹¥¬à›xé/N¼„¸y÷î§·?Ý©çHM–â¨~§y.Ëÿ.ãuz¨Dq¨Íâ‡÷ÿ%zžz|H×õ½8ÞËt{_‹Iœo3y.Ä«Û_½}Ý÷”NøõÛ··î^LûÍíë·ÐIçEuùööÉ,ÇPÉãCQ®¹š“¸’/Ò¼’9W¼Ý›C‰)cjS*.?Ö©5|ÈD/¹Ë8Á6wÈÓ_PÀÕª”ŸSzILÞ^>Æ»}‰b{Æä´P)‘¤erÈâÒŒb8œmŠ"ؤuõ³êoË0â³ïà›I] ø7áìü;Hbr±œMñ_4;ÿåLˆÉŠjo+s¼ 1róýõ–Ü÷%’šê›³V#ؾ†BSsZI”6±>ùÕýSž>BíÈ,Cùb C}å‡ û½ÜDSa•º™N÷NHG@+Övª{íT<¤0&Ð`Er¦‘Š”TLJhUet¸5Ú |Ñÿ_BmØ9C]ë‚5yCÖÑ2˜ñÊPœ©!7ïaà–)ß g¸©ªÃ«fMî!… -dâÅyj[—&ºÚžÅ¦ÐPà{H õ\hÆr}Î0®<ø@³ < hÖŸ0ã*ý;Tëbö¸˜MEZs¾YQ|YúIÒãÐnÂh¾X^\^]φ?™]³—Á‰—óë1à«1àË1à‹1àåð õå‚ç>pzÐŽºàн,p8Ü•`ؾpÔ‘ pÐîHÐI­îHЭÜ‘à¸#Á!pG‚CàŽ‡À ÕFG‚CõèØß=X郡¿ö€½}°ìéƒý`OìEÇ ¢cÆÐ1Cè˜tŒðÆÈnŒèFIn ΪxTs³Ã.  ŒÅ¶È‰`eŠ$cà©C8ºTGÏ缚ê•P nkMÒ* ‡Ò^ !I¹¯9ï=rLZßnÅ(R»fÕ €ã1ߦ¼Ì_îeΔOßá[È9 ǘeÈ93r¬€ÐSŠ«D›EI5nUÒ[­&“¢?—Ù¼ªµàúÇ^ä–W2œn#̸إ5dLlm-7ñ!Éxfêí‘ùgÒS|ã„wW´´tÛ ¯+š†£rºžî+Ov¹¾õT†Ä–ùµ/àc½ Ó_g2ßÂ÷+|_X ÂöÜSÅ7}üýï£ocø!þ]ñó ?/`9þ80׬W\Ä’q=7ðbÐÎëbŠ‹IUŒ”œ–z«Ày7KÚX(#åü°[Á3PeJتRš^@b?îöÁ°¯ö‚½}°ÜÓýàgb¯±ÏÄž±H€dë'‰çúRb⥤%%®tµÏ‡ê@Ôß ù¸ÏÒ$­³ãT¬µQåíô÷¬d´¶Fù[Z´eÊ”(­¦ø>P©'dŠêC(S~²4 Ú¼ŠÒAÃô®ÔÐZ×®PghW9Â¥ùþP£’š^±Ž?I|«qܧ^Ò„—ÔÖr½•:»Ò†é¤JœŸ&Ò½’õƒT«“ú¡°*•­ê ËX²ž•[ ~Š åø’§4ñ¨š«RF»32 SáÕL(ÒfZ§w›…CAÀ¦i ƒ©Òº.cX Dºv^Åe-«*oŸÅ¹dîºN+ø‹ì˜D–›\V_‚†žËßc€Ž__Ž_Œ/Ç€cÀó1àh 8#ÁhŒ£1ŒÆH0#ÁhŒ£1ŒÆH0#ÁhŒ=Êݾ˯Üíá~ånx ‹xVîÚàgÈØ¯…Ávæ¨aºÏâ#©ã:d¢¢²w ³’),˜ã‘ÄlYߤeUkå`ü0_[w+™ùšŠqÀ ¹G¬c ƒº¸˜ Ëç)Ư˜a¨ì‰…·T."!ú)ÐÄ4“NŠÜ¼¢I²ï)“ÐÎÄä¸+r©ïËâ°½‡îÕÜš4lè<`å°´UQß+*é7&râ¸ÄˆÙ{GÓU’ˆRÆù‘‰oÁÕ­ø»wP%²¼Kš¾ gò ð½œÉ7ôr¦°ÆõÍ2½œ©ìŸqýZ—/Í™|ذ3y aØÃ™|P{9“ú9“Jà®ýPw%؃ }œ©JàŽ{ nK°Jà¶{±a—3õB ìJ°ŠàðºöC ìHpgrÀ½PÛ‚¸§úÁþ>Øö÷Á°Ÿõö€ý¬·Ü?ŠvÁ½ƒ¨Û;†z°}C¨Û7‚ú°c„7FvcD7Jr#°.gÚ¬!õ¥ "P >0ïÒZ¤u%ª¤ØË)=¬Ug¨‡ª”k(ð.²1’oœr™ž*­H¥¬¢Ê®\ ÙuU™$“¸,IåUbr¬f%³âúqv/³=*Wâl+We|ÔD|€¢|å¦(wä`Š\…˜XÚxE*ÿGb:鎌ŒðÕ¾(•ý]½;Ù¡Õ»§»xK^¤kR¶okE"ù·§¨ùJâC%™Ù4Ú¶”õEN:ÃMš§µÔVBpPíU…Š7ªOr—Mî%0tD<вx¨È/1Í“ ê Mþ“CN‰+Zé§J·Hæ\Zã4œÄ:©’]Bbò²>ˆ·²<ˆžÉŸey„–Q< GD.²¸Üªú@[yŽ®½uJ¯Æ‹ŸûóO¯þÄ®¼êa²ï²3p¾ŽuäœÖ‹UŒZU%!#wx5Ý\6‡<ÉkäŸÁGa ߨE1p¢”–J¯´ªôg²^‘³ÄíF‹W)>È©^àÖô¢Eo ¯ r×Ômñw¿C]p‰ ‡<ÉÚ,ã Õ‡EÉÞž©E~y—t„5I½;vÐdÈUW>BðJUž•jCÕ!#ýò§¼xÄ]ŠÍßEµ¬FYÕªŽ¨²©©Õd˜ôæ¿Â°€]CÚvmXU­*À¶Üà€bZ4ù×ãøÃŽèÖħ¦6LÚpE©*ŸFMwÎPµ ÆÝ ²VÏ·+ÙÊAM˜Tµ—¸dO»RÕÏãU†›UÞ´;{¼‚!T!ljÒ½CÍé’û ©ÛI5/‡õ-“{Ú;ñõa®ùn/^ÔÁæØ‹gKèÔâ ú2ô/˜änÓ”¬`±÷À×/´·>{#ãúPò€´£ÝJ Œ[[©Íx›ÞfSŽÓ ØBˆÏ6§|uëê­t,¨—mï´]+ƒö©ž…‰'m¬£ ¥û(³Šgi½Óä1œÃs*Úä1š£s%šê×'É‹?;v®—jcÕd9½˜Âúo-Ï…6E©-(ÏG üìqdƒ¿J£'Àc$ØÝJ /Ÿ«OŸOð8Àv=ް£~lŸµÉï­Õ³•À‹õ[›z°~£¬ÏÚÔ‹õX›ú±]kÓ¶cm¶­MƒØ–µiëZ›žÀÚÖ¦§ –µéI¨±6= m¬M'@ÿ?X›Š–-ýÐ.n²úžŒ-È=&Óã¹½ý˜ö³¯3\ÞöYÃ;‰Õ>d½kY{n'E «º}Á†)*;uóŸÒ"TÛȳ5žÞ©¡|´&Îi»k³±4?-Ñ¿J÷@l´L·)êPp[>ùHI¤]1{YËø<,n±8ìê[ ?•4™}¨ u`ÀŽ™`½«í´³DÅ?4¿„ÚXKXïUѺ¥qßß@WjT)(¢—B}N×Z×  :ŽC´ÍœtÑiNq°ÂÿÈ ¦óÙ¹rîÆ—qÖÊž·¡Ò¡‡vpsýß9k¶žIš?“4|Š ü¯EÒ|à1ì#i~ð úIZØ+Á¹üì䀿ˆKPô$ø·éôLÒ˜¤eÇ-ÌÇݽyúiìðt—4ïQ#Pƒ)L¼óóÀI µ—YV 瘗ē`R?dl,2§ƒH6+Ð2Š’f?F'ïÊø!/Ì{iÊEgÒ É$º†|ÅÕßm ¼IÄOÓrv&mW]¦Ê{©M=ô:ä:3æ³<¢»}!²â³8Û`‡¬ bÛdeÛ&+ƒØ6YĶÉÊ ¶MV±m²2ˆm“•Al›¬ bÛdeÛ&+ƒØ6YĶÉÊ ¶MV±m²2ˆm“•Al›¬ b;¥§ÔOއ°¿]²rö_™¬˜ójg-ÌVÂÌýV5™õØivWÉì3jF6ì§“Ñ<Ÿ”EUòû·f>׺‹ÈÌïQ£ÃØ—šHi'X)cc}Eó¼& Õ”§ÿÕ½6ÙQ ×xÖc €{ÌàÿZ¡ÁÏz ü5ë1zÀ.5è|h]jàþî€[ÔÀúå·©Aÿ4î£CܧK ÀjÐöQƒ^°—ôŸ©ckÔࣳ¾7>GÊSR¹'‘ÃØ!Ô9ÅÔMw8#«3²šœ¡OìÍ»?ˆö ;;gÕÛWâªÙŸ4ÛÎñ|¢8Ã:”§}ô±ïÔckîþݨ£}iË8î¡¢#}#‘Çè V¢‹þÈñ‡ߘ“TÅ«îñž|üñ!+Äñ~<ñOðƒ£ŒÏ!1<{J¼þçÓѱ*‰ÜÝ&PÕ"=wOªÕçQ'tN’WæÆƒZìâò“,+}¨Š]lÑ­Oö†u¢{5ï¿*ô1RÍ^w×#µRfAÕ˜ø Zu—rh¤&Ù8ËÒÛh·¦}ê8yk'cã L¾¡ÊõO)ËÚoi».*Ï1íù7Å‚î±E~–x,. È—®Ñ‡OzâQÇw¯8#å@X‘`•C¤Úe'd ¢e¦`е»,;ɳ®­Mæ2Q”{6_À?ü.§ àÜ’x,ñÜøÝ·Ž´…‡¢™ë*K/¼h\åã¬*<ÏÊ3YËN8K‡Qs.ÅDù†± .z_Ã4IgÍÅPwÍ1ÈÕù3—7à/Çåæê‚ÝÉhá^m°3]]  ].uÅà9^]¸Ãå¯è𛫅v¸ØÆÚàk·sã] hAÛ\ž±ÖeÝëpù¨‡Ë÷!ÿÕ¹¼v´ÒÓq‹µÛnCzÇ–½cF (7©ê°Ç=l´§bÓÑP븎ÍV¶s:ªOÞÐF2Ú’Â$?@cˆor†ÝµDš—TNnz;R%¥Ú‘goÉÀŽWUb3'³šÁ &ðËK ÏùšópÉAOàw¨q†aÒŠþè38q'eûl¿´ÀϧëÛà¯ût}æ§®ùÁþÓõ{ÀþÓõ{ÀþÓõ{À=§ë+p«6ÚŒBƒ~ât}$„ýly[{ìm-o«h|Ù;ps¯ãmµÑ^zÁ>'¦¶³Õ´­¤ ‚~hGI 5‡—ÛVR> ~VR2ö·FlŒý²ÙüÛ8 ãQC%ï o¶¨ó6и\¥u ¤8U•nsÖyÅäLåì²§„~bDteRljÉú‹µæ.1ë^J3ô R›¯«FAe¶rã†r³OãÏxcf4 ŸÇ=ï;ýÛæûî”T%tèæ¨½ué””7¸W2E¯ûw?Öä|ò±Æ0Uø*ê¨Ú€nÅ Óg:ñIRx¸Å™£1±,­jVþÅ%ÐÀšv(ÕQ¤>û̪fZGÑŒX“6ê8~u4}sd<ï‰GM¹¨LJ|ïMŸ‚Þ^Z]èÀ‡ÃQ>?WúÃ’}TOMÅàܤØ0ь浉oጒt¾1Žƒ0pg)í‹çã0¤ÑÙ[ø µÔ]\Y/ô1z(%UþN¼>w'’ÈÑa}óùu. @Þ©t“™ay÷"ÔEᤠ’A{›Zãh7džH>P·(²Ç;ŒÜ(tôj¨ ç (ÕkLJ'@§"ð"ç ¨"åk³Ò¦ão̪澽sª'ª-œá/”aÁ9ñõ68ošÑVŸµàØÈÌ Š€Ç€@†¥Æ^´Ï0 þ€Ì 7ß øvé½Ákøî .°ï¿ŽâTéWï‹´´¯Ø¡¨ËöÕ[µuáÎ*ß‹µÐÖ*¿jÁÍ*¿¹c™Zèf•ïÚp Žlð¢}µÀÄT{ ®À(Á¬…V«|ܲu8` ÛAó*ßÂÎÝËB«Uþò$ð’WùýX7iZå°BXf”¹ žwÀ¶]¤ŽÚ`Ç.Ò‡0/ò=àÙ0¬òG€¯F”Vù§×Fx1¢žÃ1 #Ú.óOnu¸Ì?¹=Ó2ÿÔžŽéƒ×#:÷ÕˆQãrÄpt1bœ3€.ÆŒÌ#†ühÄ\Ž˜¤_ÀêO9v¨¥.ç7ÊnmGè2K$;&b\Í®¨&Òª0//W² òˆ÷:ÆîÔ ÑÖÁÿ]–EûpíÂÁ h$ƒNº&»A„ßa¤.'Ƽy-AaÌ ÎV¦|¿F^1 þÖÝÕÀº[ØN/Xõ‹öÈçsÇè “tÃ+<#p®y…µð]ð¬GöåAkëAÌð6øJƒ-ݰ­­ Xk‘}hm=è€×€^Ú`[óÝA7Ölltc=PI­·…¶À‘ ŽBÇŠâ&m¬V9 Ú-ˆ±XåèKÚXzËÙà+«ñ—ö´K¶Ëa[ÁØ& ¼t:ì]ç.:jmôpãk›L»6ÍÚwÍž£Á­Qt 7vÍýýÜc>Ѓ†…ÔµìBçKa}æ/´ß|Ð…™ZȯÊ| ”´ú,Bö®l´P¸ù¹Ôgó¡|x­k% %­ ®¦U ì³eº'[ª v‰…é^©¿l÷¥zЪ›îRy7Çô•̤¯ø‰„§ÝYà«v·í…»D¢ÛúçîÌâ!}è"á‡{ˆD{(°;X‹Hø†™yÓs=DƒÖ`/‘èÀ%8€µÐŠH8`wˆvÁ A?¶ƒf"aaC÷rFS"ó“Às&ýX7i"j"4..xÞ«¦àGmpÓÊ<àp x6 Dbøêt0ðˆÓ+#¼QÍᆋMyÄÉyÄÉÍ™xÄ©%Ó¯Gôí«ƒÆåˆÑèbÄ07fü\Œ˜GŒø؃ôðˆ^$bopãÃ†Ž¢3¶&c2f'Š=©LJ&‚eUj›9|É4&µ“£±Y†,.Ts§±¡§h‘²b`úLR*Ym’2©èèS¤éÚ¤øeŒAʳҴLRô@Àö(~øÁE!¬"ü½7@—,]:–(yߘâ¿E§§w."L'bC"L'bC"L'bC"L'bC"L}£X azj0N·'aC"LOC¦éö,‡8âéö,‡.Øžo±¡!LOcÃ6a††0yÐa<ï·±¡!LtÂÔw±¡!L-´Âä‚}ØÐ&íÅr¨Ø c²Ð=ØÐ0&îÆcÒè^,rÀýXeOžXeOµO€gx8~Öµ‹#cr±CA¼.ÛØè`lSÛ¢láÁúÁȘ<ؾ8i^¬ŒŒÉ‹õkûh“’aÇ>í©ˆPµ—\Ž®Mi^ÿ¢œäH3à’ÈÛTÕ3ê<ɸöRW&~n]žP†/Örîy}n™”€°B wØïµjȸ!)U o¦=Ô•ÈoA`q9}1DȪ8äëã´•€ªé—´-YÉ!7•§ã§»°*ÈÒ6œŒ&eN*wçìñ™²›(í­Iß,«Ñ}ù<Š8")–H¥ésVjÌlÛ û‘æ*ÿ~.†]|Úª®Û ‡ÝÐÂTîœ*Jcc½œeýê2Õ³áuèÈCs 6F²Ï•qo@رÞEÔØí´07Z{GAuºÙš…)qÒ˜ g׸aµ‘ƒ¬'CáaæâOgªZ’ôSq–¥ øÄySsläÚ&ü¶\ñ3—œž Èç6¦À2•ŽÓê¤ê¼r Ǫ÷sÅÙþ>^É:MÌ.p#ŒR8ûþŒ4¢ðãûùTüÈ: ôÑ”V‹Á%ŽyãE¸é1S“Ý«økêxJÛÌ!ºL‹7µÚBæ¾Ð°ÙwFß FÔº]ƒ¯²öêÔº£nŒÏXÙø lëÚí%îüºµÖïÇ7:Ûyûòƒ/_ú°>¸ÒÙú°]8ëlÍmâ?}h^‚ØHuùàj ÒÁF®.¥G½Ô¸ÖK?én¡õ¤E1ýèf ÒÖCùÐí%ˆ5uwÑÍÄÇF º_ô‚Ûèf â`?ºY‚X`γ…Và¹ÜQh>m#ƒNÒOêlí¤Ùø;¶“fãïIå˜kãïiåPÆ_©Mí5`ŸùÞ_ÕÚøÛJÚ/ÅÆøÛEwŸ1þö¡]pd_=­º‡Ž®r¨ÃØÆ_·“[P¾n¸‘çÒØ«¶b³Ú2þνèyƒ½ð)A=Ðy×ø;Ÿ;xó§Ïø;÷_ßøÛí1þz¡½Æ_°?J­ùèw¼²I€æ+еh ô,’ä¤-CM.ÅVkb•àfª=îߙĨȴ‚ç¹”ÃÏNpóÒGŒ¼’'/j{/¾>ÊÈX¢y“T­‰!Ñ]¶ú {do*"‚L»…,˜¸§tª&Ù‘‡7œæqûî?oÞÞþˆ©­ë¢;dpêyEÖâï—¼3ä·Ö¦¨ê qE¤j©eÓãžû}¾D.IQ§*D"ªgÚÛÞÈe"ü¾ì&j}a²°¾Ô¹}´ƒÉL0šÌy+œŒ9.@…Z¥ÕÆ~©)0VZV•ÔÛ¶¦xj)F×Ý£™QÀÅ5×}Rä¦K{F0’-ÔþCQÒê…Z]ÉõZÊÅ?L‘ß¾û᥸±÷Ãìâ£sZC'þ±UÖ64äDÃ)þi &›†*>a³b $7X\Y%>ÃÀ ÿ‰eZ”¼¡×xP¢¸ñ“´·°ÑεûX;KNËÕÖá‰ãâ8Ql ]«5¬Ð%¾¯Èù 1É%Ç×à£ci•cö4ZvØŽyTuãˆÏ3£ IØ piÂGáÆ•>Ÿ‚êÒiTËy…gââRãÂËAy§:0°³[ ºÒG”Y[@±ž×i•‡2Þò‚^s­ðÃ:¨²¿fðE›óÚ ™Õ¤[¨éu(ÎqjHü|“ev*•pNä¢WÑa+¡ÕBÂæØ5JJ…Ñf7Ü©HøÚ„¼<Ãô¿‡.fÔ µ"¥òÐMšÓÅòã±_:í3ÝÖ0Ž'Æ¡ý,fÈóçîA¿œ ¡”ž¨¾ß~»µw”5‘˜ñà:¸MU‘ŽÍºÇ¨ÜeJ Fö„áNWLBm;on?Þ™§ÖéŽ7ÖÂBêq1Ó*ˆàq÷úµ¸y{÷^‘Mß™äçJq€j1…7ºWÑA&{ r±(Í0XKq%Ê€áQkaˆÜÊb'ëò©ýÜQ6 4aec34e9222832066c4d05d9aa07e91dfuntools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/sman/fun8.index.version000066400000000000000000000000431256243640000255730ustar00rootroot00000000000000SMAN_DATA_VERSION 1.2 VERSION 1.01 funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/sman_conf.tmpl000066400000000000000000000066071256243640000241150ustar00rootroot00000000000000# $Id: sman-defaults.conf,v 1.33 2006/05/02 02:09:18 joshr Exp $ # by Josh Rabinowitz, 2005-2006. # this is the default sman configuration file. # if you need to make changes, copy this file to # /usr/local/etc/sman.conf and make changes to that file. # NOTE: if you do use a custom sman.conf you may need to manually # NOTE: merge changes from this file to your configuration file # NOTE: after upgrading sman versions # See 'perldoc sman.conf' for more documentation # sman-defaults.conf # holds the defaults for sman. # the directive names are case-insensitive SWISHECMD @SW@ -v 0 # MANCMD specifies how to manually convert the manpages to # ASCII. For 'manual' parsing. # %F is the quoted full [F]ilename of the manpage (ie, '/usr/share/man/man1/ls.1.gz) # %S is the quoted [S]ection of the manpage (ie, '1') # %C is the quoted (apparent) [C]ommand of the manpage (ie, 'ls') # NOTE: lack of a MANCMD (or a value of AUTOCONFIG) causes sman-update # to autoconfigure the value of MANCMD. It will most likely choose # one of the below: # this works for most linuxes we've tested. ie 'man /man/man1/ls.1' # MANCMD man -c %F # this works for freebsd 4.4 and Mac OS X. ie 'man 1 ls' #MANCMD man -c %S %C # -c means reparse man page sources (for line re-wrapping) # works for Solaris and OS X MANCMD man -s %S %C # the COL program is used to strip out backspaces and # such from the MAN output. COLCMD col -b # all vars starting with ENV_ get set in the # environment, sans the ENV_ prefix. # Try to make MAN wrap lines at 256 chars (not 80!) ENV_MANWIDTH 256 # where to put sman's temp files. # (Use SWISHE_TMPDIR to set affect SWISH-E at index time) TMPDIR /tmp # meta and property aliases. If your XML has different tags. # refentrytitle, manvolnum and refpurpose are the names from rman # each ALIASES line turns into 2 lines for SWISH-E like this: #MetaNameAlias swishtitle refentrytitle #PropertyNameAlias swishtitle refentrytitle TITLEALIASES RefEntryTitle SECALIASES ManVolNum DESCALIASES RefPurpose #MANPAGEALIASES swishdefault # All parameters beginning with SWISHE_ have the SWISHE_ prefix stripped # and are written into a tmp config file for SWISH-E at index time. # SWISHE_IndexFile is also used by sman as which index to search. # SWISHE_IndexFile specifies which index to create and search # NOTE: if the containing dir (ie, /var/lib/sman) is owned by an unprivileged # user, then sman-update can be run as that user. SWISHE_IndexFile /var/lib/sman/sman.index # these have 'SWISHE_' stripped off and are used # when indexing the man pages. SWISHE_IndexComments no # don't index text in comments # These are important! You probably don't want to mess with these. SWISHE_IndexPointer "format=%V;" # for future use. %V becomes $Sman::SMAN_DATA_VERSION #SWISHE_FuzzyIndexingMode Stem # above was deprecated in 2.4.3, does not work in 2.4.4 SWISHE_FuzzyIndexingMode Stemming_en2 SWISHE_MetaNames desc sec swishtitle manpage digest SWISHE_PropertyNames desc sec manpage digest # SWISHE_IgnoreWords File: ./stopwords/english.txt # allow _ and : but not / # .'s in middle of word are word chars, for files like 'named.conf'. SWISHE_WordCharacters 0123456789abcdefghijklmnopqrstuvwxyz_:. SWISHE_BeginCharacters 0123456789abcdefghijklmnopqrstuvwxyz_: SWISHE_EndCharacters 0123456789abcdefghijklmnopqrstuvwxyz_: SWISHE_IgnoreTotalWordCountWhenRanking 0 funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/szlong.c000066400000000000000000000001631256243640000227230ustar00rootroot00000000000000#include int main(int argc, char **argv) { fprintf(stdout, "%d\n", (int)sizeof(long)); return 0; } funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/tabcalc.c000066400000000000000000000120541256243640000230020ustar00rootroot00000000000000/* * * This program was generated automatically by the funcalc program, * by running the tabcalc.c template through the funcalc.l lexical analyzer. * On this system, it was (or can be) built a command such as: * * $COMMAND * */ #include extern char *optarg; extern int optind; /* define the types of event records we have to handle */ #define REC_CUR 1 #define REC_PREV 2 #define REC_NEXT 4 /* default number of rows to read at a time */ #define MAXROW 8192 int maxrow=MAXROW; typedef struct rowstruct{ $MEMBERS } *Row, RowRec; /* global definitions and init calls go here */ $GLOBAL /* main program */ int main (int argc, char **argv) { int c, i, got, total, rectype, start, stop, skip, args; int del=0; char *s; Fun fun, ofun; Row rowbuf, rowptr; Row cur, prev, next; $AUTO /* local definitions, followed by init calls go here */ $LOCAL /* exit on gio errors */ setgerror(1); /* avoid shared library problems by using "process" type for filtering */ putenv("FILTER_PTYPE=process"); /* process switch arguments */ while ((c = getopt(argc, argv, "d")) != -1){ switch(c){ case 'd': del = 1; break; } } /* check for required arguments */ args = argc - optind; /* make sure we have minimal arguments */ if( args < $ARGS ){ if( $ARGS == 1 ) fprintf(stderr, "usage: [expr] | funcalc [-e expr] [-f file] iname\n"); else fprintf(stderr, "usage: [expr] | funcalc [-e expr] [-f file] iname oname [cols]\n"); goto error; } /* set rectype: determine whether we need prev,next records */ rectype=$RECTYPE; /* get maxrow,if user-specified */ if( (s=(char *)getenv("FUN_MAXROW")) != NULL ) maxrow = atoi(s); /* make sure max row is large enough to handle prev, next */ if( rectype & (REC_PREV|REC_NEXT) ) maxrow = MAX(3,maxrow); /* open input file */ if( !(fun = FunOpen(argv[optind+0], "rc", NULL)) ){ gerror(stderr, "could not FunOpen input file: %s\n", argv[optind+0]); goto error; } /* open the output FITS image, inheriting params from input */ if( $ARGS > 1 ){ if( !(ofun = FunOpen(argv[optind+1], "w", fun)) ){ gerror(stderr, "could not FunOpen output file: %s\n", argv[optind+1]); goto error; } } /* select columns */ FunColumnSelect(fun, sizeof(RowRec), "merge=replace", $SELECT NULL); /* activate specified columns -- these will be written to the output file */ if( args >= 3 ) FunColumnActivate(fun, argv[optind+2], NULL); /* allocate space for rowbuf -- we will manage this buffer ourselves */ rowbuf = (Row)calloc(maxrow, sizeof(RowRec)); /* no record read yet */ total = 0; /* any user-defined calls before we enter the row loop go here */ $BEFORE /* main loop -- get rows and process */ while( 1 ){ /* need prev record */ if( rectype & REC_PREV ){ /* no records yet: read new batch of records into start of rowbuf */ if( total == 0 ){ rowptr = rowbuf; } /* we have read records: move last record from last batch into first new record and read new records after that */ else{ /* if we are accessing next, we did not actually process final record, therefore we do it now */ if( rectype & REC_NEXT ){ memcpy(rowbuf, rowbuf+(got-2), sizeof(RowRec)*2); rowptr = rowbuf+2; } /* not accessing next, so we just move last record processed */ else{ memcpy(rowbuf, rowbuf+(got-1), sizeof(RowRec)); rowptr = rowbuf+1; } } /* start at 2nd record so as to have a valid prev */ start = 1; } /* processing that does not require prev */ else{ rowptr = rowbuf; start = 0; } /* adjust maxrow to account for handling of prev record */ skip = (rowptr - rowbuf)/sizeof(RowRec); /* read new rows */ if( !FunTableRowGet(fun, rowptr, maxrow-skip, NULL, &got) ) break; /* if we need access to next record, don't process the last one we read */ if( rectype & REC_NEXT ){ stop = got - 1; } /* processing that does not require acces to next, process as cur */ else{ stop = got; } /* process all rows */ for(i=start; i 1 ) FunTableRowPut(ofun, (char *)cur, 1, i, NULL); } total += got; } /* any user-defined calls after we finish the row loop go here */ $AFTER /* free row data */ if( rowbuf ) free(rowbuf); /* clean up -- close output before input to perform flush automatically */ if( $ARGS > 1 ) FunClose(ofun); FunClose(fun); /* delete program if necessary */ if( del ) unlink(argv[0]); return(0); error: /* delete program if necessary */ if( del ) unlink(argv[0]); return(1); } funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/text.html000066400000000000000000000454331256243640000231260ustar00rootroot00000000000000 Column-based Text Files

Funtext: Support for Column-based Text Files

Summary

This document contains a summary of the options for processing column-based text files.

Description

Funtools will automatically sense and process "standard" column-based text files as if they were FITS binary tables without any change in Funtools syntax. In particular, you can filter text files using the same syntax as FITS binary tables:

  fundisp foo.txt'[cir 512 512 .1]'
  fundisp -T foo.txt > foo.rdb
  funtable foo.txt'[pha=1:10,cir 512 512 10]' foo.fits

The first example displays a filtered selection of a text file. The second example converts a text file to an RDB file. The third example converts a filtered selection of a text file to a FITS binary table.

Text files can also be used in Funtools image programs. In this case, you must provide binning parameters (as with raw event files), using the bincols keyword specifier:

  bincols=([xname[:tlmin[:tlmax:[binsiz]]]],[yname[:tlmin[:tlmax[:binsiz]]]
For example:
  funcnts foo'[bincols=(x:1024,y:1024)]' "ann 512 512 0 10 n=10"

Standard Text Files

Standard text files have the following characteristics:

  • Optional comment lines start with #
  • Optional blank lines are considered comments
  • An optional table header consists of the following (in order):
    • a single line of alpha-numeric column names
    • an optional line of unit strings containing the same number of cols
    • an optional line of dashes containing the same number of cols
  • Data lines follow the optional header and (for the present) consist of the same number of columns as the header.
  • Standard delimiters such as space, tab, comma, semi-colon, and bar.

Examples:

  # rdb file
  foo1	foo2	foo3	foos
  ----	----	----	----
  1	2.2	3	xxxx
  10	20.2	30	yyyy

  # multiple consecutive whitespace and dashes
  foo1   foo2    foo3 foos
  ---    ----    ---- ----
     1    2.2    3    xxxx
    10   20.2    30   yyyy

  # comma delims and blank lines
  foo1,foo2,foo3,foos

  1,2.2,3,xxxx
  10,20.2,30,yyyy

  # bar delims with null values
  foo1|foo2|foo3|foos
  1||3|xxxx
  10|20.2||yyyy

  # header-less data
  1     2.2   3 xxxx
  10    20.2 30 yyyy

The default set of token delimiters consists of spaces, tabs, commas, semi-colons, and vertical bars. Several parsers are used simultaneously to analyze a line of text in different ways. One way of analyzing a line is to allow a combination of spaces, tabs, and commas to be squashed into a single delimiter (no null values between consecutive delimiters). Another way is to allow tab, semi-colon, and vertical bar delimiters to support null values, i.e. two consecutive delimiters implies a null value (e.g. RDB file). A successful parser is one which returns a consistent number of columns for all rows, with each column having a consistent data type. More than one parser can be successful. For now, it is assumed that successful parsers all return the same tokens for a given line. (Theoretically, there are pathological cases, which will be taken care of as needed). Bad parsers are discarded on the fly.

If the header does not exist, then names "col1", "col2", etc. are assigned to the columns to allow filtering. Furthermore, data types for each column are determined by the data types found in the columns of the first data line, and can be one of the following: string, int, and double. Thus, all of the above examples return the following display:

  fundisp foo'[foo1>5]'
        FOO1                  FOO2       FOO3         FOOS
  ---------- --------------------- ---------- ------------
          10           20.20000000         30         yyyy

Comments Convert to Header Params

Comments which precede data rows are converted into header parameters and will be written out as such using funimage or funhead. Two styles of comments are recognized:

1. FITS-style comments have an equal sign "=" between the keyword and value and an optional slash "/" to signify a comment. The strict FITS rules on column positions are not enforced. In addition, strings only need to be quoted if they contain whitespace. For example, the following are valid FITS-style comments:

  # fits0 = 100
  # fits1 = /usr/local/bin
  # fits2 = "/usr/local/bin /opt/local/bin"
  # fits3c = /usr/local/bin /opt/local/bin /usr/bin
  # fits4c = "/usr/local/bin /opt/local/bin" / path dir
Note that the fits3c comment is not quoted and therefore its value is the single token "/usr/local/bin" and the comment is "opt/local/bin /usr/bin". This is different from the quoted comment in fits4c.

2. Free-form comments can have an optional colon separator between the keyword and value. In the absence of quote, all tokens after the keyword are part of the value, i.e. no comment is allowed. If a string is quoted, then slash "/" after the string will signify a comment. For example:

  # com1 /usr/local/bin
  # com2 "/usr/local/bin /opt/local/bin"
  # com3 /usr/local/bin /opt/local/bin /usr/bin
  # com4c "/usr/local/bin /opt/local/bin" / path dir
  
  # com11: /usr/local/bin
  # com12: "/usr/local/bin /opt/local/bin"
  # com13: /usr/local/bin /opt/local/bin /usr/bin
  # com14c: "/usr/local/bin /opt/local/bin" / path dir

Note that com3 and com13 are not quoted, so the whole string is part of the value, while comz4c and com14c are quoted and have comments following the values.

Some text files have column name and data type information in the header. You can specify the format of column information contained in the header using the "hcolfmt=" specification. See below for a detailed description.

Multiple Tables in a Single File

Multiple tables are supported in a single file. If an RDB-style file is sensed, then a ^L (vertical tab) will signify end of table. Otherwise, an end of table is sensed when a new header (i.e., all alphanumeric columns) is found. (Note that this heuristic does not work for single column tables where the column type is ASCII and the table that follows also has only one column.) You also can specify characters that signal an end of table condition using the eot= keyword. See below for details.

You can access the nth table (starting from 1) in a multi-table file by enclosing the table number in brackets, as with a FITS extension:

  fundisp foo'[2]'
The above example will display the second table in the file. (Index values start at 1 in oder to maintain logical compatibility with FITS files, where extension numbers also start at 1).

TEXT() Specifier

As with ARRAY() and EVENTS() specifiers for raw image arrays and raw event lists respectively, you can use TEXT() on text files to pass key=value options to the parsers. An empty set of keywords is equivalent to not having TEXT() at all, that is:

  fundisp foo
  fundisp foo'[TEXT()]'
are equivalent. A multi-table index number is placed before the TEXT() specifier as the first token, when indexing into a multi-table: fundisp foo'[2,TEXT(...)]'

The filter specification is placed after the TEXT() specifier, separated by a comma, or in an entirely separate bracket:

  fundisp foo'[TEXT(...),circle 512 512 .1]'
  fundisp foo'[2,TEXT(...)][circle 512 512 .1]'

Text() Keyword Options

The following is a list of keywords that can be used within the TEXT() specifier (the first three are the most important):

delims="[delims]"
Specify token delimiters for this file. Only a single parser having these delimiters will be used to process the file.
  fundisp foo.fits'[TEXT(delims="!")]'
  fundisp foo.fits'[TEXT(delims="\t%")]'

comchars="[comchars]"
Specify comment characters. You must include "\n" to allow blank lines. These comment characters will be used for all standard parsers (unless delims are also specified).
  fundisp foo.fits'[TEXT(comchars="!\n")]'

cols="[name1:type1 ...]"
Specify names and data type of columns. This overrides header names and/or data types in the first data row or default names and data types for header-less tables.
  fundisp foo.fits'[TEXT(cols="x:I,y:I,pha:I,pi:I,time:D,dx:E,dy:e")]'

If the column specifier is the only keyword, then the cols= is not required (in analogy with EVENTS()):

  fundisp foo.fits'[TEXT(x:I,y:I,pha:I,pi:I,time:D,dx:E,dy:e)]'
Of course, an index is allowed in this case:
  fundisp foo.fits'[2,TEXT(x:I,y:I,pha:I,pi:I,time:D,dx:E,dy:e)]'

eot="[eot delim]"
Specify end of table string specifier for multi-table files. RDB files support ^L. The end of table specifier is a string and the whole string must be found alone on a line to signify EOT. For example:
  fundisp foo.fits'[TEXT(eot="END")]' 
will end the table when a line contains "END" is found. Multiple lines are supported, so that:
  fundisp foo.fits'[TEXT(eot="END\nGAME")]'
will end the table when a line contains "END" followed by a line containing "GAME".

In the absence of an EOT delimiter, a new table will be sensed when a new header (all alphanumeric columns) is found.

null1="[datatype]"
Specify data type of a single null value in row 1. Since column data types are determined by the first row, a null value in that row will result in an error and a request to specify names and data types using cols=. If you only have a one null in row 1, you don't need to specify all names and columns. Instead, use null1="type" to specify its data type.

alen=[n]
Specify size in bytes for ASCII type columns. FITS binary tables only support fixed length ASCII columns, so a size value must be specified. The default is 16 bytes.

nullvalues=["true"|"false"]
Specify whether to expect null values. Give the parsers a hint as to whether null values should be allowed. The default is to try to determine this from the data.

whitespace=["true"|"false"]
Specify whether surrounding white space should be kept as part of string tokens. By default surrounding white space is removed from tokens.

header=["true"|"false"]
Specify whether to require a header. This is needed by tables containing all string columns (and with no row containing dashes), in order to be able to tell whether the first row is a header or part of the data. The default is false, meaning that the first row will be data. If a row dashes are present, the previous row is considered the column name row.

units=["true"|"false"]
Specify whether to require a units line. Give the parsers a hint as to whether a row specifying units should be allowed. The default is to try to determine this from the data.

i2f=["true"|"false"]
Specify whether to allow int to float conversions. If a column in row 1 contains an integer value, the data type for that column will be set to int. If a subsequent row contains a float in that same column, an error will be signaled. This flag specifies that, instead of an error, the float should be silently truncated to int. Usually, you will want an error to be signaled, so that you can specify the data type using cols= (or by changing the value of the column in row 1).

comeot=["true"|"false"|0|1|2]
Specify whether comment signifies end of table. If comeot is 0 or false, then comments do not signify end of table and can be interspersed with data rows. If the value is true or 1 (the default for standard parsers), then non-blank lines (e.g. lines beginning with '#') signify end of table but blanks are allowed between rows. If the value is 2, then all comments, including blank lines, signify end of table.

lazyeot=["true"|"false"]
Specify whether "lazy" end of table should be permitted (default is true for standard formats, except rdb format where explicit ^L is required between tables). A lazy EOT can occur when a new table starts directly after an old one, with no special EOT delimiter. A check for this EOT condition is begun when a given row contains all string tokens. If, in addition, there is a mismatch between the number of tokens in the previous row and this row, or a mismatch between the number of string tokens in the prev row and this row, a new table is assumed to have been started. For example:
  ival1 sval3
  ----- -----
  1     two
  3     four

  jval1 jval2 tval3
  ----- ----- ------
  10    20    thirty
  40    50    sixty
Here the line "jval1 ..." contains all string tokens. In addition, the number of tokens in this line (3) differs from the number of tokens in the previous line (2). Therefore a new table is assumed to have started. Similarly:
  ival1 ival2 sval3
  ----- ----- -----
  1     2     three
  4     5     six

  jval1 jval2 tval3
  ----- ----- ------
  10    20    thirty
  40    50    sixty
Again, the line "jval1 ..." contains all string tokens. The number of string tokens in the previous row (1) differs from the number of tokens in the current row(3). We therefore assume a new table as been started. This lazy EOT test is not performed if lazyeot is explicitly set to false.

hcolfmt=[header column format]
Some text files have column name and data type information in the header. For example, VizieR catalogs have headers containing both column names and data types:
  #Column e_Kmag  (F6.3)  ?(k_msigcom) K total magnitude uncertainty (4)  [ucd=ERROR]
  #Column Rflg    (A3)    (rd_flg) Source of JHK default mag (6)  [ucd=REFER_CODE]
  #Column Xflg    (I1)    [0,2] (gal_contam) Extended source contamination (10) [ucd=CODE_MISC]
while Sextractor files have headers containing column names alone:
  #   1 X_IMAGE         Object position along x                         [pixel]
  #   2 Y_IMAGE         Object position along y                         [pixel]
  #   3 ALPHA_J2000     Right ascension of barycenter (J2000)           [deg]
  #   4 DELTA_J2000     Declination of barycenter (J2000)               [deg]
The hcolfmt specification allows you to describe which header lines contain column name and data type information. It consists of a string defining the format of the column line, using "$col" (or "$name") to specify placement of the column name, "$fmt" to specify placement of the data format, and "$skip" to specify tokens to ignore. You also can specify tokens explicitly (or, for those users familiar with how sscanf works, you can specify scanf skip specifiers using "%*"). For example, the VizieR hcolfmt above might be specified in several ways:
  Column $col ($fmt)    # explicit specification of "Column" string
  $skip  $col ($fmt)    # skip one token
  %*s $col  ($fmt)      # skip one string (using scanf format)
while the Sextractor format might be specified using:
  $skip $col            # skip one token  
  %*d $col              # skip one int (using scanf format)
You must ensure that the hcolfmt statement only senses actual column definitions, with no false positives or negatives. For example, the first Sextractor specification, "$skip $col", will consider any header line containing two tokens to be a column name specifier, while the second one, "%*d $col", requires an integer to be the first token. In general, it is preferable to specify formats as explicitly as possible.

Note that the VizieR-style header info is sensed automatically by the funtools standard VizieR-like parser, using the hcolfmt "Column $col ($fmt)". There is no need for explicit use of hcolfmt in this case.

debug=["true"|"false"]
Display debugging information during parsing.

Environment Variables

Environment variables are defined to allow many of these TEXT() values to be set without having to include them in TEXT() every time a file is processed:

  keyword       environment variable
  -------       --------------------
  delims        TEXT_DELIMS
  comchars      TEXT_COMCHARS
  cols          TEXT_COLUMNS
  eot           TEXT_EOT
  null1         TEXT_NULL1
  alen          TEXT_ALEN
  bincols       TEXT_BINCOLS
  hcolfmt       TEXT_HCOLFMT

Restrictions and Problems

As with raw event files, the '+' (copy extensions) specifier is not supported for programs such as funtable.

String to int and int to string data conversions are allowed by the text parsers. This is done more by force of circumstance than by conviction: these transitions often happens with VizieR catalogs, which we want to support fully. One consequence of allowing these transitions is that the text parsers can get confused by columns which contain a valid integer in the first row and then switch to a string. Consider the following table:

  xxx   yyy     zzz
  ----  ----    ----
  111   aaa     bbb
  ccc   222     ddd
The xxx column has an integer value in row one a string in row two, while the yyy column has the reverse. The parser will erroneously treat the first column as having data type int:
  fundisp foo.tab
         XXX          YYY          ZZZ
  ---------- ------------ ------------
         111        'aaa'        'bbb'
  1667457792        '222'        'ddd'
while the second column is processed correctly. This situation can be avoided in any number of ways, all of which force the data type of the first column to be a string. For example, you can edit the file and explicitly quote the first row of the column:
  xxx   yyy     zzz
  ----  ----    ----
  "111" aaa     bbb
  ccc   222     ddd

  [sh] fundisp foo.tab
           XXX          YYY          ZZZ
  ------------ ------------ ------------
         '111'        'aaa'        'bbb'
         'ccc'        '222'        'ddd'
You can edit the file and explicitly set the data type of the first column:
  xxx:3A   yyy  zzz
  ------   ---- ----
  111      aaa  bbb
  ccc      222  ddd

  [sh] fundisp foo.tab
           XXX          YYY          ZZZ
  ------------ ------------ ------------
         '111'        'aaa'        'bbb'
         'ccc'        '222'        'ddd'
You also can explicitly set the column names and data types of all columns, without editing the file:
  [sh] fundisp foo.tab'[TEXT(xxx:3A,yyy:3A,zzz:3a)]'
           XXX          YYY          ZZZ
  ------------ ------------ ------------
         '111'        'aaa'        'bbb'
         'ccc'        '222'        'ddd'
The issue of data type transitions (which to allow and which to disallow) is still under discussion.

Go to Funtools Help Index

Last updated: August 3, 2007
funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/twcs.c000066400000000000000000000027051256243640000223730ustar00rootroot00000000000000/* * * twcs.c -- example using WCS Library * */ #include int main(int argc, char **argv) { int i; Fun fun; struct WorldCoor *wcs; /* WCS info */ double x,y,ra,dec,xr,yr; if(argc == 1){ fprintf(stderr, "usage: twcs iname\n"); exit(1); } /* open Funtools file */ /* Funopen makes initial WCS library call: wcs = wcsinit(header_string) */ if( !(fun = FunOpen(argv[1], "r ", NULL)) ){ fprintf(stderr, "ERROR can't open file: %s\n", argv[1]); exit(1); } /* get wcs structure */ FunInfoGet(fun,FUN_WCS,&wcs,0); if( !wcs || !iswcs(wcs) ){ fprintf(stderr,"No WCS data"); return(1); } /* read input, convert pixels to wcs and back */ while(1){ fprintf(stdout,"\nInput x y: "); if(scanf("%lf %lf", &x, &y) != EOF){ if(x <= -999) break; /* convert image pixels to sky coords */ pix2wcs(wcs, x, y, &ra, &dec); fprintf(stdout,"Convert from pixels to ra,dec using pix2wcs()\n"); fprintf(stdout, "x=%.10g y=%.10g -> ra=%.10g dec=%.10g\n", x, y, ra, dec); /* convert sky coords to image pixels */ fprintf(stdout,"Convert from ra,dec -> pixels using wcs2pix()\n"); wcs2pix(wcs, ra, dec, &xr, &yr, &i); fprintf(stdout, "ra=%.10g dec=%.10g -> x=%.10g y=%.10g offscale=%d\n", ra, dec, xr, yr, i); } else break; } /* clean up */ /* FunClose makes final WCS library call: wcsfree(wcs) */ FunClose(fun); return(0); } funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/doc/view.html000066400000000000000000000342651256243640000231150ustar00rootroot00000000000000 Database View Support for Tables

Funview: Database View Support for Tables

Summary

This document contains a summary of the options for utilizing database-inspired Views of tables.

Description

Database Views

In database parlance, a View defines a "virtual table", i.e., a description of row and/or column selection filters (but with no permanent storage space allocated). When used in place of a table, a View selects the specified rows and/or columns from one or more real tables. Views enable you to see complicated data tables in a more convenient format. They also can be used as a security mechanism, by restricting user access to specific columns and/or rows. [See:

http://www.cs.unibo.it/~ciaccia/COURSES/RESOURCES/SQLTutorial/sqlch5.htm
for a good discussion of SQL Views.]

Funtools supports an expanded notion of Views for all tabular data (FITS tables, raw binary tables, and ASCII column files). Funtools Views allow you to pre-set values for the filter specification, the columns to activate, and display format (though the latter is for fundisp only). Setting the filter and column activation values provides functionality equivalent to that of a classical database View, while the ability to set the format is similar to classical report writing capabilities.

Funtools View Attributes

A Funtools View is a text file containing one or more of the following columns:

  column         description
  ------         -----------------------------
  view           name of view
  file           data file name or template
  filter         filter specification
  columns        columns to activate
  format         fundisp format specification
All of the attribute columns are optional, including the view name itself. This means that a View can be named or unnamed. Unnamed Views can refer to a specific file or a template of files (obviously if neither the view or the file column is specified, the input View specification will never be used). You can specify any combination of filter, column, and format parameters. (It also is possible to apply file-specific View to other files; see the discussion on View Lists below). Each column has a size limit of 1024 characters.

For example, consider the following View file:

  view    file                    format  columns       filter
  ----    ----------------------  ------  ------------  -------
  x3      ${HOME}/data/snr.ev     I=%4d   x y pi pha    cir 512 512 .1 
  x2      ${HOME}/data/snr.ev             x y pi pha    cir 512 512 .1 
  x1      ${HOME}/data/snr.ev                           cir 512 512 .1 
  x1a     ${HOME}/data/snr.ev             x y pi pha
  x0      ${HOME}/data/snr.ev
  xf                              I=%4d
  xc                                      x y pi pha
  xr                                                    cir 512 512 .1
          *.ev                            x y pi pha
          *.fit                           x y dx dy     cir 400 400  3
          *.fits                  I=%3d   x y dx dy     cir 400 400  3
This database example is in rdb format, i.e. using tab delimiters and permitting null values. Any valid ASCII table format is acceptable, but if you use a format that does not permit null values, it will be necessary to quote the null strings.

The first five entries (x3, x2, x1, x1a, x0) are named entries defining default values specifically for the snr.ev data file. Typically, you would use these Views by specifying View name, and the corresponding file, filter, column, and format values would be used. Note that the x0 View is essentially an alias for the pathname of this file.

The next three entries define defaults that can be applied to any file. You typically would use these View names in conjunction with a specific file name (see View Lists below) so that the associated parameter(s) were applied to that file.

The last three entry in the database define unnamed Views that pertains to all files ending with the specified templates. In these cases, any View that specifies a file name matching the file template would be processed with the associated parameter attributes.

Invoking a Funtools View (in Place of an Input File)

To use a Funtools View, you simply pre-pend the "v:" prefix to a View name or a file name where an input file name usually is specified. For example:

  fundisp v:x3
specifies that the View named x3 (with its file name and associated parameters) is processed as the input file to fundisp. Using the example database, above, this is equivalent to:
  fundisp  -f "I=%4d" ${HOME}/data/snr.ev'[cir 512 512 .1]'  "x y pi pha"
That is, the format is used with fundisp's -f (format) switch, while the filename and extension are composed of the x3 View's filename and region filter.

Similarly, executing a command such as:

  fundisp v:foo.fit
will match the unnamed View associated with the template "*.fit". This is equivalent to executing:
  fundisp foo.fit'[cir 400 400 3]' "x y dx dy"
Of course, if you omit the "v:" prefix, then no View processing takes place:
  fundisp foo.fit    # process foo.fit without any View parameters
  fundisp x3         # error (assuming there is no file named x3)

Basic View Matching Rules

When a "v:" prefix is recognized, Funtools searches for a View database file in the following order:

  location             description
  ------------         ------------------------------------
  FUN_VIEWFILE         environment variable (any file name)
  ./.funtools.vu       hidden file, default name
  $HOME/.funtools.vu   hidden file, default name
The first View database file located is used to construct a new filename, as well as an activation column specification and a format specification. The following rules are used:

1. An attempt is made to match the input name (i.e., the part of the input View after the "v:" prefix) against the view column value (if present) of each row in the database. If a match is found, the values of all non-blank columns are saved for later use. Also note that the first match terminates the search: i.e., the order of the database rows matters.

2. If no view match is made, an attempt is made to match the input name against the file column value (if present). Matching is performed on the full pathname of both the input name and the database file name, and on the non-directory (root) part of these files. This means that the root specification:

  fundisp v:snr.ev
will match a row in the database that has a full pathname in the file, allowing you to use a file-matched View without having to specify the full pathname. In this example, the "v:snr.ev" View specification will match the first row (v:x3) in the database:
  x3   ${HOME}/data/snr.ev     I=%4d   x y pi pha    cir 512 512 .1 
even though the row contains a fully qualified pathname as the file value. Once again, values of all non-blank columns are saved, and the first match terminates the search.

3. If neither a view or a view match has been found, then a simple template match is attempted against the view values. Template matching supports a simplified version of file globbing (not a regular expression), with support for a single "*" (all characters), "?" (single character), or "[...]" (range) specification.

4. If no template match was found on the view column, then a simple template match is attempted against the file columns.

5. If no match is found, then the filename (minus the "v:" prefix) is returned.

More on View Matching Rules: Single vs. Multiple Matches

The matching rules described above stop after the first match, regardless of whether that match provides values for all three parameters (filter, columns, and format). In cases where a view or file match does not provide all three values, it is possible that a template match might do so. With regard to the example View database above, the x1 View provides only a filter, while omitting both the format and columns values. But note that the final rows in the database could provide the values via a template match on the filename. This sort of multiple matching is especially valuable in order to provide "global" values to several Views.

Obviously, multiple matching might not be wanted in every case. Therefore, we support both multiple matching and single matching according to the value of the FUN_VIEWMATCH environment variable. If the FUN_VIEWMATCH environment variable exists and if its value begins with "s", then a single match is used and missing parameters are not filled in with subsequent template matches on the file name. That is, matching rules above are followed exactly as explained above. If the value of this environment variable begins with "m" (or does not exist), then multiple matches are used to try to fill in missing parameters. In this case, template matching always takes place and missing values are taken from these template matches.

Thus, in the example above, the View specification:

  fundisp v:x1
will take the file name and filter value from the x1 View:
  x1      ${HOME}/data/snr.ev                           cir 512 512 .1 
The column value then will be taken from the "*.ev" file template match against the x1 file name:
          *.ev                            x y pi pha
Note once again that order is important: missing values are taken in the order in which the template matches are processed.

View Lists: Applying a View to Any File

It is possible to apply a named View, or even several Views, to any data file by appending a viewlist immediately after the standard "v:" prefix. A viewlist takes the form:

  :v1,v2,...vn:
where v1, v2, etc. are named Views. The two ":" colon characters surrounding the list are required. Thus, the syntax for applying a viewlist to a file is:
  v::view1,view2,...viewn:filename
Note that the name after the last ":" is assumed to be a file; it is not permissible (or sensible) to use a View name.

For example, the View specification:

  fundisp v::x2:foo
applies the x2 View to the file foo (even if there is a View named foo) and (in using our example database) is equivalent to:
  ./fundisp foo'[cir 512 512 .1] "x y pi pha"
The same command can be effected using a list of Views:
  fundisp v::x1,x1a:foo

What happens if a viewlist is used and the file also matches a template? Consider, for example, this View specification:

  fundisp v::x2:foo.fit
Here, the x2 View will supply filter and column values, while the template *.fit can also supply (different) filter and column values. In this case, the explicitly specified Views of the viewlist trump the matched view values.

On the other hand, if a file template match can supply a View value that is not supplied by the viewlist, then that value will be taken from the file template match. For example:

  fundisp v::x2:foo.fits
does not explicitly supply a format value, but the file match on *.fits can and does. You can avoid supplying missing values using file template matching by replacing the first ":" with a "-" in a viewlist specification:
  fundisp v:-x2:foo.fits
The use of ":+" to explicitly allow file template matching is also supported, but is the same as the default case. Note that the nuances of viewlist support are subject to change as our experience and understanding grow.

Overriding Values Associated with a View

To override values associated with a View, simply supply the override values in the correct place on the command line. Thus, given the example database described above, the command:

  fundisp v:x3
specifies that the View named x3, along with its file name and associated parameters, be processed as the input file to fundisp in this way:
  fundisp  -f "I=%4d" ${HOME}/data/snr.ev'[cir 512 512 .1]'  "x y pi pha"
To override one or more of these values, simply specify a new value for the format, filter, or columns. For example, if your input View file contains a filter, then the View will use that filter as an override of the View filter:
  fundisp v:x3'[cir 400 400 3]'
will use the columns and format of the x3 View but not the x3 filter. Further examples are:
  fundisp v:x3 "x y dx dy"    # activate a different set of columns
  fundisp -f "I=%3d" v:x3     # use a different format statement

Note that extension names, extension index values, and other non-filter specifications do not override the View filter. Thus:

  fundisp v:foo.fit[3]
will still use the filter associated with the .fit template (see above), since the "3" is an extension index, not a filter.

Environment Variables

The following environment variables are used by Funtools Views:
FUN_VIEWNAME
The FUN_VIEWNAME environment variable specifies the name and location of the View database file. If not present, the files ./.funtools.vu and $HOME/.funtools.vu are searched for, in that order.
FUN_VIEWMATCH
The FUN_VIEWMATCH environment variable specifies whether a single match or multiple match algorithm is used to locate parameter values. If the value of this environment variable begins with "s", then a single match is used and missing parameters are not filled in with subsequent template matches on the file name. If the value begins with "m", then multiple matches are used to try to fill in missing parameters. The default is to use multiple matches.

Restrictions and Problems

Support for overriding a filter (while not overriding extension names, extension indexes, etc.) requires that we can sense the presence of a filter in a bracket specification. It is unclear yet whether our algorithm is perfect.

Go to Funtools Help Index

Last updated: August 3, 2007
funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/faq/000077500000000000000000000000001256243640000212455ustar00rootroot00000000000000funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/faq/Makefile.in000066400000000000000000000076061256243640000233230ustar00rootroot00000000000000# # This is a Makefile for the Funtools testing. If it has the name "Makefile.in" # then it is a template for a Makefile; to generate the actual Makefile, # run "./configure", which is a configuration script generated by the # "autoconf" program (constructs like "@foo@" will get replaced in the # actual Makefile. # #---------------------------------------------------------------- # Things you can change to personalize the Makefile for your own # site (you can make these changes in either Makefile.in or # Makefile, but changes to Makefile will get lost if you re-run # the configuration script). #---------------------------------------------------------------- # Default top-level directories in which to install architecture- # specific files (exec_prefix) and machine-independent files such # as scripts (prefix). The values specified here may be overridden # at configure-time with the --exec-prefix and --prefix options # to the "configure" script. prefix = @prefix@ exec_prefix = @exec_prefix@ # The following definition can be set to non-null for special systems # like AFS with replication. It allows the pathnames used for installation # to be different than those used for actually reference files at # run-time. INSTALL_ROOT is prepended to $prefix and $exec_prefix # when installing files. INSTALL_ROOT = # extra includes for compiling INCLUDES = -I. -I$(prefix)/include # extra libs EXTRA_LIBS = @EXTRA_LIBS@ # the full set of libraries for linking LIBS = -L.. -lfuntools $(EXTRA_LIBS) -lm # To change the compiler switches, for example to change from -O # to -g, change the following line: CFLAGS = @CFLAGS@ # To add ld switches, change the following line: LDFLAGS = @LDFLAGS@ # Some versions of make, like SGI's, use the following variable to # determine which shell to use for executing commands: SHELL = /bin/sh # extra modules added by configure.in to fix OS bugs EXTRA_OBJS = @EXTRA_OBJS@ # There are just too many different versions of "install" around; # better to use the install-sh script that comes with the distribution, # which is slower but guaranteed to work. INSTALL = @srcdir@/install-sh -c INSTALL_PROGRAM = ${INSTALL} INSTALL_DATA = ${INSTALL} -m 644 #---------------------------------------------------------------- # The information below is modified by the configure script when # Makefile is generated from Makefile.in. You shouldn't normally # modify any of this stuff by hand. #---------------------------------------------------------------- AC_FLAGS = @DEFS@ RANLIB = @RANLIB@ # web site for installation WEBDIR = /proj/rd/www/funtools #---------------------------------------------------------------- # The information below should be usable as is. The configure # script won't modify it and you shouldn't need to modify it # either. #---------------------------------------------------------------- CC = @CC@ CC_SWITCHES = ${CFLAGS} ${INCLUDES} ${AC_FLAGS} DEPEND_SWITCHES = ${CFLAGS} ${INCLUDES} ${AC_FLAGS} PROGS = tev tim all: $(PROGS) tev: tev.o $(CC) $(LDFLAGS) tev.o -o tev $(LIBS) tim: tim.o $(CC) $(LDFLAGS) tim.o -o tim $(LIBS) Makefile: Makefile.in $(SHELL) config.status RM = rm -f clean: $(RM) *.a *.so *.o *.exe core errs *pure* .nfs* \ foo* *~ *.log \#* TAGS *.E a.out errors \ $(PROGS) $(TESTPROGS) \ gmon.out *.pg *.bak \ config.info config.log \ *fun*.out doc/*~ $(RM) -r autom4te.cache distclean: clean $(RM) Makefile config.status config.cache config.log install: @echo "Nothing to install in faq" www: -@( if [ -d ${WEBDIR} ]; then \ echo "installing in Web site: ${WEBDIR}"; \ mkdir -p ${WEBDIR}/faq; \ cp -p *.html ${WEBDIR}/faq/.; \ else \ echo "Web site not available for install"; \ fi;) pclean: $(RM) $(PROGS) depend: makedepend -- $(DEPEND_SWITCHES) -- $(SRCS) evread.o: evread.c $(CC) -c $(CC_SWITCHES) evread.c # DO NOT DELETE THIS LINE -- make depend depends on it. funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/faq/faq.html000066400000000000000000000030751256243640000227070ustar00rootroot00000000000000Funtools FAQ

Welcome to the Funtools FAQ

The primary home page for this FAQ is http://hea-www.harvard.edu/saord/funtools/faq/faq.html.

  1. Retrieving and Installing Funtools
    1. Where can I get funtools?
    2. How do I build funtools?
    3. What secondary build options might be useful?
  2. Programming with Funtools
    1. What are the compile/link commands for various platforms?
    2. What is the simplest possible program?
    3. Working with Binary Tables (Event Files)
      1. How do I read and display events?
      2. How do I change the values of a single column for all events?
      3. How do I process events based on the region each is in?
      4. How do I make a FITS event file from a non-FITS source (and add my own params)?
    4. Working with Images
      1. How do I process an image in double float format?
      2. How do I process an image in its native format?
  3. Funtools Analysis Programs
    1. What programs are available and what do they do?
  4. Using Filters and Regions
    1. Please show how to use column and regions filters
funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/faq/faq1.html000066400000000000000000000021771256243640000227720ustar00rootroot00000000000000Funtools FAQ: Installing
  1. Where can I get funtools?

    Funtools is available at: http://hea-www.harvard.edu/saord/funtools.

  2. How do I build funtools?

    ./configure --prefix="install_root"	# site-specific configuration
    make			                # build the software
    make install		                # install it
    make clean		                # clean up unneeded temp files
    
  3. What secondary build options might be useful?

    # specify root dir to install funtools executables, libraries, man pages, etc.
    # default is to install in /usr/local
    configure --prefix="install_root"
    
    # create funtools as a shared library
    configure --enable-shared=yes
    
    # create funtools as a shared library and use it to link funtools itself
    configure --enable-shared=link
    
    # gcc: enable support for files larger than 2 Gb
    configure CFLAGS="-D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64"
    
funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/faq/faq2.html000066400000000000000000000244551256243640000227760ustar00rootroot00000000000000Funtools FAQ: Programming
  1. What are the compile/link commands for various platforms?

    Assuming, for example, that funtools is installed in /soft/saord and that gcc is the compiler being used:

    1. Linux:
      gcc -g -I/soft/saord/include -c -o foo.o foo.c
      gcc -g foo.o -o foo -L/soft/saord/lib -lfuntools -ldl -lm
      
    2. Apple OS X:
      gcc -g -no-cpp-precomp -fno-common -I/soft/saord/include -c -o foo.o foo.c
      gcc -g foo.o -o foo -L/soft/saord/lib -lfuntools -lm
      
    3. Sun Solaris:
      gcc -g -no-cpp-precomp -fno-common -I/soft/saord/include -c -o foo.o foo.c
      gcc -g foo.o -o foo -L/soft/saord/lib -lfuntools -lsocket -lnsl -ldl -lm
      
  2. What is the simplest possible program?

    #include <stdlib.h>
    #include <funtools.h>
    
    int main(int argc, char **argv)
    {
      Fun fun;
    
      /* sanity check */
      if( argc < 2 ) return 1;
      /* open file for reading */
      if( !(fun=FunOpen(argv[1], "r", NULL)) ){
        fprintf(stderr, "ERROR: can't open funtools file: %s\n", argv[1]);
        return 1;
      }
      /* close file */
      FunClose(fun);
      return 0;
    }
    
  3. How do I read and display events?

    #
    #include <stdlib.h>
    #include <funtools.h>
    
    typedef struct evstruct{
      double x, y;
      int pi, pha;
    } *Ev, EvRec;
    
    int main(int argc, char **argv)
    {
      int i, got;
      int maxrow=1024;
      Ev ev, ebuf=NULL;
      Fun fun;
    
      /* sanity check */
      if( argc < 2 ) return 1;
      /* open file for reading */
      if( !(fun=FunOpen(argv[1], "r", NULL)) ){
        fprintf(stderr, "ERROR: can't open funtools file: %s\n", argv[1]);
        return 1;
      }
      /* select columns to read (and data types to convert to) */
      got = FunColumnSelect(fun, sizeof(EvRec), NULL,
    			"x",       "D", "r", FUN_OFFSET(Ev, x),
    			"y",       "D", "r", FUN_OFFSET(Ev, y),
    			"pha",     "J", "r", FUN_OFFSET(Ev, pha),
    			"pi",      "J", "r", FUN_OFFSET(Ev, pi),
    			NULL);
      /* read and process events */
      while( (ebuf=(void *)FunTableRowGet(fun, NULL, maxrow, NULL, &got)) && got ){
        for(i=0; i<got; i++){
          ev = (Ev)ebuf+i;
          fprintf(stdout, "%.1f %.1f %d %d\n", ev->x, ev->y, ev->pha, ev->pi);
        }
        if( ebuf) free(ebuf);
      }
      /* close file */
      FunClose(fun);
      return 0;
    }
    
  4. How do I change the value of a single column in all events?

    #include <stdlib.h>
    #include <funtools.h>
    
    typedef struct evstruct{
      int pi;
    } *Ev, EvRec;
    
    int main(int argc, char **argv)
    {
      int i, got;
      int maxrow=1024;
      Ev ev, ebuf=NULL;
      Fun fun, ofun;
    
      /* sanity check */
      if( argc < 3 ) return 1;
      /* open file for reading */
      if( !(fun=FunOpen(argv[1], "r", NULL)) ){
        fprintf(stderr, "ERROR: can't open input funtools file: %s\n", argv[1]);
        return 1;
      }
      /* open output file and inherit header params, columns, etc. from input */
      if( !(ofun=FunOpen(argv[2], "w", fun)) ){
        fprintf(stderr, "ERROR: can't open output funtools file: %s\n", argv[2]);
        return 1;
      }
      /* select columns to read (and data types to convert to) */
      /* use "merge=update" to change value while keeping original data type */
      /* use "merge=replace" to change boh the value and data type */
      got = FunColumnSelect(fun, sizeof(EvRec), "merge=update",
    			"pi",     "J", "rw", FUN_OFFSET(Ev, pi),
    			NULL);
      /* read and process events */
      while( (ebuf=(void *)FunTableRowGet(fun, NULL, maxrow, NULL, &got)) && got ){
        for(i=0; i<got; i++){
          ev = (Ev)ebuf+i;
          ev->pi = ev->pi + 1;
        }
        /* write rows to output file */
        if( FunTableRowPut(ofun, ebuf, got, 0, NULL) != got ){
          fprintf(stderr, "ERROR: writing to funtools file: %s\n", argv[2]);
          return 1;
        }
        if( ebuf) free(ebuf);
      }
      /* close files */
      FunClose(ofun);
      FunClose(fun);
      return 0;
    }
    
  5. How do I process events based on the region each is in?

    #include <stdlib.h>
    #include <funtools.h>
    
    typedef struct evstruct{
      int x, y;
      int pi, pha;
      int region;
    } *Ev, EvRec;
    
    int main(int argc, char **argv)
    {
      int i, got;
      int maxrow=1024;
      Ev ev, ebuf=NULL;
      Fun fun;
    
      /* sanity check */
      if( argc < 2 ) return 1;
      /* open file for reading */
      if( !(fun=FunOpen(argv[1], "r", NULL)) ){
        fprintf(stderr, "ERROR: can't open funtools file: %s\n", argv[1]);
        return 1;
      }
      /* select columns to read (and data types to convert to) */
      /* specifying $REGION will retrieve the one-indexed region number */
      /* events passing the filter but not in a region will have value -1 */
      got = FunColumnSelect(fun, sizeof(EvRec), NULL,
    			"x",       "J", "r", FUN_OFFSET(Ev, x),
    			"y",       "J", "r", FUN_OFFSET(Ev, y),
    			"pha",     "J", "r", FUN_OFFSET(Ev, pha),
    			"pi",      "J", "r", FUN_OFFSET(Ev, pi),
    			"$REGION", "J", "r", FUN_OFFSET(Ev, region),
    			NULL);
      /* read and process events */
      while( (ebuf=(void *)FunTableRowGet(fun, NULL, maxrow, NULL, &got)) && got ){
        for(i=0; i<got; i++){
          ev = (Ev)ebuf+i;
          fprintf(stdout, "%4d %4d %3d %3d %4d\n", 
    	      ev->x, ev->y, ev->pha, ev->pi, ev->region);
        }
        if( ebuf) free(ebuf);
      }
      /* close file */
      FunClose(fun);
      return 0;
    }
    
  6. How do I make a FITS event file from a non-FITS source (and add my own params)?

    #include <stdlib.h>
    #include <funtools.h>
    
    typedef struct evstruct{
      int x, y;
      int pha;
      float pi;
    } *Ev, EvRec;
    
    int main(int argc, char **argv)
    {
      int i, nev;
      int pmod=16, put=1;
      double pinc=0.1234;
      char xbuf[32], ybuf[32];
      Ev ev;
      Fun ofun;
    
      /* sanity check */
      if( argc < 3 ) return 1;
      /* open new file for writing */
      if( !(ofun=FunOpen(argv[1], "w", NULL)) ){
        fprintf(stderr, "ERROR: can't open funtools file: %s\n", argv[1]);
        return 1;
      }
      if( (nev = atoi(argv[2])) <=0 ) return 1;
      ev = (Ev)calloc(1, sizeof(EvRec));
      /* The pair of numeric values specify the data value range, used to bin
         x, y into an image. They are permitted but not needed for pi and pha */
      sprintf(xbuf, "J:1:%d", nev);
      sprintf(ybuf, "J:1:%d", nev);
      /* select columns to write */
      FunColumnSelect(ofun, sizeof(EvRec), NULL,
    		  "x",   xbuf,      "w", FUN_OFFSET(Ev, x),
    		  "y",   ybuf,      "w", FUN_OFFSET(Ev, y),
    		  "pha", "J:1:16",  "w", FUN_OFFSET(Ev, pha),
    		  "pi",  "E",       "w", FUN_OFFSET(Ev, pi),
    		  NULL);
      /* write params to header; generally added before first event is written */
      FunParamPuti(ofun, "PMOD",  0, pmod,  "modulus for pha generation", 1);
      FunParamPutd(ofun, "PINC",  0, pinc,  7, "increment for pi generation", 1);
      /* make up events */
      for(i=1; i<=nev; i++){
        ev->x = i; ev->y = nev-i+1; ev->pha = i % pmod; ev->pi = ev->pha + pinc;
        /* write rows to output file -- this can be done in batches, of course */
        if( FunTableRowPut(ofun, ev, put, 0, NULL) != put ){
          fprintf(stderr, "ERROR: writing to funtools file: %s\n", argv[1]);
          return 1;
        }
      }
      if( ev) free(ev);
      /* close file */
      FunClose(ofun);
      return 0;
    }
    
  7. How do I process an image in double float format?

    #include <stdlib.h>
    #include <funtools.h>
    
    int main(int argc, char **argv)
    {
      int i, j, dim1, dim2;
      double *buf;
      Fun fun;
    
      /* sanity check */
      if( argc < 2 ) return 1;
      /* open file for reading */
      if( !(fun=FunOpen(argv[1], "r", NULL)) ){
        fprintf(stderr, "ERROR: can't open funtools file: %s\n", argv[1]);
        return 1;
      }
      /* extract (and bin, if necessary) data into a double prec. image buffer */
      if( !(buf = FunImageGet(fun, NULL, "bitpix=-64")) ){
        fprintf(stderr, "ERROR: can't get image: %s\n", argv[1]);
        return 1;
      }
      /* get image dimensions after FunImageGet, in case an image section
         was specified on the command line, which changes image dimensions */
      FunInfoGet(fun, FUN_SECT_DIM1, &dim1, FUN_SECT_DIM2, &dim2, 0);
      /* loop through image */
      for(i=0; i<dim2; i++){
        for(j=0; j<dim1; j++){
          fprintf(stdout, "%.1f ", buf[i*dim1+j]);
        }
        fprintf(stdout, "\n");
      }
      /* close file */
      FunClose(fun);
      return 0;
    }
    
  8. How do I process an image in its native format?
    #include <funtools.h>
    
    int main(int argc, char **argv)
    {
      int i, j, bitpix, dim1, dim2;
      double *buf;
      unsigned char *cbuf;
      short *sbuf;
      int *ibuf;
      float *fbuf;
      double *dbuf;
      Fun fun;
    
      /* sanity check */
      if( argc < 2 ) return 1;
      /* open file for reading */
      if( !(fun=FunOpen(argv[1], "r", NULL)) ){
        fprintf(stderr, "ERROR: can't open funtools file: %s\n", argv[1]);
        return 1;
      }
      /* extract (and bin, if necessary) data into a buffer whose
         data type is not specified and therefore is that of the file */
      if( !(buf = FunImageGet(fun, NULL, NULL)) ){
        fprintf(stderr, "ERROR: can't get image: %s\n", argv[1]);
        return 1;
      }
      /* get image dimensions after FunImageGet, in case an image section
         was specified on the command line, which changes image dimensions */
      FunInfoGet(fun, FUN_SECT_BITPIX, &bitpix, 
    	     FUN_SECT_DIM1, &dim1, FUN_SECT_DIM2, &dim2, 0);
      /* set appropriate data type buffer to point to image buffer */
      switch(bitpix){
        case 8:   cbuf = (unsigned char *)buf; break;
        case 16:  sbuf = (short *)buf;         break;
        case 32:  ibuf = (int *)buf;           break;
        case -32: fbuf = (float *)buf;         break;
        case -64: dbuf = (double *)buf;        break;
      }
      /* loop through image */
      for(i=0; i<dim2; i++){
        for(j=0; j<dim1; j++){
          switch(bitpix){
            case 8:   fprintf(stdout, "%4d ",  cbuf[i*dim1+j]);  break;
            case 16:  fprintf(stdout, "%6d ",  sbuf[i*dim1+j]);  break;
            case 32:  fprintf(stdout, "%9d ",  ibuf[i*dim1+j]);  break;
            case -32: fprintf(stdout, "%.2f ", fbuf[i*dim1+j]);  break;
            case -64: fprintf(stdout, "%.6f ", dbuf[i*dim1+j]);  break;
          }
        }
        fprintf(stdout, "\n");
      }
      /* close file */
      FunClose(fun);
      return 0;
    }
    
funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/faq/faq3.html000066400000000000000000000017161256243640000227720ustar00rootroot00000000000000Funtools FAQ: Programs
  1. What programs are available and what do they do?

    1. funcalc: funtools calculator (for binary tables)
    2. funcen: find centroid (for binary tables)
    3. funcnts: count photons in specified regions with background subtraction
    4. funcone: cone search on RA, Dec columns
    5. fundisp: display data in a funtools data file
    6. funhead: display a header in a funtools file
    7. funhist: create a 1D histogram of a column
    8. funimage: create a FITS image from a funtools data file
    9. funindex: create a index on a column in a binary table
    10. funjoin: join two or more FITS binary tables on specified columns
    11. funmerge: merge one or more funtools table files
    12. funsky: convert between image and sky coodinates, using WCS info from a FITS header
    13. funtable: copy selected rows from a funtools file to a FITS binary table
    14. funtbl: extract a table (obsolete)
funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/faq/faq4.html000066400000000000000000000164041256243640000227730ustar00rootroot00000000000000Funtools FAQ: Filtering

NB: column filters work on tables only. Regions work on tables and images.

  1. Please show how to use column and regions filters

    1. Filter events through a circular region using physical pixels
      fundisp foo.fits'[circle(512,512,.5)]'
       
         X    Y PHA  PI                  TIME   DX   DY
      ---- ---- --- --- --------------------- ---- ----
       512  512   6   7     79493997.45854475  578  574
       512  512   8   9     79494575.58943175  579  573
       512  512   5   6     79493631.03866175  578  575
       512  512   5   5     79493290.86521725  578  575
       512  512   8   9     79493432.00990875  579  573
      
    2. Filter events through a circular region, for a single value of pha
      fundisp foo.fits'[circle 512 512 .5 && pha==5]'
       
         X    Y PHA  PI                  TIME   DX   DY
      ---- ---- --- --- --------------------- ---- ----
       512  512   5   6     79493631.03866175  578  575
       512  512   5   5     79493290.86521725  578  575
      
    3. Filter events through a circular region, including a range of pha values
      fundisp foo.fits'[circle(512,512,.5)&&pha=5:6]'
       
         X    Y PHA  PI                  TIME   DX   DY
      ---- ---- --- --- --------------------- ---- ----
       512  512   6   7     79493997.45854475  578  574
       512  512   5   6     79493631.03866175  578  575
       512  512   5   5     79493290.86521725  578  575
      
    4. Filter events through a circular region, excluding a range of pha values
      fundisp foo.fits'[circle(512,512,.5)&&\!pha=5:6]'
       
         X    Y PHA  PI                  TIME   DX   DY
      ---- ---- --- --- --------------------- ---- ----
       512  512   8   9     79494575.58943175  579  573
       512  512   8   9     79493432.00990875  579  573
      
    5. Filter events through two circular regions
      fundisp foo.fits'[circle(512,512,.5); circle 500 500 .1]'
       
         X    Y PHA  PI                  TIME   DX   DY
      ---- ---- --- --- --------------------- ---- ----
       500  500   5   5     79493733.05197725  600  577
       500  500   9   9     79488217.13936825  600  576
       500  500   2   2     79487590.99904275  599  581
       512  512   6   7     79493997.45854475  578  574
       512  512   8   9     79494575.58943175  579  573
       512  512   5   6     79493631.03866175  578  575
       512  512   5   5     79493290.86521725  578  575
       512  512   8   9     79493432.00990875  579  573
      
    6. Filter events through a circular region, selecting a single time value
      fundisp foo.fits'[circle(512,512,.5)&&time==79493631.03866175]'
       
         X    Y PHA  PI                  TIME   DX   DY
      ---- ---- --- --- --------------------- ---- ----
       512  512   5   6     79493631.03866175  578  575
      
    7. Filter events through a circular region, selecting a single time value (but using feq to avoid possible precision problems)
      fundisp foo.fits'[circle(512,512,.5)&&feq(time,79493631.03866175)]'
       
         X    Y PHA  PI                  TIME   DX   DY
      ---- ---- --- --- --------------------- ---- ----
       512  512   5   6     79493631.03866175  578  575
      
    8. Filter events through a circular region, while excluding an inner circle
      fundisp foo.fits'[circle(512,512,1);-cir 512 512 .5]'
       
         X    Y PHA  PI                  TIME   DX   DY
      ---- ---- --- --- --------------------- ---- ----
       512  511   9   9     79492909.11908525  580  572
       512  511   6   7     79492607.35239075  580  573
       512  511   6   7     79493574.08603576  580  573
       512  511   7   8     79488537.75487424  579  572
       511  512   5   5     79488781.64644176  579  576
       511  512   5   6     79492586.05470325  579  576
       511  512  10  10     79494397.55842775  580  574
       511  512   1   2     79493697.87522624  577  582
       511  512   6   7     79493997.75123225  579  575
       511  512  10  11     79487417.67703976  579  574
       513  512   6   6     79493306.47509325  578  573
       513  512   8   8     79487909.39373726  578  572
       512  513   4   4     79487403.52010125  576  577
       512  513   8   9     79492536.31151475  577  574
       512  513  10  10     79492589.71195325  578  574
       512  513   5   5     79488335.19512025  576  575
       512  513   8   8     79493661.25728776  578  574
       512  513   8   9     79487914.98186225  577  574
       512  513   5   5     79487392.91247626  577  576
       512  513   4   4     79492808.24789475  577  576
       512  513   7   8     79493236.90765475  577  574
       512  513   6   7     79493667.65710025  578  574
      
    9. Filter events through a circular region for a range of pha, while excluding an inner circle
      fundisp foo.fits'[circle(512,512,1)&&pha=6:7;-cir 512 512 .5]'
       
         X    Y PHA  PI                  TIME   DX   DY
      ---- ---- --- --- --------------------- ---- ----
       512  511   6   7     79492607.35239075  580  573
       512  511   6   7     79493574.08603576  580  573
       512  511   7   8     79488537.75487424  579  572
       511  512   6   7     79493997.75123225  579  575
       513  512   6   6     79493306.47509325  578  573
       512  513   7   8     79493236.90765475  577  574
       512  513   6   7     79493667.65710025  578  574
      
    10. Filter events through a circular region for ranges of pha and pi, while excluding an inner circle
      fundisp foo.fits'[circle(512,512,1)&&pha=5:7 && pi=6:8;-cir 512 512 .5]'
       
         X    Y PHA  PI                  TIME   DX   DY
      ---- ---- --- --- --------------------- ---- ----
       512  511   6   7     79492607.35239075  580  573
       512  511   6   7     79493574.08603576  580  573
       512  511   7   8     79488537.75487424  579  572
       511  512   5   6     79492586.05470325  579  576
       511  512   6   7     79493997.75123225  579  575
       513  512   6   6     79493306.47509325  578  573
       512  513   7   8     79493236.90765475  577  574
       512  513   6   7     79493667.65710025  578  574
      
    11. Filter events through a circular region in fk5 coords (degrees)
      fundisp foo.fits'[fk5;circle(345.25391,58.879774,3.9999997")]'
       
         X    Y PHA  PI                  TIME   DX   DY
      ---- ---- --- --- --------------------- ---- ----
       512  512   6   7     79493997.45854475  578  574
       512  512   8   9     79494575.58943175  579  573
       512  512   5   6     79493631.03866175  578  575
       512  512   5   5     79493290.86521725  578  575
       512  512   8   9     79493432.00990875  579  573
      
    12. Filter events through a circular region retrieved from ds9
      cat foo.reg
      # Region file format: DS9 version 4.0
      # Filename: foo.fits'[EVENTS]'
      global color=green font="helvetica 10 normal" select=1 highlite=1 edit=1 move=1 delete=1 include=1 fixed=0 source
      fk5
      circle(345.25391,58.879774,3.9999997")
      
      fundisp foo.fits'[@foo.reg]'
       
         X    Y PHA  PI                  TIME   DX   DY
      ---- ---- --- --- --------------------- ---- ----
       512  512   6   7     79493997.45854475  578  574
       512  512   8   9     79494575.58943175  579  573
       512  512   5   6     79493631.03866175  578  575
       512  512   5   5     79493290.86521725  578  575
       512  512   8   9     79493432.00990875  579  573
      
      
funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/faq/tdisp000077500000000000000000000004121256243640000223130ustar00rootroot00000000000000#!/bin/sh if [ ! -r foo.fits ]; then ln -s $HOME/data/snr.ev foo.fits fi FUN_FORMAT='x=%4d y=%4d pha=%3d pi=%3d dx=%4d dy=%4d' export FUN_FORMAT echo fundisp foo.fits"'[$1]'" | tee foo.log echo " " | tee -a foo.log ../fundisp foo.fits"[$1]" | tee -a foo.log funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/faq/tev.c000066400000000000000000000032701256243640000222110ustar00rootroot00000000000000#include #include typedef struct evstruct{ int x, y; int pha; float pi; int region; } *Ev, EvRec; int main(int argc, char **argv) { int i, nev; int pmod=16, put=1; double pinc=0.1234; char xbuf[32], ybuf[32]; Ev ev; Fun ofun; /* sanity check */ if( argc < 3 ) return 1; /* open new file for writing */ if( !(ofun=FunOpen(argv[1], "w", NULL)) ){ fprintf(stderr, "ERROR: can't open funtools file: %s\n", argv[1]); return 1; } if( (nev = atoi(argv[2])) <=0 ) return 1; ev = (Ev)calloc(1, sizeof(EvRec)); /* The pair of numeric values specify the data value range, used to bin x, y into an image. They are permitted but not needed for pi and pha */ sprintf(xbuf, "J:1:%d", nev); sprintf(ybuf, "J:1:%d", nev); /* select columns to write */ FunColumnSelect(ofun, sizeof(EvRec), NULL, "x", xbuf, "w", FUN_OFFSET(Ev, x), "y", ybuf, "w", FUN_OFFSET(Ev, y), "pha", "J:1:16", "w", FUN_OFFSET(Ev, pha), "pi", "E", "w", FUN_OFFSET(Ev, pi), NULL); /* write params to header; generally added before first event is written */ FunParamPuti(ofun, "PMOD", 0, pmod, "modulus for pha generation", 1); FunParamPutd(ofun, "PINC", 0, pinc, 7, "increment for pi generation", 1); /* make up events */ for(i=1; i<=nev; i++){ ev->x = i; ev->y = nev-i+1; ev->pha = i % pmod; ev->pi = ev->pha + pinc; /* write rows to output file -- this can be done in batches, of course */ if( FunTableRowPut(ofun, ev, put, 0, NULL) != put ){ fprintf(stderr, "ERROR: writing to funtools file: %s\n", argv[1]); return 1; } } if( ev) free(ev); /* close file */ FunClose(ofun); return 0; } funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/faq/tfaq.c000066400000000000000000000020771256243640000223520ustar00rootroot00000000000000#include typedef struct evstruct{ int pi; } *Ev, EvRec; int main(int argc, char **argv) { int i, got; int maxrow=1024; Ev ev, ebuf=NULL; Fun fun, ofun; /* open file for reading */ if( !(fun=FunOpen(argv[1], "r", NULL)) ){ fprintf(stderr, "ERROR: can't open input funtools file: %s\n", argv[1]); return 1; } if( !(ofun=FunOpen(argv[2], "w", fun)) ){ fprintf(stderr, "ERROR: can't open output funtools file: %s\n", argv[2]); return 1; } /* select columns to read (and data types to convert to) */ got = FunColumnSelect(fun, sizeof(EvRec), "merge=update", "pi", "J", "rw", FUN_OFFSET(Ev, pi), NULL); /* read and process events */ while(ebuf=(void *)FunTableRowGet(fun, NULL, maxrow, NULL, &got) ){ for(i=0; ipi = ev->pi + 1; } if( FunTableRowPut(ofun, ebuf, got, 0, NULL) != got ){ fprintf(stderr, "ERROR: writing to funtools file: %s\n", argv[2]); return 1; } if( ebuf) free(ebuf); } /* close files */ FunClose(ofun); FunClose(fun); } funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/faq/tim.c000066400000000000000000000034101256243640000222000ustar00rootroot00000000000000#include int main(int argc, char **argv) { int i, j, bitpix, dim1, dim2; double *buf; unsigned char *cbuf; short *sbuf; int *ibuf; float *fbuf; double *dbuf; Fun fun; /* sanity check */ if( argc < 2 ) return 1; /* open file for reading */ if( !(fun=FunOpen(argv[1], "r", NULL)) ){ fprintf(stderr, "ERROR: can't open funtools file: %s\n", argv[1]); return 1; } /* extract (and bin, if necessary) data into a double prec. image buffer */ /* data type is not specified and therefore is that of the file */ if( !(buf = FunImageGet(fun, NULL, NULL)) ){ fprintf(stderr, "ERROR: can't get image: %s\n", argv[1]); return 1; } /* get image dimensions after FunImageGet, in case an image section was specified on the command line, which changes image dimensions */ FunInfoGet(fun, FUN_SECT_BITPIX, &bitpix, FUN_SECT_DIM1, &dim1, FUN_SECT_DIM2, &dim2, 0); /* set appropriate data type buffer to point to image buffer */ switch(bitpix){ case 8: cbuf = (unsigned char *)buf; break; case 16: sbuf = (short *)buf; break; case 32: ibuf = (int *)buf; break; case -32: fbuf = (float *)buf; break; case -64: dbuf = (double *)buf; break; } /* loop through image */ for(i=0; i regions_h.h xalloc_c.h: ../util/xalloc.c inc.sed $(RM) xalloc_c.h ./inc.sed XALLOC_C < ../util/xalloc.c > xalloc_c.h swap_c.h: swap.c inc.sed $(RM) swap_c.h ./inc.sed SWAP_C < swap.c > swap_c.h events_c.h: evfilter.c inc.sed $(RM) events_c.h ./inc.sed EVENTS_C < evfilter.c > events_c.h image_c.h: imfilter.c inc.sed $(RM) image_c.h ./inc.sed IMAGE_C < imfilter.c > image_c.h evregions.c: evregions_c.tmpl Makefile $(RM) evregions.c sed 's/_FPUDBL_/$(FPU_DOUBLE)/' < evregions_c.tmpl > evregions.c imregions.c: imregions_c.tmpl Makefile $(RM) imregions.c sed 's/_FPUDBL_/$(FPU_DOUBLE)/' < imregions_c.tmpl > imregions.c evregions_c.h: evregions.c inc.sed $(RM) evregions_c.h ./inc.sed EVREGIONS_C < evregions.c > evregions_c.h imregions_c.h: imregions.c inc.sed $(RM) imregions_c.h ./inc.sed IMREGIONS_C < imregions.c > imregions_c.h headers: regions_h.h xalloc_c.h swap_c.h \ events_c.h image_c.h evregions_c.h imregions_c.h # remake the parser LEX = flex -i parser: filt.l @($(LEX) -Pfilt filt.l; \ sed "s/yytext_ptr/filttext_ptr/g" < lex.filt.c > nlex.filt.c; \ mv nlex.filt.c lex.filt.c) iparser: idx.l @($(LEX) -Pidx idx.l; \ sed "s/yytext_ptr/idxtext_ptr/g" < lex.idx.c > nlex.idx.c; \ mv nlex.idx.c lex.idx.c) YACC = bison -d -v igrammar: idx.y $(YACC) -p idx idx.y pure: tfilt.pure tfilt.pure: $(FILDLIB) tfilt.o purify $(CC) $(LDFLAGS) tfilt.o -o tfilt.pure \ $(LIB) $(LIBS) # DO NOT DELETE THIS LINE -- make depend depends on it. funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/filter/ZHTODO000066400000000000000000000002141256243640000227120ustar00rootroot000000000000001. segments should be full statements 2. reverse order of segments 3. excludes are not moved to the end 4. allow specification of region id funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/filter/ac_c_long_long.m4000066400000000000000000000015641256243640000251560ustar00rootroot00000000000000##### http://autoconf-archive.cryp.to/ac_c_long_long.html # # SYNOPSIS # # AC_C_LONG_LONG # # DESCRIPTION # # Provides a test for the existance of the long long int type and # defines HAVE_LONG_LONG if it is found. # # LAST MODIFICATION # # 2006-10-30 # # COPYLEFT # # Copyright (c) 2006 Caolan McNamara # # Copying and distribution of this file, with or without # modification, are permitted in any medium without royalty provided # the copyright notice and this notice are preserved. AC_DEFUN([AC_C_LONG_LONG], [AC_CACHE_CHECK(for long long int, ac_cv_c_long_long, [if test "$GCC" = yes; then ac_cv_c_long_long=yes else AC_TRY_COMPILE(,[long long int i;], ac_cv_c_long_long=yes, ac_cv_c_long_long=no) fi]) if test $ac_cv_c_long_long = yes; then AC_DEFINE(HAVE_LONG_LONG, 1, [compiler understands long long]) fi ]) funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/filter/aclocal.m4000066400000000000000000000000431256243640000236200ustar00rootroot00000000000000builtin(include,ac_c_long_long.m4) funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/filter/addld000066400000000000000000000000571256243640000227600ustar00rootroot00000000000000setenv LD_LIBRARY_PATH "..:${LD_LIBRARY_PATH}" funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/filter/column.c000066400000000000000000000011431256243640000234230ustar00rootroot00000000000000/* * Copyright (c) 1999-2003 Smithsonian Astrophysical Observatory */ #include #ifdef ANSI_FUNC void ColumnLoad(char *ibuf, int size, int n, int convert, void *obuf) #else void ColumnLoad(ibuf, size, n, convert, obuf) char *ibuf; int size; int n; int convert; void *obuf; #endif { register char *iptr; register char *optr; int i, j; if( convert ){ optr = (char *)obuf; iptr = (char *)ibuf; for(i=0; i=0; j--){ *optr++ = *(iptr+j); } iptr += size; } } else{ memcpy(obuf, ibuf, n*size); } } funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/filter/column.h000066400000000000000000000006101256243640000234260ustar00rootroot00000000000000/* * Copyright (c) 1999-2003 Smithsonian Astrophysical Observatory */ /* * * column.h -- declarations for column processing * */ #ifndef __column_h #define __column_h #if HAVE_CONFIG_H #include "conf.h" #endif #ifdef HAVE_STRING_H #include #endif #include "prsetup.h" _PRbeg void ColumnLoad _PRx((char *ibuf, int size, int n, int convert, void *obuf)); _PRend #endif funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/filter/compat/000077500000000000000000000000001256243640000232465ustar00rootroot00000000000000funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/filter/compat/install-sh000077500000000000000000000112431256243640000252530ustar00rootroot00000000000000#!/bin/sh # # install - install a program, script, or datafile # This comes from X11R5. # # 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. # # 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}" tranformbasename="" transform_arg="" instcmd="$mvprog" chmodcmd="$chmodprog 0755" chowncmd="" chgrpcmd="" stripcmd="" rmcmd="$rmprog -f" mvcmd="$mvprog" src="" dst="" dir_arg="" while [ x"$1" != x ]; do case $1 in -c) instcmd="$cpprog" shift continue;; -d) dir_arg=true shift continue;; -m) chmodcmd="$chmodprog $2" shift shift continue;; -o) chowncmd="$chownprog $2" shift shift continue;; -g) chgrpcmd="$chgrpprog $2" shift shift continue;; -s) stripcmd="$stripprog" shift continue;; -t=*) transformarg=`echo $1 | sed 's/-t=//'` shift continue;; -b=*) transformbasename=`echo $1 | sed 's/-b=//'` shift continue;; *) if [ x"$src" = x ] then src=$1 else # this colon is to work around a 386BSD /bin/sh bug : dst=$1 fi shift continue;; esac done if [ x"$src" = x ] then echo "install: no input file specified" exit 1 else true fi if [ x"$dir_arg" != x ]; then dst=$src src="" if [ -d $dst ]; then instcmd=: else instcmd=mkdir fi else # Waiting for this to be detected by the "$instcmd $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if [ -f $src -o -d $src ] then true else echo "install: $src does not exist" exit 1 fi if [ x"$dst" = x ] then echo "install: no destination specified" exit 1 else true fi # If destination is a directory, append the input filename; if your system # does not like double slashes in filenames, you may need to add some logic if [ -d $dst ] then dst="$dst"/`basename $src` else true fi fi ## this sed command emulates the dirname command dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` # Make sure that the destination directory exists. # this part is taken from Noah Friedman's mkinstalldirs script # Skip lots of stat calls in the usual case. if [ ! -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 [ $# -ne 0 ] ; do pathcomp="${pathcomp}${1}" shift if [ ! -d "${pathcomp}" ] ; then $mkdirprog "${pathcomp}" else true fi pathcomp="${pathcomp}/" done fi if [ x"$dir_arg" != x ] then $doit $instcmd $dst && if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi else # If we're going to rename the final executable, determine the name now. if [ x"$transformarg" = x ] then dstfile=`basename $dst` else dstfile=`basename $dst $transformbasename | sed $transformarg`$transformbasename fi # don't allow the sed command to completely eliminate the filename if [ x"$dstfile" = x ] then dstfile=`basename $dst` else true fi # Make a temp file name in the proper directory. dsttmp=$dstdir/#inst.$$# # Move or copy the file name to the temp name $doit $instcmd $src $dsttmp && trap "rm -f ${dsttmp}" 0 && # 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 $instcmd $src $dsttmp" command. if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && # Now rename the file to the real destination. $doit $rmcmd -f $dstdir/$dstfile && $doit $mvcmd $dsttmp $dstdir/$dstfile fi && exit 0 funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/filter/conf.h.in000066400000000000000000000024041256243640000234660ustar00rootroot00000000000000/* Define as 1 if this compiler supports long long. */ #undef HAVE_LONG_LONG /* Define as 1 if you have string.h */ #undef HAVE_STRING_H /* Define as 1 if you have stdlib.h */ #undef HAVE_STDLIB_H /* Define as 1 if you have malloc.h */ #undef HAVE_MALLOC_H /* Define as 1 if you have unistd.h */ #undef HAVE_UNISTD_H /* Define as 1 if you have getopt.h */ #undef HAVE_GETOPT_H /* Define as 1 if you have values.h */ #undef HAVE_VALUES_H /* Define as 1 if you have dlfcn.h */ #undef HAVE_DLFCN_H /* Define as 1 if you have sys/un.h */ #undef HAVE_SYS_UN_H /* Define as 1 if you have sys/shm.h */ #undef HAVE_SYS_SHM_H /* Define as 1 if you have sys/mman.h */ #undef HAVE_SYS_MMAN_H /* Define as 1 if you have sys/ipc.h */ #undef HAVE_SYS_IPC_H /* Define as 1 if you have socklen_t */ #undef HAVE_SOCKLEN_T /* Define as 1 if you have strchr */ #undef HAVE_STRCHR /* Define as 1 if you have memcpy */ #undef HAVE_MEMCPY /* Define as 1 if you have snprintf */ #undef HAVE_SNPRINTF /* Define as 1 if you have Tcl */ #undef HAVE_TCL /* Define as 1 if you have Xt */ #undef HAVE_XT /* Define as 1 if you are running Cygwin. */ #undef HAVE_CYGWIN /* Define as 1 if you are running MinGW. */ #undef HAVE_MINGW32 /* Define if you have inline */ #undef inline funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/filter/config.guess000066400000000000000000001245261256243640000243120ustar00rootroot00000000000000#! /bin/sh # Attempt to guess a canonical system name. # Copyright 1992-2015 Free Software Foundation, Inc. timestamp='2015-02-23' # 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 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # 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. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # # Originally written by Per Bothner; maintained since 2000 by Ben Elliston. # # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD # # Please send patches to . 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 1992-2015 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 ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # 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 "$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 ; set_cc_for_build= ;' # 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 case "${UNAME_SYSTEM}" in Linux|GNU|GNU/*) # If the system lacks a compiler, then just pick glibc. # We could probably try harder. LIBC=gnu eval $set_cc_for_build cat <<-EOF > $dummy.c #include #if defined(__UCLIBC__) LIBC=uclibc #elif defined(__dietlibc__) LIBC=dietlibc #else LIBC=gnu #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC' | sed 's, ,,g'` ;; esac # 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 tuples: *-*-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=`(uname -p 2>/dev/null || \ /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 ;; sh5el) machine=sh5le-unknown ;; earmv*) arch=`echo ${UNAME_MACHINE_ARCH} | sed -e 's,^e\(armv[0-9]\).*$,\1,'` endian=`echo ${UNAME_MACHINE_ARCH} | sed -ne 's,^.*\(eb\)$,\1,p'` machine=${arch}${endian}-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*|earm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ 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 # Determine ABI tags. case "${UNAME_MACHINE_ARCH}" in earm*) expr='s/^earmv[0-9]/-eabi/;s/eb$//' abi=`echo ${UNAME_MACHINE_ARCH} | sed -e "$expr"` ;; 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}${abi}" exit ;; *:Bitrig:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE} exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; *:SolidBSD:*:*) echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; 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'` # Reset EXIT trap before exiting to avoid spurious non-zero exit code. exitcode=$? trap '' 0 exit $exitcode ;; 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 ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm*:riscos:*:*|arm*:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; 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 ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; s390x:SunOS:*:*) echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) echo i386-pc-auroraux${UNAME_RELEASE} exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) eval $set_cc_for_build SUN_ARCH="i386" # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH="x86_64" fi fi echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; 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 ;; 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 ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; 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 ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # 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 ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; 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 && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; 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 ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????: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 ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; 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 ;; *: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 if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi 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 ;; *:AIX:*:[4567]) 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/lslpp ] ; then IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 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 eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit ;; 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 && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; 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 ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; 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 ;; 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 ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) UNAME_PROCESSOR=`/usr/bin/uname -p` case ${UNAME_PROCESSOR} in amd64) echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; *:MINGW64*:*) echo ${UNAME_MACHINE}-pc-mingw64 exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; *:MSYS*:*) echo ${UNAME_MACHINE}-pc-msys exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; *:Interix*:*) case ${UNAME_MACHINE} in x86) echo i586-pc-interix${UNAME_RELEASE} exit ;; authenticamd | genuineintel | EM64T) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; IA64) echo ia64-unknown-interix${UNAME_RELEASE} exit ;; esac ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; 8664:Windows_NT:*) echo x86_64-pc-mks exit ;; 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 ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *: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/[-(].*//'`-${LIBC} exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; aarch64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; 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 -q ld.so.1 if test "$?" = 0 ; then LIBC="gnulibc1" ; fi echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arc:Linux:*:* | arceb:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arm*:Linux:*:*) eval $set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then echo ${UNAME_MACHINE}-unknown-linux-${LIBC} else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi else echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf fi fi exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; cris:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; crisv32:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; frv:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; hexagon:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; i*86:Linux:*:*) echo ${UNAME_MACHINE}-pc-linux-${LIBC} exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; mips:Linux:*:* | mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef ${UNAME_MACHINE} #undef ${UNAME_MACHINE}el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=${UNAME_MACHINE}el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=${UNAME_MACHINE} #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-${LIBC}"; exit; } ;; openrisc*:Linux:*:*) echo or1k-unknown-linux-${LIBC} exit ;; or32:Linux:*:* | or1k*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; padre:Linux:*:*) echo sparc-unknown-linux-${LIBC} exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-${LIBC} exit ;; 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-${LIBC} ;; PA8*) echo hppa2.0-unknown-linux-${LIBC} ;; *) echo hppa-unknown-linux-${LIBC} ;; esac exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-${LIBC} exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-${LIBC} exit ;; ppc64le:Linux:*:*) echo powerpc64le-unknown-linux-${LIBC} exit ;; ppcle:Linux:*:*) echo powerpcle-unknown-linux-${LIBC} exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux-${LIBC} exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; tile*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-${LIBC} exit ;; x86_64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; xtensa*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; 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 ;; 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 ;; 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 ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; 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 ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. 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 ;; 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 ;; 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 i586. # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configury will decide that # this is a cross-build. echo i586-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; 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 ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) 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; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' 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; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *: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 ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; 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 ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku exit ;; x86_64:Haiku:*:*) echo x86_64-unknown-haiku exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux${UNAME_RELEASE} exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux${UNAME_RELEASE} exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown eval $set_cc_for_build if test "$UNAME_PROCESSOR" = unknown ; then UNAME_PROCESSOR=powerpc fi if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then case $UNAME_PROCESSOR in i386) UNAME_PROCESSOR=x86_64 ;; powerpc) UNAME_PROCESSOR=powerpc64 ;; esac fi fi elif test "$UNAME_PROCESSOR" = i386 ; then # Avoid executing cc on OS X 10.9, as it ships with a stub # that puts up a graphical alert prompting to install # developer tools. Any system running Mac OS X 10.7 or # later (Darwin 11 and later) is required to have a 64-bit # processor. This is not true of the ARM version of Darwin # that Apple uses in portable devices. UNAME_PROCESSOR=x86_64 fi echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *: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 ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NEO-?:NONSTOP_KERNEL:*:*) echo neo-tandem-nsk${UNAME_RELEASE} exit ;; NSE-*:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *: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 ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos exit ;; i*86:AROS:*:*) echo ${UNAME_MACHINE}-pc-aros exit ;; x86_64:VMkernel:*:*) echo ${UNAME_MACHINE}-unknown-esx exit ;; esac 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: funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/filter/config.sub000066400000000000000000001062521256243640000237510ustar00rootroot00000000000000#! /bin/sh # Configuration validation subroutine script. # Copyright 1992-2015 Free Software Foundation, Inc. timestamp='2015-02-22' # 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 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # 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. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # Please send patches to . # # 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. # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD # 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 1992-2015 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 ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # 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 ;; * ) 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-android* | linux-dietlibc | linux-newlib* | \ linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ knetbsd*-gnu* | netbsd*-gnu* | netbsd*-eabi* | \ kopensolaris*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; android-linux) os=-linux-android basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown ;; *) 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 | -microblaze*) os= basic_machine=$1 ;; -bluegene*) os=-cnk ;; -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 ;; -sco6) os=-sco5v6 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -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/'` ;; -sco5v6*) # 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*178) os=-lynxos178 ;; -lynx*5) os=-lynxos5 ;; -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 \ | aarch64 | aarch64_be \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arceb \ | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ | avr | avr32 \ | be32 | be64 \ | bfin \ | c4x | c8051 | clipper \ | d10v | d30v | dlx | dsp16xx \ | epiphany \ | fido | fr30 | frv | ft32 \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | hexagon \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | k1om \ | le32 | le64 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64octeon | mips64octeonel \ | mips64orion | mips64orionel \ | mips64r5900 | mips64r5900el \ | mips64vr | mips64vrel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa32r6 | mipsisa32r6el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64r6 | mipsisa64r6el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipsr5900 | mipsr5900el \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nds32 | nds32le | nds32be \ | nios | nios2 | nios2eb | nios2el \ | ns16k | ns32k \ | open8 | or1k | or1knd | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle \ | pyramid \ | riscv32 | riscv64 \ | rl78 | rx \ | score \ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu \ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ | ubicom32 \ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ | visium \ | we32k \ | x86 | xc16x | xstormy16 | xtensa \ | z8k | z80) basic_machine=$basic_machine-unknown ;; c54x) basic_machine=tic54x-unknown ;; c55x) basic_machine=tic55x-unknown ;; c6x) basic_machine=tic6x-unknown ;; leon|leon[3-9]) basic_machine=sparc-$basic_machine ;; m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip) basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-unknown ;; strongarm | thumb | xscale) basic_machine=arm-unknown ;; xgate) basic_machine=$basic_machine-unknown os=-none ;; xscaleeb) basic_machine=armeb-unknown ;; xscaleel) basic_machine=armel-unknown ;; # 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-* \ | aarch64-* | aarch64_be-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | be32-* | be64-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* \ | c8051-* | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | hexagon-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | k1om-* \ | le32-* | le64-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ | microblaze-* | microblazeel-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64octeon-* | mips64octeonel-* \ | mips64orion-* | mips64orionel-* \ | mips64r5900-* | mips64r5900el-* \ | mips64vr-* | mips64vrel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa32r6-* | mipsisa32r6el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64r6-* | mipsisa64r6el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipsr5900-* | mipsr5900el-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nds32-* | nds32le-* | nds32be-* \ | nios-* | nios2-* | nios2eb-* | nios2el-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | open8-* \ | or1k*-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ | pyramid-* \ | rl78-* | romp-* | rs6000-* | rx-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ | tahoe-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tile*-* \ | tron-* \ | ubicom32-* \ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ | vax-* \ | visium-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* \ | xstormy16-* | xtensa*-* \ | ymp-* \ | z8k-* | z80-*) ;; # Recognize the basic CPU types without company name, with glob match. xtensa*) basic_machine=$basic_machine-unknown ;; # 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 ;; aros) basic_machine=i386-pc os=-aros ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; blackfin) basic_machine=bfin-unknown os=-linux ;; blackfin-*) basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; bluegene*) basic_machine=powerpc-ibm os=-cnk ;; c54x-*) basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c55x-*) basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c6x-*) basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c90) basic_machine=c90-cray os=-unicos ;; cegcc) basic_machine=arm-unknown os=-cegcc ;; 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 ;; cr16 | cr16-*) basic_machine=cr16-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; 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 ;; dicos) basic_machine=i686-pc os=-dicos ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; 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*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 ;; leon-*|leon[3-9]-*) basic_machine=sparc-`echo $basic_machine | sed 's/-.*//'` ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; microblaze*) basic_machine=microblaze-xilinx ;; mingw64) basic_machine=x86_64-pc os=-mingw64 ;; mingw32) basic_machine=i686-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; 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 ;; moxiebox) basic_machine=moxie-unknown os=-moxiebox ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; msys) basic_machine=i686-pc os=-msys ;; mvs) basic_machine=i370-ibm os=-mvs ;; nacl) basic_machine=le32-unknown os=-nacl ;; 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 ;; neo-tandem) basic_machine=neo-tandem ;; nse-tandem) basic_machine=nse-tandem ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; 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 ;; parisc) basic_machine=hppa-unknown os=-linux ;; parisc-*) basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ;; 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 | ppcbe) basic_machine=powerpc-unknown ;; ppc-* | ppcbe-*) 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 ;; rdos | rdos64) basic_machine=x86_64-pc os=-rdos ;; rdos32) basic_machine=i386-pc os=-rdos ;; 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 ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh5el) basic_machine=sh5le-unknown ;; 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 ;; strongarm-* | thumb-*) basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` ;; 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 ;; tile*) basic_machine=$basic_machine-unknown os=-linux-gnu ;; 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 ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; xscale-* | xscalee[bl]-*) basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; z80-*-coff) basic_machine=z80-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 ;; sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) 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. -auroraux) os=-auroraux ;; -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* | -cnk* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ | -sym* | -kopensolaris* | -plan9* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* | -aros* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | -bitrig* | -openbsd* | -solidbsd* \ | -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* | -cegcc* \ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ | -linux-newlib* | -linux-musl* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \ | -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* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* | -tirtos*) # 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* | -haiku* \ | -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 ;; -zvmoe) os=-zvmoe ;; -dicos*) os=-dicos ;; -nacl*) ;; -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 score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; c8051-*) os=-elf ;; hexagon-*) os=-elf ;; tic54x-*) os=-coff ;; tic55x-*) os=-coff ;; tic6x-*) 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 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; 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 ;; *-haiku) os=-haiku ;; *-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 ;; -cnk*|-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 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/filter/configure.ac000066400000000000000000000123101256243640000242460ustar00rootroot00000000000000# This file is an input file used by the GNU "autoconf" program to # generate the file "configure", which is run during XPA installation # to configure the system for the local environment. AC_INIT(filter, 1.1, saord@cfa.harvard.edu, filter) AC_CONFIG_HEADERS([conf.h]) AC_CONFIG_SRCDIR(./filter.h) AC_CANONICAL_HOST # # checks that we use in most projects # AC_PROG_CC AC_EXEEXT if test x"${EXEEXT}" = "xno"; then EXEEXT="" fi AC_C_LONG_LONG AC_PROG_RANLIB AC_HEADER_STDC AC_CHECK_HEADERS(malloc.h) AC_CHECK_HEADERS(getopt.h) AC_CHECK_HEADERS(values.h) AC_CHECK_HEADERS(dlfcn.h) AC_CHECK_HEADERS(sys/un.h) AC_CHECK_HEADERS(sys/mman.h) AC_CHECK_HEADERS(sys/ipc.h) case $host_os in *cygwin*|*Cygwin* ) ;; * ) AC_CHECK_HEADERS(sys/shm.h) ;; esac AC_CHECK_TYPES([socklen_t], [], [], [#include ]) AC_C_CONST AC_CHECK_FUNCS(strchr memcpy snprintf) AC_CHECK_FUNC(connect) if test $ac_cv_func_connect = no; then AC_CHECK_LIB(socket, connect, EXTRA_LIBS="$EXTRA_LIBS -lsocket") fi AC_CHECK_FUNC(gethostbyname) if test $ac_cv_func_gethostbyname = no; then AC_CHECK_LIB(nsl, gethostbyname, EXTRA_LIBS="$EXTRA_LIBS -lnsl") fi # AC_CHECK_LIB(db, snprintf, EXTRA_LIBS="$EXTRA_LIBS -ldb") # # checks specific to this project # AC_C_INLINE AC_MSG_CHECKING(for filter cc) AC_ARG_WITH(filter-cc, [ --with-filter-cc=CC compiler], FILTER_CC=\\\"$withval\\\", FILTER_CC=NULL) AC_MSG_RESULT($FILTER_CC) AC_SUBST(FILTER_CC) AC_MSG_CHECKING(for filter cflags) AC_ARG_WITH(filter-cflags, [ --with-filter-cflags=CFLAGS compiler flags], FILTER_CFLAGS=\\\"$withval\\\", FILTER_CFLAGS=NULL) AC_MSG_RESULT($FILTER_CFLAGS) AC_SUBST(FILTER_CFLAGS) DEFLIB="libfilter.a" AC_MSG_CHECKING(for alternate target library) AC_ARG_WITH(altlib, [ --with-altlib=LIB library name], alt_lib=yes LIB=$withval, alt_lib=no LIB=$DEFLIB) AC_MSG_RESULT($alt_lib ($LIB)) AC_SUBST(LIB) AC_SUBST(DEFLIB) AC_MSG_CHECKING(for shared library build) AC_ARG_ENABLE(shared, [ --enable-shared build shared libraries], [fun_ok=$enableval], [fun_ok=no]) if test "$fun_ok" != "no"; then fpic="yes" DOSHARED=shlib AC_SUBST(DOSHARED) if test "$fun_ok" = "link"; then LLIB="-L. -l$PACKAGE_NAME" else LLIB='$(LIB)' fi else LLIB='$(LIB)' fi AC_SUBST(LLIB) AC_MSG_RESULT($fun_ok) AC_ARG_ENABLE(dl, [ --enable-dl allow use of dynamic loading if available], [fun_ok=$enableval], [fun_ok=no]) if test "$fun_ok" = "yes"; then AC_MSG_CHECKING([for dynamic loading (with gcc) ]) if test "$CC" = "gcc" -o `$CC -v 2>&1 | grep -c gcc` != "0" ; then using_dl="yes" AC_CHECK_LIB(dl, dlopen, have_dl=yes, have_dl=no) if test "$have_dl" = yes; then USE_DL="-DUSE_DL=1" fpic="yes" EXTRA_LIBS="$EXTRA_LIBS -ldl" if test `$CC -v -rdynamic 2>&1 | grep -c unrecognized` = "0" ; then LDFLAGS="$LDFLAGS -rdynamic" fi else AC_CHECK_LIB(c, dlopen, have_dl=yes, have_dl=no) if test "$have_dl" = yes; then USE_DL="-DUSE_DL=1" fpic="yes" if test `$CC -v -rdynamic 2>&1 | grep -c unrecognized` = "0" ; then LDFLAGS="$LDFLAGS -rdynamic" fi else using_dl="no" fi fi else using_dl="no" fi AC_MSG_RESULT([$using_dl ($CC)]) fi AC_ARG_ENABLE(fpu_double, [ --enable-fpu_double set FPU in double round mode], [fun_ok=$enableval], [fun_ok=no]) if test "$fun_ok" = "yes"; then AC_MSG_CHECKING([for setting fpu in double rounding mode (with gcc) ]) if test "$CC" = "gcc" -o `$CC -v 2>&1 | grep -c gcc` != "0" ; then using_fpu_double="yes" USE_FPU_DOUBLE="1" else using_fpu_double="no" USE_FPU_DOUBLE="0" fi AC_MSG_RESULT([$using_fpu_double]) else USE_FPU_DOUBLE="0" fi AC_SUBST(USE_FPU_DOUBLE) AC_MSG_CHECKING([$host_os configuration]) PRE="" POST="|\& cat" case $host_os in *cygwin*|*Cygwin* ) AC_DEFINE([HAVE_CYGWIN], [], [Define if the cygwin compiler is used.]) AC_MSG_RESULT(flagging Cygwin) PRE="sh -c {" POST="}" ;; *mingw32*|*Mingw32*) CFLAGS="$CFLAGS -mconsole -D_WSTRING_DEFINED=1" EXTRA_LIBS="$EXTRA_LIBS -lwsock32" AC_DEFINE([HAVE_MINGW32], [], [Define if the mingw32 compiler is used.]) AC_MSG_RESULT(flagging MinGW) ;; *osf*|*Osf*) AC_CHECK_LIB(db, snprintf, EXTRA_LIBS="$EXTRA_LIBS -ldb") ;; *darwin*|*Darwin*) LDFLAGS="$LDFLAGS $CFLAGS" G=`$CC -v 2>&1 | grep version | awk '{print $3}' | awk -F. '{print $1$2}'` if test x"$G" != x -a "$G" -lt 42; then CFLAGS="$CFLAGS -no-cpp-precomp" fi CFLAGS="$CFLAGS -fno-common" if test x"$fpic" = x"yes" ; then CFLAGS="$CFLAGS -fPIC" AC_MSG_RESULT([adding -fno-common, -fPIC to CFLAGS]) else AC_MSG_RESULT([adding -fno-common to CFLAGS]) fi ;; * ) if test x"$fpic" = x"yes" ; then if test "$CC" = "gcc" -o `$CC -v 2>&1 | grep -c gcc` != "0" ; then CFLAGS="$CFLAGS -fPIC" AC_MSG_RESULT(adding -fPIC to gcc) else AC_MSG_RESULT(none) fi else AC_MSG_RESULT(none) fi ;; esac AC_SUBST(USE_DL) AC_SUBST(EXTRA_LIBS) AC_SUBST(EXTRA_OBJS) AC_CONFIG_FILES(Makefile) AC_OUTPUT funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/filter/dl.c000066400000000000000000000012671256243640000225340ustar00rootroot00000000000000#ifdef USE_DL #include #include #include #include int have_dl = 1; #ifdef ANSI_FUNC void * DLOpen(char *name) #else void *DLOpen(name) char *name; #endif { void *d; if( !(d=dlopen(name, RTLD_LAZY)) ) gerror(stderr, "%s\n", dlerror()); return d; } #ifdef ANSI_FUNC void * DLSym(void *dl, char *name) #else void *DLSym(dl, name) void *dl; char *name; #endif { void *d; if( !(d=dlsym(dl, name)) ) gerror(stderr, "%s\n", dlerror()); return d; } #ifdef ANSI_FUNC int DLClose(void *dl) #else int DLClose(dl) void *dl; #endif { if( dl ) return dlclose(dl); else return -1; } #else int have_dl = 0; #endif funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/filter/dl.h000066400000000000000000000004221256243640000225310ustar00rootroot00000000000000#ifndef __dl_h #define __dl_h #if HAVE_CONFIG_H #include "conf.h" #endif #ifdef HAVE_DLFCN_H #include #endif #include "prsetup.h" _PRbeg void *DLOpen _PRx((char *name)); void *DLSym _PRx((void *dl, char *name)); int DLClose _PRx((void *dl)); _PRend #endif funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/filter/events_c.h000066400000000000000000000134311256243640000237440ustar00rootroot00000000000000static char *EVENTS_C="\n\n#ifdef TEST\n#include \n#define EVFILTRTN _FilterEvents\n#define NSHAPE 1\n#define NREGION 1\n#define _X_ X\n#define _Y_ Y\n#define FILTER ((circle(g,1,1,1,_X_,_Y_,1,2,3)))\n#define EVSIZE 4\n#define X *((short *)(eptr+0))\n#define Y *((short *)(eptr+2))\n#include \"regions.h\"\n#endif\n\nstatic char __abuf[EVSIZE+1];\nstatic char *acopy(void *s, int n)\n{\n memset(__abuf, 0, n+1);\n memmove(__abuf, s, n);\n return __abuf;\n}\n\nvoid *EVFILTRTN(void *tg, char *ebuf, int ne, int esize, int *rbuf)\n{\n int i, j;\n int *rptr;\n char *eptr;\n Scan scan, tscan;\n GFilt g = (GFilt)tg;\n\n \n \n eptr = ebuf;\n\n if( !g ){\n g = (GFilt)calloc(1, sizeof(GFiltRec));\n#if NSHAPE\n \n g->nshapes = NSHAPE;\n g->maxshapes = (NSHAPE*(XSNO+1))+1;\n g->shapes = (Shape)calloc(g->maxshapes, sizeof(ShapeRec));\n#endif\n#ifdef EVSECT\n \n g->evsect = EVSECT;\n sscanf(g->evsect, \"%d %d %d %d %d\",\n &g->xmin, &g->xmax, &g->ymin, &g->ymax, &g->block);\n \n g->x0 = 1;\n g->y0 = 1;\n g->x1 = (g->xmax-g->xmin)/g->block+1;\n g->y1 = (g->ymax-g->ymin)/g->block+1;\n \n g->ybuf = (int *)calloc(g->y1+1, sizeof(int));\n g->x0s = (int *)calloc(g->y1+1, sizeof(int));\n g->x1s = (int *)calloc(g->y1+1, sizeof(int));\n \n for(i=0; i<=g->y1; i++) g->x0s[i] = g->x0;\n for(i=0; i<=g->y1; i++) g->x1s[i] = g->x1;\n \n if( NMASK ){\n g->nmask = NMASK; \n g->maskdim = MASKDIM;\n g->masks = _masks;\n }\n \n#if DO_FILTER_SWAP\n memset(_swf, 0, EVSIZE);\n#endif\n if( eptr ) FINIT;\n \n g->tlminx = TLMINX;\n g->tlminy = TLMINY;\n g->usebinsiz = USEBINSIZ;\n if( BINSIZX > 0.0 )\n g->binsizx = BINSIZX;\n else\n g->binsizx = 1.0;\n if( BINSIZY > 0.0 )\n g->binsizy = BINSIZY;\n else\n g->binsizy = 1.0;\n g->tloff = TLOFF;\n#endif\n }\n\n \n if( !ebuf && !rbuf && (ne<0) ){\n#if NSHAPE\n \n for(i=0; imaxshapes; i++){\n if( g->shapes[i].scanlist ){\n for(j=0; jy1; j++){\n if( g->shapes[i].scanlist[j] ){\n for(scan=g->shapes[i].scanlist[j]; scan; ){\n tscan = scan->next;\n if( scan ) free(scan);\n scan = tscan;\n }\n }\n }\n if( g->shapes[i].scanlist ) free(g->shapes[i].scanlist);\n }\n if( g->shapes[i].pts ) free(g->shapes[i].pts);\n if( g->shapes[i].xv ) free(g->shapes[i].xv);\n }\n if( g->masks ) free(g->masks);\n if( g->shapes ) free(g->shapes);\n if( g->ybuf ) free(g->ybuf);\n if( g->x0s ) free(g->x0s);\n if( g->x1s ) free(g->x1s);\n if( g ) free(g);\n#endif\n return NULL;\n }\n else{\n \n for(rptr=rbuf, eptr=ebuf; ne--; rptr++, eptr += esize){\n g->rid = 0;\n#if DO_FILTER_SWAP\n memset(_swf, 0, EVSIZE);\n#endif\n *rptr = ((FILTER) ? (g->rid ? g->rid : -1) : 0);\n }\n return (void *)g;\n }\n}\n\nint main(int argc, char **argv)\n{\n int i;\n#if HAVE_MINGW32==0\n int pipes[4];\n#endif\n int get, got;\n#if DO_FILTER_SWAP\n int sgot;\n#endif\n int n;\n int *rbuf;\n char *ebuf, *etop;\n char *s=NULL, *t=NULL, *u=NULL;\n void *g=NULL;\n#if USE_WIN32\n HANDLE hStdin, hStdout; \n DWORD dwRead, dwWritten; \n#endif\n\n \n#if HAVE_MINGW32==0\n if( (s=getenv(\"LAUNCH_PIPES\")) ){\n t = (char *)strdup(s);\n for(i=0, u=(char *)strtok(t, \",\"); i<4 && u; \n i++, u=(char *)strtok(NULL,\",\")){\n pipes[i] = atoi(u);\n }\n if( t ) free(t);\n if( i < 4 ) return(1);\n close(pipes[0]);\n close(pipes[3]);\n dup2(pipes[2], 0); close(pipes[2]);\n dup2(pipes[1], 1); close(pipes[1]);\n }\n#endif\n\n#if USE_WIN32\n hStdout = GetStdHandle(STD_OUTPUT_HANDLE); \n hStdin = GetStdHandle(STD_INPUT_HANDLE); \n if( (hStdout == INVALID_HANDLE_VALUE) || (hStdin == INVALID_HANDLE_VALUE) ){\n unlink(argv[0]);\n return 0;\n }\n#endif\n\n \n#if USE_WIN32\n while((ReadFile(hStdin, &get, sizeof(int), &dwRead, NULL) >0) && \n (dwRead == sizeof(int)) ){\n#else\n while( read(0, &get, sizeof(int)) == sizeof(int) ){\n#endif\n#if DO_FILTER_SWAP\n switch(sizeof(int)){\n case 2:\n _sw2((char *)&get,2,NULL,0);\n break;\n case 4:\n _sw4((char *)&get,4,NULL,0);\n break;\n case 8:\n _sw8((char *)&get,8,NULL,0);\n break;\n }\n#endif\n ebuf = (char *)calloc(get, sizeof(char));\n#if USE_WIN32\n for(n=0, etop=ebuf; get>0; etop += got, get -= dwRead){\n if((ReadFile(hStdin, etop, get, &dwRead, NULL)==FALSE) || (dwRead==0))\n break;\n n += dwRead;\n }\n#else\n for(n=0, etop=ebuf; get>0; etop += got, get -= got){\n if( (got=read(0, etop, get)) <=0 ) \n break;\n n += got;\n }\n#endif\n n /= EVSIZE;\n \n rbuf = (int *)calloc(n, sizeof(int));\n \n g = EVFILTRTN(g, ebuf, n, EVSIZE, rbuf);\n \n got = n*sizeof(int);\n#if DO_FILTER_SWAP\n sgot = got;\n switch(sizeof(int)){\n case 2:\n _sw2((char *)&sgot,2,NULL,0);\n break;\n case 4:\n _sw4((char *)&sgot,4,NULL,0);\n break;\n case 8:\n _sw8((char *)&sgot,8,NULL,0);\n break;\n }\n#if USE_WIN32\n WriteFile(hStdout, &sgot, sizeof(int), &dwWritten, NULL); \n#else\n write(1, &sgot, sizeof(int));\n#endif\n#else\n#if USE_WIN32\n WriteFile(hStdout, &got, sizeof(int), &dwWritten, NULL); \n#else\n write(1, &got, sizeof(int));\n#endif\n#endif\n#if DO_FILTER_SWAP\n switch(sizeof(int)){\n case 2:\n _sw2((char *)rbuf,got,NULL,0);\n break;\n case 4:\n _sw4((char *)rbuf,got,NULL,0);\n break;\n case 8:\n _sw8((char *)rbuf,got,NULL,0);\n break;\n }\n#endif\n#if USE_WIN32\n WriteFile(hStdout, rbuf, got, &dwWritten, NULL); \n#else\n write(1, rbuf, got);\n#endif\n if( ebuf) free(ebuf);\n if( rbuf ) free(rbuf);\n }\n EVFILTRTN(g, NULL, -1, 0, NULL);\n unlink(argv[0]);\n return 0;\n}\n"; funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/filter/events_py.h000066400000000000000000000123261256243640000241540ustar00rootroot00000000000000static char *EVENTS_PY="\n# load the funtools routines\n_libname = './libfuntools.so.1.0'\nlibfuntools=cdll.LoadLibrary(_libname)\nlibc=cdll.LoadLibrary(None)\n\n# region definitions\nimannulusi=libfuntools.imannulusi\nimboxi=libfuntools.imboxi\nimcirclei=libfuntools.imcirclei\nimellipsei=libfuntools.imellipsei\nimfieldi=libfuntools.imfieldi\nimlinei=libfuntools.imlinei\nimpiei=libfuntools.impiei\nimqtpiei=libfuntools.imqtpiei\nimpointi=libfuntools.impointi\nimpandai=libfuntools.impandai\nimnannulusi=libfuntools.imnannulusi\nimnboxi=libfuntools.imnboxi\nimnellipsei=libfuntools.imnellipsei\nimnpiei=libfuntools.imnpiei\nimpolygoni=libfuntools.impolygoni\nimvannulusi=libfuntools.imvannulusi\nimvboxi=libfuntools.imvboxi\nimvellipsei=libfuntools.imvellipsei\nimvpiei=libfuntools.imvpiei\nimvpointi=libfuntools.imvpointi\nimannulus=libfuntools.imannulus\nimbox=libfuntools.imbox\nimcircle=libfuntools.imcircle\nimellipse=libfuntools.imellipse\nimfield=libfuntools.imfield\nimline=libfuntools.imline\nimpie=libfuntools.impie\nimqtpie=libfuntools.imqtpie\nimpoint=libfuntools.impoint\nimpanda=libfuntools.impanda\nimnannulus=libfuntools.imnannulus\nimnbox=libfuntools.imnbox\nimnellipse=libfuntools.imnellipse\nimnpie=libfuntools.imnpie\nimpolygon=libfuntools.impolygon\nimvannulus=libfuntools.imvannulus\nimvbox=libfuntools.imvbox\nimvellipse=libfuntools.imvellipse\nimvpie=libfuntools.imvpie\nimvpoint=libfuntools.imvpoint\n\nevannulus=libfuntools.evannulus\nevbox=libfuntools.evbox\nevcircle=libfuntools.evcircle\nevellipse=libfuntools.evellipse\nevfield=libfuntools.evfield\nevline=libfuntools.evline\nevpie=libfuntools.evpie\nevqtpie=libfuntools.evqtpie\nevpoint=libfuntools.evpoint\nevnannulus=libfuntools.evnannulus\nevnbox=libfuntools.evnbox\nevnellipse=libfuntools.evnellipse\nevnpie=libfuntools.evnpie\nevpanda=libfuntools.evpanda\nevpolygon=libfuntools.evpolygon\nevvannulus=libfuntools.evvannulus\nevvbox=libfuntools.evvbox\nevvellipse=libfuntools.evvellipse\nevvpie=libfuntools.evvpie\nevvpoint=libfuntools.evvpoint\n\nevvcircle=libfuntools.evvannulus\nevncircle=libfuntools.evnannulus\nevcpanda=libfuntools.evpanda\n\nimvcirclei=libfuntools.imvannulusi\nimncirclei=libfuntools.imnannulusi\nimvcircle=libfuntools.imvannulus\nimncircle=libfuntools.imnannulus\nimcpandai=libfuntools.impandai\nimcpanda=libfuntools.impanda\n\n# from regions.h -- no idea what it is ...\nxsno=3\n\n# ... but its important!\nmaxshapes=(nshape*(xsno+1))+1\n\n# ctypes struct definitions (taken from filter.h)\nclass filtmask(Structure):\n _fields_ = [('region', c_int), ('y', c_int), ('xstart', c_int), ('xstop', c_int)]\n\nclass scanrec(Structure):\n pass\n\n# this is how you add a forward pointer\nscanrec._fields_ = [ ('next', POINTER(scanrec)), ('x', c_int) ]\n\nclass shaperec(Structure):\n _fields_ = [ ('init', c_int), ('ystart', c_double), ('ystop', c_double), ('scanlist', c_void_p), ('nv', c_int), ('xv', c_void_p), ('r1sq', c_double), ('r2sq', c_double), ('angl', c_double), ('sinangl', c_double), ('cosangl', c_double), ('cossq', c_double), ('sinsq', c_double), ('xradsq', c_double), ('yradsq', c_double), ('a', c_double), ('npt', c_int), ('pts', c_void_p), ('xonly', c_int), ('x1', c_double), ('x2', c_double), ('y1', c_double), ('invslope', c_double)]\n\nclass gfiltrec(Structure):\n _fields_ = [('nshapes', c_int), ('maxshapes', c_int), ('shapes', POINTER(shaperec * maxshapes)), ('rid', c_int), ('usebinsiz', c_int), ('evsect', c_char_p), ('tlminx', c_double), ('tlminy', c_double), ('binsizx', c_double), ('binsizy', c_double), ('tloff', c_double), ('xmin', c_int), ('xmax', c_int), ('ymin', c_int), ('ymax', c_int), ('block', c_int), ('x0', c_int), ('x1', c_int), ('y0', c_int), ('y1', c_int), ('ybuf', POINTER(c_int)), ('x0s', POINTER(c_int)), ('x1s', POINTER(c_int)), ('nmask', c_int), ('maskdim', c_int), ('masks', POINTER(filtmask))]\n\n# taken from the code in evfilter.c that initializes the g struct\n# allocate shape record\nshapearr = (shaperec * maxshapes)()\n# allocate g record\ngrec = gfiltrec()\n# fill in g record\ngrec.nshapes = nshape\ngrec.maxshapes = maxshapes\ngrec.shapes = pointer(shapearr)\n# pointer to g record\ng=pointer(grec)\n\n# # processing loop\n# while True:\n# rvals = ''\n# buf = sys.stdin.read(4)\n# if not buf: break\n# vals = struct.unpack('=i', buf)\n# nev = vals[0]/evsize\n# for i in range(nev):\n# evbuf = sys.stdin.read(evsize)\n# rvals += struct.pack('=i', xfilter(evdef, evbuf))\n# sys.stdout.write(struct.pack('=i', nev*4))\n# sys.stdout.write(rvals)\n# sys.stdout.flush()\n\n# processing loop\nobytes = 0\nwhile True:\n # get byte count\n nval = c_int(0)\n if libc.read(0, byref(nval), 4) != 4: break\n bytes = nval.value\n nev = bytes / evsize\n\n # create a new data buffer, if necessary\n if obytes != bytes:\n evbuf = create_string_buffer(bytes)\n pevbuf = addressof(evbuf)\n rvals = (c_int * nev)()\n obytes = bytes\n\n # read data\n if libc.read(0, evbuf, bytes) != bytes: break\n\n # process data\n ioff = 0\n for i in range(nev):\n rvals[i] = xfilter(evdef, evbuf[ioff:ioff+evsize])\n ioff += evsize\n\n # write result byte count and result data\n nval = c_int(nev*4)\n libc.write(1, byref(nval), 4)\n libc.write(1, rvals, nval)\n"; funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/filter/evfilter.c000066400000000000000000000145041256243640000237530ustar00rootroot00000000000000/* gcc -g -o foo event.body.c -lm */ #ifdef TEST #include #define EVFILTRTN _FilterEvents #define NSHAPE 1 #define NREGION 1 #define _X_ X #define _Y_ Y #define FILTER ((circle(g,1,1,1,_X_,_Y_,1,2,3))) #define EVSIZE 4 #define X *((short *)(eptr+0)) #define Y *((short *)(eptr+2)) #include "regions.h" #endif static char __abuf[EVSIZE+1]; static char *acopy(void *s, int n) { memset(__abuf, 0, n+1); memmove(__abuf, s, n); return __abuf; } void *EVFILTRTN(void *tg, char *ebuf, int ne, int esize, int *rbuf) { int i, j; int *rptr; char *eptr; Scan scan, tscan; GFilt g = (GFilt)tg; /* set eptr to ebuf -- this must be done before FINIT, because the latter */ /*passes X and Y to shape init routines, and these defines use eptr */ eptr = ebuf; if( !g ){ g = (GFilt)calloc(1, sizeof(GFiltRec)); #if NSHAPE /* allocate space for the globals */ g->nshapes = NSHAPE; g->maxshapes = (NSHAPE*(XSNO+1))+1; g->shapes = (Shape)calloc(g->maxshapes, sizeof(ShapeRec)); #endif #ifdef EVSECT /* if evsect is defined, we are filtering an image section */ g->evsect = EVSECT; sscanf(g->evsect, "%d %d %d %d %d", &g->xmin, &g->xmax, &g->ymin, &g->ymax, &g->block); /* get x and y limits on subsection */ g->x0 = 1; g->y0 = 1; g->x1 = (g->xmax-g->xmin)/g->block+1; g->y1 = (g->ymax-g->ymin)/g->block+1; /* allocate a buffer for valid y row flags */ g->ybuf = (int *)calloc(g->y1+1, sizeof(int)); g->x0s = (int *)calloc(g->y1+1, sizeof(int)); g->x1s = (int *)calloc(g->y1+1, sizeof(int)); /* seed impossible values for x limits */ for(i=0; i<=g->y1; i++) g->x0s[i] = g->x0; for(i=0; i<=g->y1; i++) g->x1s[i] = g->x1; /* save image mask values */ if( NMASK ){ g->nmask = NMASK; g->maskdim = MASKDIM; g->masks = _masks; } /* initialize shapes -- but check to make sure eptr is OK */ #if DO_FILTER_SWAP memset(_swf, 0, EVSIZE); #endif if( eptr ) FINIT; /* these also must be defined if EVSECT is being used */ g->tlminx = TLMINX; g->tlminy = TLMINY; g->usebinsiz = USEBINSIZ; if( BINSIZX > 0.0 ) g->binsizx = BINSIZX; else g->binsizx = 1.0; if( BINSIZY > 0.0 ) g->binsizy = BINSIZY; else g->binsizy = 1.0; g->tloff = TLOFF; #endif } /* if we have negative events, we free the structs */ if( !ebuf && !rbuf && (ne<0) ){ #if NSHAPE /* free polygon records */ for(i=0; imaxshapes; i++){ if( g->shapes[i].scanlist ){ for(j=0; jy1; j++){ if( g->shapes[i].scanlist[j] ){ for(scan=g->shapes[i].scanlist[j]; scan; ){ tscan = scan->next; if( scan ) free(scan); scan = tscan; } } } if( g->shapes[i].scanlist ) free(g->shapes[i].scanlist); } if( g->shapes[i].pts ) free(g->shapes[i].pts); if( g->shapes[i].xv ) free(g->shapes[i].xv); } if( g->masks ) free(g->masks); if( g->shapes ) free(g->shapes); if( g->ybuf ) free(g->ybuf); if( g->x0s ) free(g->x0s); if( g->x1s ) free(g->x1s); if( g ) free(g); #endif return NULL; } else{ /* do the filtering on each event */ for(rptr=rbuf, eptr=ebuf; ne--; rptr++, eptr += esize){ g->rid = 0; #if DO_FILTER_SWAP memset(_swf, 0, EVSIZE); #endif *rptr = ((FILTER) ? (g->rid ? g->rid : -1) : 0); } return (void *)g; } } int main(int argc, char **argv) { int i; #if HAVE_MINGW32==0 int pipes[4]; #endif int get, got; #if DO_FILTER_SWAP int sgot; #endif int n; int *rbuf; char *ebuf, *etop; char *s=NULL, *t=NULL, *u=NULL; void *g=NULL; #if USE_WIN32 HANDLE hStdin, hStdout; DWORD dwRead, dwWritten; #endif /* Launch() sometimes rearranges passed pipes to be stdin/stdout */ #if HAVE_MINGW32==0 if( (s=getenv("LAUNCH_PIPES")) ){ t = (char *)strdup(s); for(i=0, u=(char *)strtok(t, ","); i<4 && u; i++, u=(char *)strtok(NULL,",")){ pipes[i] = atoi(u); } if( t ) free(t); if( i < 4 ) return(1); close(pipes[0]); close(pipes[3]); dup2(pipes[2], 0); close(pipes[2]); dup2(pipes[1], 1); close(pipes[1]); } #endif #if USE_WIN32 hStdout = GetStdHandle(STD_OUTPUT_HANDLE); hStdin = GetStdHandle(STD_INPUT_HANDLE); if( (hStdout == INVALID_HANDLE_VALUE) || (hStdin == INVALID_HANDLE_VALUE) ){ unlink(argv[0]); return 0; } #endif /* read and filter events */ #if USE_WIN32 while((ReadFile(hStdin, &get, sizeof(int), &dwRead, NULL) >0) && (dwRead == sizeof(int)) ){ #else while( read(0, &get, sizeof(int)) == sizeof(int) ){ #endif #if DO_FILTER_SWAP switch(sizeof(int)){ case 2: _sw2((char *)&get,2,NULL,0); break; case 4: _sw4((char *)&get,4,NULL,0); break; case 8: _sw8((char *)&get,8,NULL,0); break; } #endif ebuf = (char *)calloc(get, sizeof(char)); #if USE_WIN32 for(n=0, etop=ebuf; get>0; etop += got, get -= dwRead){ if((ReadFile(hStdin, etop, get, &dwRead, NULL)==FALSE) || (dwRead==0)) break; n += dwRead; } #else for(n=0, etop=ebuf; get>0; etop += got, get -= got){ if( (got=read(0, etop, get)) <=0 ) break; n += got; } #endif n /= EVSIZE; /* allocate return value buffer */ rbuf = (int *)calloc(n, sizeof(int)); /* filter events, with results going into rbuf */ g = EVFILTRTN(g, ebuf, n, EVSIZE, rbuf); /* write results */ got = n*sizeof(int); #if DO_FILTER_SWAP sgot = got; switch(sizeof(int)){ case 2: _sw2((char *)&sgot,2,NULL,0); break; case 4: _sw4((char *)&sgot,4,NULL,0); break; case 8: _sw8((char *)&sgot,8,NULL,0); break; } #if USE_WIN32 WriteFile(hStdout, &sgot, sizeof(int), &dwWritten, NULL); #else write(1, &sgot, sizeof(int)); #endif #else #if USE_WIN32 WriteFile(hStdout, &got, sizeof(int), &dwWritten, NULL); #else write(1, &got, sizeof(int)); #endif #endif #if DO_FILTER_SWAP switch(sizeof(int)){ case 2: _sw2((char *)rbuf,got,NULL,0); break; case 4: _sw4((char *)rbuf,got,NULL,0); break; case 8: _sw8((char *)rbuf,got,NULL,0); break; } #endif #if USE_WIN32 WriteFile(hStdout, rbuf, got, &dwWritten, NULL); #else write(1, rbuf, got); #endif if( ebuf) free(ebuf); if( rbuf ) free(rbuf); } EVFILTRTN(g, NULL, -1, 0, NULL); unlink(argv[0]); return 0; } funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/filter/evfilter.py000066400000000000000000000120351256243640000241560ustar00rootroot00000000000000# load the funtools routines _libname = './libfuntools.so.1.0' libfuntools=cdll.LoadLibrary(_libname) libc=cdll.LoadLibrary(None) # region definitions imannulusi=libfuntools.imannulusi imboxi=libfuntools.imboxi imcirclei=libfuntools.imcirclei imellipsei=libfuntools.imellipsei imfieldi=libfuntools.imfieldi imlinei=libfuntools.imlinei impiei=libfuntools.impiei imqtpiei=libfuntools.imqtpiei impointi=libfuntools.impointi impandai=libfuntools.impandai imnannulusi=libfuntools.imnannulusi imnboxi=libfuntools.imnboxi imnellipsei=libfuntools.imnellipsei imnpiei=libfuntools.imnpiei impolygoni=libfuntools.impolygoni imvannulusi=libfuntools.imvannulusi imvboxi=libfuntools.imvboxi imvellipsei=libfuntools.imvellipsei imvpiei=libfuntools.imvpiei imvpointi=libfuntools.imvpointi imannulus=libfuntools.imannulus imbox=libfuntools.imbox imcircle=libfuntools.imcircle imellipse=libfuntools.imellipse imfield=libfuntools.imfield imline=libfuntools.imline impie=libfuntools.impie imqtpie=libfuntools.imqtpie impoint=libfuntools.impoint impanda=libfuntools.impanda imnannulus=libfuntools.imnannulus imnbox=libfuntools.imnbox imnellipse=libfuntools.imnellipse imnpie=libfuntools.imnpie impolygon=libfuntools.impolygon imvannulus=libfuntools.imvannulus imvbox=libfuntools.imvbox imvellipse=libfuntools.imvellipse imvpie=libfuntools.imvpie imvpoint=libfuntools.imvpoint evannulus=libfuntools.evannulus evbox=libfuntools.evbox evcircle=libfuntools.evcircle evellipse=libfuntools.evellipse evfield=libfuntools.evfield evline=libfuntools.evline evpie=libfuntools.evpie evqtpie=libfuntools.evqtpie evpoint=libfuntools.evpoint evnannulus=libfuntools.evnannulus evnbox=libfuntools.evnbox evnellipse=libfuntools.evnellipse evnpie=libfuntools.evnpie evpanda=libfuntools.evpanda evpolygon=libfuntools.evpolygon evvannulus=libfuntools.evvannulus evvbox=libfuntools.evvbox evvellipse=libfuntools.evvellipse evvpie=libfuntools.evvpie evvpoint=libfuntools.evvpoint evvcircle=libfuntools.evvannulus evncircle=libfuntools.evnannulus evcpanda=libfuntools.evpanda imvcirclei=libfuntools.imvannulusi imncirclei=libfuntools.imnannulusi imvcircle=libfuntools.imvannulus imncircle=libfuntools.imnannulus imcpandai=libfuntools.impandai imcpanda=libfuntools.impanda # from regions.h -- no idea what it is ... xsno=3 # ... but its important! maxshapes=(nshape*(xsno+1))+1 # ctypes struct definitions (taken from filter.h) class filtmask(Structure): _fields_ = [('region', c_int), ('y', c_int), ('xstart', c_int), ('xstop', c_int)] class scanrec(Structure): pass # this is how you add a forward pointer scanrec._fields_ = [ ('next', POINTER(scanrec)), ('x', c_int) ] class shaperec(Structure): _fields_ = [ ('init', c_int), ('ystart', c_double), ('ystop', c_double), ('scanlist', c_void_p), ('nv', c_int), ('xv', c_void_p), ('r1sq', c_double), ('r2sq', c_double), ('angl', c_double), ('sinangl', c_double), ('cosangl', c_double), ('cossq', c_double), ('sinsq', c_double), ('xradsq', c_double), ('yradsq', c_double), ('a', c_double), ('npt', c_int), ('pts', c_void_p), ('xonly', c_int), ('x1', c_double), ('x2', c_double), ('y1', c_double), ('invslope', c_double)] class gfiltrec(Structure): _fields_ = [('nshapes', c_int), ('maxshapes', c_int), ('shapes', POINTER(shaperec * maxshapes)), ('rid', c_int), ('usebinsiz', c_int), ('evsect', c_char_p), ('tlminx', c_double), ('tlminy', c_double), ('binsizx', c_double), ('binsizy', c_double), ('tloff', c_double), ('xmin', c_int), ('xmax', c_int), ('ymin', c_int), ('ymax', c_int), ('block', c_int), ('x0', c_int), ('x1', c_int), ('y0', c_int), ('y1', c_int), ('ybuf', POINTER(c_int)), ('x0s', POINTER(c_int)), ('x1s', POINTER(c_int)), ('nmask', c_int), ('maskdim', c_int), ('masks', POINTER(filtmask))] # taken from the code in evfilter.c that initializes the g struct # allocate shape record shapearr = (shaperec * maxshapes)() # allocate g record grec = gfiltrec() # fill in g record grec.nshapes = nshape grec.maxshapes = maxshapes grec.shapes = pointer(shapearr) # pointer to g record g=pointer(grec) # # processing loop # while True: # rvals = '' # buf = sys.stdin.read(4) # if not buf: break # vals = struct.unpack('=i', buf) # nev = vals[0]/evsize # for i in range(nev): # evbuf = sys.stdin.read(evsize) # rvals += struct.pack('=i', xfilter(evdef, evbuf)) # sys.stdout.write(struct.pack('=i', nev*4)) # sys.stdout.write(rvals) # sys.stdout.flush() # processing loop obytes = 0 while True: # get byte count nval = c_int(0) if libc.read(0, byref(nval), 4) != 4: break bytes = nval.value nev = bytes / evsize # create a new data buffer, if necessary if obytes != bytes: evbuf = create_string_buffer(bytes) pevbuf = addressof(evbuf) rvals = (c_int * nev)() obytes = bytes # read data if libc.read(0, evbuf, bytes) != bytes: break # process data ioff = 0 for i in range(nev): rvals[i] = xfilter(evdef, evbuf[ioff:ioff+evsize]) ioff += evsize # write result byte count and result data nval = c_int(nev*4) libc.write(1, byref(nval), 4) libc.write(1, rvals, nval) funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/filter/evregions.c000066400000000000000000001245611256243640000241410ustar00rootroot00000000000000/* NB: MAKE SURE YOU EDIT THE TEMPLATE FILE!!!! */ #ifndef FILTER_PTYPE #include #endif /* panda and pie incorrectly used astronomical angles. fixed 4/2004 */ #define USE_ASTRO_ANGLE 0 /* we might want to avoid (x86) extended precision problems */ #define USE_FPU_DOUBLE 0 #if USE_FPU_DOUBLE #include static fpu_control_t _cw; #define FPU_DOUBLE {fpu_control_t _cw2; _FPU_GETCW(_cw); _cw2 = _cw & ~_FPU_EXTENDED; _cw2 |= _FPU_DOUBLE; _FPU_SETCW(_cw2);} #define FPU_RESTORE {_FPU_SETCW(_cw);} #else #define FPU_DOUBLE #define FPU_RESTORE #endif /* alternate method of avoiding (x86) extended precision problems */ #define USE_FLOAT_COMPARE 0 /* add this to FilterOpen to cause this module to be loaded for dynamic linking */ static int evregno=0; void initevregions(void) { evregno++; return; } static int polypt(double x, double y, double* poly, int count, double xstart, double ystart, int flag) { /* x-- x value of point being tested */ /* y-- y value of point being tested */ /* poly-- bounding polygon, array of length (count*2) */ /* count-- number of edges of bounding polygon */ /* This algorithm is from "An Introduction to Ray Tracing", Academic Press, */ /* 1989, edited by Andrew Glassner, pg 53 */ /* a point lies in a polygon if a line is extended from the point to infinite */ /* in any direction and the number of intersections with the polygon is odd. */ /* This is valid for both concave and convex polygons. */ /* Points on a vertex are considered inside. */ /* Points on a edge are considered inside. */ /* number of crossings */ int crossings = 0; /* init sign for first vertice */ int sign = ((poly[1] - y)>=0) ? 1 : -1; /* for all edges */ int i; /* avoid -W unused parameter warning */ if( 0 ){ xstart = xstart; } /* if flag is set, we check x, y against first point */ if( flag && (x == poly[0]) && (y == poly[1]) ) return 1; for(i=0; i=0) ? 1 : -1; /* horiz line */ if( (y1==0) && (y2==0) ){ if( ((x2>=0) && (x1<=0)) || ((x1>=0) && (x2<=0)) ){ /* we always return true for ystart horiz lines */ if( y == ystart ) return 1; else return fmod((double)crossings+1,2.0) ? 1 : 0; } } /* vertical line */ else if( (x1==0) && (x2==0) ){ if( ((y2>=0) && (y1<=0)) || ((y1>=0) && (y2<=0)) ){ return fmod((double)crossings+1,2.0) ? 1 : 0; } } /* point on line */ else if( feq((y1*(x2-x1)),(x1*(y2-y1))) ){ if( (((x2>=0) && (x1<=0)) || ((x1>=0) && (x2<=0))) && (((y2>=0) && (y1<=0)) || ((y1>=0) && (y2<=0))) ){ return fmod((double)crossings+1,2.0) ? 1 : 0; } } #if 0 /* horiz line */ if( (y1==0) && (y2==0) ){ if( ((x2>=0) && (x1<=0)) || ((x1>=0) && (x2<=0)) ){ if( y == ystart ){ return 1; } } } /* vertical line */ else if( (x1==0) && (x2==0) ){ if( ((y2>=0) && (y1<=0)) || ((y1>=0) && (y2<=0)) ){ if( x == xstart ){ return 1; } } } /* point on line */ else if( feq((y1*(x2-x1)),(x1*(y2-y1))) ){ if( (((x2>=0) && (x1<=0)) || ((x1>=0) && (x2<=0))) && (((y2>=0) && (y1<=0)) || ((y1>=0) && (y2<=0))) ){ return 0; } } #endif if (sign != nextSign) { if (x1>0 && x2>0) crossings++; else if (x1>0 || x2>0) { if (x1-(y1*(x2-x1)/(y2-y1)) > 0) crossings++; } sign = nextSign; } } return crossings%2 ? 1 : 0; /* if odd, point is inside */ } static void quadeq(double a, double b, double c, double *x1, double *x2, int *nr, int *nc) { double dis, q; if( feq(a,0.0) ){ *nc = 0; if( feq(b,0.0) ){ *nr = 0; *x1 = 0.0; } else{ *nr = 1; *x1 = -c / b; } *x2 = *x1; } else{ dis = b*b - 4.0 * a * c; if( dis > 0.0 ){ *nr = 2; *nc = 0; dis = sqrt(dis); if( b < 0.0 ) dis = -dis; q = -0.5 * (b + dis); *x1 = q/a; *x2 = c/q; if(*x1 > *x2){ q = *x1; *x1 = *x2; *x2 = q; } } else if( feq(dis,0.0) ){ *nr = 1; *nc = 0; *x1 = - 0.5 * b / a; *x2 = *x1; } else{ *nr = 0; *nc = 2; *x1 = - 0.5 * b / a; *x2 = 0.5 * sqrt(-dis) / a; } } } static int corner_vertex(int index, int width, int height, double *x, double *y) { switch (index) { case 1: *x = 0.0; *y = height + 1; break; case 2: *x = 0.0; *y = 0.0; break; case 3: *x = width + 1; *y = 0.0; break; case 4: *x = width + 1; *y = height + 1; default: break; } index = index + 1; if(index > 4) index = 1; return(index); } static int pie_intercept(double width, double height, double xcen, double ycen, double angle, double *xcept, double *ycept) { double angl, slope; /* l: angle and slope of ray */ angl = angle; /* put angles in normal range */ while (angl < 0.0) angl = angl + 360.0; while (angl >= 360.0) angl = angl - 360.0; /* check for a horizontal angle */ #if USE_ASTRO_ANGLE if(fabs(angl - 90.0) < SMALL_NUMBER) { #else if(fabs(angl - 180.0) < SMALL_NUMBER) { #endif *xcept = 0.0; *ycept = ycen; return(2); } #if USE_ASTRO_ANGLE if(fabs(angl - 270.0) < SMALL_NUMBER) { #else if(fabs(angl - 0.0) < SMALL_NUMBER) { #endif *xcept = width + 1; *ycept = ycen; return(4); } /* convert to a Cartesian angle */ #if USE_ASTRO_ANGLE angl = angl + 90.0; #else angl = angl; #endif if(angl >= 360.0) angl = angl - 360.0; if(angl < 180.0) { *ycept = height + 1; /* rule out vertical line */ if(fabs(angl - 90.0) < SMALL_NUMBER) { *xcept = xcen; return(1); } } else { *ycept = 0.0; /* rule out vertical line */ if(fabs(angl - 270.0) < SMALL_NUMBER) { *xcept = xcen; return(3); } } /* convert to radians */ angl = (angl / 180.0) * M_PI; /* calculate slope */ slope = tan(angl); /* calculate intercept with designated y edge */ *xcept = xcen + ((*ycept - ycen) / slope); if(*xcept < 0) { *ycept = (ycen - (xcen * slope)); *xcept = 0.0; return(2); } else if(*xcept > (width + 1)) { *ycept = (ycen + ((width + 1 - xcen) * slope)); *xcept = width + 1; return(4); } else { if(*ycept < height) return(3); else return(1); } } /* ***************************** shapes ********************************** */ int evannulus(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, double ri, double ro) { /* use circle if possible */ if( ri == 0 ){ return(evcircle(g, rno, sno, flag, type, x, y, xcen, ycen, ro)); } if( !g->shapes[sno].init ){ g->shapes[sno].init = 1; g->shapes[sno].ystart = ycen - ro; g->shapes[sno].ystop = ycen + ro; g->shapes[sno].r1sq = ri * ri; g->shapes[sno].r2sq = ro * ro; } if((((y>=g->shapes[sno].ystart) && (y<=g->shapes[sno].ystop)) && (((xcen-x)*(xcen-x))+((ycen-y)*(ycen-y))<=g->shapes[sno].r2sq) && (((xcen-x)*(xcen-x))+((ycen-y)*(ycen-y))>g->shapes[sno].r1sq)) == flag ){ if( rno && flag ) g->rid = rno; return 1; } else{ return 0; } } int evbox(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, double xwidth, double yheight, double angle) { int i; double angl; /* l: Cartesian angle in radians */ double half_width, half_height;/* l: radii (1/2 width and height) */ double cosangl, sinangl; /* l: sine, cosine of the Cartesian angle */ double hw_cos, hw_sin; /* l: products of half_width with sin, cos */ double hh_cos, hh_sin; /* l: products of half_height with sin, cos */ double xstart=0.0; /* avoid -W unused parameter warning */ if( 0 ){ type = type; } if( (xwidth == 0) && (yheight==0) ){ return(!flag); } if( !g->shapes[sno].init ){ g->shapes[sno].init = 1; #if USE_ASTRO_ANGLE /* convert to a Cartesian angle; save angle for use in multi or slices */ angl = angle + 90.0; #else angl = angle; #endif while (angl >= 360.0) angl = angl - 360.0; /* convert to radians */ angl = (angl / 180.0) * M_PI; sinangl = sin (angl); cosangl = cos (angl); #if USE_ASTRO_ANGLE /* since we rotate by 90.0 degrees to get from astro angle to cartesian, */ /* we also need to switch the width and height. we do this secretly so */ /* that the display will turn out right, by doing it in the half terms */ half_width = yheight / 2.0; half_height = xwidth / 2.0; #else half_width = xwidth / 2.0; half_height = yheight / 2.0; #endif hw_cos = half_width * cosangl; hw_sin = half_width * sinangl; hh_cos = half_height * cosangl; hh_sin = half_height * sinangl; g->shapes[sno].pts = (double *)calloc(8, sizeof(double)); #if USE_ASTRO_ANGLE g->shapes[sno].pts[0] = xcen - hw_cos - hh_sin; g->shapes[sno].pts[1] = ycen - hw_sin + hh_cos; g->shapes[sno].pts[2] = xcen + hw_cos - hh_sin; g->shapes[sno].pts[3] = ycen + hw_sin + hh_cos; g->shapes[sno].pts[4] = xcen + hw_cos + hh_sin; g->shapes[sno].pts[5] = ycen + hw_sin - hh_cos; g->shapes[sno].pts[6] = xcen - hw_cos + hh_sin; g->shapes[sno].pts[7] = ycen - hw_sin - hh_cos; #else g->shapes[sno].pts[0] = xcen - hw_cos + hh_sin; g->shapes[sno].pts[1] = ycen - hh_cos - hw_sin; g->shapes[sno].pts[2] = xcen - hw_cos - hh_sin; g->shapes[sno].pts[3] = ycen + hh_cos - hw_sin; g->shapes[sno].pts[4] = xcen + hw_cos - hh_sin; g->shapes[sno].pts[5] = ycen + hh_cos + hw_sin; g->shapes[sno].pts[6] = xcen + hw_cos + hh_sin; g->shapes[sno].pts[7] = ycen - hh_cos + hw_sin; #endif g->shapes[sno].npt = 8; /* now find the y limits */ if( g->shapes[sno].npt ){ xstart = g->shapes[sno].pts[0]; g->shapes[sno].ystart = g->shapes[sno].pts[1]; g->shapes[sno].ystop = g->shapes[sno].ystart; for(i=1; ishapes[sno].npt; i+=2){ if(g->shapes[sno].pts[i-1] < xstart) xstart = g->shapes[sno].pts[i-1]; if(g->shapes[sno].pts[i] > g->shapes[sno].ystop) g->shapes[sno].ystop = g->shapes[sno].pts[i]; if(g->shapes[sno].pts[i] < g->shapes[sno].ystart) g->shapes[sno].ystart = g->shapes[sno].pts[i]; } } } if( (((y>=g->shapes[sno].ystart) && (y<=g->shapes[sno].ystop)) && polypt(x, y, g->shapes[sno].pts, g->shapes[sno].npt/2, xstart, g->shapes[sno].ystart, 0)) == flag ){ if( rno && flag ) g->rid = rno; return 1; } else return 0; } int evcircle(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, double radius) { /* avoid -W unused parameter warning */ if( 0 ){ type = type; } if( radius == 0 ){ return(!flag); } if( !g->shapes[sno].init ){ g->shapes[sno].init = 1; g->shapes[sno].ystart = ycen - radius; g->shapes[sno].ystop = ycen + radius; g->shapes[sno].r1sq = radius * radius; } if( (((y>=g->shapes[sno].ystart) && (y<=g->shapes[sno].ystop)) && (((xcen-x)*(xcen-x))+((ycen-y)*(ycen-y))<=g->shapes[sno].r1sq)) == flag ){ if( rno && flag ) g->rid = rno; return 1; } else return 0; } int evellipse(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, double xrad, double yrad, double angle) { double yhi, yoff; double b, c; double b_partial, c_partial; double xboff, xfoff; int nr, nc; /* use circle if possible */ if( xrad == yrad ){ return(evcircle(g, rno, sno, flag, type, x, y, xcen, ycen, xrad)); } if( !g->shapes[sno].init ){ g->shapes[sno].init = 1; /* set worst case limits (xrad axis parallel to vertical axis) */ #if USE_ASTRO_ANGLE /* convert to a Cartesian angle; save "angle" for use by other routines */ g->shapes[sno].angl = angle + 90.0; #else g->shapes[sno].angl = angle; #endif while( g->shapes[sno].angl >= 360.0 ) g->shapes[sno].angl = g->shapes[sno].angl - 360.0; /* convert to radians */ g->shapes[sno].angl = (g->shapes[sno].angl / 180.0) * M_PI; g->shapes[sno].sinangl = sin(g->shapes[sno].angl); g->shapes[sno].cosangl = cos(g->shapes[sno].angl); /* calculate approximate y limits */ /* choose lesser of containing rotbox and circle */ #if USE_ASTRO_ANGLE yhi = fabs(g->shapes[sno].sinangl * yrad) + fabs(g->shapes[sno].cosangl * xrad); #else yhi = fabs(g->shapes[sno].sinangl * xrad) + fabs(g->shapes[sno].cosangl * yrad); #endif yhi = min(yhi, max(yrad, xrad)); g->shapes[sno].ystart = ycen - yhi; g->shapes[sno].ystop = ycen + yhi; /* prepare partials for quadratic equation solutions to coordinates */ g->shapes[sno].cossq = g->shapes[sno].cosangl * g->shapes[sno].cosangl; g->shapes[sno].sinsq = g->shapes[sno].sinangl * g->shapes[sno].sinangl; #if USE_ASTRO_ANGLE /* because we rotate by 90.0 degrees to get from astro angle to */ /* cartesian, we also need to switch the x and y axes. we do this */ /* secretly so that the display will turn out right, by doing it in */ /* the sq terms */ g->shapes[sno].xradsq = yrad * yrad; g->shapes[sno].yradsq = xrad * xrad; #else g->shapes[sno].xradsq = xrad * xrad; g->shapes[sno].yradsq = yrad * yrad; #endif /* fill in as much of a,b,c as we can */ g->shapes[sno].a = (g->shapes[sno].cossq / g->shapes[sno].xradsq) + (g->shapes[sno].sinsq / g->shapes[sno].yradsq); } if( ((y>=g->shapes[sno].ystart) && (y<=g->shapes[sno].ystop)) ){ b_partial = (2.0 * g->shapes[sno].sinangl) * ((g->shapes[sno].cosangl / g->shapes[sno].xradsq) - (g->shapes[sno].cosangl / g->shapes[sno].yradsq)); c_partial = (g->shapes[sno].sinsq / g->shapes[sno].xradsq) + (g->shapes[sno].cossq / g->shapes[sno].yradsq); yoff = y - ycen; b = b_partial * yoff; c = (c_partial * yoff * yoff) - 1.0; /* solve quadratic */ quadeq (g->shapes[sno].a, b, c, &xboff, &xfoff, &nr, &nc); /* if real roots */ if( nr != 0 ) { FPU_DOUBLE #if USE_FLOAT_COMPARE if( (((float)x>=(float)(xcen+xboff)) && ((float)x<=(float)(xcen+xfoff))) == flag ){ #else if( ((x>=(xcen+xboff)) && (x<=(xcen+xfoff))) == flag ){ #endif if( rno && flag ) g->rid = rno; FPU_RESTORE return 1; } else{ FPU_RESTORE return 0; } } else return !flag; } return !flag; } int evfield(GFilt g, int rno, int sno, int flag, int type, double x, double y) { /* avoid -W unused parameter warning */ if( 0 ){ sno = sno; type = type; x = x; y = y; } if( flag ){ if( rno && flag ) g->rid = rno; return 1; } else return 0; } int evline(GFilt g, int rno, int sno, int flag, int type, double x, double y, double x1, double y1, double x2, double y2) { /* avoid -W unused parameter warning */ if( 0 ){ type = type; } if( !g->shapes[sno].init ){ g->shapes[sno].init = 1; g->shapes[sno].ystart = min(y1,y2); g->shapes[sno].ystop = max(y1,y2); g->shapes[sno].x1 = x1; g->shapes[sno].x2 = x2; g->shapes[sno].y1 = y1; if( feq(y1,y2) ){ g->shapes[sno].xonly = 1; g->shapes[sno].invslope = 0; } else{ g->shapes[sno].xonly = 0; g->shapes[sno].invslope = (x1 - x2) / (y1 - y2); } } if( (((y>=g->shapes[sno].ystart) && (y<=g->shapes[sno].ystop)) && ((!g->shapes[sno].xonly && feq((((y-g->shapes[sno].y1)*g->shapes[sno].invslope)+g->shapes[sno].x1),x)) || (g->shapes[sno].xonly && ((x>=g->shapes[sno].x1)&&(x<=g->shapes[sno].x2))))) == flag){ if( rno && flag ) g->rid = rno; return 1; } else return 0; } int evpie(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, double angle1, double angle2) { int i; int width, height; /* l: image mask width and height */ double sweep; /* l: sweep between cut angles */ int intrcpt1, intrcpt2; /* l: side intercepted by each cut */ double x2, y2; /* l: coordinates of second intercept */ double xstart=0.0; /* use field if possible */ if( (angle1==0) && (angle2==360) ){ return(evfield(g, rno, sno, flag, type, x, y)); } if( !g->shapes[sno].init ){ g->shapes[sno].init = 1; /* we have to fake width and height, since we do not know them! */ width = LARGE_NUMBER; height = LARGE_NUMBER; /* start listing vertices of polygon */ g->shapes[sno].pts = (double *)calloc(14, sizeof(double)); g->shapes[sno].pts[0] = xcen; g->shapes[sno].pts[1] = ycen; sweep = angle2 - angle1; /* if sweep is too small to be noticed, don't bother */ if(fabs(sweep) < SMALL_NUMBER) return !flag; if (sweep < 0.0) sweep = sweep + 360.0; intrcpt1 = pie_intercept((double)width, (double)height, xcen, ycen, angle1, &(g->shapes[sno].pts[2]), &(g->shapes[sno].pts[3])); intrcpt2 = pie_intercept((double)width, (double)height, xcen, ycen, angle2, &x2, &y2); g->shapes[sno].npt = 4; /* if angles intercept same side and slice is between them, no corners */ /* else, mark corners until reaching side with second angle intercept */ if((intrcpt1 != intrcpt2) || (sweep > 180.0)){ do{ intrcpt1 = corner_vertex(intrcpt1, width, height, &(g->shapes[sno].pts[g->shapes[sno].npt]), &(g->shapes[sno].pts[g->shapes[sno].npt+1])); g->shapes[sno].npt = g->shapes[sno].npt + 2; }while(intrcpt1 != intrcpt2); } g->shapes[sno].pts[g->shapes[sno].npt] = x2; g->shapes[sno].pts[g->shapes[sno].npt+1] = y2; g->shapes[sno].npt = g->shapes[sno].npt + 2; /* now find the y limits */ if( g->shapes[sno].npt ){ xstart = g->shapes[sno].pts[0]; g->shapes[sno].ystart = g->shapes[sno].pts[1]; g->shapes[sno].ystop = g->shapes[sno].ystart; for(i=1; ishapes[sno].npt; i+=2){ if(g->shapes[sno].pts[i-1] < xstart) xstart = g->shapes[sno].pts[i-1]; if(g->shapes[sno].pts[i] > g->shapes[sno].ystop) g->shapes[sno].ystop = g->shapes[sno].pts[i]; if(g->shapes[sno].pts[i] < g->shapes[sno].ystart) g->shapes[sno].ystart = g->shapes[sno].pts[i]; } } } if( (((y>=g->shapes[sno].ystart) && (y<=g->shapes[sno].ystop)) && polypt(x, y, g->shapes[sno].pts, g->shapes[sno].npt/2, xstart, g->shapes[sno].ystart, 1)) == flag ){ if( rno && flag ) g->rid = rno; return 1; } else{ return 0; } } int evqtpie(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, double angle1, double angle2) { return evpie(g, rno, sno, flag, type, x, y, xcen, ycen, angle1, angle2); } int evpoint(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen) { /* avoid -W unused parameter warning */ if( 0 ){ sno = sno; type = type; } if( ((x==xcen) && (y==ycen)) == flag ){ if( rno && flag ) g->rid = rno; return 1; } else return 0; } #ifdef __STDC__ int evpolygon(GFilt g, int rno, int sno, int flag, int type, double x, double y, ...) { int i, maxpts; double xstart=0.0; va_list args; va_start(args, y); #else int evpolygon(va_alist) va_dcl { GFilt g; int rno, sno, flag, type; double x, y; double xstart=0.0; int i, maxpts; va_list args; va_start(args); g = va_arg(args, GFilt); rno = va_arg(args, int); sno = va_arg(args, int); flag = va_arg(args, int); type = va_arg(args, int); x = va_arg(args, double); y = va_arg(args, double); #endif /* avoid -W unused parameter warning */ if( 0 ){ type = type; } if( !g->shapes[sno].init ){ g->shapes[sno].init = 1; /* allocate space for x,y arguments */ maxpts = MASKINC; g->shapes[sno].pts = (double *)calloc(maxpts, sizeof(double)); /* gather up arguments */ g->shapes[sno].npt = 0; while( 1 ){ if( g->shapes[sno].npt >= maxpts ){ maxpts += MASKINC; g->shapes[sno].pts = (double *)realloc(g->shapes[sno].pts, maxpts*sizeof(double)); } g->shapes[sno].pts[g->shapes[sno].npt] = va_arg(args, double); /* two negatives in a row means we are at end of args */ if( feq(g->shapes[sno].pts[g->shapes[sno].npt],PSTOP) && feq(g->shapes[sno].pts[g->shapes[sno].npt-1],PSTOP) ){ g->shapes[sno].npt--; break; } g->shapes[sno].npt++; } va_end(args); /* realloc to actual size */ g->shapes[sno].pts = (double *)realloc(g->shapes[sno].pts, g->shapes[sno].npt*sizeof(double)); /* now find the y limits */ if( g->shapes[sno].npt ){ xstart = g->shapes[sno].pts[0]; g->shapes[sno].ystart = g->shapes[sno].pts[1]; g->shapes[sno].ystop = g->shapes[sno].ystart; for(i=1; ishapes[sno].npt; i+=2){ if(g->shapes[sno].pts[i-1] < xstart) xstart = g->shapes[sno].pts[i-1]; if(g->shapes[sno].pts[i] > g->shapes[sno].ystop) g->shapes[sno].ystop = g->shapes[sno].pts[i]; if(g->shapes[sno].pts[i] < g->shapes[sno].ystart) g->shapes[sno].ystart = g->shapes[sno].pts[i]; } } } if( (((y>=g->shapes[sno].ystart) && (y<=g->shapes[sno].ystop)) && polypt(x, y, g->shapes[sno].pts, g->shapes[sno].npt/2, xstart, g->shapes[sno].ystart, 0)) == flag ){ if( rno && flag ) g->rid = rno; return 1; } else return 0; } /* accelerator regions -- lower and upper limits are given for n regions */ int evnannulus(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, double lo, double hi, int n) { int i; int xsno; double dinc; /* get limits */ dinc = (hi - lo)/(double)n; xsno = (g->nshapes+1)+((sno-1)*XSNO); if( flag ){ /* if its not somewhere inside the entire region we lose ... */ if( !evannulus(g, 0, xsno, flag, type, x, y, xcen, ycen, lo, hi) ){ return(0); } /* look through all of them to find the right one */ for(i=0; inshapes+1)+((sno-1)*XSNO); if( flag ){ /* if its not somewhere inside the entire region we lose ... */ if( !evbox(g, 0, xsno, flag, type, x, y, xcen, ycen, hix, hiy, ang) ){ return(0); } /* if its in the inner region we lose */ if( evbox(g, 0, xsno+1, flag, type, x, y, xcen, ycen, lox, loy, ang) ){ return(0); } /* look through all of them to find the right one */ for(i=0; inshapes+1)+((sno-1)*XSNO); if( flag ){ /* if its not somewhere inside the entire region we lose ... */ if( !evellipse(g, 0, xsno, flag, type, x, y, xcen, ycen, hix, hiy, ang) ){ return(0); } /* if its in the inner region we lose */ if( evellipse(g, 0, xsno+1, flag, type, x, y, xcen, ycen, lox, loy, ang) ){ return(0); } /* look through all of them to find the right one */ for(i=0; i hi ) lo -= 360.0; dinc = (hi - lo)/n; xsno = (g->nshapes+1)+((sno-1)*XSNO); if( flag ){ /* check limits */ if( !evpie(g, 0, xsno, flag, type, x, y, xcen, ycen, lo, hi) ){ return(0); } /* look through all of them to find the right one */ for(i=0; inshapes+1)+((sno-1)*XSNO); if( flag ){ /* if its not somewhere inside the entire region we lose ... */ if( !evannulus(g, 0, xsno, flag, type, x, y, xcen, ycen, radlo, radhi) || !evpie(g, 0, xsno+1, flag, type, x, y, xcen, ycen, anglo, anghi) ){ return(0); } /* look through all of them to find the right one */ for(a=1; a<=ahi; a++){ for(r=1; r<=rhi; r++){ if( evannulus(g, rno+n, sno+(2*n), flag, type, x, y, xcen, ycen, radlo+((r-1)*rinc), radlo+(r*rinc)) && evpie(g, rno+n, sno+(2*n+1), flag, type, x, y, xcen, ycen, anglo+((a-1)*ainc), anglo+(a*ainc)) ){ return(1); } n++; } } return(0); } else{ /* if its not somewhere inside the entire region we win ... */ if( !evannulus(g, 0, xsno, 1, type, x, y, xcen, ycen, radlo, radhi) ) return(1); else if( !evpie(g, 0, xsno+1, 1, type, x, y, xcen, ycen, anglo, anghi) ){ return(1); } else{ return(0); } } } int evbpanda(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, double anglo, double anghi, double angn, double xlo, double ylo, double xhi, double yhi, double radn, double ang) { int a, r; int ahi, rhi; int xsno; int n=0; double ainc, xinc, yinc; /* get limits */ anglo += ang; anghi += ang; ainc = (anghi - anglo)/angn; ahi = (int)angn; xinc = (xhi - xlo)/radn; yinc = (yhi - ylo)/radn; rhi = (int)radn; xsno = (g->nshapes+1)+((sno-1)*XSNO); if( flag ){ /* if its not somewhere inside the entire region we lose ... */ if( !evbox(g, 0, xsno, flag, type, x, y, xcen, ycen, xhi, yhi, ang) ){ return(0); } /* but if its in the inner region we lose */ else if( evbox(g, 0, xsno+2, flag, type, x, y, xcen, ycen, xlo, ylo, ang) ){ return(0); } /* its in the box .. must also be in the pie */ else if( !evpie(g, 0, xsno+1, flag, type, x, y, xcen, ycen, anglo, anghi)){ return(0); } /* look through all of them to find the right one */ for(a=0; anshapes+1)+((sno-1)*XSNO); if( flag ){ /* if its not somewhere inside the entire region we lose ... */ if( !evellipse(g, 0, xsno, flag, type, x, y, xcen, ycen, xhi, yhi, ang) ){ return(0); } /* but if its in the inner region we lose */ else if( evellipse(g, 0, xsno+2, flag, type, x, y, xcen, ycen, xlo, ylo, ang) ){ return(0); } /* its in the ellipse .. must also be in the pie */ else if( !evpie(g, 0, xsno+1, flag, type, x, y, xcen, ycen, anglo, anghi)){ return(0); } /* look through all of them to find the right one */ for(a=0; anshapes+1)+((sno-1)*XSNO); if( !g->shapes[xsno].xv ){ maxpts = MASKINC; g->shapes[xsno].xv = (double *)calloc(maxpts, sizeof(double)); g->shapes[xsno].nv = 0; while( 1 ){ if( g->shapes[xsno].nv >= maxpts ){ maxpts += MASKINC; g->shapes[xsno].xv = (double *)realloc(g->shapes[xsno].xv, maxpts*sizeof(double)); } g->shapes[xsno].xv[g->shapes[xsno].nv] = va_arg(args, double); if( feq(g->shapes[xsno].xv[g->shapes[xsno].nv],PSTOP) && feq(g->shapes[xsno].xv[g->shapes[xsno].nv-1],PSTOP) ){ g->shapes[xsno].nv--; break; } g->shapes[xsno].nv++; } va_end(args); g->shapes[xsno].xv = (double *)realloc(g->shapes[xsno].xv, g->shapes[xsno].nv*sizeof(double)); } n = g->shapes[xsno].nv; xv = g->shapes[xsno].xv; /* this should be impossible ... */ if( n == 2 ){ return(evannulus(g, rno, sno, flag, type, x, y, xcen, ycen, xv[0], xv[1])); } if( flag ){ /* if its not somewhere inside the entire region we lose ... */ if( !evannulus(g, 0, xsno, flag, type, x, y, xcen, ycen, xv[0], xv[n-1]) ){ return(0); } /* look through all of them to find the right one */ for(i=0; inshapes+1)+((sno-1)*XSNO); if( !g->shapes[xsno].xv ){ maxpts = MASKINC; g->shapes[xsno].xv = (double *)calloc(maxpts, sizeof(double)); g->shapes[xsno].nv = 0; while( 1 ){ if( g->shapes[xsno].nv >= maxpts ){ maxpts += MASKINC; g->shapes[xsno].xv = (double *)realloc(g->shapes[xsno].xv, maxpts*sizeof(double)); } g->shapes[xsno].xv[g->shapes[xsno].nv] = va_arg(args, double); if( feq(g->shapes[xsno].xv[g->shapes[xsno].nv],PSTOP) && feq(g->shapes[xsno].xv[g->shapes[xsno].nv-1],PSTOP) ){ g->shapes[xsno].nv--; break; } g->shapes[xsno].nv++; } va_end(args); g->shapes[xsno].xv = (double *)realloc(g->shapes[xsno].xv, g->shapes[xsno].nv*sizeof(double)); } n = g->shapes[xsno].nv; xv = g->shapes[xsno].xv; ang = xv[--n]; /* this should be impossible ... */ if( n == 2 ){ return(evbox(g, rno, sno, flag, type, x, y, xcen, ycen, xv[0], xv[1], ang)); } if( flag ){ /* if its not somewhere inside the entire region we lose ... */ if( !evbox(g, 0, xsno, flag, type, x, y, xcen, ycen, xv[n-2], xv[n-1], ang) ){ return(0); } /* if its in the inner region we lose */ if( evbox(g, 0, xsno+1, flag, type, x, y, xcen, ycen, xv[0], xv[1], ang) ){ return(0); } /* look through all of them to find the right one */ for(i=2, j=0; inshapes+1)+((sno-1)*XSNO); if( !g->shapes[xsno].xv ){ maxpts = MASKINC; g->shapes[xsno].xv = (double *)calloc(maxpts, sizeof(double)); g->shapes[xsno].nv = 0; while( 1 ){ if( g->shapes[xsno].nv >= maxpts ){ maxpts += MASKINC; g->shapes[xsno].xv = (double *)realloc(g->shapes[xsno].xv, maxpts*sizeof(double)); } g->shapes[xsno].xv[g->shapes[xsno].nv] = va_arg(args, double); if( feq(g->shapes[xsno].xv[g->shapes[xsno].nv],PSTOP) && feq(g->shapes[xsno].xv[g->shapes[xsno].nv-1],PSTOP) ){ g->shapes[xsno].nv--; break; } g->shapes[xsno].nv++; } va_end(args); g->shapes[xsno].xv = (double *)realloc(g->shapes[xsno].xv, g->shapes[xsno].nv*sizeof(double)); } n = g->shapes[xsno].nv; xv = g->shapes[xsno].xv; ang = xv[--n]; /* this should be impossible ... */ if( n == 2 ){ return(evellipse(g, rno, sno, flag, type, x, y, xcen, ycen, xv[0], xv[1], ang)); } if( flag ){ /* if its not somewhere inside the entire region we lose ... */ if( !evellipse(g, 0, xsno, flag, type, x, y, xcen, ycen, xv[n-2], xv[n-1], ang) ){ return(0); } /* if its in the inner region we lose */ if( evellipse(g, 0, xsno+1, flag, type, x, y, xcen, ycen, xv[0], xv[1], ang) ){ return(0); } /* look through all of them to find the right one */ for(i=2, j=0; inshapes+1)+((sno-1)*XSNO); if( !g->shapes[xsno].xv ){ maxpts = MASKINC; g->shapes[xsno].xv = (double *)calloc(maxpts, sizeof(double)); g->shapes[xsno].nv = 0; while( 1 ){ if( g->shapes[xsno].nv >= maxpts ){ maxpts += MASKINC; g->shapes[xsno].xv = (double *)realloc(g->shapes[xsno].xv, maxpts*sizeof(double)); } g->shapes[xsno].xv[g->shapes[xsno].nv] = va_arg(args, double); if( feq(g->shapes[xsno].xv[g->shapes[xsno].nv],PSTOP) && feq(g->shapes[xsno].xv[g->shapes[xsno].nv-1],PSTOP) ){ g->shapes[xsno].nv--; break; } g->shapes[xsno].nv++; } va_end(args); g->shapes[xsno].xv = (double *)realloc(g->shapes[xsno].xv, g->shapes[xsno].nv*sizeof(double)); } n = g->shapes[xsno].nv; xv = g->shapes[xsno].xv; /* this should be impossible ... */ if( n == 2 ){ return(evpie(g, rno, sno, flag, type, x, y, xcen, ycen, xv[0], xv[1])); } if( flag ){ /* if its not somewhere inside the entire region we lose ... */ if( !evpie(g, 0, xsno, flag, type, x, y, xcen, ycen, xv[0], xv[n-1]) ){ return(0); } /* look through all of them to find the right one */ for(i=0; inshapes+1)+((sno-1)*XSNO); if( !g->shapes[xsno].xv ){ maxpts = MASKINC; g->shapes[xsno].xv = (double *)calloc(maxpts, sizeof(double)); g->shapes[xsno].nv = 0; while( 1 ){ if( g->shapes[xsno].nv >= maxpts ){ maxpts += MASKINC; g->shapes[xsno].xv = (double *)realloc(g->shapes[xsno].xv, maxpts*sizeof(double)); } g->shapes[xsno].xv[g->shapes[xsno].nv] = va_arg(args, double); if( feq(g->shapes[xsno].xv[g->shapes[xsno].nv],PSTOP) && feq(g->shapes[xsno].xv[g->shapes[xsno].nv-1],PSTOP) ){ g->shapes[xsno].nv--; break; } g->shapes[xsno].nv++; } va_end(args); g->shapes[xsno].xv = (double *)realloc(g->shapes[xsno].xv, g->shapes[xsno].nv*sizeof(double)); } n = g->shapes[xsno].nv; xv = g->shapes[xsno].xv; /* look through all of them to find the right one */ for(i=0, j=0; i #endif /* panda and pie incorrectly used astronomical angles. fixed 4/2004 */ #define USE_ASTRO_ANGLE 0 /* we might want to avoid (x86) extended precision problems */ #define USE_FPU_DOUBLE _FPUDBL_ #if USE_FPU_DOUBLE #include static fpu_control_t _cw; #define FPU_DOUBLE {fpu_control_t _cw2; _FPU_GETCW(_cw); _cw2 = _cw & ~_FPU_EXTENDED; _cw2 |= _FPU_DOUBLE; _FPU_SETCW(_cw2);} #define FPU_RESTORE {_FPU_SETCW(_cw);} #else #define FPU_DOUBLE #define FPU_RESTORE #endif /* alternate method of avoiding (x86) extended precision problems */ #define USE_FLOAT_COMPARE 0 /* add this to FilterOpen to cause this module to be loaded for dynamic linking */ static int evregno=0; void initevregions(void) { evregno++; return; } static int polypt(double x, double y, double* poly, int count, double xstart, double ystart, int flag) { /* x-- x value of point being tested */ /* y-- y value of point being tested */ /* poly-- bounding polygon, array of length (count*2) */ /* count-- number of edges of bounding polygon */ /* This algorithm is from "An Introduction to Ray Tracing", Academic Press, */ /* 1989, edited by Andrew Glassner, pg 53 */ /* a point lies in a polygon if a line is extended from the point to infinite */ /* in any direction and the number of intersections with the polygon is odd. */ /* This is valid for both concave and convex polygons. */ /* Points on a vertex are considered inside. */ /* Points on a edge are considered inside. */ /* number of crossings */ int crossings = 0; /* init sign for first vertice */ int sign = ((poly[1] - y)>=0) ? 1 : -1; /* for all edges */ int i; /* avoid -W unused parameter warning */ if( 0 ){ xstart = xstart; } /* if flag is set, we check x, y against first point */ if( flag && (x == poly[0]) && (y == poly[1]) ) return 1; for(i=0; i=0) ? 1 : -1; /* horiz line */ if( (y1==0) && (y2==0) ){ if( ((x2>=0) && (x1<=0)) || ((x1>=0) && (x2<=0)) ){ /* we always return true for ystart horiz lines */ if( y == ystart ) return 1; else return fmod((double)crossings+1,2.0) ? 1 : 0; } } /* vertical line */ else if( (x1==0) && (x2==0) ){ if( ((y2>=0) && (y1<=0)) || ((y1>=0) && (y2<=0)) ){ return fmod((double)crossings+1,2.0) ? 1 : 0; } } /* point on line */ else if( feq((y1*(x2-x1)),(x1*(y2-y1))) ){ if( (((x2>=0) && (x1<=0)) || ((x1>=0) && (x2<=0))) && (((y2>=0) && (y1<=0)) || ((y1>=0) && (y2<=0))) ){ return fmod((double)crossings+1,2.0) ? 1 : 0; } } #if 0 /* horiz line */ if( (y1==0) && (y2==0) ){ if( ((x2>=0) && (x1<=0)) || ((x1>=0) && (x2<=0)) ){ if( y == ystart ){ return 1; } } } /* vertical line */ else if( (x1==0) && (x2==0) ){ if( ((y2>=0) && (y1<=0)) || ((y1>=0) && (y2<=0)) ){ if( x == xstart ){ return 1; } } } /* point on line */ else if( feq((y1*(x2-x1)),(x1*(y2-y1))) ){ if( (((x2>=0) && (x1<=0)) || ((x1>=0) && (x2<=0))) && (((y2>=0) && (y1<=0)) || ((y1>=0) && (y2<=0))) ){ return 0; } } #endif if (sign != nextSign) { if (x1>0 && x2>0) crossings++; else if (x1>0 || x2>0) { if (x1-(y1*(x2-x1)/(y2-y1)) > 0) crossings++; } sign = nextSign; } } return crossings%2 ? 1 : 0; /* if odd, point is inside */ } static void quadeq(double a, double b, double c, double *x1, double *x2, int *nr, int *nc) { double dis, q; if( feq(a,0.0) ){ *nc = 0; if( feq(b,0.0) ){ *nr = 0; *x1 = 0.0; } else{ *nr = 1; *x1 = -c / b; } *x2 = *x1; } else{ dis = b*b - 4.0 * a * c; if( dis > 0.0 ){ *nr = 2; *nc = 0; dis = sqrt(dis); if( b < 0.0 ) dis = -dis; q = -0.5 * (b + dis); *x1 = q/a; *x2 = c/q; if(*x1 > *x2){ q = *x1; *x1 = *x2; *x2 = q; } } else if( feq(dis,0.0) ){ *nr = 1; *nc = 0; *x1 = - 0.5 * b / a; *x2 = *x1; } else{ *nr = 0; *nc = 2; *x1 = - 0.5 * b / a; *x2 = 0.5 * sqrt(-dis) / a; } } } static int corner_vertex(int index, int width, int height, double *x, double *y) { switch (index) { case 1: *x = 0.0; *y = height + 1; break; case 2: *x = 0.0; *y = 0.0; break; case 3: *x = width + 1; *y = 0.0; break; case 4: *x = width + 1; *y = height + 1; default: break; } index = index + 1; if(index > 4) index = 1; return(index); } static int pie_intercept(double width, double height, double xcen, double ycen, double angle, double *xcept, double *ycept) { double angl, slope; /* l: angle and slope of ray */ angl = angle; /* put angles in normal range */ while (angl < 0.0) angl = angl + 360.0; while (angl >= 360.0) angl = angl - 360.0; /* check for a horizontal angle */ #if USE_ASTRO_ANGLE if(fabs(angl - 90.0) < SMALL_NUMBER) { #else if(fabs(angl - 180.0) < SMALL_NUMBER) { #endif *xcept = 0.0; *ycept = ycen; return(2); } #if USE_ASTRO_ANGLE if(fabs(angl - 270.0) < SMALL_NUMBER) { #else if(fabs(angl - 0.0) < SMALL_NUMBER) { #endif *xcept = width + 1; *ycept = ycen; return(4); } /* convert to a Cartesian angle */ #if USE_ASTRO_ANGLE angl = angl + 90.0; #else angl = angl; #endif if(angl >= 360.0) angl = angl - 360.0; if(angl < 180.0) { *ycept = height + 1; /* rule out vertical line */ if(fabs(angl - 90.0) < SMALL_NUMBER) { *xcept = xcen; return(1); } } else { *ycept = 0.0; /* rule out vertical line */ if(fabs(angl - 270.0) < SMALL_NUMBER) { *xcept = xcen; return(3); } } /* convert to radians */ angl = (angl / 180.0) * M_PI; /* calculate slope */ slope = tan(angl); /* calculate intercept with designated y edge */ *xcept = xcen + ((*ycept - ycen) / slope); if(*xcept < 0) { *ycept = (ycen - (xcen * slope)); *xcept = 0.0; return(2); } else if(*xcept > (width + 1)) { *ycept = (ycen + ((width + 1 - xcen) * slope)); *xcept = width + 1; return(4); } else { if(*ycept < height) return(3); else return(1); } } /* ***************************** shapes ********************************** */ int evannulus(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, double ri, double ro) { /* use circle if possible */ if( ri == 0 ){ return(evcircle(g, rno, sno, flag, type, x, y, xcen, ycen, ro)); } if( !g->shapes[sno].init ){ g->shapes[sno].init = 1; g->shapes[sno].ystart = ycen - ro; g->shapes[sno].ystop = ycen + ro; g->shapes[sno].r1sq = ri * ri; g->shapes[sno].r2sq = ro * ro; } if((((y>=g->shapes[sno].ystart) && (y<=g->shapes[sno].ystop)) && (((xcen-x)*(xcen-x))+((ycen-y)*(ycen-y))<=g->shapes[sno].r2sq) && (((xcen-x)*(xcen-x))+((ycen-y)*(ycen-y))>g->shapes[sno].r1sq)) == flag ){ if( rno && flag ) g->rid = rno; return 1; } else{ return 0; } } int evbox(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, double xwidth, double yheight, double angle) { int i; double angl; /* l: Cartesian angle in radians */ double half_width, half_height;/* l: radii (1/2 width and height) */ double cosangl, sinangl; /* l: sine, cosine of the Cartesian angle */ double hw_cos, hw_sin; /* l: products of half_width with sin, cos */ double hh_cos, hh_sin; /* l: products of half_height with sin, cos */ double xstart=0.0; /* avoid -W unused parameter warning */ if( 0 ){ type = type; } if( (xwidth == 0) && (yheight==0) ){ return(!flag); } if( !g->shapes[sno].init ){ g->shapes[sno].init = 1; #if USE_ASTRO_ANGLE /* convert to a Cartesian angle; save angle for use in multi or slices */ angl = angle + 90.0; #else angl = angle; #endif while (angl >= 360.0) angl = angl - 360.0; /* convert to radians */ angl = (angl / 180.0) * M_PI; sinangl = sin (angl); cosangl = cos (angl); #if USE_ASTRO_ANGLE /* since we rotate by 90.0 degrees to get from astro angle to cartesian, */ /* we also need to switch the width and height. we do this secretly so */ /* that the display will turn out right, by doing it in the half terms */ half_width = yheight / 2.0; half_height = xwidth / 2.0; #else half_width = xwidth / 2.0; half_height = yheight / 2.0; #endif hw_cos = half_width * cosangl; hw_sin = half_width * sinangl; hh_cos = half_height * cosangl; hh_sin = half_height * sinangl; g->shapes[sno].pts = (double *)calloc(8, sizeof(double)); #if USE_ASTRO_ANGLE g->shapes[sno].pts[0] = xcen - hw_cos - hh_sin; g->shapes[sno].pts[1] = ycen - hw_sin + hh_cos; g->shapes[sno].pts[2] = xcen + hw_cos - hh_sin; g->shapes[sno].pts[3] = ycen + hw_sin + hh_cos; g->shapes[sno].pts[4] = xcen + hw_cos + hh_sin; g->shapes[sno].pts[5] = ycen + hw_sin - hh_cos; g->shapes[sno].pts[6] = xcen - hw_cos + hh_sin; g->shapes[sno].pts[7] = ycen - hw_sin - hh_cos; #else g->shapes[sno].pts[0] = xcen - hw_cos + hh_sin; g->shapes[sno].pts[1] = ycen - hh_cos - hw_sin; g->shapes[sno].pts[2] = xcen - hw_cos - hh_sin; g->shapes[sno].pts[3] = ycen + hh_cos - hw_sin; g->shapes[sno].pts[4] = xcen + hw_cos - hh_sin; g->shapes[sno].pts[5] = ycen + hh_cos + hw_sin; g->shapes[sno].pts[6] = xcen + hw_cos + hh_sin; g->shapes[sno].pts[7] = ycen - hh_cos + hw_sin; #endif g->shapes[sno].npt = 8; /* now find the y limits */ if( g->shapes[sno].npt ){ xstart = g->shapes[sno].pts[0]; g->shapes[sno].ystart = g->shapes[sno].pts[1]; g->shapes[sno].ystop = g->shapes[sno].ystart; for(i=1; ishapes[sno].npt; i+=2){ if(g->shapes[sno].pts[i-1] < xstart) xstart = g->shapes[sno].pts[i-1]; if(g->shapes[sno].pts[i] > g->shapes[sno].ystop) g->shapes[sno].ystop = g->shapes[sno].pts[i]; if(g->shapes[sno].pts[i] < g->shapes[sno].ystart) g->shapes[sno].ystart = g->shapes[sno].pts[i]; } } } if( (((y>=g->shapes[sno].ystart) && (y<=g->shapes[sno].ystop)) && polypt(x, y, g->shapes[sno].pts, g->shapes[sno].npt/2, xstart, g->shapes[sno].ystart, 0)) == flag ){ if( rno && flag ) g->rid = rno; return 1; } else return 0; } int evcircle(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, double radius) { /* avoid -W unused parameter warning */ if( 0 ){ type = type; } if( radius == 0 ){ return(!flag); } if( !g->shapes[sno].init ){ g->shapes[sno].init = 1; g->shapes[sno].ystart = ycen - radius; g->shapes[sno].ystop = ycen + radius; g->shapes[sno].r1sq = radius * radius; } if( (((y>=g->shapes[sno].ystart) && (y<=g->shapes[sno].ystop)) && (((xcen-x)*(xcen-x))+((ycen-y)*(ycen-y))<=g->shapes[sno].r1sq)) == flag ){ if( rno && flag ) g->rid = rno; return 1; } else return 0; } int evellipse(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, double xrad, double yrad, double angle) { double yhi, yoff; double b, c; double b_partial, c_partial; double xboff, xfoff; int nr, nc; /* use circle if possible */ if( xrad == yrad ){ return(evcircle(g, rno, sno, flag, type, x, y, xcen, ycen, xrad)); } if( !g->shapes[sno].init ){ g->shapes[sno].init = 1; /* set worst case limits (xrad axis parallel to vertical axis) */ #if USE_ASTRO_ANGLE /* convert to a Cartesian angle; save "angle" for use by other routines */ g->shapes[sno].angl = angle + 90.0; #else g->shapes[sno].angl = angle; #endif while( g->shapes[sno].angl >= 360.0 ) g->shapes[sno].angl = g->shapes[sno].angl - 360.0; /* convert to radians */ g->shapes[sno].angl = (g->shapes[sno].angl / 180.0) * M_PI; g->shapes[sno].sinangl = sin(g->shapes[sno].angl); g->shapes[sno].cosangl = cos(g->shapes[sno].angl); /* calculate approximate y limits */ /* choose lesser of containing rotbox and circle */ #if USE_ASTRO_ANGLE yhi = fabs(g->shapes[sno].sinangl * yrad) + fabs(g->shapes[sno].cosangl * xrad); #else yhi = fabs(g->shapes[sno].sinangl * xrad) + fabs(g->shapes[sno].cosangl * yrad); #endif yhi = min(yhi, max(yrad, xrad)); g->shapes[sno].ystart = ycen - yhi; g->shapes[sno].ystop = ycen + yhi; /* prepare partials for quadratic equation solutions to coordinates */ g->shapes[sno].cossq = g->shapes[sno].cosangl * g->shapes[sno].cosangl; g->shapes[sno].sinsq = g->shapes[sno].sinangl * g->shapes[sno].sinangl; #if USE_ASTRO_ANGLE /* because we rotate by 90.0 degrees to get from astro angle to */ /* cartesian, we also need to switch the x and y axes. we do this */ /* secretly so that the display will turn out right, by doing it in */ /* the sq terms */ g->shapes[sno].xradsq = yrad * yrad; g->shapes[sno].yradsq = xrad * xrad; #else g->shapes[sno].xradsq = xrad * xrad; g->shapes[sno].yradsq = yrad * yrad; #endif /* fill in as much of a,b,c as we can */ g->shapes[sno].a = (g->shapes[sno].cossq / g->shapes[sno].xradsq) + (g->shapes[sno].sinsq / g->shapes[sno].yradsq); } if( ((y>=g->shapes[sno].ystart) && (y<=g->shapes[sno].ystop)) ){ b_partial = (2.0 * g->shapes[sno].sinangl) * ((g->shapes[sno].cosangl / g->shapes[sno].xradsq) - (g->shapes[sno].cosangl / g->shapes[sno].yradsq)); c_partial = (g->shapes[sno].sinsq / g->shapes[sno].xradsq) + (g->shapes[sno].cossq / g->shapes[sno].yradsq); yoff = y - ycen; b = b_partial * yoff; c = (c_partial * yoff * yoff) - 1.0; /* solve quadratic */ quadeq (g->shapes[sno].a, b, c, &xboff, &xfoff, &nr, &nc); /* if real roots */ if( nr != 0 ) { FPU_DOUBLE #if USE_FLOAT_COMPARE if( (((float)x>=(float)(xcen+xboff)) && ((float)x<=(float)(xcen+xfoff))) == flag ){ #else if( ((x>=(xcen+xboff)) && (x<=(xcen+xfoff))) == flag ){ #endif if( rno && flag ) g->rid = rno; FPU_RESTORE return 1; } else{ FPU_RESTORE return 0; } } else return !flag; } return !flag; } int evfield(GFilt g, int rno, int sno, int flag, int type, double x, double y) { /* avoid -W unused parameter warning */ if( 0 ){ sno = sno; type = type; x = x; y = y; } if( flag ){ if( rno && flag ) g->rid = rno; return 1; } else return 0; } int evline(GFilt g, int rno, int sno, int flag, int type, double x, double y, double x1, double y1, double x2, double y2) { /* avoid -W unused parameter warning */ if( 0 ){ type = type; } if( !g->shapes[sno].init ){ g->shapes[sno].init = 1; g->shapes[sno].ystart = min(y1,y2); g->shapes[sno].ystop = max(y1,y2); g->shapes[sno].x1 = x1; g->shapes[sno].x2 = x2; g->shapes[sno].y1 = y1; if( feq(y1,y2) ){ g->shapes[sno].xonly = 1; g->shapes[sno].invslope = 0; } else{ g->shapes[sno].xonly = 0; g->shapes[sno].invslope = (x1 - x2) / (y1 - y2); } } if( (((y>=g->shapes[sno].ystart) && (y<=g->shapes[sno].ystop)) && ((!g->shapes[sno].xonly && feq((((y-g->shapes[sno].y1)*g->shapes[sno].invslope)+g->shapes[sno].x1),x)) || (g->shapes[sno].xonly && ((x>=g->shapes[sno].x1)&&(x<=g->shapes[sno].x2))))) == flag){ if( rno && flag ) g->rid = rno; return 1; } else return 0; } int evpie(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, double angle1, double angle2) { int i; int width, height; /* l: image mask width and height */ double sweep; /* l: sweep between cut angles */ int intrcpt1, intrcpt2; /* l: side intercepted by each cut */ double x2, y2; /* l: coordinates of second intercept */ double xstart=0.0; /* use field if possible */ if( (angle1==0) && (angle2==360) ){ return(evfield(g, rno, sno, flag, type, x, y)); } if( !g->shapes[sno].init ){ g->shapes[sno].init = 1; /* we have to fake width and height, since we do not know them! */ width = LARGE_NUMBER; height = LARGE_NUMBER; /* start listing vertices of polygon */ g->shapes[sno].pts = (double *)calloc(14, sizeof(double)); g->shapes[sno].pts[0] = xcen; g->shapes[sno].pts[1] = ycen; sweep = angle2 - angle1; /* if sweep is too small to be noticed, don't bother */ if(fabs(sweep) < SMALL_NUMBER) return !flag; if (sweep < 0.0) sweep = sweep + 360.0; intrcpt1 = pie_intercept((double)width, (double)height, xcen, ycen, angle1, &(g->shapes[sno].pts[2]), &(g->shapes[sno].pts[3])); intrcpt2 = pie_intercept((double)width, (double)height, xcen, ycen, angle2, &x2, &y2); g->shapes[sno].npt = 4; /* if angles intercept same side and slice is between them, no corners */ /* else, mark corners until reaching side with second angle intercept */ if((intrcpt1 != intrcpt2) || (sweep > 180.0)){ do{ intrcpt1 = corner_vertex(intrcpt1, width, height, &(g->shapes[sno].pts[g->shapes[sno].npt]), &(g->shapes[sno].pts[g->shapes[sno].npt+1])); g->shapes[sno].npt = g->shapes[sno].npt + 2; }while(intrcpt1 != intrcpt2); } g->shapes[sno].pts[g->shapes[sno].npt] = x2; g->shapes[sno].pts[g->shapes[sno].npt+1] = y2; g->shapes[sno].npt = g->shapes[sno].npt + 2; /* now find the y limits */ if( g->shapes[sno].npt ){ xstart = g->shapes[sno].pts[0]; g->shapes[sno].ystart = g->shapes[sno].pts[1]; g->shapes[sno].ystop = g->shapes[sno].ystart; for(i=1; ishapes[sno].npt; i+=2){ if(g->shapes[sno].pts[i-1] < xstart) xstart = g->shapes[sno].pts[i-1]; if(g->shapes[sno].pts[i] > g->shapes[sno].ystop) g->shapes[sno].ystop = g->shapes[sno].pts[i]; if(g->shapes[sno].pts[i] < g->shapes[sno].ystart) g->shapes[sno].ystart = g->shapes[sno].pts[i]; } } } if( (((y>=g->shapes[sno].ystart) && (y<=g->shapes[sno].ystop)) && polypt(x, y, g->shapes[sno].pts, g->shapes[sno].npt/2, xstart, g->shapes[sno].ystart, 1)) == flag ){ if( rno && flag ) g->rid = rno; return 1; } else{ return 0; } } int evqtpie(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, double angle1, double angle2) { return evpie(g, rno, sno, flag, type, x, y, xcen, ycen, angle1, angle2); } int evpoint(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen) { /* avoid -W unused parameter warning */ if( 0 ){ sno = sno; type = type; } if( ((x==xcen) && (y==ycen)) == flag ){ if( rno && flag ) g->rid = rno; return 1; } else return 0; } #ifdef __STDC__ int evpolygon(GFilt g, int rno, int sno, int flag, int type, double x, double y, ...) { int i, maxpts; double xstart=0.0; va_list args; va_start(args, y); #else int evpolygon(va_alist) va_dcl { GFilt g; int rno, sno, flag, type; double x, y; double xstart=0.0; int i, maxpts; va_list args; va_start(args); g = va_arg(args, GFilt); rno = va_arg(args, int); sno = va_arg(args, int); flag = va_arg(args, int); type = va_arg(args, int); x = va_arg(args, double); y = va_arg(args, double); #endif /* avoid -W unused parameter warning */ if( 0 ){ type = type; } if( !g->shapes[sno].init ){ g->shapes[sno].init = 1; /* allocate space for x,y arguments */ maxpts = MASKINC; g->shapes[sno].pts = (double *)calloc(maxpts, sizeof(double)); /* gather up arguments */ g->shapes[sno].npt = 0; while( 1 ){ if( g->shapes[sno].npt >= maxpts ){ maxpts += MASKINC; g->shapes[sno].pts = (double *)realloc(g->shapes[sno].pts, maxpts*sizeof(double)); } g->shapes[sno].pts[g->shapes[sno].npt] = va_arg(args, double); /* two negatives in a row means we are at end of args */ if( feq(g->shapes[sno].pts[g->shapes[sno].npt],PSTOP) && feq(g->shapes[sno].pts[g->shapes[sno].npt-1],PSTOP) ){ g->shapes[sno].npt--; break; } g->shapes[sno].npt++; } va_end(args); /* realloc to actual size */ g->shapes[sno].pts = (double *)realloc(g->shapes[sno].pts, g->shapes[sno].npt*sizeof(double)); /* now find the y limits */ if( g->shapes[sno].npt ){ xstart = g->shapes[sno].pts[0]; g->shapes[sno].ystart = g->shapes[sno].pts[1]; g->shapes[sno].ystop = g->shapes[sno].ystart; for(i=1; ishapes[sno].npt; i+=2){ if(g->shapes[sno].pts[i-1] < xstart) xstart = g->shapes[sno].pts[i-1]; if(g->shapes[sno].pts[i] > g->shapes[sno].ystop) g->shapes[sno].ystop = g->shapes[sno].pts[i]; if(g->shapes[sno].pts[i] < g->shapes[sno].ystart) g->shapes[sno].ystart = g->shapes[sno].pts[i]; } } } if( (((y>=g->shapes[sno].ystart) && (y<=g->shapes[sno].ystop)) && polypt(x, y, g->shapes[sno].pts, g->shapes[sno].npt/2, xstart, g->shapes[sno].ystart, 0)) == flag ){ if( rno && flag ) g->rid = rno; return 1; } else return 0; } /* accelerator regions -- lower and upper limits are given for n regions */ int evnannulus(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, double lo, double hi, int n) { int i; int xsno; double dinc; /* get limits */ dinc = (hi - lo)/(double)n; xsno = (g->nshapes+1)+((sno-1)*XSNO); if( flag ){ /* if its not somewhere inside the entire region we lose ... */ if( !evannulus(g, 0, xsno, flag, type, x, y, xcen, ycen, lo, hi) ){ return(0); } /* look through all of them to find the right one */ for(i=0; inshapes+1)+((sno-1)*XSNO); if( flag ){ /* if its not somewhere inside the entire region we lose ... */ if( !evbox(g, 0, xsno, flag, type, x, y, xcen, ycen, hix, hiy, ang) ){ return(0); } /* if its in the inner region we lose */ if( evbox(g, 0, xsno+1, flag, type, x, y, xcen, ycen, lox, loy, ang) ){ return(0); } /* look through all of them to find the right one */ for(i=0; inshapes+1)+((sno-1)*XSNO); if( flag ){ /* if its not somewhere inside the entire region we lose ... */ if( !evellipse(g, 0, xsno, flag, type, x, y, xcen, ycen, hix, hiy, ang) ){ return(0); } /* if its in the inner region we lose */ if( evellipse(g, 0, xsno+1, flag, type, x, y, xcen, ycen, lox, loy, ang) ){ return(0); } /* look through all of them to find the right one */ for(i=0; i hi ) lo -= 360.0; dinc = (hi - lo)/n; xsno = (g->nshapes+1)+((sno-1)*XSNO); if( flag ){ /* check limits */ if( !evpie(g, 0, xsno, flag, type, x, y, xcen, ycen, lo, hi) ){ return(0); } /* look through all of them to find the right one */ for(i=0; inshapes+1)+((sno-1)*XSNO); if( flag ){ /* if its not somewhere inside the entire region we lose ... */ if( !evannulus(g, 0, xsno, flag, type, x, y, xcen, ycen, radlo, radhi) || !evpie(g, 0, xsno+1, flag, type, x, y, xcen, ycen, anglo, anghi) ){ return(0); } /* look through all of them to find the right one */ for(a=1; a<=ahi; a++){ for(r=1; r<=rhi; r++){ if( evannulus(g, rno+n, sno+(2*n), flag, type, x, y, xcen, ycen, radlo+((r-1)*rinc), radlo+(r*rinc)) && evpie(g, rno+n, sno+(2*n+1), flag, type, x, y, xcen, ycen, anglo+((a-1)*ainc), anglo+(a*ainc)) ){ return(1); } n++; } } return(0); } else{ /* if its not somewhere inside the entire region we win ... */ if( !evannulus(g, 0, xsno, 1, type, x, y, xcen, ycen, radlo, radhi) ) return(1); else if( !evpie(g, 0, xsno+1, 1, type, x, y, xcen, ycen, anglo, anghi) ){ return(1); } else{ return(0); } } } int evbpanda(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, double anglo, double anghi, double angn, double xlo, double ylo, double xhi, double yhi, double radn, double ang) { int a, r; int ahi, rhi; int xsno; int n=0; double ainc, xinc, yinc; /* get limits */ anglo += ang; anghi += ang; ainc = (anghi - anglo)/angn; ahi = (int)angn; xinc = (xhi - xlo)/radn; yinc = (yhi - ylo)/radn; rhi = (int)radn; xsno = (g->nshapes+1)+((sno-1)*XSNO); if( flag ){ /* if its not somewhere inside the entire region we lose ... */ if( !evbox(g, 0, xsno, flag, type, x, y, xcen, ycen, xhi, yhi, ang) ){ return(0); } /* but if its in the inner region we lose */ else if( evbox(g, 0, xsno+2, flag, type, x, y, xcen, ycen, xlo, ylo, ang) ){ return(0); } /* its in the box .. must also be in the pie */ else if( !evpie(g, 0, xsno+1, flag, type, x, y, xcen, ycen, anglo, anghi)){ return(0); } /* look through all of them to find the right one */ for(a=0; anshapes+1)+((sno-1)*XSNO); if( flag ){ /* if its not somewhere inside the entire region we lose ... */ if( !evellipse(g, 0, xsno, flag, type, x, y, xcen, ycen, xhi, yhi, ang) ){ return(0); } /* but if its in the inner region we lose */ else if( evellipse(g, 0, xsno+2, flag, type, x, y, xcen, ycen, xlo, ylo, ang) ){ return(0); } /* its in the ellipse .. must also be in the pie */ else if( !evpie(g, 0, xsno+1, flag, type, x, y, xcen, ycen, anglo, anghi)){ return(0); } /* look through all of them to find the right one */ for(a=0; anshapes+1)+((sno-1)*XSNO); if( !g->shapes[xsno].xv ){ maxpts = MASKINC; g->shapes[xsno].xv = (double *)calloc(maxpts, sizeof(double)); g->shapes[xsno].nv = 0; while( 1 ){ if( g->shapes[xsno].nv >= maxpts ){ maxpts += MASKINC; g->shapes[xsno].xv = (double *)realloc(g->shapes[xsno].xv, maxpts*sizeof(double)); } g->shapes[xsno].xv[g->shapes[xsno].nv] = va_arg(args, double); if( feq(g->shapes[xsno].xv[g->shapes[xsno].nv],PSTOP) && feq(g->shapes[xsno].xv[g->shapes[xsno].nv-1],PSTOP) ){ g->shapes[xsno].nv--; break; } g->shapes[xsno].nv++; } va_end(args); g->shapes[xsno].xv = (double *)realloc(g->shapes[xsno].xv, g->shapes[xsno].nv*sizeof(double)); } n = g->shapes[xsno].nv; xv = g->shapes[xsno].xv; /* this should be impossible ... */ if( n == 2 ){ return(evannulus(g, rno, sno, flag, type, x, y, xcen, ycen, xv[0], xv[1])); } if( flag ){ /* if its not somewhere inside the entire region we lose ... */ if( !evannulus(g, 0, xsno, flag, type, x, y, xcen, ycen, xv[0], xv[n-1]) ){ return(0); } /* look through all of them to find the right one */ for(i=0; inshapes+1)+((sno-1)*XSNO); if( !g->shapes[xsno].xv ){ maxpts = MASKINC; g->shapes[xsno].xv = (double *)calloc(maxpts, sizeof(double)); g->shapes[xsno].nv = 0; while( 1 ){ if( g->shapes[xsno].nv >= maxpts ){ maxpts += MASKINC; g->shapes[xsno].xv = (double *)realloc(g->shapes[xsno].xv, maxpts*sizeof(double)); } g->shapes[xsno].xv[g->shapes[xsno].nv] = va_arg(args, double); if( feq(g->shapes[xsno].xv[g->shapes[xsno].nv],PSTOP) && feq(g->shapes[xsno].xv[g->shapes[xsno].nv-1],PSTOP) ){ g->shapes[xsno].nv--; break; } g->shapes[xsno].nv++; } va_end(args); g->shapes[xsno].xv = (double *)realloc(g->shapes[xsno].xv, g->shapes[xsno].nv*sizeof(double)); } n = g->shapes[xsno].nv; xv = g->shapes[xsno].xv; ang = xv[--n]; /* this should be impossible ... */ if( n == 2 ){ return(evbox(g, rno, sno, flag, type, x, y, xcen, ycen, xv[0], xv[1], ang)); } if( flag ){ /* if its not somewhere inside the entire region we lose ... */ if( !evbox(g, 0, xsno, flag, type, x, y, xcen, ycen, xv[n-2], xv[n-1], ang) ){ return(0); } /* if its in the inner region we lose */ if( evbox(g, 0, xsno+1, flag, type, x, y, xcen, ycen, xv[0], xv[1], ang) ){ return(0); } /* look through all of them to find the right one */ for(i=2, j=0; inshapes+1)+((sno-1)*XSNO); if( !g->shapes[xsno].xv ){ maxpts = MASKINC; g->shapes[xsno].xv = (double *)calloc(maxpts, sizeof(double)); g->shapes[xsno].nv = 0; while( 1 ){ if( g->shapes[xsno].nv >= maxpts ){ maxpts += MASKINC; g->shapes[xsno].xv = (double *)realloc(g->shapes[xsno].xv, maxpts*sizeof(double)); } g->shapes[xsno].xv[g->shapes[xsno].nv] = va_arg(args, double); if( feq(g->shapes[xsno].xv[g->shapes[xsno].nv],PSTOP) && feq(g->shapes[xsno].xv[g->shapes[xsno].nv-1],PSTOP) ){ g->shapes[xsno].nv--; break; } g->shapes[xsno].nv++; } va_end(args); g->shapes[xsno].xv = (double *)realloc(g->shapes[xsno].xv, g->shapes[xsno].nv*sizeof(double)); } n = g->shapes[xsno].nv; xv = g->shapes[xsno].xv; ang = xv[--n]; /* this should be impossible ... */ if( n == 2 ){ return(evellipse(g, rno, sno, flag, type, x, y, xcen, ycen, xv[0], xv[1], ang)); } if( flag ){ /* if its not somewhere inside the entire region we lose ... */ if( !evellipse(g, 0, xsno, flag, type, x, y, xcen, ycen, xv[n-2], xv[n-1], ang) ){ return(0); } /* if its in the inner region we lose */ if( evellipse(g, 0, xsno+1, flag, type, x, y, xcen, ycen, xv[0], xv[1], ang) ){ return(0); } /* look through all of them to find the right one */ for(i=2, j=0; inshapes+1)+((sno-1)*XSNO); if( !g->shapes[xsno].xv ){ maxpts = MASKINC; g->shapes[xsno].xv = (double *)calloc(maxpts, sizeof(double)); g->shapes[xsno].nv = 0; while( 1 ){ if( g->shapes[xsno].nv >= maxpts ){ maxpts += MASKINC; g->shapes[xsno].xv = (double *)realloc(g->shapes[xsno].xv, maxpts*sizeof(double)); } g->shapes[xsno].xv[g->shapes[xsno].nv] = va_arg(args, double); if( feq(g->shapes[xsno].xv[g->shapes[xsno].nv],PSTOP) && feq(g->shapes[xsno].xv[g->shapes[xsno].nv-1],PSTOP) ){ g->shapes[xsno].nv--; break; } g->shapes[xsno].nv++; } va_end(args); g->shapes[xsno].xv = (double *)realloc(g->shapes[xsno].xv, g->shapes[xsno].nv*sizeof(double)); } n = g->shapes[xsno].nv; xv = g->shapes[xsno].xv; /* this should be impossible ... */ if( n == 2 ){ return(evpie(g, rno, sno, flag, type, x, y, xcen, ycen, xv[0], xv[1])); } if( flag ){ /* if its not somewhere inside the entire region we lose ... */ if( !evpie(g, 0, xsno, flag, type, x, y, xcen, ycen, xv[0], xv[n-1]) ){ return(0); } /* look through all of them to find the right one */ for(i=0; inshapes+1)+((sno-1)*XSNO); if( !g->shapes[xsno].xv ){ maxpts = MASKINC; g->shapes[xsno].xv = (double *)calloc(maxpts, sizeof(double)); g->shapes[xsno].nv = 0; while( 1 ){ if( g->shapes[xsno].nv >= maxpts ){ maxpts += MASKINC; g->shapes[xsno].xv = (double *)realloc(g->shapes[xsno].xv, maxpts*sizeof(double)); } g->shapes[xsno].xv[g->shapes[xsno].nv] = va_arg(args, double); if( feq(g->shapes[xsno].xv[g->shapes[xsno].nv],PSTOP) && feq(g->shapes[xsno].xv[g->shapes[xsno].nv-1],PSTOP) ){ g->shapes[xsno].nv--; break; } g->shapes[xsno].nv++; } va_end(args); g->shapes[xsno].xv = (double *)realloc(g->shapes[xsno].xv, g->shapes[xsno].nv*sizeof(double)); } n = g->shapes[xsno].nv; xv = g->shapes[xsno].xv; /* look through all of them to find the right one */ for(i=0, j=0; i #ifdef HAVE_MALLOC_H #include #endif #ifdef HAVE_STDLIB_H #include #endif #include #include #include #include #define MAX_INCLUDE_DEPTH 100 #define SEGINC 1024 #define MASKINC 1024 #define LARGE_NUMBER 65536 /* must match regions.h */ #define PSTOP -142857.142857 /* stolen from fitsy/xos.h */ #define X__PI 3.14159265358979323846 #define X_2PI ( 2 * X__PI ) #define X_R2D (X_2PI / 360.0) #define X_R2H (X_2PI / 24.0) #define X_H2D (360.0 / 24.0) #define r2h(r) ( (r) / X_R2H ) #define h2r(d) ( (d) * X_R2H ) #define r2d(r) ( (r) / X_R2D ) #define d2r(d) ( (d) * X_R2D ) #define h2d(r) ( (r) * X_H2D ) #define d2h(d) ( (d) / X_H2D ) /* region types */ #define TY_ANNULUS 1 #define TY_BOX 2 #define TY_CIRCLE 3 #define TY_ELLIPSE 4 #define TY_FIELD 5 #define TY_LINE 6 #define TY_PANDA 7 #define TY_BPANDA 8 #define TY_CPANDA 9 #define TY_EPANDA 10 #define TY_PIE 11 #define TY_QTPIE 11 #define TY_POINT 12 #define TY_POLYGON 13 #define TY_IMAGEMASK 14 /* oft-used checks on argument and coord types */ #define XARG ((narg % 2) == 1) #define YARG ((narg % 2) == 0) #define POSARG ((regid == TY_POLYGON) || (regid == TY_LINE) || (narg<=2)) #define ANGARG (((regid == TY_PANDA) && (narg==3)) || \ ((regid == TY_PANDA) && (narg==4)) || \ ((regid == TY_BPANDA) && (narg==3)) || \ ((regid == TY_BPANDA) && (narg==4)) || \ ((regid == TY_CPANDA) && (narg==3)) || \ ((regid == TY_CPANDA) && (narg==4)) || \ ((regid == TY_EPANDA) && (narg==3)) || \ ((regid == TY_EPANDA) && (narg==4)) || \ ((regid == TY_PIE) && (narg>=3)) ) #define NUMARG (((regid == TY_PANDA) && (narg==5)) || \ ((regid == TY_PANDA) && (narg==8)) || \ ((regid == TY_BPANDA) && (narg==5)) || \ ((regid == TY_BPANDA) && (narg==10)) || \ ((regid == TY_CPANDA) && (narg==5)) || \ ((regid == TY_CPANDA) && (narg==8)) || \ ((regid == TY_EPANDA) && (narg==5)) || \ ((regid == TY_EPANDA) && (narg==10)) ) #define SAVEANG ((regid == TY_BOX) || (regid == TY_ELLIPSE)) #define USEPHYS (filt->fhd->table && \ (filt->type == TYPE_EVENTS) && !filt->evsect) #define USEWCS (gcoordsys && \ strcmp(gcoordsys, "image") && strcmp(gcoordsys, "physical")) #define IMFLIP (USEWCS && wcs->imflip) #define WCSSIZE (iswcs(wcs) && (cdelt1!=0) && (cdelt2!=0)) /* format statements */ #define DFMT1 ",%f" #define DFMT2 ",%f,%f" #define DFMT4 ",%f,%f,%f,%f" #define SFMT1 ",%s" #define IFMT1 ",%d" /* flex is not thread-safe, so we did not put any effort into avoiding globals, i.e. by putting read-write variables below into a struct */ static YY_BUFFER_STATE include_stack[MAX_INCLUDE_DEPTH]; static int include_stack_ptr = 0; static int parse_error = 0; static int colargs; static int filtlen; static int radanglen; static int initbindefs; static int regtype; static int regid; static int laststart; static int maxfiltseg; static int setargs; static int inexpr; static int macropass; static int narg; static int nparen; static int nsparen; static int nrparen; static int nfiltseg; static int nrange; static int nroutine; static int nshape; static int nregion; static int nmask; static int got; static int offscl; static int xtype, ytype; static int tltyp[2]; static double lastd1; static double lastd2; static double xpos, ypos; static double xpix, ypix; static double cdelt1, cdelt2, crot; static double dval, dval2; static double tlmin[2]; static double tlmax[2]; static double binsiz[2]; static char lastarg[SZ_LINE]; static char regname[SZ_LINE]; static char colnames[2][SZ_LINE]; static char wcsnames[2][SZ_LINE]; static char macrobuf[SZ_LINE]; static char rangename[SZ_LINE]; static char sbuf[SZ_LINE]; static char saveang[SZ_LINE]; static char *fcoordsys=NULL; static char *gcoordsys=NULL; static char *filter=NULL; static char *radang=NULL; static struct WorldCoor *wcs=NULL; static FiltSeg *filtseg=NULL; static Filter filt=NULL; /* these are read-only */ static char *rnames[] = {"annulus", "box", "circle", "ellipse", "line", "panda", "pie", "qtpie", "point", "polygon", "field", "bpanda", "cpanda", "epanda", "imagemask", NULL}; static int rargs[] = {4, 5, 3, 5, 4, 8, 4, 4, 2, 6, 0, 11, 8, 11, 0, 0}; static int vargs[] = {'y', 'o', 'y', 'o', 'n', 'n', 'y', 'n', 'e', 'e', 'n', 'n', 'n', 'n', 'n', '\0'}; static int _FiltLexTypeCmp(const void *s1, const void *s2); static int _FiltLexTypeMatch(int ftype, int ttype); static int _FiltLexAccel _PRx((int n)); static int _FiltLexRegionPanda _PRx((void)); static int _FiltLexLcx _PRx((void)); static int _FiltLexArgCheck _PRx((char *name, int args)); static int _FiltLexNeedOp _PRx((int i, char *s)); static void _FiltLexOp _PRx((char *s)); static void _FiltLexTypeSet _PRx((int type)); static void _FiltLexNew _PRx((void)); static void _FiltLexParen _PRx((char *s)); static void _FiltLexCat _PRx((char *s)); static void _FiltLexRegionStart _PRx((int docols)); static void _FiltLexRegionVal _PRx((char *s)); static void _FiltLexRegionEnd _PRx((void)); static void _FiltLexRangeAdd _PRx((char *xname, char *str, int type, int n, int maxlen)); static void _FiltLexArgSave _PRx((double dval)); static void _FiltLexSetWcs _PRx((char *s)); static void _FiltLexWcsCols _PRx((FITSHead header, char *name1, char *name2)); static void _FiltLexNum _PRx((int lcx)); static void _FiltLexEnd _PRx((void)); static void _FiltLexMake _PRx((void)); static char *_FiltLexGetWcs _PRx((void)); static int _FiltIncMask(FilterMask masks, int maxmask, int nmask); static int _FiltFitsMask(char *filename, FilterMask *rmasks, FITSHead *rhead, int *nreg); static void bin2num(char *d, char *s, int maxlen); int _filterror _PRx((char *msg)); %} DIG [0-9] DIG2 [0-9a-fA-F] BINARY 0[bB][01]+ INT1 [-+]?{DIG}+L? INT2 [-+]?0[xX]{DIG2}+L? INT ({INT1}|{INT2}) FLOAT1 [-+]?{DIG}+\.?([eE][-+]?{DIG}+)? FLOAT2 [-+]?{DIG}*\.{DIG}+([eE][-+]?{DIG}+)? FLOAT ({FLOAT1}|{FLOAT2}) NUM ({INT}|{FLOAT}|{BINARY}) HMS {INT}{SP}[:hH]{SP}{INT}{SP}[:mM]{SP}{NUM}{SP}[s]? DMS {INT}{SP}[:dD]{SP}{INT}{SP}[:mM]{SP}{NUM}{SP}[s]? WCS {HMS}|{DMS} DEG {NUM}d RAD {NUM}r IPIX {NUM}i PPIX {NUM}p ASEC {NUM}\" AMIN {NUM}' COORSYS (j2000|fk5|icrs|b1950|fk4|galactic|ecliptic|linear|image|physical|amplifier|detector) NAME [A-Za-z_][0-9A-Za-z~_]*(\[[^\[]*\])? FILE @[0-9A-Za-z~_/\-\.]*(\[.*\])? REGION [\!+-]?(ann|annulus|box|cir|circle|ell|ellipse|lin|line|pan|panda|pie|poi|qtpie|qtp|point|pol|polygon|fie|field|bpanda|bpa|cpanda|cpa|epanda|epa) REGVAL {SP}\{{INT}\} LOP (&&|\|\||[&\|]) OP (&&|\|\||==|!=|<=|>=|<<|>>|[&\|~=<>+\-*/%^]) STR (\"[^\"]*\"|'[^']*') SP [ \t]* EOL ([;\n]|\\n) SEP (,|{EOL}) COM # US (unsigned{SP})? II (int{SP})? DTYPE (\({US}char\)|\({US}short{II}\)|\({US}int\)|\({US}long{II}\)|\(float\)|\(double\)) %s RLIST %s RTINE %s REG %x AREG %x INCLUDE %x COMM %% {DTYPE} { _FiltLexCat(yytext); } {COORSYS}[\n;,]* { _FiltLexSetWcs(yytext); } global { BEGIN COMM; } tile { BEGIN COMM; } compass { BEGIN COMM; } {COM} { /* comment acts like EOL */ if( YY_START == REG ){ _FiltLexRegionEnd(); _FiltLexNew(); } else if( YY_START == RLIST ){ _FiltLexParen(")"); _FiltLexNew(); } else{ _FiltLexNew(); } BEGIN COMM; } \n { BEGIN INITIAL; } \\n { BEGIN INITIAL; } . { /* ignore comments up to eol */ ; } [+-]?text([ \t]+|{SP}\({SP})[^;\n]*{EOL} { ; /* ignore */ } [+-]?vector([ \t]+|{SP}\({SP})[^;\n]*{EOL} { ; /* ignore */ } [+-]?ruler([ \t]+|{SP}\({SP})[^;\n]*{EOL} { ; /* ignore */ } [+-]?projection([ \t]+|{SP}\({SP})[^;\n]*{EOL} { ; /* ignore */ } \(/{NAME},{NAME}\){SP}={SP}{REGION} { if( YY_START == REG ){ _FiltLexRegionEnd(); _FiltLexNew(); } /* Found an asc-style region */ colargs = 0; laststart = YY_START; BEGIN AREG; } {NAME} { if( colargs > 2 ) _filterror("illegal Chandra region (too many column args)"); if( !FilterSymbolEnter(filt, yytext, &got) ){ switch(got){ case -1: _filterror("missing column or header parameter"); break; case -2: _filterror("column is not an array"); break; case -3: _filterror("internal error while processing column"); break; } } strcpy(colnames[colargs],yytext); colargs++; } , { ; } \( { ; } \) { ; } = { /* end of asc part of region */ if( colargs != 2 ) _filterror("illegal Chandra region (wrong number of cols)"); BEGIN INITIAL; } [+-]?field([ \t]+|{SP}\({SP})? | {REGION}([ \t]+|{SP}\({SP})/{NUM} { /* finish off previous */ if( YY_START == REG ){ _FiltLexRegionEnd(); _FiltLexNew(); } /* Found a region */ BEGIN REG; if( filt->type == TYPE_EVENTS ){ /* if asc-style, re-do wcs for specified columns */ if( colargs == 2 ){ _FiltLexRegionStart(2); _FiltLexWcsCols(filt->fhd, colnames[0], colnames[1]); } /* set up default columns */ else{ _FiltLexRegionStart(1); } } /* its an image */ else{ _FiltLexRegionStart(0); } } {REGION}([ \t]+|{SP}\({SP})/{NAME} { /* can't happen */ _filterror("invalid characters following the region name"); } {NUM} { narg++; /* process this pure number in the current coord system */ _FiltLexNum(_FiltLexLcx()); } {IPIX} { narg++; /* remove trailing unit character */ yytext[strlen(yytext)-1] = '\0'; /* process this as a pure number in image coord sys */ _FiltLexNum(LCX_IMAGE); } {PPIX} { narg++; /* remove trailing unit character */ yytext[strlen(yytext)-1] = '\0'; /* process this as a pure number in physical coord sys */ _FiltLexNum(LCX_PHYS); } {WCS} { char *coordsys; if( nowcs(wcs) ) _filterror("no WCS information in file"); narg++; /* save x value for processing with y next time */ if( XARG ){ xpos = SAOstrtod(yytext,NULL); xtype = SAOdtype; if( (xtype !=0) && (xtype != '.') && (xtype != 'd') ){ coordsys = _FiltLexGetWcs(); /* arg1 coords are hms, but ecliptic, galactic are deg */ if( !coordsys || (strncasecmp(coordsys, "ecl", 3) && strncasecmp(coordsys, "gal", 3)) ){ xpos = h2d(xpos); } } } else{ ypos = SAOstrtod(yytext,NULL); ytype = SAOdtype; /* convert wcs to image pixels */ wcsc2pix(wcs, xpos,ypos, _FiltLexGetWcs(), &xpix,&ypix, &offscl); /* convert to physical for single event filtering */ if( USEPHYS ){ xpix = tli2p(xpix, tlmin[0], binsiz[0], tltyp[0]); ypix = tli2p(ypix, tlmin[1], binsiz[1], tltyp[1]); } snprintf(sbuf, SZ_LINE, DFMT2, xpix, ypix); _FiltLexCat(sbuf); } } {DEG} { narg++; /* handle position arguments */ if( POSARG ){ if( nowcs(wcs) ) _filterror("no WCS information in file"); /* save x value for processing with y next time */ if( XARG ){ xpos = strtod(yytext,NULL); } else{ ypos = strtod(yytext,NULL); /* convert wcs to image pixels */ wcsc2pix(wcs, xpos, ypos, _FiltLexGetWcs(), &xpix, &ypix, &offscl); /* convert to physical for single event filtering */ if( USEPHYS ){ xpix = tli2p(xpix, tlmin[0], binsiz[0], tltyp[0]); ypix = tli2p(ypix, tlmin[1], binsiz[1], tltyp[1]); } snprintf(sbuf, SZ_LINE, DFMT2, xpix, ypix); _FiltLexCat(sbuf); } } /* angle arguments are just passed along, with updated crot */ else if( ANGARG ){ dval = strtod(yytext,NULL); if( USEWCS ) dval += crot; if( IMFLIP ) dval = -dval; snprintf(sbuf, SZ_LINE, DFMT1, dval); _FiltLexCat(sbuf); } /* panda numeric args are just passed along */ else if( NUMARG ){ dval = strtod(yytext,NULL); snprintf(sbuf, SZ_LINE, DFMT1, dval); _FiltLexCat(sbuf); } /* handle size arguments */ else{ if( !WCSSIZE ) _filterror("no WCS (or CDELT) information in file"); if( SAVEANG ){ dval = strtod(yytext,NULL); if( USEWCS ) dval += crot; if( IMFLIP ) dval = -dval; snprintf(saveang, SZ_LINE, DFMT1, dval); } /* arg 1 is ra, arg2 is dec */ if( XARG ) dval = ABS(strtod(yytext,NULL)/cdelt1); else dval = ABS(strtod(yytext,NULL)/cdelt2); snprintf(sbuf, SZ_LINE, DFMT1, dval); _FiltLexCat(sbuf); _FiltLexArgSave(dval); } } {RAD} { narg++; /* handle position arguments */ if( POSARG ){ if( nowcs(wcs) ) _filterror("no WCS information in file"); /* save x value for processing with y next time */ if( XARG ){ xpos = r2d(strtod(yytext,NULL)); } else{ ypos = r2d(strtod(yytext,NULL)); /* convert wcs to image pixels */ wcsc2pix(wcs, xpos, ypos, _FiltLexGetWcs(), &xpix, &ypix, &offscl); /* convert to physical for single event filtering */ if( USEPHYS ){ xpix = tli2p(xpix, tlmin[0], binsiz[0], tltyp[0]); ypix = tli2p(ypix, tlmin[1], binsiz[1], tltyp[1]); } snprintf(sbuf, SZ_LINE, DFMT2, xpix, ypix); _FiltLexCat(sbuf); } } /* angle arguments are just passed along, with updated crot */ else if( ANGARG ){ dval = r2d(strtod(yytext,NULL)); if( USEWCS ) dval += crot; if( IMFLIP ) dval = -dval; snprintf(sbuf, SZ_LINE, DFMT1, dval); _FiltLexCat(sbuf); } /* panda numeric args are just passed along */ else if( NUMARG ){ dval = strtod(yytext,NULL); snprintf(sbuf, SZ_LINE, DFMT1, dval); _FiltLexCat(sbuf); } /* handle size arguments */ else{ if( !WCSSIZE ) _filterror("no WCS (or CDELT) information in file"); if( SAVEANG ){ dval = r2d(strtod(yytext,NULL)); if( USEWCS ) dval += crot; if( IMFLIP ) dval = -dval; snprintf(saveang, SZ_LINE, DFMT1, dval); } /* arg 1 is ra, arg2 is dec */ if( XARG ) dval = r2d(ABS(strtod(yytext,NULL)/cdelt1)); else dval = r2d(ABS(strtod(yytext,NULL)/cdelt2)); snprintf(sbuf, SZ_LINE, DFMT1, dval); _FiltLexCat(sbuf); _FiltLexArgSave(dval); } } {AMIN} { if( !WCSSIZE ) _filterror("no WCS (or CDELT) information in file"); narg++; /* arg 1 is ra, arg2 is dec */ if( XARG ) dval = ABS(strtod(yytext,NULL)/(cdelt1*60.0)); else dval = ABS(strtod(yytext,NULL)/(cdelt2*60.0)); snprintf(sbuf, SZ_LINE, DFMT1, dval); _FiltLexCat(sbuf); _FiltLexArgSave(dval); } {ASEC} { if( !WCSSIZE ) _filterror("no WCS (or CDELT) information in file"); narg++; /* arg 1 is ra, arg2 is dec */ if( XARG ) dval = ABS(strtod(yytext,NULL)/(cdelt1*3600.0)); else dval = ABS(strtod(yytext,NULL)/(cdelt2*3600.0)); snprintf(sbuf, SZ_LINE, DFMT1, dval); _FiltLexCat(sbuf); _FiltLexArgSave(dval); } [a-z]{SP}={SP}{NUM}{SP} { int n; n = strtol(strchr(yytext, '=')+1, NULL, 10); if( n <=0 ){ _filterror("invalid region accelerator"); } else{ if( !_FiltLexAccel(n) ){ _filterror("invalid region accelerator"); } } } {NUM}/{OP} { if( _FiltLexArgCheck(regname, narg) == 0 ){ /* new expression without an expression separator ... sigh */ _FiltLexRegionEnd(); _FiltLexNew(); BEGIN INITIAL; yyless(0); } else { narg++; /* process this pure number in the current coord system */ _FiltLexNum(_FiltLexLcx()); } } ({NAME}{OP}|{FILE}) { /* new expression without an expression separator ... sigh */ _FiltLexRegionEnd(); _FiltLexNew(); BEGIN INITIAL; yyless(0); } , { /* explicit rule avoids the _FiltLexNew of general rule */ ; } {REGVAL} { _FiltLexRegionVal(yytext); if( !nsparen ){ _FiltLexRegionEnd(); BEGIN INITIAL; } } \( { nsparen++; } \){REGVAL} { _FiltLexRegionVal(yytext+1); if( nsparen ){ nsparen--; if( !nsparen ){ _FiltLexRegionEnd(); BEGIN INITIAL; } } else { _FiltLexRegionEnd(); BEGIN INITIAL; /* REJECT; */ /* explicit execution of general rule instead of REJECT */ nparen--; _FiltLexNew(); _FiltLexCat(")"); _FiltLexNew(); } } \) { if( nsparen ){ nsparen--; if( !nsparen ){ _FiltLexRegionEnd(); BEGIN INITIAL; } } else { _FiltLexRegionEnd(); BEGIN INITIAL; /* REJECT; */ /* explicit execution of general rule instead of REJECT */ nparen--; _FiltLexNew(); _FiltLexCat(")"); _FiltLexNew(); } } {OP} { _FiltLexRegionEnd(); _FiltLexOp(yytext); BEGIN INITIAL; } {EOL} { _FiltLexRegionEnd(); _FiltLexNew(); BEGIN INITIAL; } {NAME}{SP}/={SP}\(?({NAME}|:{NAME}) { _filterror("you must use == to compare two columns,"); } {NAME}{SP}/={SP}\(?({NUM}|:{NUM}) { if( YY_START == REG ){ _FiltLexRegionEnd(); } _FiltLexParen("("); BEGIN RLIST; narg = 0; _FiltLexTypeSet(TOK_RLIST); nrange = 0; if( !FilterSymbolEnter(filt, yytext, &got) ){ switch(got){ case -1: _filterror("missing column or header parameter"); break; case -2: _filterror("column is not an array"); break; case -3: _filterror("internal error while processing column"); break; } } strncpy(rangename, yytext, SZ_LINE-1); } {NUM}{SP}:{SP}{NUM} { _FiltLexRangeAdd(rangename, yytext, 3, nrange++, SZ_LINE); } :{SP}{NUM} { _FiltLexRangeAdd(rangename, yytext, 1, nrange++, SZ_LINE); } {NUM}{SP}: { _FiltLexRangeAdd(rangename, yytext, 4, nrange++, SZ_LINE); } {NUM} { _FiltLexRangeAdd(rangename, yytext, 2, nrange++, SZ_LINE); } = { ; } , { ; } {SEP}{SP}/{NUM}\)*{LOP} { ; } {SEP}{SP}/\(*({NAME}|{NUM}{SP}{OP}|{FILE}|{REGION}) { _FiltLexParen(")"); _FiltLexNew(); BEGIN INITIAL; } \) { _FiltLexParen(")"); _FiltLexNew(); _FiltLexParen(")"); _FiltLexNew(); BEGIN INITIAL; } {OP} { _FiltLexParen(")"); _FiltLexOp(yytext); BEGIN INITIAL; } {EOL} { _FiltLexParen(")"); _FiltLexNew(); BEGIN INITIAL; } {NAME}{SP}/\( { /* Found a routine */ laststart = YY_START; BEGIN RTINE; narg = 0; nrparen = 0; _FiltLexTypeSet(TOK_RTINE); _FiltLexCat(FilterLexRoutine1(filt, yytext)); nroutine++; } , { /* explicit rule avoids the _FiltLexNew of general rule */ _FiltLexCat(","); } \( { nrparen++; _FiltLexCat("("); } \) { nrparen--; if( nrparen ){ _FiltLexCat(")"); } else{ /* end of routine */ BEGIN laststart; _FiltLexCat(FilterLexRoutine2(filt, ")")); } } {FILE} { /* Found an include file */ char *s, *t; if( YY_START == REG ){ _FiltLexRegionEnd(); _FiltLexNew(); } /* handle FITS mask file specially */ filt->nmask = _FiltFitsMask(yytext+1, &(filt->masks), &(filt->maskhd), &(filt->nmaskreg)); /* filt->nmask == -1 => its not a FITS file */ if( filt->nmask != -1 ){ switch(filt->nmask){ case -2: _filterror("FITS image mask must be image data -"); break; case -3: _filterror("Invalid dimensions for FITS image mask -"); break; case -4: _filterror("FITS image mask cannot contain negative values -"); break; default: if( (filt->type != TYPE_IMAGE) && !filt->evsect ){ _filterror("FITS image mask is valid for image filtering only -"); } else{ if( nmask ) _filterror("only one FITS image mask allowed at a time -"); else nmask++; } break; } } else{ if ( include_stack_ptr >= MAX_INCLUDE_DEPTH ) { _filterror("include files are nested too deeply"); } if( (s = (char *)FileContents(yytext+1, 0, NULL)) == NULL ){ _filterror("can't access include file"); } /* ignore empty include file */ else if( *s == '\0' ){ ; } else { t = FilterClip(s); xfree(s); if( t && *t ){ include_stack[include_stack_ptr++] = YY_CURRENT_BUFFER; _FiltLexNew(); _FiltLexParen("("); FiltScanString(t); xfree(t); } } } } {NAME} { if( !FilterSymbolEnter(filt, yytext, &got) ){ switch(got){ case -1: _filterror("missing column or header parameter"); break; case -2: _filterror("column is not an array"); break; case -3: _filterror("internal error while processing column"); break; } } else{ narg++; /* add if initial condition (not region, routine, etc.) */ if( YY_START == INITIAL ) _FiltLexTypeSet(TOK_NAME); _FiltLexCat(FilterLexName(filt,yytext)); } } {SP} { ; /* ignore white space */ } {STR} { narg++; _FiltLexCat(yytext); } {NUM} { char tbuf[SZ_LINE]; bin2num(tbuf, yytext, SZ_LINE-1); narg++; _FiltLexCat(tbuf); } {OP} { _FiltLexOp(yytext); if( YY_START != RTINE ) BEGIN INITIAL; } \( { nparen++; _FiltLexNew(); _FiltLexCat(yytext); _FiltLexNew(); } \) { nparen--; _FiltLexNew(); _FiltLexCat(yytext); _FiltLexNew(); } {SEP} { _FiltLexNew(); BEGIN INITIAL; } . { _FiltLexCat(yytext); } <> { if ( --include_stack_ptr < 0 ){ _FiltLexMake(); yy_delete_buffer( YY_CURRENT_BUFFER ); yyterminate(); } else { _FiltLexParen(")"); _FiltLexNew(); yy_delete_buffer( YY_CURRENT_BUFFER ); yy_switch_to_buffer(include_stack[include_stack_ptr] ); } } %% /* * * Private Routines * * */ #ifdef YY_USE_PROTOS static void floatprefix(void) #else static void floatprefix() #endif { if( filt->method == METHOD_C ) _FiltLexCat("(double)"); } #ifdef YY_USE_PROTOS static void floatsuffix(void) #else static void floatsuffix() #endif { return; } #ifdef YY_USE_PROTOS static void bin2num(char *d, char *s, int maxlen) #else static void bin2num(d, s, maxlen) char *d; char *s; int maxlen; #endif { unsigned long bits; char *p=NULL; if( strlen(s) < 2 ){ if( d != s ) strncpy(d, s, maxlen-1); } else{ if( (*s=='0') && (*(s+1)=='b') ){ bits = strtoul(s+2, &p, 2); if( *p != '\0' ) _filterror("invalid binary value"); snprintf(d, maxlen, "%lx", bits); if( (strlen(d) <2) || (*d!='0') || ((*(d+1)!='x')&&((*(d+1)!='X'))) ){ snprintf(d, maxlen, "0x%lx", bits); } } else{ if( d != s ) strncpy(d, s, maxlen-1); } } } /* * * _FiltLexNew -- finish last start and set up new filter segment * */ #ifdef YY_USE_PROTOS static void _FiltLexNew(void) #else static void _FiltLexNew() #endif { int i; int last; if( nfiltseg >= maxfiltseg ){ last = maxfiltseg; if( maxfiltseg == 0 ){ maxfiltseg = SEGINC; filtseg = (FiltSeg *)xmalloc(maxfiltseg * sizeof(FiltSeg)); } else{ maxfiltseg += SEGINC; filtseg = (FiltSeg *)xrealloc(filtseg, maxfiltseg * sizeof(FiltSeg)); } /* clear the unused records */ for(i=last; is) ){ filtseg[nfiltseg] = (FiltSeg)xcalloc(1, sizeof(FiltSegRec)); nfiltseg++; } filtseg[nfiltseg-1]->n = nfiltseg-1; filtseg[nfiltseg-1]->nregion = 0; } /* * * _FiltLexParen -- add a paren to the filter string buffer * */ #ifdef YY_USE_PROTOS static void _FiltLexParen(char *str) #else static void _FiltLexParen(str) char *str; #endif { /* _FiltLexNew(); */ _FiltLexCat(str); /* _FiltLexNew(); */ } /* * * __FiltLexCat -- add a string to the filter string buffer * */ #ifdef YY_USE_PROTOS static void __FiltLexCat(char *str, char **ostr, int *olen) #else static void __FiltLexCat(str, ostr, olen) char *str; char **ostr; int *olen; #endif { int blen; int slen; if( (str == NULL) || (*str == '\0') ) return; else slen = strlen(str) + 1; if( (*ostr == NULL) || (**ostr == '\0') ) blen = 0; else blen = strlen(*ostr); while( (blen + slen) >= *olen ){ *olen += SEGINC; } if( blen == 0 ) *ostr = (char *)xcalloc(*olen, sizeof(char)); else *ostr = (char *)xrealloc(*ostr, *olen); strcat(*ostr, str); } /* * * _FiltLexCat -- add a string to the filter string buffer * */ #ifdef YY_USE_PROTOS static void _FiltLexCat(char *str) #else static void _FiltLexCat(str) char *str; #endif { char *s; if( !str || !*str ) return; if( nfiltseg ==0 ) _FiltLexNew(); s = xmalloc(strlen(str)+1); nowhite(str, s); __FiltLexCat(s, &(filtseg[nfiltseg-1]->s), &(filtseg[nfiltseg-1]->len)); if( s ) xfree(s); } /* * * _FiltLexArgSave -- save a radius or angle value to the temp string: * this is a special hack for funcnts * */ #ifdef YY_USE_PROTOS static void _FiltLexArgSave(double dval) #else static void _FiltLexArgSave(dval) double dval; #endif { char tbuf[SZ_LINE]; if( narg < 3 ) return; snprintf(tbuf, SZ_LINE, DFMT1, dval); if( narg == 3 ){ *lastarg = '\0'; lastd1 = 0.0; lastd2 = 0.0; if( filtseg[nfiltseg-1]->radang ){ xfree(filtseg[nfiltseg-1]->radang); filtseg[nfiltseg-1]->radang = NULL; filtseg[nfiltseg-1]->ralen = 0; } } switch(regid){ case TY_ANNULUS: case TY_CIRCLE: if( *lastarg ){ __FiltLexCat(lastarg, &(filtseg[nfiltseg-1]->radang), &(filtseg[nfiltseg-1]->ralen)); } __FiltLexCat(tbuf, &(filtseg[nfiltseg-1]->radang), &(filtseg[nfiltseg-1]->ralen)); if( narg > 3 ){ __FiltLexCat(",NA,NA\n", &(filtseg[nfiltseg-1]->radang), &(filtseg[nfiltseg-1]->ralen)); strcpy(lastarg, tbuf); } lastd1 = lastd2; lastd2 = dval; break; case TY_BOX: case TY_ELLIPSE: if( (narg%2) == 1 ){ if( *lastarg ){ __FiltLexCat(lastarg, &(filtseg[nfiltseg-1]->radang), &(filtseg[nfiltseg-1]->ralen)); } __FiltLexCat(tbuf, &(filtseg[nfiltseg-1]->radang), &(filtseg[nfiltseg-1]->ralen)); if( narg > 3 ){ __FiltLexCat(",NA,NA\n", &(filtseg[nfiltseg-1]->radang), &(filtseg[nfiltseg-1]->ralen)); strcpy(lastarg, tbuf); } lastd1 = lastd2; lastd2 = dval; } break; case TY_PIE: if( narg == 3 ){ __FiltLexCat("NA,NA", &(filtseg[nfiltseg-1]->radang), &(filtseg[nfiltseg-1]->ralen)); } else if( *lastarg ){ __FiltLexCat("NA,NA,", &(filtseg[nfiltseg-1]->radang), &(filtseg[nfiltseg-1]->ralen)); __FiltLexCat(lastarg, &(filtseg[nfiltseg-1]->radang), &(filtseg[nfiltseg-1]->ralen)); } __FiltLexCat(tbuf, &(filtseg[nfiltseg-1]->radang), &(filtseg[nfiltseg-1]->ralen)); if( narg > 3 ){ __FiltLexCat("\n", &(filtseg[nfiltseg-1]->radang), &(filtseg[nfiltseg-1]->ralen)); strcpy(lastarg, tbuf); } lastd1 = lastd2; lastd2 = dval; break; case TY_POINT: /* we have to process this here if its is a varargs */ /* so, for the 3rd arg, we add a line for initial x, y pair */ if( narg == 3 ){ __FiltLexCat("NA,NA,NA,NA\n", &(filtseg[nfiltseg-1]->radang), &(filtseg[nfiltseg-1]->ralen)); } /* and for every even arg, add a line for the preceeding x,y pair */ else if( (narg % 2) == 0 ){ __FiltLexCat("NA,NA,NA,NA\n", &(filtseg[nfiltseg-1]->radang), &(filtseg[nfiltseg-1]->ralen)); } break; default: return; } } /* * * _FiltLexAccel -- appply acceleration to a segment * */ #ifdef YY_USE_PROTOS static int _FiltLexAccel(int n) #else static int _FiltLexAccel(n) int n; #endif { int i; char tbuf[SZ_LINE]; char *s; double dinc; /* check region type */ switch(regid){ case TY_ANNULUS: break; case TY_BOX: narg -= 2; break; case TY_CIRCLE: narg -= 1; break; case TY_ELLIPSE: narg -= 2; break; case TY_PIE: break; default: _filterror("annulus, box, circle, ellipse, pie accelerators only - "); break; } /* add the argument */ snprintf(tbuf, SZ_LINE, IFMT1, n); _FiltLexCat(tbuf); /* change the name of the routine we will call */ if( filtseg[nfiltseg-1]->s0 ){ if( (s = xstrdup(&filtseg[nfiltseg-1]->s[filtseg[nfiltseg-1]->s0])) ){ filtseg[nfiltseg-1]->s[filtseg[nfiltseg-1]->s0] = '\0'; _FiltLexCat("n"); _FiltLexCat(s); snprintf(tbuf, SZ_LINE, "%d ", n); __FiltLexCat(tbuf, &(filtseg[nfiltseg-1]->regions), &(filtseg[nfiltseg-1]->nr)); __FiltLexCat(tbuf, &(filtseg[nfiltseg-1]->shapes), &(filtseg[nfiltseg-1]->ns)); setargs = 1; free (s); } if( filtseg[nfiltseg-1]->radang ){ xfree(filtseg[nfiltseg-1]->radang); filtseg[nfiltseg-1]->radang = NULL; filtseg[nfiltseg-1]->ralen = 0; } switch(regid){ case TY_ANNULUS: case TY_BOX: case TY_CIRCLE: case TY_ELLIPSE: dinc = (lastd2 - lastd1)/n; for(i=1; i<=n; i++){ snprintf(tbuf, SZ_LINE, DFMT2, lastd1+((i-1)*dinc), lastd1+(i*dinc)); __FiltLexCat(tbuf, &(filtseg[nfiltseg-1]->radang), &(filtseg[nfiltseg-1]->ralen)); __FiltLexCat(",NA,NA", &(filtseg[nfiltseg-1]->radang), &(filtseg[nfiltseg-1]->ralen)); __FiltLexCat("\n", &(filtseg[nfiltseg-1]->radang), &(filtseg[nfiltseg-1]->ralen)); } break; case TY_PIE: dinc = (lastd2 - lastd1)/n; for(i=1; i<=n; i++){ snprintf(tbuf, SZ_LINE, DFMT2, lastd1+((i-1)*dinc), lastd1+(i*dinc)); __FiltLexCat("NA,NA", &(filtseg[nfiltseg-1]->radang), &(filtseg[nfiltseg-1]->ralen)); __FiltLexCat(tbuf, &(filtseg[nfiltseg-1]->radang), &(filtseg[nfiltseg-1]->ralen)); __FiltLexCat("\n", &(filtseg[nfiltseg-1]->radang), &(filtseg[nfiltseg-1]->ralen)); } break; default: _filterror("annulus, box, circle, ellipse, pie accelerators only - "); break; } _FiltLexTypeSet(TOK_ACCEL); } else{ _filterror("misplaced accelerator"); } return(n); } /* * * _FiltLexTypeSet -- add type info to the filter segment record * */ #ifdef YY_USE_PROTOS static void _FiltLexTypeSet(int type) #else static void _FiltLexTypeSet(type) int type; #endif { if( nfiltseg ==0 ) _FiltLexNew(); filtseg[nfiltseg-1]->type |= type; } /* * * _FiltLexOp -- add an operator to the filter segment record * */ #ifdef YY_USE_PROTOS static void _FiltLexOp(char *op) #else static void _FiltLexOp(op) char *op; #endif { _FiltLexCat(op); filtseg[nfiltseg-1]->ops += 1; } #ifdef YY_USE_PROTOS static void _FiltLexRegionStart(int docols) #else static void _FiltLexRegionStart(docols) int docols; #endif { char *s, *t; char tbuf[SZ_LINE]; /* sanity check -- 1D images do not support regions */ if( (filt->type == TYPE_IMAGE) && (ft_naxes(filt->fhd)==1) ){ _filterror("2D region filters invalid for 1D images"); } narg = 0; setargs=0; s = xmalloc(strlen(yytext)+1); nowhite(yytext, s); if( *s == '+' ){ regtype = TOK_IREG; strcpy(regname, s+1); } else if( *s == '-' ){ regtype = TOK_EREG; strcpy(regname, s+1); } else if( *s == '!' ){ regtype = TOK_NREG; strcpy(regname, s+1); } else{ regtype = TOK_IREG; strcpy(regname, s); } _FiltLexTypeSet(regtype); if( !(t=strchr(regname, '(')) ){ nsparen=0; } /* remove the paren from the regname string -- we will explicitly add it */ else{ *t = '\0'; nsparen=1; } /* convert to lower case, remove white space */ culc(regname); nowhite(regname, s); strcpy(regname, s); /* convert abbrev to region */ if( !strncmp(regname, "ann", 3) ){ strcpy(regname, "annulus"); regid = TY_ANNULUS; } else if( !strncmp(regname, "box", 3) ){ strcpy(regname, "box"); regid = TY_BOX; } else if( !strncmp(regname, "cir", 3) ){ strcpy(regname, "circle"); regid = TY_CIRCLE; } else if( !strncmp(regname, "ell", 3) ){ strcpy(regname, "ellipse"); regid = TY_ELLIPSE; } else if( !strncmp(regname, "fie", 3) ){ strcpy(regname, "field"); regid = TY_FIELD; } else if( !strncmp(regname, "lin", 3) ){ strcpy(regname, "line"); regid = TY_LINE; } else if( !strncmp(regname, "pan", 3) ){ strcpy(regname, "panda"); regid = TY_PANDA; } else if( !strncmp(regname, "bpa", 3) ){ strcpy(regname, "bpanda"); regid = TY_BPANDA; } else if( !strncmp(regname, "cpa", 3) ){ strcpy(regname, "cpanda"); regid = TY_CPANDA; } else if( !strncmp(regname, "epa", 3) ){ strcpy(regname, "epanda"); regid = TY_EPANDA; } else if( !strncmp(regname, "pie", 3) ){ strcpy(regname, "pie"); regid = TY_PIE; } else if( !strncmp(regname, "qtp", 3) ){ strcpy(regname, "qtpie"); regid = TY_PIE; } else if( !strncmp(regname, "poi", 3) ){ strcpy(regname, "point"); regid = TY_POINT; } else if( !strncmp(regname, "pol", 3) ){ strcpy(regname, "polygon"); regid = TY_POLYGON; } else if( !strcmp(regname, "imagemask") ){ regid = TY_IMAGEMASK; } /* append filter-type prefix */ switch( filt->type ){ case TYPE_EVENTS: /* normally, we filter rows analytically using evregions.o */ if( !filt->evsect ) _FiltLexCat("ev"); /* if evsect=xxx is specified, we filter by image pixels */ else _FiltLexCat("im"); break; case TYPE_IMAGE: /* image are filtered by image pixels */ _FiltLexCat("im"); break; } /* no region value to start */ filtseg[nfiltseg-1]->regval = 0; /* save size of current string so we can get back to the region string */ filtseg[nfiltseg-1]->s0 = strlen(filtseg[nfiltseg-1]->s); /* append region */ _FiltLexCat(FilterLexRegion1(filt,regname)); /* append standard args */ _FiltLexCat("(g,$RS,"); /* add include/exclude and whether we mark y lines for this region (we don't mark y on excludes as an optimization) */ switch(regtype){ case TOK_IREG: snprintf(tbuf, SZ_LINE, "1,%d", TOK_IREG); _FiltLexCat(tbuf); break; case TOK_NREG: snprintf(tbuf, SZ_LINE, "0,%d", TOK_NREG); _FiltLexCat(tbuf); break; case TOK_EREG: snprintf(tbuf, SZ_LINE, "0,%d", TOK_EREG); _FiltLexCat(tbuf); break; } switch(docols){ case 0: /* initialize default columns for tables -- but don't enter symbols yet */ FilterSymbolDefaults(filt, 0); /* initialize wcs for default image case */ _FiltLexWcsCols(filt->fhd, filt->xbin, filt->ybin); _FiltLexCat(","); floatprefix(); _FiltLexCat("x"); floatsuffix(); _FiltLexCat(","); floatprefix(); _FiltLexCat("y"); floatsuffix(); break; case 1: if( !initbindefs ){ /* initialize default columns for tables and enter symbols */ FilterSymbolDefaults(filt, 1); /* initialize wcs for default table case */ _FiltLexWcsCols(filt->fhd, filt->xbin, filt->ybin); initbindefs++; } if( !filt->xbin || !filt->ybin ){ _filterror("two binning columns are required for regions"); } _FiltLexCat(","); floatprefix(); _FiltLexCat(filt->xbin); floatsuffix(); _FiltLexCat(","); floatprefix(); _FiltLexCat(filt->ybin); floatsuffix(); break; case 2: _FiltLexCat(","); floatprefix(); _FiltLexCat(colnames[0]); floatsuffix(); _FiltLexCat(","); floatprefix(); _FiltLexCat(colnames[1]); floatsuffix(); break; } if( s ) xfree(s); } #ifdef YY_USE_PROTOS static void _FiltLexRegionVal(char *s) #else static void _FiltLexRegionVal(s) char *s; #endif { char *t=NULL; if( (t=strchr(s, '{')) ){ t++; } else{ t = s; } filtseg[nfiltseg-1]->regval = atoi(t); } #ifdef YY_USE_PROTOS static void _FiltLexRegionEnd(void) #else static void _FiltLexRegionEnd() #endif { int n; char *s; char ebuf[SZ_LINE]; char tbuf[SZ_LINE]; /* add final arguments as required */ switch( regid ){ case TY_BOX: if( (narg%2) == 0 ){ _FiltLexCat(",0.0"); narg++; } else{ /* if we saved an angle arg, we need to replace the last position arg */ if( *saveang ){ if( (s=strrchr(filtseg[nfiltseg-1]->s, ',')) ){ *s = '\0'; _FiltLexCat(saveang); } } } break; case TY_ELLIPSE: if( (narg%2) == 0 ){ _FiltLexCat(",0.0"); narg++; } else{ /* if we saved an angle arg, we need to replace the last position arg */ if( *saveang ){ if( (s=strrchr(filtseg[nfiltseg-1]->s, ',')) ){ *s = '\0'; _FiltLexCat(saveang); } } } break; case TY_BPANDA: case TY_EPANDA: if( (narg%2) == 0 ){ _FiltLexCat(",0.0"); narg++; } /* drop through here to process panda */ case TY_PANDA: case TY_CPANDA: _FiltLexRegionPanda(); setargs = 1; break; default: break; } /* argument check */ if( (n=_FiltLexArgCheck(regname, narg)) > 0 ){ /* don't bother printing where we are in region */ *yytext = '\0'; switch( vargs[n-1] ){ case 'n': snprintf(ebuf, SZ_LINE, "'%s' requires %d args (%d found)", rnames[n-1], rargs[n-1], narg); break; case 'e': snprintf(ebuf, SZ_LINE, "'%s' requires at least %d (even) args (%d found)", rnames[n-1], rargs[n-1], narg); break; case 'o': snprintf(ebuf, SZ_LINE, "'%s' requires at least %d (odd) args (%d found)", rnames[n-1], rargs[n-1], narg); break; case 'y': default: snprintf(ebuf, SZ_LINE, "'%s' requires %d args (%d found)", rnames[n-1], rargs[n-1], narg); break; } _filterror(ebuf); } /* process varargs */ if( (n < 0) || (regid == TY_POLYGON) ){ if( filtseg[nfiltseg-1]->type & TOK_ACCEL ){ _filterror("n= and variable arglist cannot be combined -"); } /* if its a varargs, we need to end with PSTOP values */ snprintf(sbuf, SZ_LINE, DFMT2, PSTOP, PSTOP); _FiltLexCat(sbuf); /* change the name of the routine we will call */ if( regid != TY_POLYGON ){ if( filtseg[nfiltseg-1]->s0 ){ if((s = xstrdup(&filtseg[nfiltseg-1]->s[filtseg[nfiltseg-1]->s0]))){ filtseg[nfiltseg-1]->s[filtseg[nfiltseg-1]->s0] = '\0'; _FiltLexCat("v"); _FiltLexCat(s); switch(regid){ case TY_ANNULUS: n = narg - 3; break; case TY_BOX: n = (narg - 5)/2; break; case TY_CIRCLE: n = narg - 3; break; case TY_ELLIPSE: n = (narg - 5)/2; break; case TY_PIE: n = narg - 3; break; case TY_POINT: n = narg/2; break; default: _filterror("varargs: annulus, box, circle, ellipse, pie, point;"); break; } snprintf(tbuf, SZ_LINE, "%d ", n); __FiltLexCat(tbuf, &(filtseg[nfiltseg-1]->regions), &(filtseg[nfiltseg-1]->nr)); __FiltLexCat(tbuf, &(filtseg[nfiltseg-1]->shapes), &(filtseg[nfiltseg-1]->ns)); setargs = 1; free (s); } _FiltLexTypeSet(TOK_VARARGS); } else{ _filterror("invalid varargs"); } } } /* set number of regions and shapes, if not already done */ if( !setargs ){ snprintf(tbuf, SZ_LINE, "%d ", 1); __FiltLexCat(tbuf, &(filtseg[nfiltseg-1]->regions), &(filtseg[nfiltseg-1]->nr)); __FiltLexCat(tbuf, &(filtseg[nfiltseg-1]->shapes), &(filtseg[nfiltseg-1]->ns)); } /* finish off region string */ _FiltLexCat(FilterLexRegion2(filt,")")); /* no column arguments */ colargs = 0; /* arguments are not set */ setargs = 0; /* save angle not set */ *saveang = 0; } #ifdef YY_USE_PROTOS static int _FiltLexRegionPanda(void) #else static int _FiltLexRegionPanda() #endif { int i; int n=0; int got=0; int a, r; int ahi=0, rhi=0; int hi=0; double d[11]; double ainc=0.0, rinc=0.0; char tbuf[SZ_LINE]; char *s=NULL; char *t, *u; switch(regid){ case TY_PANDA: case TY_CPANDA: hi = 7; break; case TY_BPANDA: case TY_EPANDA: hi = 10; break; default: _filterror("unknown panda type -- contact saord@cfa.harvard.edu"); break; } s = xstrdup(filtseg[nfiltseg-1]->s); for(i=hi; i>=0; i--){ /* look for last comma */ t = strrchr(s, ','); if( !t ) goto done; /* null it out from base string */ *t = '\0'; /* point past comma and get double value */ t++; d[i] = strtod(t, &u); if( t == u ) goto done; } switch(regid){ case TY_PANDA: case TY_CPANDA: ainc = (d[3] - d[2])/d[4]; ahi = (int)d[4]; rinc = (d[6] - d[5])/d[7]; rhi = (int)d[7]; break; case TY_BPANDA: case TY_EPANDA: ainc = (d[3] - d[2])/d[4]; ahi = (int)d[4]; rinc = (d[7] - d[5])/d[9]; rhi = (int)d[9]; break; default: _filterror("unknown panda type -- contact saord@cfa.harvard.edu"); break; } /* process limits arguments */ for(a=1; a<=ahi; a++){ for(r=1; r<=rhi; r++){ snprintf(tbuf, SZ_LINE, DFMT4, d[5]+((r-1)*rinc), d[5]+(r*rinc), d[2]+((a-1)*ainc), d[2]+(a*ainc)); __FiltLexCat(tbuf, &(filtseg[nfiltseg-1]->radang), &(filtseg[nfiltseg-1]->ralen)); __FiltLexCat("\n", &(filtseg[nfiltseg-1]->radang), &(filtseg[nfiltseg-1]->ralen)); n++; } } /* adjust region and shape count */ snprintf(tbuf, SZ_LINE, "%d ", n); __FiltLexCat(tbuf, &(filtseg[nfiltseg-1]->regions), &(filtseg[nfiltseg-1]->nr)); snprintf(tbuf, SZ_LINE, "%d ", 2*n); __FiltLexCat(tbuf, &(filtseg[nfiltseg-1]->shapes), &(filtseg[nfiltseg-1]->ns)); _FiltLexTypeSet(TOK_ACCEL); /* success */ got = 1; done: if( s ) xfree(s); return got; } /* * * _FiltLexRangeAdd -- add a rangelist string to the filter string buffer * */ #ifdef YY_USE_PROTOS static void _FiltLexRangeAdd(char *xname, char *str, int type, int n, int maxlen) #else static void _FiltLexRangeAdd(xname, str, type, n, maxlen) char *xname; char *str; int type; int n; int maxlen; #endif { char tbuf[SZ_LINE]; char tbuf2[SZ_LINE]; char *s; char *t; char *t2; char *name; /* get "in-expression" name for current technique */ name = FilterLexName(filt, xname); /* initialize pointers */ s = str; t = tbuf; /* clear working buffer */ memset(t, 0, SZ_LINE); /* if this is not the beginning, we first need to OR with prev */ if( n != 0 ) strncat(t, "||", maxlen-1); /* put in parens for safety */ strncat(t, "(", maxlen-1); /* add the name */ strncat(t, name, maxlen-1); /* add the rangelist */ switch(type){ case 1: strncat(t, "<=", maxlen-1); /* skip past : */ s++; /* append value */ t2 = tbuf2; while( *s ){ *t2++ = *s++; } *t2 = '\0'; bin2num(tbuf2, tbuf2, maxlen-1); strncat(t, tbuf2, maxlen-1); break; case 2: strncat(t, "==", maxlen-1); /* append upper value */ t2 = tbuf2; while( *s ){ *t2++ = *s++; } *t2 = '\0'; bin2num(tbuf2, tbuf2, maxlen-1); strncat(t, tbuf2, maxlen-1); break; case 3: strncat(t, ">=", maxlen-1); /* append lower value */ t2 = tbuf2; while( *s && (*s != ':') ){ *t2++ = *s++; } *t2 = '\0'; bin2num(tbuf2, tbuf2, maxlen-1); strncat(t, tbuf2, maxlen-1); /* skip past : */ s++; strncat(t, "&&", maxlen-1); strncat(t, name, maxlen-1); strncat(t, "<=", maxlen-1); /* append upper value */ t2 = tbuf2; while( *s ){ *t2++ = *s++; } *t2 = '\0'; bin2num(tbuf2, tbuf2, maxlen-1); strncat(t, tbuf2, maxlen-1); break; case 4: strncat(t, ">=", maxlen-1); /* append lower value */ t2 = tbuf2; while( *s && (*s != ':') ){ *t2++ = *s++; } *t2 = '\0'; bin2num(tbuf2, tbuf2, maxlen-1); strncat(t, tbuf2, maxlen-1); break; } strncat(t, ")", maxlen-1); _FiltLexCat(tbuf); } /* * * _FiltLexTypeCmp -- compare routine for qsort * */ #ifdef YY_USE_PROTOS static int _FiltLexTypeCmp(const void *s1, const void *s2) #else static int _FiltLexTypeCmp(s1, s2) const void *s1; const void *s2; #endif { FiltSeg *f1 = (FiltSeg *)s1; FiltSeg *f2 = (FiltSeg *)s2; /* check for broken qsort */ if( !*f1 || !*f2 ){ _filterror("qsort is broken -- contact saord@cfa.harvard.edu"); /* will not happen */ return 0; } /* make sure null string is at the end */ if( !(*f1)->s && !(*f2)->s ) return 0; else if( !(*f1)->s ) return 1; else if( !(*f2)->s ) return -1; /* paint: reverse order and make excludes local */ if( filt->paint ){ /* if both are regions, reverse order */ if( ((*f1)->type & TOK_REG) && ((*f2)->type & TOK_REG) ){ if( (*f1)->n < (*f2)->n ) return 1; else if( (*f1)->n > (*f2)->n ) return -1; else return 0; } /* keep same order */ else{ if( (*f1)->n < (*f2)->n ) return -1; else if( (*f1)->n > (*f2)->n ) return 1; else return 0; } } else{ /* if both or neither are eregions, keep them in the same order */ if( ((*f1)->type & TOK_EREG) == ((*f2)->type & TOK_EREG) ){ if( (*f1)->n < (*f2)->n ) return -1; else if( (*f1)->n > (*f2)->n ) return 1; else return 0; } /* exactly one is an eregion -- and we want eregions last */ else{ if( (*f1)->type & TOK_EREG ) return 1; else if( (*f2)->type & TOK_EREG ) return -1; /* should not happen */ else return 0; } } } /* * * _FiltLexTypeMatch -- see if the type of filtering we are doing * matches the type of token we have * */ #ifdef YY_USE_PROTOS int _FiltLexTypeMatch(int ftype, int ttype) #else int _FiltLexTypeMatch(ftype, ttype) int ftype; int ttype; #endif { switch(ftype){ case TYPE_IMAGE: /* we don't allow range list and col names in image filters */ if( (ttype & TOK_RLIST) || (ttype & TOK_NAME) ) return 0; /* everything else is fine */ else return 1; case TYPE_EVENTS: return 1; default: return 1; } } #ifdef YY_USE_PROTOS static int _FiltLexArgCheck(char *name, int args) #else static int _FiltLexArgCheck(name, args) char *name; int args; #endif { int i; for(i=0; rnames[i]; i++){ if( !strcmp(name, rnames[i]) ){ if( args == rargs[i] ){ return(0); } else{ /* less than required min */ if( args < rargs[i] ) return(i+1); /* more than min args -- could be varargs */ else{ /* check args allowed in varargs */ switch(vargs[i]){ case 'e': if( (args%2) == 0 ) return(-1); else return(i+1); case 'o': if( (args%2) == 1 ) return(-1); else return(i+1); case 'y': return(-1); default: return(i+1); } } } } } return(0); } #ifdef YY_USE_PROTOS static void _FiltLexSetWcs(char *s) #else static void _FiltLexSetWcs(s) char *s; #endif { char name[SZ_LINE]; int ip=0; newdtable(",=;"); /* get name of global coordsys */ if( word(s, name, &ip) ){ if( gcoordsys ) xfree(gcoordsys); gcoordsys = xstrdup(name); culc(gcoordsys); } /* restore old delim table */ freedtable(); } #ifdef YY_USE_PROTOS static char * _FiltLexCB(char *name, void *client_data) #else static char *_FiltLexCB(name, client_data) char *name; void *client_data; #endif { FiltSeg f=(FiltSeg)client_data; int ip=0; int nr=0; int ns=0; char *s; char tbuf[SZ_LINE]; if( !strcmp(name, "RS") ){ /* exclude regions get no region value first time around */ if( (macropass==0) && (f->type & TOK_EREG) ){ return NULL; } /* get next region value and remove from string */ if( word(f->regions, tbuf, &ip) ){ nr = atoi(tbuf); s = xstrdup(&(f->regions[ip])); xfree(f->regions); f->regions = s; } else{ _filterror("internal error: no region string specified"); return(NULL); } if( !inexpr || (f->type & (TOK_ACCEL|TOK_VARARGS)) ){ if( f->regval ){ snprintf(macrobuf, SZ_LINE, "%d,", f->regval); } else{ snprintf(macrobuf, SZ_LINE, "%d,", nregion+1); } nregion += nr; f->nregion += nr; inexpr = 1; } else{ if( f->regval ){ snprintf(macrobuf, SZ_LINE, "%d,", f->regval); } else{ snprintf(macrobuf, SZ_LINE, "%d,", nregion); } } /* get next shape value and remove from string */ ip = 0; if( word(f->shapes, tbuf, &ip) ){ ns = atoi(tbuf); s = xstrdup(&(f->shapes[ip])); xfree(f->shapes); f->shapes = s; } else{ _filterror("internal error: no shape string specified"); return(NULL); } /* concat shape value */ nshape++; snprintf(tbuf, SZ_LINE, "%d", nshape); strcat(macrobuf, tbuf); /* set new shape value */ nshape += (ns-1); /* return macro value */ return(macrobuf); } else{ return NULL; } } /* * * _FiltLexNeedOp -- determine if we add a connecting operator for this segment * */ #ifdef YY_USE_PROTOS static int _FiltLexNeedOp(int i, char *s) #else static int _FiltLexNeedOp(i, s) int i; char *s; #endif { int c; /* check for operator in current string */ if( s && *s ){ c = *s; switch(c){ case '&': case '|': case '=': case '!': case '<': case '>': return 0; default: break; } } /* not in this string check for operator in previous */ for(i=i-1; i>=0; i--){ if( !filtseg[i] || !filtseg[i]->s ) continue; if( strcmp(filtseg[i]->s, "(") && strcmp(filtseg[i]->s, ")") ) break; } if( i >= 0 ){ c = filtseg[i]->s[strlen(filtseg[i]->s)-1]; switch(c){ case '&': case '|': case '=': case '!': case '<': case '>': return 0; default: return 1; } } else{ return 0; } } /* * * _FiltLexMake -- generate filter from filter segments * */ #ifdef YY_USE_PROTOS static void _FiltLexMake(void) #else static void _FiltLexMake() #endif { int i, j, k, l; int x, xtot; int type=0; int ltype=0; int opar=0; char *s; /* debugging */ if( filt->debug ){ for(i=0; is ) fprintf(stderr, "unsorted #%d %s\n", filtseg[i]->n, filtseg[i]->s); else fprintf(stderr, "unsorted #%d %d is empty\n", i, filtseg[i]->n); } } /* look for bad region expressions and determine how many regions we have */ for(i=0, j=0, k=0, l=0; is ) continue; type = filtseg[i]->type; /* make sure we want the type being offered */ if( !_FiltLexTypeMatch(filt->type, type) ){ _filterror("column filters not permitted in an image filter expression"); } /* look for bad combinations */ if( (type & TOK_NREG) && !(type & TOK_IREG) ) _filterror("!region must be combined with another region (e.g., field()&&!region)"); if( (type & TOK_EREG) && (type & TOK_IREG) ) _filterror("-region must not be combined with another region (use !region instead)"); if( (type & TOK_EREG) && (type & TOK_NAME) ) _filterror("-region must not be combined with filters (use !region instead)"); if( (type & TOK_EREG) && (type & TOK_RLIST) ) _filterror("-region must not be combined with range lists (use !region instead)"); if( (type & TOK_EREG) && (type & TOK_RTINE) ) _filterror("-region must not be combined with routines (use !region instead)"); /* count region types */ if( filtseg[i]->type & TOK_IREG ) j++; if( filtseg[i]->type & TOK_NREG ) k++; if( filtseg[i]->type & TOK_EREG ) l++; } /* check for fits image mask and process specially */ if( filt->masks ){ /* can't have fits mask and ascii regions */ if( j || k || l ){ _filterror("FITS image masks cannot be combined with ASCII regions"); } /* image filtering of events uses a imagemask special routine */ if( (filt->type == TYPE_EVENTS) && filt->evsect ){ strcpy(yytext, "imagemask"); _FiltLexRegionStart(1); _FiltLexRegionEnd(); } else{ __FiltLexCat("imagemask", &filter, &filtlen); nregion = filt->nmaskreg; return; } } /* if we have only exclude regions, add field */ if( !j && !k && l ){ strcpy(yytext, "field"); if( filt->type == TYPE_EVENTS ) _FiltLexRegionStart(1); else _FiltLexRegionStart(0); _FiltLexRegionEnd(); } /* reset region and shape counts */ nregion=0; nshape=0; /* expand macro before reordering, to maintain region numbers in sequence */ for(i=0; is ){ if( _FiltLexNeedOp(i, NULL) ) inexpr=0; macropass=0; s = ExpandMacro(filtseg[i]->s, NULL, NULL, 0, _FiltLexCB, filtseg[i]); xfree(filtseg[i]->s); filtseg[i]->s = s; } } /* we want descending order so that eregions are last in the expression */ qsort(filtseg, nfiltseg, sizeof(FiltSeg), _FiltLexTypeCmp); if( filt->debug ){ for(i=0; is ) fprintf(stderr, "sorted #%d %s\n", filtseg[i]->n, filtseg[i]->s); else fprintf(stderr, "sorted #%d %d is empty\n", i, filtseg[i]->n); } } /* add open paren and mark that we did it */ __FiltLexCat("(", &filter, &filtlen); opar = 1; /* run through segments, inserting proper boolean connectors */ ltype = 0; for(i=0; is ){ /* no type probably means its a paren, so just add it and jump out */ if( !filtseg[i]->type ){ __FiltLexCat(filtseg[i]->s, &filter, &filtlen); /* remove empty parens, if we just make them */ x = strlen(filter); if( (filter[x-2] == '(') && (filter[x-1] == ')') ) filter[x-2] = '\0'; i++; continue; } type = filtseg[i]->type; if( _FiltLexNeedOp(i, NULL) ) inexpr=0; macropass=1; s = ExpandMacro(filtseg[i]->s, NULL, NULL, 0, _FiltLexCB, filtseg[i]); if( _FiltLexNeedOp(i, s) ){ /* remove trailing open parens from prev. segment (add back later) */ for(xtot=0, x=strlen(filter)-1; x>=0; x--){ if( filter[x] != '(' ) break; filter[x] = '\0'; xtot++; } if( (ltype & TOK_IREG) && (type & TOK_IREG) ){ __FiltLexCat("||", &filter, &filtlen); } else if( (ltype & TOK_IREG) && (type & TOK_EREG) ){ if( opar > 0 ){ __FiltLexCat(")", &filter, &filtlen); opar--; } if( filt->paint ){ if( opar > 0 ){ __FiltLexCat(")", &filter, &filtlen); opar --; } __FiltLexCat("||", &filter, &filtlen); } else{ __FiltLexCat("&&", &filter, &filtlen); } __FiltLexCat("(", &filter, &filtlen); opar++; } else if( (ltype & TOK_EREG) && (type & TOK_EREG) ){ __FiltLexCat("&&", &filter, &filtlen); } else if( (ltype & TOK_EREG) && (type & TOK_IREG) ){ if( filt->paint && (opar > 0) ){ __FiltLexCat(")", &filter, &filtlen); opar --; } __FiltLexCat("&&", &filter, &filtlen); __FiltLexCat("(", &filter, &filtlen); opar ++; if( filt->paint ){ __FiltLexCat("(", &filter, &filtlen); opar++; } } /* otherwise implied operator is AND */ else{ __FiltLexCat("&&", &filter, &filtlen); } /* add back parens */ for(x=0; xpaint && (i==0) ){ __FiltLexCat("((", &filter, &filtlen); opar +=2; } } __FiltLexCat(s, &filter, &filtlen); if( s ) xfree(s); if( filtseg[i]->radang ){ if( *filtseg[i]->radang == ',' ) __FiltLexCat(filtseg[i]->radang+1, &radang, &radanglen); else __FiltLexCat(filtseg[i]->radang, &radang, &radanglen); } else{ __FiltLexCat("NA,NA,NA,NA\n", &radang, &radanglen); } i++; for(; (itype==type); ){ if( _FiltLexNeedOp(i, NULL) ) inexpr=0; s = ExpandMacro(filtseg[i]->s, NULL, NULL, 0, _FiltLexCB, filtseg[i]); if( _FiltLexNeedOp(i, s) ){ for(xtot=0, x=strlen(filter)-1; x>=0; x--){ if( filter[x] != '(' ) break; filter[x] = '\0'; xtot++; } /* if lhs and rhs are regions, implied operator is OR */ if( type & TOK_IREG ) __FiltLexCat("||", &filter, &filtlen); /* otherwise implied operator is AND */ else __FiltLexCat("&&", &filter, &filtlen); for(x=0; xradang ){ if( *filtseg[i]->radang == ',' ) __FiltLexCat(filtseg[i]->radang+1, &radang, &radanglen); else __FiltLexCat(filtseg[i]->radang, &radang, &radanglen); } else{ __FiltLexCat("NA,NA,NA,NA\n", &radang, &radanglen); } i++; } } /* ignore invalid arguments */ else{ i++; } /* save last type */ ltype = type; } /* if last segment was an exclude and we are in paint mode, ignore it */ if( filt->paint && (ltype & TOK_EREG) ){ __FiltLexCat("&&0", &filter, &filtlen); } /* close off open parens (lots could be needed in paint mode) */ while( opar-- ){ __FiltLexCat(")", &filter, &filtlen); } /* check for even number of parens */ l = strlen(filter); for(i=0, j=0; idebug ) fprintf(stderr, "paren error %d: %s\n", j, filter); _filterror("unbalanced parentheses"); } if( filt->debug ) fprintf(stderr, "filter: %s\n", filter); } /* * * _FiltLexEnd -- cleanup from parsing regions * */ #ifdef YY_USE_PROTOS static void _FiltLexEnd(void) #else static void _FiltLexEnd() #endif { int i; /* reset state variables */ colargs = 0; initbindefs = 0; include_stack_ptr = 0; nroutine = 0; nshape = 0; nmask = 0; nparen = 0; parse_error = 0; filtlen = 0; radanglen = 0; regid = 0; regtype = 0; inexpr = 0; *regname = '\0'; *saveang = 0; *(wcsnames[0]) = '\0'; *(wcsnames[1]) = '\0'; binsiz[0] = 1; binsiz[1] = 1; /* free up previous filter */ if( filter ){ xfree(filter); filter = NULL; } /* free up previous radang string */ if( radang ){ xfree(radang); radang = NULL; } /* free up wcs */ if( wcs ){ wcsfree (wcs); wcs = NULL; } /* no segments */ if( filtseg ){ for(i=0; is ) xfree(filtseg[i]->s); if( filtseg[i]->regions ) xfree(filtseg[i]->regions); if( filtseg[i]->shapes ) xfree(filtseg[i]->shapes); if( filtseg[i]->radang ) xfree(filtseg[i]->radang); xfree(filtseg[i]); } } xfree(filtseg); filtseg = NULL; } maxfiltseg = 0; nfiltseg = 0; if( gcoordsys ){ xfree(gcoordsys); gcoordsys = NULL; } if( fcoordsys ){ xfree(fcoordsys); fcoordsys = NULL; } cdelt1 = 0.0; cdelt2 = 0.0; crot = 0.0; } /* * * _FiltLexGetWcs -- determine the WCS coord system to use for wcsc translation * */ #ifdef YY_USE_PROTOS static char * _FiltLexGetWcs(void) #else static char *_FiltLexGetWcs() #endif { if( gcoordsys && strcmp(gcoordsys, "image") && strcmp(gcoordsys, "physical") ) return gcoordsys; if( fcoordsys && strcmp(fcoordsys, "image") && strcmp(fcoordsys, "physical") ) return fcoordsys; return NULL; } /* * * _FiltLexWcsCols -- reset WCS for these columns * */ #ifdef YY_USE_PROTOS static void _FiltLexWcsCols(FITSHead iheader, char *name0, char *name1) #else static void _FiltLexWcsCols(iheader, name0, name1) FITSHead iheader; char *name0; char *name1; #endif { int i, which, ival; int simple=1; double dval, dval2; char *s; FITSHead oheader; FITSCard card; /* make sure we have something to process */ if( !iheader ) return; if( filt->fhd->image ){ /* free up old wcs */ if( wcs ) wcsfree (wcs); /* init new wcs */ hlength(ft_cards(filt->fhd),0); wcs = wcsinit(ft_cards(filt->fhd)); tltyp[0] = 0; tltyp[1] = 0; } /* for tables, we can init wcs only the specified columns */ else if( name0 && *name0 && name1 && *name1 ){ /* see if these are the same as the last set of columns */ if( (*(wcsnames[0]) && !strcasecmp(name0,wcsnames[0])) && (*(wcsnames[1]) && !strcasecmp(name1,wcsnames[1])) && wcs ){ return; } /* gather up important tl info about the binning columns */ for(i=1; i<=iheader->table->tfields; i++){ /* determine which bincol we are processing */ if( !strcasecmp(iheader->table->col[i-1].name, name0) ) which = 0; else if( !strcasecmp(iheader->table->col[i-1].name, name1) ) which = 1; else continue; /* set tlinfo values for this column */ tlmin[which] = ft_headgetr(iheader, "TLMIN", i, 1.0, &card); tlmax[which] = ft_headgetr(iheader, "TLMAX", i, 1.0, &card); binsiz[which] = ft_headgetr(iheader, "TDBIN", i, 1.0, &card); tltyp[which] = iheader->table->col[i-1].type; } /* free up old wcs */ if( wcs ) wcsfree (wcs); /* make a copy of the header */ oheader = ft_headcopy(iheader); /* make sure this is a primary FITS file */ ft_cardfmt((FITSCard)oheader->cards, "SIMPLE", 0, FT_LOGICAL, &simple, 0, "Standard FITS"); /* set dimension info, used by wcs code */ ft_headseti(oheader, "NAXIS", 0, 2, "number of axes", 1); /* set dimension info */ for(i=0; i<=1; i++){ ival = (int)tldim(tlmin[i], tlmax[i], binsiz[i], tltyp[i]); ft_headseti(oheader, "NAXIS", i+1, ival, "axis dimension", 1); } /* set bitpix */ ft_headseti(oheader, "BITPIX", 0, 32, "bits/pixel", 1); /* synchronize the header and the cards after any changes */ ft_syncdata(oheader); /* transform WCS cards for the specified columns, if we have such */ for(i=1; i<=iheader->table->tfields; i++){ /* determine which bincol we are processing */ if( !strcasecmp(iheader->table->col[i-1].name, name0) ) which = 0; else if( !strcasecmp(iheader->table->col[i-1].name, name1) ) which = 1; else continue; /* convert event wcs header info image wcs info */ if( (s=ft_headgets(iheader, "TCTYP", i, NULL, &card)) && card ){ ft_headapps(oheader, "CTYPE", which+1, s, NULL); xfree(s); } if( (s=ft_headgets(iheader, "TCRVL", i, NULL, &card)) && card ){ ft_headappv(oheader, "CRVAL", which+1, s, NULL); xfree(s); } if( (s=ft_headgets(iheader, "TCDLT", i, NULL, &card)) && card ){ ft_headappv(oheader, "CDELT", which+1, s, NULL); xfree(s); } if( (s=ft_headgets(iheader, "TCROT", i, NULL, &card)) && card ){ ft_headappv(oheader, "CROTA", which+1, s, NULL); xfree(s); } /* this value gets converted from physical to image */ if( (dval=ft_headgetr(iheader, "TCRPX", i, 0.0, &card)) && card ){ dval2 = tlp2i(dval, tlmin[which], binsiz[which], tltyp[which]); ft_headsetr(oheader, "CRPIX", which+1, dval2, 7, NULL, 1); } } /* init new wcs */ hlength(ft_cards(oheader),0); wcs = wcsinit(ft_cards(oheader)); ft_headfree(oheader, 1); /* save names for next time */ strcpy(wcsnames[0], name0); strcpy(wcsnames[1], name1); } /* set some extra wcs parameters */ if( wcs && iswcs(wcs) ){ if( fcoordsys ) xfree(fcoordsys); fcoordsys = xstrdup(wcs->radecin); culc(fcoordsys); if( !wcs->coorflip ){ cdelt1 = wcs->cdelt[0]; cdelt2 = wcs->cdelt[1]; } else{ cdelt1 = wcs->cdelt[1]; cdelt2 = wcs->cdelt[0]; } if ( wcs->imflip ) { crot = -wcs->rot; } else { crot = wcs->rot; } } else{ cdelt1 = 0.0; cdelt2 = 0.0; crot = 0.0; } /* set global coord system first time through */ if( !gcoordsys ){ if( (gcoordsys=xstrdup(getenv("COORDSYS"))) == NULL ) gcoordsys = xstrdup(DEFAULT_COORDSYS); } } /* * * _FiltLexLcx -- determine if we have a linear-type WCS * */ #ifdef YY_USE_PROTOS static int _FiltLexLcx(void) #else static int _FiltLexLcx() #endif { char *coordsys; coordsys = gcoordsys; if( !coordsys || !*coordsys ) return 0; if( !strcasecmp(coordsys, "image") ) return LCX_IMAGE; if( !strcasecmp(coordsys, "physical") ) return LCX_PHYS; if( !strcasecmp(coordsys, "amplifier") ) return LCX_AMP; if( !strcasecmp(coordsys, "detector") ) return LCX_DET; return 0; } #ifdef YY_USE_PROTOS static void _FiltLexNum(int lcx) #else static void _FiltLexNum(lcx) int lcx; #endif { char tbuf[SZ_LINE]; /* process binary number, if necessary */ bin2num(tbuf, yytext, SZ_LINE); /* for linear coordinate systems (physical, amps, etc.), we have to convert to image coords or physical coords, depending on the type of data and type of filtering */ if( lcx ){ /* data is in a table: we can use image or physical coords */ if( filt->fhd->table ){ /* if we want to use physical coordinates ... */ if( USEPHYS ){ /* convert image positions to physical coords */ if( lcx == LCX_IMAGE ){ if( POSARG ){ dval = tli2p(strtod(tbuf,NULL), tlmin[(narg+1)%2], binsiz[(narg+1)%2], tltyp[(narg+1)%2]); snprintf(sbuf, SZ_LINE, DFMT1, dval); _FiltLexCat(sbuf); _FiltLexArgSave(dval); } /* angle arguments are just passed along */ else if( ANGARG ){ dval = strtod(tbuf,NULL); snprintf(sbuf, SZ_LINE, DFMT1, dval); _FiltLexCat(sbuf); _FiltLexArgSave(dval); } /* panda numeric args are just passed along */ else if( NUMARG ){ dval = strtod(tbuf,NULL); snprintf(sbuf, SZ_LINE, DFMT1, dval); _FiltLexCat(sbuf); } /* size arguments have to be converted using the binsize */ else{ if( SAVEANG ){ dval = strtod(tbuf,NULL); snprintf(saveang, SZ_LINE, DFMT1, dval); } dval = strtod(tbuf,NULL) * binsiz[(narg+1)%2]; snprintf(sbuf, SZ_LINE, DFMT1, dval); _FiltLexCat(sbuf); _FiltLexArgSave(dval); } } /* already in physical -- just pass along args */ else{ dval = strtod(tbuf,NULL); snprintf(sbuf, SZ_LINE, DFMT1, dval); _FiltLexCat(sbuf); _FiltLexArgSave(dval); } } /* we are using image coords (image-style filtering) */ else{ /* convert non-image positions to image coords */ if( lcx != LCX_IMAGE ){ if( POSARG ){ dval = tlp2i(strtod(tbuf,NULL), tlmin[(narg+1)%2], binsiz[(narg+1)%2], tltyp[(narg+1)%2]); snprintf(sbuf, SZ_LINE, DFMT1, dval); _FiltLexCat(sbuf); _FiltLexArgSave(dval); } /* angle arguments are just passed along */ else if( ANGARG ){ dval = strtod(tbuf,NULL); snprintf(sbuf, SZ_LINE, DFMT1, dval); _FiltLexCat(sbuf); _FiltLexArgSave(dval); } /* panda numeric args are just passed along */ else if( NUMARG ){ dval = strtod(tbuf,NULL); snprintf(sbuf, SZ_LINE, DFMT1, dval); _FiltLexCat(sbuf); } /* size arguments have to be converted using the binsize */ else{ if( SAVEANG ){ dval = strtod(tbuf,NULL); snprintf(saveang, SZ_LINE, DFMT1, dval); } dval = strtod(tbuf,NULL) / binsiz[(narg+1)%2]; snprintf(sbuf, SZ_LINE, DFMT1, dval); _FiltLexCat(sbuf); _FiltLexArgSave(dval); } } /* already in image -- just pass along args */ else{ dval = strtod(tbuf,NULL); snprintf(sbuf, SZ_LINE, DFMT1, dval); _FiltLexCat(sbuf); _FiltLexArgSave(dval); } } } /* data is in an image: we use image coords */ else{ /* convert positional arguments to image */ if( POSARG ){ /* save x value for processing with y next time */ if( XARG ){ xpos = SAOstrtod(tbuf,NULL); } else{ ypos = SAOstrtod(tbuf,NULL); switch(lcx){ case LCX_IMAGE: xpix = xpos; ypix = ypos; break; case LCX_PHYS: ft_phy2img(filt->fhd, xpos, ypos, &xpix, &ypix); break; case LCX_AMP: ft_amp2phy(filt->fhd, xpos, ypos, &dval, &dval2); ft_phy2img(filt->fhd, dval, dval2, &xpix, &ypix); break; case LCX_DET: ft_det2phy(filt->fhd, xpos, ypos, &dval, &dval2); ft_phy2img(filt->fhd, dval, dval2, &xpix, &ypix); break; } snprintf(sbuf, SZ_LINE, DFMT2, xpix, ypix); _FiltLexCat(sbuf); } } /* angle arguments are just passed along, with updated crot */ else if( ANGARG ){ dval = strtod(tbuf,NULL); if( USEWCS ) dval += crot; if( IMFLIP ) dval = -dval; snprintf(sbuf, SZ_LINE, DFMT1, dval); _FiltLexCat(sbuf); } /* panda numeric args are just passed along */ else if( NUMARG ){ dval = strtod(tbuf,NULL); snprintf(sbuf, SZ_LINE, DFMT1, dval); _FiltLexCat(sbuf); } /* convert size args, which may or may not be in pairs */ else{ if( SAVEANG ){ dval = strtod(tbuf,NULL); if( USEWCS ) dval += crot; if( IMFLIP ) dval = -dval; snprintf(saveang, SZ_LINE, DFMT1, dval); } /* arg 1 is associated with ra, arg2 with dec */ if( XARG ){ xpos = ABS(strtod(tbuf,NULL)); ypos = 0.0; switch(lcx){ case LCX_IMAGE: xpix = xpos; break; case LCX_PHYS: ft_phy2img_size(filt->fhd, xpos, ypos, &xpix, &ypix); break; case LCX_AMP: ft_amp2phy_size(filt->fhd, xpos,ypos, &dval,&dval2); ft_phy2img_size(filt->fhd, dval,dval2, &xpix,&ypix); break; case LCX_DET: ft_det2phy_size(filt->fhd, xpos,ypos, &dval,&dval2); ft_phy2img_size(filt->fhd, dval,dval2, &xpix,&ypix); break; } snprintf(sbuf, SZ_LINE, DFMT1, xpix); _FiltLexArgSave(xpix); } else{ xpos = 0.0; ypos = ABS(strtod(tbuf,NULL)); switch(lcx){ case LCX_IMAGE: ypix = ypos; break; case LCX_PHYS: ft_phy2img_size(filt->fhd, xpos, ypos, &xpix, &ypix); break; case LCX_AMP: ft_amp2phy_size(filt->fhd, xpos,ypos, &dval,&dval2); ft_phy2img_size(filt->fhd, dval,dval2, &xpix,&ypix); break; case LCX_DET: ft_det2phy_size(filt->fhd, xpos,ypos, &dval,&dval2); ft_phy2img_size(filt->fhd, dval,dval2, &xpix,&ypix); break; } snprintf(sbuf, SZ_LINE, DFMT1, ypix); _FiltLexArgSave(ypix); } _FiltLexCat(sbuf); } } } /* not lcx -- angle arguments are just passed along with updated crot */ else if( ANGARG ){ dval = strtod(tbuf,NULL); if( USEWCS ) dval += crot; if( IMFLIP ) dval = -dval; snprintf(sbuf, SZ_LINE, DFMT1, dval); _FiltLexCat(sbuf); } /* panda numeric args are just passed along */ else if( NUMARG ){ dval = strtod(tbuf,NULL); snprintf(sbuf, SZ_LINE, DFMT1, dval); _FiltLexCat(sbuf); } /* not lcx -- everything else is assumed to be in units of "degrees" in the default system. add 'd' and put back for reparsing */ else{ int i; char *yycopy = xstrdup(tbuf); unput('d'); for(i=yyleng-1; i>=0; --i) unput(yycopy[i]); xfree(yycopy); narg--; } } #ifdef YY_USE_PROTOS static int _FiltIncMask(FilterMask masks, int maxmask, int nmask) #else static int _FiltIncMask(masks, maxmask, nmask) FilterMask masks; int maxmask; int nmask; #endif { int omax; nmask++; if( nmask >= maxmask ){ omax = maxmask; maxmask += MASKINC; masks = (FilterMask)xrealloc(masks, maxmask*sizeof(FilterMaskRec)); memset(masks+omax, 0, (maxmask-omax)*sizeof(FilterMaskRec)); } return nmask; } #ifdef YY_USE_PROTOS static int _FiltFitsMask(char *filename, FilterMask *rmasks, FITSHead *rhead, int *nreg) #else static int _FiltFitsMask(filename, rmasks, rhead, nreg) char *filename; FilterMask *rmasks; FITSHead *rhead; int *nreg; #endif { short *dptr; short *data=NULL; int x, y; int maxreg=-1; int maxmask; /* max masks allocated thus far */ int nmask=0; /* number of mask segments */ FilterMask masks=NULL; /* array valid region masks for one row */ FITSHead head=NULL; /* read fits image */ if( !ft_simpleimageread(filename, &head, (void *)&data, NULL, 16) ){ return(-1); } if( !head->image ){ if( data ) xfree(data); if( head ) ft_headfree(head, 1); return(-2); } if( !ft_naxes(head) || !ft_naxis(head, 1) || !ft_naxis(head, 2) ){ if( data ) xfree(data); if( head ) ft_headfree(head, 1); return(-3); } /* allocate an array of masks, which will be returned to caller */ maxmask = MASKINC; masks = (FilterMask)xcalloc(maxmask, sizeof(FilterMaskRec)); /* seed the first region mask value */ masks[nmask].region = 0; /* loop through y rows */ for(y=1; y<=ft_naxis(head, 2); y++){ dptr = data + ((y-1) * ft_naxis(head, 1)); /* to start this line, we make a seed mask with no region */ if( masks[nmask].region ){ nmask = _FiltIncMask(masks, maxmask, nmask); masks[nmask].region = 0; } /* process each pixel in the row */ for(x=1; x<=ft_naxis(head, 1); x++, dptr++){ /* we do not allow negative values */ if( *dptr < 0 ){ if( data ) xfree(data); if( head ) ft_headfree(head, 1); if( masks ) xfree(masks); return(-4); } /* set max region as needed */ if( *dptr > maxreg ) maxreg = *dptr; /* look for a change in the mask */ if( *dptr != masks[nmask].region ){ /* if previous was non-zero region, finish it and bump to next */ if( masks[nmask].region ){ masks[nmask].xstop = x - 1; nmask = _FiltIncMask(masks, maxmask, nmask); } masks[nmask].y = y; masks[nmask].region = *dptr; masks[nmask].xstart = x; } } /* finish last non-zero segment, inc number of mask segs */ if( masks[nmask].region ){ masks[nmask].xstop = x; nmask = _FiltIncMask(masks, maxmask, nmask); } } /* free up data space */ if( data ) xfree(data); /* allocate just enough mask space */ masks = (FilterMask)xrealloc(masks, nmask*sizeof(FilterMaskRec)); if( rmasks ) *rmasks = masks; else xfree(masks); if( rhead ) *rhead = head; else ft_headfree(head, 1); if( nreg ) *nreg = maxreg; return(nmask); } /* * * Semi-public Routines * * */ /* * * _FilterString -- return output filter from lexer * */ #ifdef YY_USE_PROTOS char * _FilterString(void) #else char *_FilterString() #endif { if( filtlen <= 0 ) _FiltLexMake(); return(filter); } #ifdef YY_USE_PROTOS int FilterRoutineCount(void) #else int FilterRoutineCount() #endif { return(nroutine); } #ifdef YY_USE_PROTOS int FilterShapeCount(void) #else int FilterShapeCount() #endif { return(nshape); } #ifdef YY_USE_PROTOS int FilterRegionCount(int type) #else int FilterRegionCount(type) int type; #endif { int i, j; /* handle fits image masks specially */ if( nmask ){ if( type & TOK_IREG ) return(nregion); else return(0); } /* normal regions */ for(i=0, j=0; itype & type ){ j += filtseg[i]->nregion; } } return(j); } #ifdef YY_USE_PROTOS char * FilterRadAng(void) #else char *FilterRadAng() #endif { return(radang); } #ifdef YY_USE_PROTOS int FilterParseError(void) #else int FilterParseError() #endif { return(parse_error); } #ifdef YY_USE_PROTOS int FilterTlInfo(double *tlmins, double *binsizs, int *tltyps) #else int FilterTlInfo(tlmins, binsizs, tltyps) double *tlmins; double *binsizs; int *tltyps; #endif { tlmins[0] = tlmin[0]; tlmins[1] = tlmin[1]; binsizs[0] = binsiz[0]; binsizs[1] = binsiz[1]; tltyps[0] = tltyp[0]; tltyps[1] = tltyp[1]; return 1; } #ifdef YY_USE_PROTOS void FiltInitParser(void) #else void FiltInitParser() #endif { static int parser = 0; /* make sure we free'd up all space from last time */ _FiltLexEnd(); /* set up some convenience variables */ filt = FilterDefault(); /* if( parser ) yyrestart(NULL); */ BEGIN INITIAL; parser++; laststart=INITIAL; } #ifdef YY_USE_PROTOS void FiltScanString(char *s) #else void FiltScanString(s) char *s; #endif { int i; char *t; /* make sure there is an explicit delim at end so we are done before lex finds EOF -- otherwise panda shapes don't get processed */ i = strlen(s); t = xmalloc(i+2); strcpy(t, s); if( (t[i-1] != ';') && (t[i-1] != '\n') ) strcat(t, "\n"); yy_scan_string(t); if( t ) xfree(t); } /* yyerror -- renamed to _filterror because flex -P does not change this */ #ifdef YY_USE_PROTOS int _filterror(char *msg) #else int _filterror(msg) char *msg; #endif { if( *yytext ) gerror(stderr, "%s while parsing filter at: %s\n", msg ? msg : "filterr", yytext); else gerror(stderr, "%s\n", msg ? msg : "filterr"); YY_FLUSH_BUFFER; parse_error = 1; yyterminate(); } #ifdef YY_USE_PROTOS int yywrap(void) #else int yywrap() #endif { return 1; } funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/filter/filter.c000066400000000000000000000553501256243640000234240ustar00rootroot00000000000000/* * Copyright (c) 1999-2003 Smithsonian Astrophysical Observatory */ /* * * filter.c -- hi-level management of filters * */ #include #if HAVE_CYGWIN||HAVE_MINGW32 #include #endif extern int idx_debug; /* * * private routines * */ /* this is needed by lex */ static Filter default_filter = NULL; /* null filters return this special record */ static FilterRec null_filter; #ifdef ANSI_FUNC static void FiltInitRegions(void) #else static void FiltInitRegions() #endif { initevregions(); initimregions(); } /* * * _FilterImageCmp -- compare routine for qsort * */ #ifdef ANSI_FUNC static int _FilterImageCmp(const void *s1, const void *s2) #else static int _FilterImageCmp(s1, s2) const void *s1; const void *s2; #endif { FilterMask f1 = (FilterMask)s1; FilterMask f2 = (FilterMask)s2; if( f1->y < f2->y ){ return -1; } else if( f1->y > f2->y ){ return 1; } else{ if( f1->xstart < f2->xstart ){ return -1; } else{ return 1; } } } /* * * semi-public routines, used by other modules * */ /* * * public routines * */ /* * * FilterClip -- save the filter without the enclosing brackets * */ #ifdef ANSI_FUNC char * FilterClip(char *filter) #else char *FilterClip(filter) char *filter; #endif { char *tbuf; char *tptr; char *ofilter; int len; int i; /* check for the obvious */ if( !filter || (*filter == '\0') ) return(NULL); /* save filter, but without the enclosing brackets */ tbuf = xstrdup(filter); nowhite(tbuf, tbuf); tptr = tbuf; if( *tbuf == '[' ){ tptr++; len = strlen(tptr); for(i=len-1; i>=0; i-- ){ if( tptr[i] == ']' ){ tptr[i] = '\0'; break; } } } if( tptr && (*tptr != '\0') ){ /* we extend the buffer because flex has problems in filt_init_buffer if its smaller than sizeof(FILE *) */ ofilter = xcalloc(strlen(tptr)+SZ_LINE, sizeof(char)); nowhite(tptr, ofilter); } else{ ofilter = NULL; } xfree(tbuf); return(ofilter); } /* * * FilterDefault -- get the default filter handle for the parser * */ #ifdef ANSI_FUNC Filter FilterDefault(void) #else Filter FilterDefault() #endif { return(default_filter); } /* * * FilterNull -- get the null filter pointer * */ #ifdef ANSI_FUNC Filter FilterNull(void) #else Filter FilterNull() #endif { return(&null_filter); } /* * * FilterNum -- get a unique number associated with an open filter * */ static int filter_num=0; #ifdef ANSI_FUNC int FilterNum(void) #else int FilterNum() #endif { filter_num++; return(filter_num); } /* * * FilterPath -- get the path through which we look for things * */ #ifdef ANSI_FUNC char * FilterPath(void) #else char *FilterPath() #endif { static char *filter_path=NULL; if( filter_path == NULL ){ filter_path = (char *)getenv("PATH"); } return(filter_path); } /* * * FilterOpen -- open a filter and initialize the symbol table * */ #ifdef ANSI_FUNC Filter FilterOpen(FITSHead header, char *string, char *mode) #else Filter FilterOpen(header, string, mode) FITSHead header; /* fitsy header struct */ char *string; /* filter string */ char *mode; /* "C", "f77", "awk", etc. */ #endif { int lexonly=0; int got=0; char *s, *t; char tbuf[SZ_LINE]; Filter filter; char *filtstr; /* return if we have no filter */ if( (string == NULL) || (*string == '\0') || !strcmp(string, "[]") || !strcmp(string, "\n") ) return(NOFILTER); /* more checks for an essentially blank string */ for(got=0, s=string; *s; s++){ if( (*s != ' ') && (*s != '\t') && (*s != '\n') && (*s != ';') ){ got++; break; } } if( !got ) return(NOFILTER); /* allocate a new filter record */ if( (filter = (Filter)xcalloc(1, sizeof(FilterRec))) == NULL ) return(NULL); /* this is the default filter handle for the parser */ default_filter = filter; /* clean up filter */ s = FilterClip(string); /* if its not a file, use string directly */ if( *s != '@' ){ t = xstrdup(s); } /* if it a FITS file, use string directly */ else if( IsFits(&(s[1])) ){ t = xstrdup(s); } /* replace ASCII file with contents, if possible */ else if( !(t = FileContents(&(s[1]), 0, NULL)) ){ t = xstrdup(s); } /* set the input filter string for the parser */ filter->string = FilterClip(t); if( s ) xfree(s); if( t ) xfree(t); /* return if we have no filter */ if( !filter->string || (*filter->string == '\0') ){ return(NOFILTER); } /* save mode */ filter->mode=xstrdup(mode); /* assume we will use an index */ #if HAVE_MINGW32==0 filter->doidx = 1; #else filter->doidx = 0; #endif /* process the mode string */ if( (s = xstrdup(filter->mode)) ){ /* set global convert flag */ if( keyword(s, "convert", tbuf, SZ_LINE) ) filter->convert = istrue(tbuf); /* set the event section */ if( keyword(s, "evsect", tbuf, SZ_LINE) ) filter->evsect = xstrdup(tbuf); if( keyword(s, "lexonly", tbuf, SZ_LINE) ) lexonly = 1; #if HAVE_MINGW32==0 if( keyword(s, "idx", tbuf, SZ_LINE) ){ if( istrue(tbuf) ) filter->doidx = 1; else if( isfalse(tbuf) ) filter->doidx = -1; } #endif } if( s ) xfree(s); /* determine which method of filter processing we will use: currently we support only the C method */ filter->method = DEFAULT_FILTER_METHOD; *tbuf = '\0'; if( (s=(char *)getenv("FILTER_METHOD")) ){ strcpy(tbuf, s); } if( !*tbuf && (s=xstrdup(filter->mode)) ){ keyword(s, "method", tbuf, SZ_LINE); if( s ) xfree(s); } if( *tbuf ){ if( !strcasecmp(tbuf, "c") ) filter->method = METHOD_C; } /* determine which type of filtering we do: event or image */ filter->type = DEFAULT_FILTER_TYPE; *tbuf = '\0'; if( (s=(char *)getenv("FILTER_TYPE")) ){ strcpy(tbuf, s); } if( !*tbuf && (s=xstrdup(filter->mode)) ){ keyword(s, "type", tbuf, SZ_LINE); if( s ) xfree(s); } if( *tbuf ){ if( !strncasecmp(tbuf, "ev", 2) ) filter->type = TYPE_EVENTS; else if( !strncasecmp(tbuf, "im", 2) ) filter->type = TYPE_IMAGE; } /* determine which type of process execution we do */ switch(filter->method){ case METHOD_C: filter->ptype = DEFAULT_FILTER_PTYPE; *tbuf = '\0'; if( (s=(char *)getenv("FILTER_PTYPE")) ){ strcpy(tbuf, s); } if( !*tbuf && (s=xstrdup(filter->mode)) ){ keyword(s, "ptype", tbuf, SZ_LINE); if( s ) xfree(s); } if( *tbuf ){ if( *tbuf == 'p' ) filter->ptype = PTYPE_PROCESS; else if( *tbuf == 'c' ) filter->ptype = PTYPE_CONTAINED; #ifdef USE_DL else if( *tbuf == 'd' ) filter->ptype = PTYPE_DYNAMIC; #endif } break; default: filter->ptype = PTYPE_PROCESS; break; } /* determine region paint mode */ *tbuf = '\0'; if( (s=(char *)getenv("FILTER_PAINT")) ){ strcpy(tbuf, s); } if( !*tbuf && (s=xstrdup(filter->mode)) ){ keyword(s, "paint", tbuf, SZ_LINE); if( s ) xfree(s); } if( !*tbuf ) strcpy(tbuf, DEFAULT_PAINT_MODE); if( *tbuf ){ if( istrue(tbuf) ) filter->paint = 1; else filter->paint = 0; } /* debugging mode */ *tbuf = '\0'; if( (s=(char *)getenv("FILTER_DEBUG")) ){ strcpy(tbuf, s); } if( !*tbuf && (s=xstrdup(filter->mode)) ){ keyword(s, "debug", tbuf, SZ_LINE); if( s ) xfree(s); } if( *tbuf ){ if( isdigit((int)*tbuf) ) filter->debug = atoi(tbuf); else if( istrue(tbuf) ) filter->debug = 1; else if( isfalse(tbuf) ) filter->debug = 0; } /* save the fits header */ filter->fhd = header; /* init the symbol table */ if( !FilterSymbolInit(filter) ) goto error; /* init parser variables */ FiltInitParser(); /* init regions */ FiltInitRegions(); /* set up to parse the input filter */ FiltScanString(filter->string); /* parse filter */ filtlex(); /* check for errors while parsing the string */ if( FilterParseError() ) goto error; /* make sure we have something to filter */ if( !(filtstr = (char *)_FilterString()) || !strcmp(filtstr, "()") ){ FilterClose(filter); return(NOFILTER); } /* imagemask processing of images does not use the compiled process */ if( filter->nmask && filter->masks && (filter->type == TYPE_IMAGE) ) goto done; /* for event filtering, we can use indexes */ #if HAVE_MINGW32==0 if( filter->type == TYPE_EVENTS ){ /* run index grammar and see if we can get help from indexes */ if( filter->doidx == 1 ){ if( !idxinitparser(filtstr) ){ filter->doidx = -1; } else{ idxparse(); idxfreeglobals(); if( !filter->idx || (filter->idx->type == IDX_INDEF) ){ if( filter->idx ){ idxendparser(); filter->idx = NULL; } filter->doidx = -1; } } } /* if we are using an index and we are only processing indexed columns, we don't need to use compiled filter */ if( FILTER_INDEX_ONLY(filter) ){ if( idx_debug ) fprintf(stderr, "idx: skipping compiled filter\n"); goto done; } } #endif /* lexonly means we only wanted to run the lexer */ if( lexonly ) goto done; /* open the program file that we will compile from the filter */ if( !FilterProgOpen(filter) ) goto error; /* prepend the to C program as needed */ if( !FilterProgPrepend(filter) ) goto error; /* write the symbols to the appropriate program */ if( !FilterProgWrite(filter) ) goto error; /* append the program body to C program */ if( !FilterProgAppend(filter) ) goto error; /* that is all we need to output */ if( !FilterProgClose(filter) ) goto error; /* compile the filter program */ if( !FilterProgCompile(filter) ) goto error; if( filter->debug >= 2 ) goto done; switch(filter->method){ case METHOD_C: switch(filter->ptype){ case PTYPE_PROCESS: case PTYPE_CONTAINED: switch(filter->pipeos){ case PIPE_WIN32: #if HAVE_CYGWIN||HAVE_MINGW32 if( !WinProcessOpen(filter->prog, &(filter->ihandle), &(filter->ohandle), &(filter->process)) ) goto error; #else gerror(stderr, "internal error: no WinProcess without Windows"); goto error; #endif break; default: if( !ProcessOpen(filter->prog, &(filter->ichan), &(filter->ochan), &(filter->pid)) ) goto error; break; } break; #ifdef USE_DL case PTYPE_DYNAMIC: if( !(filter->dl=DLOpen(filter->prog)) ) goto error; break; #endif default: goto error; } break; default: goto error; } /* return the good news */ done: return(filter); error: FilterClose(filter); return(NULL); } /* * * FilterEvents -- filter events by sending them to a co-process, * which returns a char array of good event flags * */ #ifdef ANSI_FUNC int FilterEvents(Filter filter, char *ebuf, int esize, int n, int *vbuf) #else int FilterEvents(filter, ebuf, esize, n, vbuf) Filter filter; char *ebuf; int esize; int n; int *vbuf; #endif { int i; int flag; int get, got; int bytes; char *eptr; char *etop; char *obuf; char *optr; #ifdef USE_DL FilterTableCall evrtn; #endif FilterSymbols sp; /* make sure we have a valid filter and a valid table */ if( !filter || (filter == NOFILTER) || !filter->fhd || !filter->fhd->table ) return(0); /* handle fits image mask specially */ if( filter->nmask && filter->masks && !filter->evsect ){ gerror(stderr, "event filtering cannot use image masks\n"); return(0); } /* if the index is enough, just return */ if( FILTER_INDEX_ONLY(filter) ) return 0; /* we only send the necessary parts of each event record */ if( (obuf = (char *)xcalloc(n*filter->evsize, sizeof(char))) == NULL ) return(0); optr = obuf; /* extract (and convert) the necessary columns of the event */ for(eptr=ebuf, etop=ebuf+(n*esize); eptrnsyms; i++){ sp = &(filter->symtab[i]); /* skip accidentally empty ones */ if( (sp->name == NULL) || (*sp->name == '\0') ) continue; /* process this type of symbol */ switch(sp->type){ case SYM_COL: if( filter->fhd->table->col[sp->idx].type == 'X' ){ ColumnLoad(eptr+filter->fhd->table->col[sp->idx].offset, filter->fhd->table->col[sp->idx].size, (filter->fhd->table->col[sp->idx].n+7)/8, filter->convert, optr+sp->offset); } else{ ColumnLoad(eptr+filter->fhd->table->col[sp->idx].offset, filter->fhd->table->col[sp->idx].size, filter->fhd->table->col[sp->idx].n, filter->convert, optr+sp->offset); } break; default: break; } } /* bump to next output record */ optr += filter->evsize; } switch(filter->ptype){ case PTYPE_PROCESS: case PTYPE_CONTAINED: switch(filter->pipeos){ case PIPE_WIN32: #if HAVE_CYGWIN||HAVE_MINGW32 /* write events to the filter process */ bytes = n*filter->evsize; if((got=WinProcessWrite(filter->ohandle, obuf, bytes)) != bytes){ gerror(stderr, "event filter failed: wanted to write %d bytes but wrote %d\n", bytes, got); flag = -1; } /* read back result flags */ get = n * sizeof(unsigned int); WinProcessRead(filter->ihandle, vbuf, get, &got); #else gerror(stderr, "internal error: no WinProcess without Windows"); flag = -1; #endif break; default: /* write events to the filter process */ bytes = n*filter->evsize; if((got=ProcessWrite(filter->ochan, obuf, bytes)) != bytes){ gerror(stderr, "event filter failed: wanted to write %d bytes but wrote %d\n", bytes, got); flag = -1; } /* read back result flags */ get = n * sizeof(unsigned int); ProcessRead(filter->ichan, vbuf, get, &got); break; } /* we need one int back for each event we wrote */ if( get == got ){ flag = 1; } else{ gerror(stderr, "event filter failed: wanted to read %d bytes but got %d\n", get, got); flag = -1; } break; #ifdef USE_DL case PTYPE_DYNAMIC: if( (evrtn=(FilterTableCall)DLSym(filter->dl, filter->pname)) ){ filter->g = (*evrtn)(filter->g, obuf, n, filter->evsize, vbuf); flag = 1; } else{ flag = -1; } break; #endif default: flag = -1; break; } /* free up malloc'ed space */ if( obuf ) xfree(obuf); /* return the news */ return flag; } /* * * FilterImage -- filter image by sending sections to a co-process, * which returns segments of valid image data * */ #ifdef ANSI_FUNC int FilterImage(Filter filter, int x0, int x1, int y0, int y1, int block, FilterMask *masks, int *nreg) #else int FilterImage(filter, x0, x1, y0, y1, block, masks, nreg) Filter filter; int x0, x1, y0, y1, block; FilterMask *masks; int *nreg; #endif { int i, j; int got; int fsize; int mblock; char tbuf[SZ_LINE]; FilterMask xmasks; #ifdef USE_DL FilterImageCall imrtn; #endif /* make sure we have a valid filter */ if( !filter || (filter == NOFILTER) ) return(0); /* handle fits image mask specially */ if( filter->nmask && filter->masks ){ mblock = (int)(((double)((x1 - x0 + 1)/block)/(double)ft_naxis(filter->maskhd, 1)) + 0.5); if( mblock < 1 ){ gerror(stderr, "image mask cannot be larger than blocked image section"); return(0); } /* copy mask records into return buffer */ fsize = filter->nmask * sizeof(FilterMaskRec) * mblock; xmasks = xmalloc(fsize); /* copy all masks and translate x,y positions as needed */ for(got=0, i=0; inmask; i++){ xmasks[got].region = filter->masks[i].region; xmasks[got].y = (filter->masks[i].y - 1.0) * mblock + 1.0; xmasks[got].xstart = (filter->masks[i].xstart - 1.0) * mblock + 1.0; xmasks[got].xstop = (filter->masks[i].xstop - 1.0) * mblock + 1.0; /* replicate the segment up to the block factor */ for(j=1; jnmaskreg; return(got); } /* if the index is enough, just return */ if( FILTER_INDEX_ONLY(filter) ) return(0); switch(filter->ptype){ case PTYPE_PROCESS: case PTYPE_CONTAINED: switch(filter->pipeos){ case PIPE_WIN32: #if HAVE_CYGWIN||HAVE_MINGW32 /* write command to process */ snprintf(tbuf, SZ_LINE-1, "%d %d %d %d %d\n", x0, x1, y0, y1, block); WinProcessWrite(filter->ohandle, tbuf, (int)strlen(tbuf)); /* read back mask records */ *masks = WinProcessRead(filter->ihandle, NULL, -1, &got); got /= sizeof(FilterMaskRec); #else gerror(stderr, "internal error: no WinProcess without Windows"); return(-1); #endif break; default: /* write command to process */ snprintf(tbuf, SZ_LINE-1, "%d %d %d %d %d\n", x0, x1, y0, y1, block); ProcessWrite(filter->ochan, tbuf, (int)strlen(tbuf)); /* read back mask records */ *masks = ProcessRead(filter->ichan, NULL, -1, &got); got /= sizeof(FilterMaskRec); break; } break; #ifdef USE_DL case PTYPE_DYNAMIC: if( (imrtn=(FilterImageCall)DLSym(filter->dl, filter->pname)) ){ *masks = (*imrtn)(x0, x1, y0, y1, block, &got); } else return(-1); break; #endif default: return(-1); } /* how many separate regions? */ if( nreg ) *nreg = FilterRegionCount(TOK_IREG); /* return the news */ return(got); } /* * * FilterClose -- close a filter and free up memory * */ #ifdef ANSI_FUNC int FilterClose(Filter filter) #else int FilterClose(filter) Filter filter; #endif { int status=0; int i, j; Scan scan, tscan; if( !filter || (filter == NOFILTER) ) return(0); /* this is the default filter handle */ default_filter = filter; switch(filter->ptype){ case PTYPE_PROCESS: case PTYPE_CONTAINED: /* close the filter process */ switch(filter->pipeos){ case PIPE_WIN32: #if HAVE_CYGWIN||HAVE_MINGW32 if( filter->process ) WinProcessClose(filter->process, &status); #else gerror(stderr, "internal error: no WinProcess without Windows"); #endif break; default: if( filter->pid > 0 ) ProcessClose(filter->pid, &status); break; } /* delete program */ if( filter->prog ) unlink(filter->prog); break; #ifdef USE_DL case PTYPE_DYNAMIC: if( filter->dl ) DLClose(filter->dl); break; #endif default: break; } /* call any method-specific cleanup routines */ FilterProgClose(filter); FilterProgEnd(filter); /* free alloc'ed memory */ FilterSymbolFree(filter); if( filter->pname ) xfree(filter->pname); if( filter->mode ) xfree(filter->mode); if( filter->masks ) xfree(filter->masks); if( filter->cc ) xfree(filter->cc); if( filter->cflags ) xfree(filter->cflags); if( filter->objs ) xfree(filter->objs); if( filter->extra ) xfree(filter->extra); if( filter->shflags ) xfree(filter->shflags); if( filter->code ) xfree(filter->code); if( filter->prog ) xfree(filter->prog); if( filter->string ) xfree(filter->string); if( filter->xbin ) xfree(filter->xbin); if( filter->ybin ) xfree(filter->ybin); if( filter->symtab ) xfree(filter->symtab); if( filter->evsect ) xfree(filter->evsect); if( filter->maskhd ) ft_headfree(filter->maskhd, 1); /* free region information */ if( filter->g ){ for(i=0; ig->maxshapes; i++){ if( filter->g->shapes[i].scanlist ){ for(j=0; j<=filter->g->y1; j++){ if( filter->g->shapes[i].scanlist[j] ){ for(scan=filter->g->shapes[i].scanlist[j]; scan; ){ tscan = scan->next; xfree(scan); scan = tscan; } } } xfree(filter->g->shapes[i].scanlist); } if( filter->g->shapes[i].pts ) xfree(filter->g->shapes[i].pts); if( filter->g->shapes[i].xv ) xfree(filter->g->shapes[i].xv); } if( filter->g->shapes ) xfree(filter->g->shapes); if( filter->g->ybuf ) xfree(filter->g->ybuf); if( filter->g->x0s ) xfree(filter->g->x0s); if( filter->g->x1s ) xfree(filter->g->x1s); if( filter->g->masks ) xfree(filter->g->masks); if( filter->g ) xfree(filter->g); } /* free index information */ #if HAVE_MINGW32==0 idxendparser(); #endif /* free main struct */ xfree(filter); /* return the status from closing the sub-process */ return(status); } /* * * FilterConcats -- concat n filters, removing enclosing brackets as necessary * */ #ifdef ANSI_FUNC char * FilterConcats(char **filters, int n) #else char *FilterConcats(filters, n) char **filters; int n; #endif { char *ofilter; char *optr; char *clip; int i; int len; /* need at least 1 string */ if( n == 0 ) return(NULL); /* get max length of output filter */ for(len=0, i=0; istring; } funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/filter/filter.h000066400000000000000000000227171256243640000234320ustar00rootroot00000000000000/* * Copyright (c) 1999-2003 Smithsonian Astrophysical Observatory */ /* * * filter.h - include file for "compile on the fly" filters * */ #ifndef __filter_h #define __filter_h #if HAVE_CONFIG_H #include "conf.h" #endif /* avoid use of system -- its not secure */ /* but funtools cannot use launch for the MinGW platform because the stdfiles support is missing in the launch_spawnvp() implementation of launch */ #ifndef USE_LAUNCH #define USE_LAUNCH 1 #endif #if HAVE_MINGW32 #undef USE_LAUNCH #endif #include #include #ifdef HAVE_UNISTD_H #include #endif #ifdef HAVE_STRING_H #include #endif #include #include "prsetup.h" #include "gio.h" #include "file.h" #include "find.h" #include "macro.h" #include "word.h" #include "xalloc.h" #include "strtod.h" #define USE_XFILEIO 1 #include "fitsy.h" #undef USE_XFILEIO #include "idx.h" #include "wcs.h" #include "column.h" #include "tl.h" #include "dl.h" #include "mkrtemp.h" #include "zprocess.h" #include "winprocess.h" #include "parse.h" #ifdef USE_LAUNCH #include "xlaunch.h" #endif #ifndef OBJPATH #define OBJPATH "." #endif #ifndef FILTER_CC #define FILTER_CC NULL #endif #ifndef FILTER_CFLAGS #define FILTER_CFLAGS NULL #endif /* define methods of program generation */ #define METHOD_C 1 /* define types of filtering */ #define TYPE_EVENTS 1 #define TYPE_IMAGE 2 /* define types of filtering process -- separate process, self-contained separate process, or dynamic load (if defined) */ #define PTYPE_PROCESS 1 #define PTYPE_CONTAINED 2 #define PTYPE_DYNAMIC 3 /* define how we connect the processes -- unix or windows pipes */ #define PIPE_UNIX 0 #define PIPE_WIN32 1 /* defaults which can be overridden by environment variables */ #define DEFAULT_FILTER_METHOD METHOD_C #define DEFAULT_FILTER_TYPE TYPE_EVENTS #ifdef USE_DL #define DEFAULT_FILTER_PTYPE PTYPE_DYNAMIC #else #define DEFAULT_FILTER_PTYPE PTYPE_PROCESS #endif #define DEFAULT_PAINT_MODE "false" #define DEFAULT_FILTER_TMPDIR "/tmp" /* define type of important tokens */ #define TOK_EREG 1 #define TOK_NREG 2 #define TOK_IREG 4 #define TOK_RLIST 8 #define TOK_RTINE 16 #define TOK_NAME 32 #define TOK_ACCEL 64 #define TOK_VARARGS 128 #define TOK_REG (TOK_EREG|TOK_NREG|TOK_IREG) /* default cordinate system for regions */ #define DEFAULT_COORDSYS "physical" /* if we have gcc, we can use dynamic loading instead of a separate process */ #define GCC_SHARED_FLAGS "-g -fPIC -shared" /* places to look for the compiler other than user's path */ #define CC_PATH "/opt/SUNWspro/bin:/bin:/usr/bin:/usr/local/bin/:/opt/local/bin:" /* define non-WCS coordinate systems we handle specially */ #define LCX_IMAGE 1 #define LCX_PHYS 2 #define LCX_AMP 3 #define LCX_DET 4 /* define symbol types in symbol table */ #define SYM_COL 1 #define SYM_PAR 2 /* whether we use only the index and not the compiled filter */ #define FILTER_INDEX_ONLY(f) \ ((f->doidx==1)&&(f->idx)&&(f->idx->dofilt==0)&&(f->idx->rtype!=IDX_INDEF)) typedef struct filtmask { int region; int y; int xstart, xstop; } *FilterMask, FilterMaskRec; typedef struct scanrec{ struct scanrec *next; int x; } *Scan, ScanRec; /* structs for use with region routines */ typedef struct shaperec { int init; double ystart, ystop; Scan *scanlist; /* varargs */ int nv; double *xv; /* circle, annulus */ double r1sq, r2sq; /* ellipse */ double angl, sinangl, cosangl; double cossq, sinsq; double xradsq, yradsq; double a; /* polygon-style shapes */ int npt; double *pts; /* line */ int xonly; double x1, x2, y1; double invslope; } *Shape, ShapeRec; typedef struct gfiltrec { int nshapes; /* number of shapes */ int maxshapes; /* number of shape records we allocate */ Shape shapes; /* array holding range limits for one shape */ int rid; /* first valid region for current pixel */ int usebinsiz; /* whether bindizx,binsizy are used */ char *evsect; /* value of event section */ double tlminx, tlminy; /* tlmin for event section */ double binsizx, binsizy; /* bin sizes for event section */ double tloff; /* offset for quick p2i conversion */ int xmin, xmax, ymin, ymax; /* section limits in original image coords */ int block; /* block factor */ int x0, x1, y0, y1; /* section limits in section coords */ int *ybuf; /* valid y row flags */ int *x0s; /* valid x start values */ int *x1s; /* valid x stop values */ int nmask; /* number of image mask record */ int maskdim; /* size of mask image */ FilterMask masks; /* mask records */ } *GFilt, GFiltRec; typedef struct filtseg { int n; int type; int ops; int len; int flag; int nregion; char *s; int s0; char *regions; int nr; char *shapes; int ns; int regval; char *radang; int ralen; } *FiltSeg, FiltSegRec; /* structs for use with symbol table routines */ typedef struct filtsymtab { int type; char *name; char *value; int idx; int offset; FITSCard card; } *FilterSymbols, FilterSymRec; typedef struct filtrec { /* general information */ char *mode; char *evsect; int method; int type; int paint; int debug; /* the input filter string */ char *string; int size; /* fits info */ FITSHead fhd; int convert; char *xbin; char *ybin; /* compiled program info */ char *code; char *prog; FILE *fp; /* symbol table info */ int maxsyms; int nsyms; int evsize; FilterSymbols symtab; /* method info */ char *cc; char *cflags; char *objs; char *extra; char *shflags; /* process info */ char *pname; int ptype; /* which type of pipe? */ int pipeos; /* used by unix pipe */ int pid; int ichan; int ochan; /* used by Windows pipe */ void *process; void *ihandle; void *ohandle; /* used for dynamic linking */ void *dl; GFilt g; /* loadable drivers for each technique */ /* NB: can't use typdef because we refer to this struct */ int (*filt_start) _PRx((struct filtrec *filter)); int (*filt_open) _PRx((struct filtrec *filter)); int (*filt_prepend) _PRx((struct filtrec *filter)); int (*filt_write) _PRx((struct filtrec *filter)); int (*filt_append) _PRx((struct filtrec *filter)); int (*filt_close) _PRx((struct filtrec *filter)); int (*filt_compile) _PRx((struct filtrec *filter)); int (*filt_end) _PRx((struct filtrec *filter)); char *(*filt_name) _PRx((struct filtrec *filter, char *name)); char *(*filt_routine1) _PRx((struct filtrec *filter, char *name)); char *(*filt_routine2) _PRx((struct filtrec *filter, char *name)); char *(*filt_region1) _PRx((struct filtrec *filter, char *name)); char *(*filt_region2) _PRx((struct filtrec *filter, char *name)); /* fits image mask info */ int nmask; int nmaskreg; FilterMask masks; FITSHead maskhd; /* indexing information */ int doidx; idxvalrec *valhead; idxrowrec *rowhead; idxrowrec *idx; } *Filter, FilterRec; typedef void *(*FilterTableCall)( #ifdef ANSI_FUNC void *tg, char *ebuf, int ne, int esize, int *rbuf #endif ); typedef FilterMask (*FilterImageCall)( #ifdef ANSI_FUNC int txmin, int txmax, int tymin, int tymax, int tblock, int *got #endif ); /* this makes it look like a simple flag */ #define NOFILTER FilterNull() _PRbeg /* filter.c */ int FilterNum _PRx((void)); char *FilterClip _PRx((char *filter)); Filter FilterDefault _PRx((void)); Filter FilterNull _PRx((void)); char *FilterPath _PRx((void)); Filter FilterOpen _PRx((FITSHead header, char *filter, char *mode)); int FilterEvents _PRx((Filter filter, char *ebuf, int esize, int n, int *vbuf)); int FilterImage _PRx((Filter filter, int x0, int x1, int y0, int y1, int block, FilterMask *masks, int *nreg)); int FilterClose _PRx((Filter filter)); char *FilterConcats _PRx((char **filters, int n)); char *FilterConcat _PRx((char *f1, char *f2, char *op)); char *FilterString _PRx((Filter filter)); /* symbols.c */ int FilterSymbolInit _PRx((Filter filter)); char *FilterSymbolEnter _PRx((Filter filter, char *s, int *got)); FilterSymbols FilterSymbolLookup _PRx((Filter filter, char *s)); int FilterSymbolDefaults _PRx((Filter filter, int enter)); void FilterSymbolFree _PRx((Filter filter)); /* filt.l */ char *_FilterString _PRx((void)); void FiltInitParser _PRx((void)); void FiltScanString _PRx((char *s)); int FilterRoutineCount _PRx((void)); int FilterShapeCount _PRx((void)); int FilterRegionCount _PRx((int type)); int FilterParseError _PRx((void)); int FilterTlInfo _PRx((double *tlmins, double *binsizs, int *tltyps)); char *FilterRadAng _PRx((void)); int filterror _PRx((char *msg)); int filtlex _PRx((void)); int filtwrap _PRx((void)); int filtparse _PRx((void)); /* filtprog.c */ int FilterProgStart _PRx((Filter filter)); int FilterProgOpen _PRx((Filter filter)); int FilterProgPrepend _PRx((Filter filter)); int FilterProgWrite _PRx((Filter filter)); int FilterProgAppend _PRx((Filter filter)); int FilterProgClose _PRx((Filter filter)); int FilterProgCompile _PRx((Filter filter)); int FilterProgEnd _PRx((Filter filter)); char *FilterLexName _PRx((Filter filter, char *name)); char *FilterLexRoutine1 _PRx((Filter filter, char *name)); char *FilterLexRoutine2 _PRx((Filter filter, char *name)); char *FilterLexRegion1 _PRx((Filter filter, char *name)); char *FilterLexRegion2 _PRx((Filter filter, char *name)); /* filtprog_c.c */ int FilterProgLoad_C _PRx((Filter filter)); /* evregions.c */ void initevregions _PRx((void)); /* imregions.c */ void initimregions _PRx((void)); _PRend /* for compatibility with funtools */ #define FilterTable FilterEvents #endif /* __filter.h */ funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/filter/filter_pyh.py000066400000000000000000000027421256243640000245070ustar00rootroot00000000000000# from regions.h -- no idea what it is ... xsno=3 # ... but its important! maxshapes=(nshape*(xsno+1))+1 # ctypes struct definitions (taken from filter.h) class filtmask(Structure): _fields_ = [('region', c_int), ('y', c_int), ('xstart', c_int), ('xstop', c_int)] class scanrec(Structure): pass # this is how you add a forward pointer scanrec._fields_ = [ ('next', POINTER(scanrec)), ('x', c_int) ] class shaperec(Structure): _fields_ = [ ('init', c_int), ('ystart', c_double), ('ystop', c_double), ('scanlist', c_void_p), ('nv', c_int), ('xv', c_void_p), ('r1sq', c_double), ('r2sq', c_double), ('angl', c_double), ('sinangl', c_double), ('cosangl', c_double), ('cossq', c_double), ('sinsq', c_double), ('xradsq', c_double), ('yradsq', c_double), ('a', c_double), ('npt', c_int), ('pts', c_void_p), ('xonly', c_int), ('x1', c_double), ('x2', c_double), ('y1', c_double), ('invslope', c_double)] class gfiltrec(Structure): _fields_ = [('nshapes', c_int), ('maxshapes', c_int), ('shapes', POINTER(shaperec * maxshapes)), ('rid', c_int), ('usebinsiz', c_int), ('evsect', c_char_p), ('tlminx', c_double), ('tlminy', c_double), ('binsizx', c_double), ('binsizy', c_double), ('tloff', c_double), ('xmin', c_int), ('xmax', c_int), ('ymin', c_int), ('ymax', c_int), ('block', c_int), ('x0', c_int), ('x1', c_int), ('y0', c_int), ('y1', c_int), ('ybuf', POINTER(c_int)), ('x0s', POINTER(c_int)), ('x1s', POINTER(c_int)), ('nmask', c_int), ('maskdim', c_int), ('masks', POINTER(filtmask))] funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/filter/filtprog.c000066400000000000000000000140551256243640000237620ustar00rootroot00000000000000/* * Copyright (c) 1999-2003 Smithsonian Astrophysical Observatory */ /* * * filtprog.c -- hi level support for filters using different techniques * */ #include /* * * FilterProgStart -- start the filtering process * */ #ifdef ANSI_FUNC int FilterProgStart (Filter filter) #else int FilterProgStart(filter) Filter filter; #endif { /* make sure we have something to play with */ if( filter == NULL) return(0); /* call the technique-specific routine */ if( filter->filt_start ) return((filter->filt_start)(filter)); else{ return(0); } } /* * * FilterProgOpen -- return filter program as a file for writing * */ #ifdef ANSI_FUNC int FilterProgOpen (Filter filter) #else int FilterProgOpen(filter) Filter filter; #endif { /* make sure we have something to play with */ if( filter == NULL) return(0); /* check the mode for known techniques and load drivers */ switch( filter->method ){ case METHOD_C: FilterProgLoad_C(filter); break; default: gerror(stderr, "unknown filter technique: %d\n", filter->method); return(0); } /* call the technique-specific routine */ if( filter->filt_open ){ return((filter->filt_open)(filter)); } else{ return(1); } } /* * * FilterProgPrepend -- prepend to the filter * */ #ifdef ANSI_FUNC int FilterProgPrepend (Filter filter) #else int FilterProgPrepend(filter) Filter filter; #endif { /* make sure we have something to play with */ if( filter == NULL) return(0); /* call the technique-specific routine */ if( filter->filt_prepend ) return((filter->filt_prepend)(filter)); else return(1); } /* * * FilterProgWrite -- write the symbols * */ #ifdef ANSI_FUNC int FilterProgWrite (Filter filter) #else int FilterProgWrite(filter) Filter filter; #endif { /* make sure we have something to play with */ if( filter == NULL) return(0); /* call the technique-specific routine */ if( filter->filt_write ) return((filter->filt_write)(filter)); else return(1); } /* * * FilterProgAppend -- append the filter program body * */ #ifdef ANSI_FUNC int FilterProgAppend (Filter filter) #else int FilterProgAppend(filter) Filter filter; #endif { /* make sure we have something to play with */ if( filter == NULL) return(0); /* call the technique-specific routine */ if( filter->filt_append ) return((filter->filt_append)(filter)); else return(1); } /* * * FilterProgClose -- close the filter program file * */ #ifdef ANSI_FUNC int FilterProgClose (Filter filter) #else int FilterProgClose(filter) Filter filter; #endif { /* make sure we have something to play with */ if( filter == NULL) return(0); /* debugging only */ if( filter->debug >= 2 ) return(1); /* call the technique-specific routine */ if( filter->filt_close ) return((filter->filt_close)(filter)); else return(1); } /* * * FilterProgCompile -- compile the filter program * */ #ifdef ANSI_FUNC int FilterProgCompile (Filter filter) #else int FilterProgCompile(filter) Filter filter; #endif { /* make sure we have something to play with */ if( filter == NULL) return(0); /* debugging only */ if( filter->debug >= 2 ) return(1); /* call the technique-specific routine */ if( filter->filt_compile ) return((filter->filt_compile)(filter)); else return(1); } /* * * FilterProgEnd -- end the filtering process * */ #ifdef ANSI_FUNC int FilterProgEnd (Filter filter) #else int FilterProgEnd(filter) Filter filter; #endif { /* make sure we have something to play with */ if( filter == NULL) return(0); /* call the technique-specific routine */ if( filter->filt_end ) return((filter->filt_end)(filter)); else{ return(0); } } /* * * FilterLexName -- return the "in-expression" name * */ #ifdef ANSI_FUNC char * FilterLexName (Filter filter, char *name) #else char *FilterLexName(filter, name) Filter filter; char *name; #endif { /* make sure we have something to play with */ if( filter == NULL) return(name); /* call the technique-specific routine */ if( filter->filt_name ) return((filter->filt_name)(filter, name)); else return(name); } /* * * FilterLexRoutine1 -- return the beginning of the routine string * */ #ifdef ANSI_FUNC char * FilterLexRoutine1 (Filter filter, char *name) #else char *FilterLexRoutine1(filter, name) Filter filter; char *name; #endif { /* make sure we have something to play with */ if( filter == NULL) return(NULL); /* call the technique-specific routine */ if( filter->filt_routine1 ) return((filter->filt_routine1)(filter, name)); else return(name); } /* * * FilterLexRoutine2 -- return the beginning of the routine string * */ #ifdef ANSI_FUNC char * FilterLexRoutine2 (Filter filter, char *name) #else char *FilterLexRoutine2(filter, name) Filter filter; char *name; #endif { /* make sure we have something to play with */ if( filter == NULL) return(NULL); /* call the technique-specific routine */ if( filter->filt_routine2 ) return((filter->filt_routine2)(filter, name)); else return(name); } /* * * FilterLexRegion1 -- return the beginning of the region string * */ #ifdef ANSI_FUNC char * FilterLexRegion1 (Filter filter, char *name) #else char *FilterLexRegion1(filter, name) Filter filter; char *name; #endif { /* make sure we have something to play with */ if( filter == NULL) return(NULL); /* call the technique-specific region */ if( filter->filt_region1 ) return((filter->filt_region1)(filter, name)); else return(name); } /* * * FilterLexRegion2 -- return the end of the region string * */ #ifdef ANSI_FUNC char * FilterLexRegion2 (Filter filter, char *name) #else char *FilterLexRegion2(filter, name) Filter filter; char *name; #endif { /* make sure we have something to play with */ if( filter == NULL) return(NULL); /* call the technique-specific region */ if( filter->filt_region2 ) return((filter->filt_region2)(filter, name)); else return(name); } funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/filter/filtprog_c.c000066400000000000000000000613441256243640000242670ustar00rootroot00000000000000/* * Copyright (c) 1999-2003 Smithsonian Astrophysical Observatory */ /* * * filtprog_c.c -- support for filters using the C compiler * */ #include #include #include #include #include #include #include #include #include /* * * Private Routines * */ #ifdef ANSI_FUNC static char * GetType(int t) #else static char *GetType(t) int t; #endif { switch(t){ case 'A': return("char"); case 'B': return("unsigned char"); case 'I': return("short"); case 'U': return("unsigned short"); case 'J': return("int"); case 'V': return("unsigned int"); case 'K': return("long long"); case 'E': return("float"); case 'D': return("double"); case 'X': return("char"); case 'L': return("char"); default: return("char"); } } #ifdef ANSI_FUNC static double GetTloff(int t) #else static double GetTloff(t) int t; #endif { switch(t){ case 'B': case 'I': case 'U': case 'J': case 'V': case 'K': case 'X': return 1.0; case 'E': case 'D': return 0.5; default: return 1.0; } } #ifdef ANSI_FUNC static char * _FilterInitString(char *filtstr) #else static char *_FilterInitString(filtstr) char *filtstr; #endif { char *ibuf, *iptr, *fptr; char *s, *t; int paren=0; ibuf = xcalloc(strlen(filtstr)*10, sizeof(char)); /* make sure we have at least one shape */ if( !FilterShapeCount() ) return ibuf; iptr = ibuf; fptr = filtstr; while( *fptr ){ /* look for beginning of region routine */ if( !(s=strstr(fptr, "im")) && !(s=strstr(fptr, "ev")) ) break; t = s+2; if( !*t ) break; /* which is followed by a region and open paren */ if( strncmp(t, "annulus(", 8) && strncmp(t, "box(", 4) && strncmp(t, "circle(", 7) && strncmp(t, "ellipse(", 8) && strncmp(t, "line(", 5) && strncmp(t, "panda(", 6) && strncmp(t, "bpanda(", 7) && strncmp(t, "cpanda(", 7) && strncmp(t, "epanda(", 7) && strncmp(t, "pie(", 4) && strncmp(t, "qtpie(", 6) && strncmp(t, "point(", 6) && strncmp(t, "nannulus(", 9) && strncmp(t, "nbox(", 5) && strncmp(t, "ncircle(", 8) && strncmp(t, "nellipse(", 9) && strncmp(t, "npie(", 5) && strncmp(t, "vannulus(", 9) && strncmp(t, "vbox(", 5) && strncmp(t, "vcircle(", 8) && strncmp(t, "vellipse(", 9) && strncmp(t, "vpie(", 5) && strncmp(t, "vpoint(", 7) && strncmp(t, "polygon(", 8) && strncmp(t, "field(", 6) && strncmp(t, "imagemask(", 10) ){ fptr = t; continue; } /* copy region name up to open paren */ for(fptr=s; *fptr && *fptr!='('; fptr++){ *iptr++ = *fptr; } /* append init suffix */ *iptr++ = 'i'; /* copy the paren */ if( *fptr == '(' ){ *iptr++ = *fptr++; paren++; } /* copy til end of region, i.e., when paren goes to 0 */ while( *fptr && paren ){ if( *fptr == '(' ) paren++; if( *fptr == ')' ) paren--; *iptr++ = *fptr++; } /* copy ';' */ *iptr++ = ';'; } return(ibuf); } /* * * FilterProgOpen_C -- return filter program as a file for writing * */ #ifdef ANSI_FUNC static int FilterProgOpen_C (Filter filter) #else static int FilterProgOpen_C(filter) Filter filter; #endif { int fd; char *ccstr=NULL; char prefix[SZ_LINE]; char tbuf[SZ_LINE]; char *tmpdir=NULL; #if HAVE_CYGWIN char *s; #endif /* make sure we have something to work with */ if( !filter ) return(0); /* see if the user specified a compiler explicitly */ if( !(ccstr = getenv("FILTER_CC")) && !(ccstr = getenv("CC")) && !(ccstr = FILTER_CC) ){ ccstr = "gcc"; } /* make sure we have a compiler */ if( !(filter->cc = Access(ccstr, "x")) && !(filter->cc = Find(ccstr, "x", NULL, FilterPath())) && !(filter->cc = Find("gcc", "x", NULL, FilterPath())) && !(filter->cc = Find("cc", "x", NULL, FilterPath())) && !(filter->cc = Find("cc", "x", NULL, ".")) && !(filter->cc = Find("cc", "x", NULL, CC_PATH)) ){ gerror(stderr, "no compiler found for filter compilation\n"); return(0); } /* determine whether communication is via Unix pipes or Win32 pipes */ filter->pipeos = PIPE_UNIX; #if HAVE_MINGW32 filter->pipeos = PIPE_WIN32; #endif #if HAVE_CYGWIN if( (s=strrchr(filter->cc, '/')) ){ s++; } else if( (s=strrchr(filter->cc, '\\')) ){ s++; } else { s = filter->cc; } if( !strcasecmp(s, "tcc") || !strcasecmp(s, "tcc.exe") || !strcasecmp(s, "pcc") || !strcasecmp(s, "pcc.exe") ){ filter->pipeos = PIPE_WIN32; } #endif /* final check on ptype: if we wanted dynamic but had no gcc, use process */ if( (filter->ptype == PTYPE_DYNAMIC) && !strstr(filter->cc, "gcc") ) filter->ptype = PTYPE_PROCESS; /* get default file names */ snprintf(tbuf, SZ_LINE, "$FILTER_OBJDIR:$FILTER_LIBDIR:%s:$HOME/.funtools:$SAORD_ROOT/lib:/usr/lib:/usr/local/lib:/opt/local/lib", OBJPATH); switch( filter->type ){ case TYPE_EVENTS: /* normally, we filter events analytically */ if( !filter->evsect ) /* filter->objs = Find("evregions.o", "r", NULL, tbuf); */ filter->objs = Find("libfuntools.a", "r", NULL, tbuf); /* if evsect=xxx is specified, we filter by image pixels */ else /* filter->objs = Find("imregions.o", "r", NULL, tbuf); */ filter->objs = Find("libfuntools.a", "r", NULL, tbuf); break; case TYPE_IMAGE: /* image are filtered by image pixels */ /* filter->objs = Find("imregions.o", "r", NULL, tbuf); */ filter->objs = Find("libfuntools.a", "r", NULL, tbuf); break; } /* if we wanted to a process, but have no objects, use self-contained */ if( (filter->ptype == PTYPE_PROCESS) && !filter->objs ) filter->ptype = PTYPE_CONTAINED; /* allow extra stuff on the command line */ if( !(filter->cflags = xstrdup(getenv("FILTER_CFLAGS"))) && !(filter->cflags = xstrdup(FILTER_CFLAGS)) ) filter->cflags = xstrdup(" "); if( !(filter->extra = xstrdup(getenv("FILTER_EXTRA"))) ) filter->extra = xstrdup(" "); /* set shared switches for gcc */ if( strstr(filter->cc, "gcc") ) filter->shflags = xstrdup(GCC_SHARED_FLAGS); /* get prefix for filter source and program */ if( !(tmpdir = (char *)getenv("FILTER_TMPDIR")) && !(tmpdir = (char *)getenv("TMPDIR")) && !(tmpdir = (char *)getenv("TMP")) ) tmpdir = DEFAULT_FILTER_TMPDIR; if( !*tmpdir ) tmpdir = "."; #if HAVE_MINGW32 snprintf(prefix, SZ_LINE, "%s\\f", tmpdir); #else snprintf(prefix, SZ_LINE, "%s/f", tmpdir); #endif /* make up the routine name when we dynamically load */ snprintf(tbuf, SZ_LINE, "Filter%d%d", (int)getpid(), FilterNum()); filter->pname = xstrdup(tbuf); /* make up name of C source file we will generate */ if( filter->debug >= 2 ){ filter->fp = stdout; return(1); } else{ if( (fd=mkrtemp(prefix, ".c", tbuf, SZ_LINE, 1)) < 0 ){ gerror(stderr, "could not generate C filter source name: %s\n", prefix); return(0); } filter->code = xstrdup(tbuf); if( !(filter->fp = fdopen(fd, "w+b")) ){ gerror(stderr, "could not open C filter source file: %s\n", tbuf); return(0); } } /* make up the name of the program we will compile into. we make this different from the .c file name to make interception by an intruder harder */ if( mkrtemp(prefix, NULL, tbuf, SZ_LINE, 0) < 0 ){ gerror(stderr, "could not generate C filter program name: %s\n", prefix); return(0); } #if HAVE_MINGW32 strcat(tbuf, ".exe"); #endif filter->prog = xstrdup(tbuf); return(1); } /* * * FilterProgPrepend_C -- prepend the filter code * */ #ifdef ANSI_FUNC static int FilterProgPrepend_C (Filter filter) #else static int FilterProgPrepend_C(filter) Filter filter; #endif { char *s=NULL; char *contents=NULL; FILE *fd; /* make sure we have something to work with */ if( !filter ) return(0); /* make sure we are not in debug mode */ if( filter->debug >= 2 ) return(1); /* init temps */ fd = filter->fp; /* initialize with process type */ switch(filter->ptype){ case PTYPE_CONTAINED: fprintf(fd, "#define FILTER_PTYPE c\n"); break; case PTYPE_DYNAMIC: fprintf(fd, "#define FILTER_PTYPE d\n"); break; case PTYPE_PROCESS: fprintf(fd, "#define FILTER_PTYPE p\n"); break; } /* we want the byte order up at the top */ if( is_bigendian() ){ fprintf(fd, "#define MYBYTE_ORDER 4321\n"); } else{ fprintf(fd, "#define MYBYTE_ORDER 1234\n"); } /* for some compilers (e.g. pcc), we need to minimize use of #include */ if( (s=strrchr(filter->cc, '/')) ){ s++; } else { s = filter->cc; } if( !strcasecmp(s, "pcc") || !strcasecmp(s, "pcc.exe") ){ fprintf(fd, "#define MINIMIZE_INCLUDES 1\n"); } /* do we need windows pipes? */ if( filter->pipeos == PIPE_WIN32 ){ fprintf(fd, "#define USE_WIN32 1\n"); fprintf(fd, "#include \n"); } /* prepend the filter header */ contents = REGIONS_H; if( (contents != NULL) && (*contents != '\0') ){ fprintf(fd, "%s\n", contents); } /* these are implemented as aliases */ fprintf(fd, "#define evvcircle evvannulus\n"); fprintf(fd, "#define evncircle evnannulus\n"); fprintf(fd, "#define imvcirclei imvannulusi\n"); fprintf(fd, "#define imncirclei imnannulusi\n"); fprintf(fd, "#define imvcircle imvannulus\n"); fprintf(fd, "#define imncircle imnannulus\n"); fprintf(fd, "#define evcpanda evpanda\n"); fprintf(fd, "#define imcpandai impandai\n"); fprintf(fd, "#define imcpanda impanda\n"); fprintf(fd, "\n"); /* add some math support */ if( is_bigendian() ){ fprintf(fd, "static unsigned char _nan[8]={0x7F,0xF0,1,1,1,1,1,1};\n"); } else{ fprintf(fd, "static unsigned char _nan[8]={1,1,1,1,1,1,0xF0,0x7F};\n"); } fprintf(fd, "#define NaN *((double *)_nan)\n"); fprintf(fd, "#define div(a,b) (feq(b,0)?(NaN):(a/b))\n"); fprintf(fd, "\n"); return(1); } /* * * FilterProgWrite_C -- write the symbols for filtering * */ #ifdef ANSI_FUNC static int FilterProgWrite_C(Filter filter) #else static int FilterProgWrite_C(filter) Filter filter; #endif { int i; int offset; int pad; int dsize; int evsize; int tltyps[2]; double tlmins[2]; double binsizs[2]; char vbuf[1024]; char *s, *t; char *v; char *ibuf; char *filtstr; char *contents=NULL; char tbuf[SZ_LINE]; FILE *fd; FilterSymbols sp; FITSHead fhd; /* make sure we have something to work with */ if( !filter ) return(0); /* make sure we are init'ed */ if( filter->fhd == NULL ){ gerror(stderr, "symbol table not initialized\n"); return(0); } /* make sure we are init'ed */ if( filter->fp == NULL ){ gerror(stderr, "no output file for parser\n"); return(0); } /* get the filter string */ if( !(filtstr = (char *)_FilterString()) || !strcmp(filtstr, "()") ){ return(0); } /* init temps */ fhd = filter->fhd; fd= filter->fp; offset = 0; evsize = 0; /* ptype-specific processing */ switch(filter->ptype){ case PTYPE_CONTAINED: /* Write code to output file -- must be done BEFORE we write the region symbols, to avoid unintentional redefinitions */ if( filter->debug < 2 ){ /* we need the xalloc routines */ contents = XALLOC_C; if( (contents != NULL) && (*contents != '\0') ){ fprintf(fd, "%s\n", contents); } /* region routines if not linking against previously compiled code */ switch( filter->type ){ case TYPE_EVENTS: /* normally, we filter events analytically using evregions.o */ if( !filter->evsect ) contents = EVREGIONS_C; /* if evsect=xxx is specified, we filter by image pixels */ else contents = IMREGIONS_C; break; case TYPE_IMAGE: /* image are filtered by image pixels */ contents = IMREGIONS_C; break; default: break; } if( (contents != NULL) && (*contents != '\0') ){ /* use fprintf so that we handle \n correctly in TEMPLATE */ fprintf(fd, "%s\n", contents); } else{ gerror(stderr, "could not write filter subroutines\n"); return(0); } } break; } /* always need the swap routines (they're part of the filter) */ contents = SWAP_C; if( (contents != NULL) && (*contents != '\0') ){ fprintf(fd, "%s\n", contents); } /* output counts of shapes */ fprintf(fd, "#define NSHAPE %d\n", FilterShapeCount()); fprintf(fd, "#define NREGION %d\n", FilterRegionCount(TOK_IREG|TOK_EREG|TOK_NREG)); /* output the filter itself */ fprintf(fd, "#define FILTER %s\n", filtstr); if( filter->debug < 2 ){ /* string version of the filter -- used to check for FIELD optimization */ fprintf(fd, "#define FILTSTR \"%s\"\n", filtstr); /* output the initialization string */ ibuf = _FilterInitString(filtstr); fprintf(fd, "#define FINIT %s\n", (ibuf && *ibuf)?ibuf:""); if( ibuf ) xfree(ibuf); } /* for type image, we generate an initialization string */ switch(filter->type){ case TYPE_IMAGE: fprintf(fd, "#define IMFILTRTN %s\n", filter->pname); break; case TYPE_EVENTS: fprintf(fd, "#define EVFILTRTN %s\n", filter->pname); /* output the event section and tlmin values, if necessary */ if( filter->evsect && FilterTlInfo(tlmins,binsizs,tltyps) ){ if( *filter->evsect == '"' ) fprintf(fd, "#define EVSECT %s\n", filter->evsect); else fprintf(fd, "#define EVSECT \"%s\"\n", filter->evsect); fprintf(fd, "#define TLMINX %f\n", tlmins[0]); fprintf(fd, "#define TLMINY %f\n", tlmins[1]); for(i=0; i<2; i++) if( binsizs[i] <= 0.0 ) binsizs[i] = 1.0; if( (binsizs[0] == 1.0) && (binsizs[1] == 1.0) ) fprintf(fd, "#define USEBINSIZ 0\n"); else fprintf(fd, "#define USEBINSIZ 1\n"); fprintf(fd, "#define BINSIZX %f\n", binsizs[0]); fprintf(fd, "#define BINSIZY %f\n", binsizs[1]); fprintf(fd, "#define TLOFF %f\n", GetTloff(tltyps[0])); fprintf(fd, "#define TLOFF %f\n", GetTloff(tltyps[1])); } /* loop through the symbol table and process #defines */ for(i=0; insyms; i++){ sp = &(filter->symtab[i]); /* skip accidentally empty ones */ if( (sp->name == NULL) || (*sp->name == '\0') ) continue; /* process this type of symbol */ switch(sp->type){ case SYM_COL: /* make sure we are aligned */ if( fhd->table->col[sp->idx].type == 'X' ){ switch(fhd->table->col[sp->idx].n){ case 8: dsize = 1; break; case 16: dsize = 2; break; case 32: dsize = 4; break; default: dsize = ft_sizeof(filter->fhd->table->col[sp->idx].type); } } else{ dsize = ft_sizeof(filter->fhd->table->col[sp->idx].type); } pad = dsize - (offset % dsize); if( pad == dsize ) pad = 0; offset += pad; evsize += pad; sp->offset = offset; if( fhd->table->col[sp->idx].scaled ){ snprintf(tbuf, SZ_LINE, "(%f+%f*(", fhd->table->col[sp->idx].zero, fhd->table->col[sp->idx].scale); s = tbuf; t = "))"; } else{ s = ""; t = ""; } if( fhd->table->col[sp->idx].n == 1 ){ fprintf(fd, "#define %s %s*((%s *)(SW%d(eptr+%d,%d,_swf,%d)))%s\n", sp->name, s, GetType((int)fhd->table->col[sp->idx].type), dsize, offset, dsize, offset, t); } else{ if( fhd->table->col[sp->idx].type == 'X' ){ switch(fhd->table->col[sp->idx].n){ case 8: fprintf(fd, "#define %s %s*((%s *)(eptr+%d))%s\n", sp->name, s, "unsigned char", offset, t); break; case 16: fprintf(fd, "#define %s %s*((%s *)(SW2(eptr+%d,%d,_swf,%d)))%s\n", sp->name, s, "unsigned short", offset, 2, offset, t); break; case 32: fprintf(fd, "#define %s %s*((%s *)(SW4(eptr+%d,%d,_swf,%d)))%s\n", sp->name, s, "unsigned int", offset, 4, offset, t); break; default: fprintf(fd, "#define %s %s((%s *)(SW%d(eptr+%d,%d,_swf,%d)))%s\n", sp->name, s, GetType((int)fhd->table->col[sp->idx].type), dsize, offset, dsize, offset, t); } } else if( fhd->table->col[sp->idx].type == 'A' ){ fprintf(fd, "#define %s acopy(eptr+%d,%d)\n", sp->name, offset, fhd->table->col[sp->idx].n); } else{ fprintf(fd, "#define %s %s((%s *)(SW%d(eptr+%d,%d,_swf,%d)))%s\n", sp->name, s, GetType((int)fhd->table->col[sp->idx].type), dsize, offset, dsize, offset, t); } } /* lower and upper case are both acceptable */ strcpy(vbuf, sp->name); cluc(vbuf); if( strcmp(vbuf, sp->name) ){ fprintf(fd, "#define %s %s\n", vbuf, sp->name); } culc(vbuf); if( strcmp(vbuf, sp->name) ){ fprintf(fd, "#define %s %s\n", vbuf, sp->name); } /* bump pointers */ if( fhd->table->col[sp->idx].type == 'X' ){ offset += ((fhd->table->col[sp->idx].size*fhd->table->col[sp->idx].n)+7)/8; evsize += ((fhd->table->col[sp->idx].size*fhd->table->col[sp->idx].n)+7)/8; } else{ offset += fhd->table->col[sp->idx].size*fhd->table->col[sp->idx].n; evsize += fhd->table->col[sp->idx].size*fhd->table->col[sp->idx].n; } break; case SYM_PAR: /* we have to distinguish between numbers and strings here */ /* strip off enclosing white space */ (void)nowhite(sp->value, vbuf); /* check for all white space */ if( *vbuf == '\0' ){ fprintf(fd, "#define %s \"\"\n", sp->name); } else{ /* see if its a pure number */ (void)strtod(vbuf, &v); if( (v == NULL) || (*v == '\0') ) fprintf(fd, "#define %s %s\n", sp->name, vbuf); else fprintf(fd, "#define %s \"%s\"\n", sp->name, vbuf); } break; } } /* make sure each record is aligned */ pad = 8 - (evsize % 8); if( pad == 8 ) pad = 0; evsize += pad; /* make sure we have at least one byte to send to co-process */ if( evsize <=0 ) evsize = 1; /* output the size of the filter record */ fprintf(fd, "#define EVSIZE %d\n", evsize); fprintf(fd, "static char _swf[%d];\n", evsize); /* save for later use */ filter->evsize = evsize; break; default: break; } /* write out the mask structure */ if( filter->nmask && filter->masks && (filter->type == TYPE_EVENTS) && filter->evsect ){ fprintf(fd, "#define NMASK %d\n", filter->nmask); fprintf(fd, "#define MASKDIM %d;\n", ft_naxis(filter->maskhd, 1)); fprintf(fd, "static FilterMaskRec _masks[]={\n"); /* copy all masks and translate x,y positions as needed */ for(i=0; inmask; i++){ fprintf(fd, "{%d,%d,%d,%d}", filter->masks[i].region, filter->masks[i].y, filter->masks[i].xstart, filter->masks[i].xstop); if( i != (filter->nmask -1) ) fprintf(fd, ","); fprintf(fd, "\n"); } fprintf(fd, "};\n"); } else{ fprintf(fd, "#define NMASK 0\n"); fprintf(fd, "#define MASKDIM 0;\n"); fprintf(fd, "static FilterMask _masks=NULL;\n"); } /* write it now */ fflush(fd); return(1); } /* * * FilterProgAppend_C -- append the filter program body * */ #ifdef ANSI_FUNC static int FilterProgAppend_C (Filter filter) #else static int FilterProgAppend_C(filter) Filter filter; #endif { char *contents=NULL; /* make sure we have something to work with */ if( !filter ) return(0); /* make sure we are not in debug mode */ if( filter->debug >= 2 ) return(1); /* get body of filter program */ switch( filter->type ){ case TYPE_EVENTS: contents = EVENTS_C; break; case TYPE_IMAGE: contents = IMAGE_C; break; } if( (contents != NULL) && (*contents != '\0') ){ /* use fprintf so that we handle \n correctly in TEMPLATE */ fprintf(filter->fp, "%s\n", contents); return(1); } else{ gerror(stderr, "could not write body of filter program\n"); return(0); } } /* * * FilterProgClose_C -- close the filter program file * */ #ifdef ANSI_FUNC static int FilterProgClose_C (Filter filter) #else static int FilterProgClose_C(filter) Filter filter; #endif { /* make sure we have something to work with */ if( !filter ) return(0); /* close file if we are not in debug mode */ if( (filter->debug < 2) && filter->fp ){ fclose(filter->fp); filter->fp = NULL; } return(1); } /* * * FilterProgCompile_C -- compile the filter program * */ #ifdef ANSI_FUNC static int FilterProgCompile_C (Filter filter) #else static int FilterProgCompile_C(filter) Filter filter; #endif { char *s; char *math; char tbuf[SZ_LINE]; char pmode[SZ_LINE]; char log[SZ_LINE]; char *devnull; #ifdef USE_LAUNCH char *stdfiles[3]; #else char tbuf2[SZ_LINE]; #endif int len; int got; int keep=0; /* make sure we have something to work with */ if( !filter ) return(0); /* make sure we are not in debug mode */ if( !filter->cc || (filter->debug >= 2) ) return(1); /* flag whether to keep compiler files around */ if( !(s=getenv("FILTER_KEEP")) || !istrue(s) ) keep = 0; else keep = 1; /* add math library, if necessary */ switch(filter->pipeos){ case PIPE_WIN32: math = ""; break; default: math = "-lm"; break; } /* set up /dev/null */ #if HAVE_MINGW32 devnull = "nul"; #else devnull = "/dev/null"; #endif /* get log file name */ snprintf(log, SZ_LINE, "%s.log", filter->prog); /* delete old version */ unlink(filter->prog); switch(filter->ptype){ case PTYPE_PROCESS: /* make up the compile command */ snprintf(tbuf, SZ_LINE, "%s %s -o %s %s %s %s %s", filter->cc, filter->cflags, filter->prog, filter->code, filter->objs ? filter->objs : " ", filter->extra, math); #ifndef USE_LAUNCH snprintf(tbuf2, SZ_LINE, " 1>%s 2>%s", devnull, log); strcat(tbuf, tbuf2); #endif strcpy(pmode, "x"); break; case PTYPE_CONTAINED: /* make up the compile command */ snprintf(tbuf, SZ_LINE, "%s %s -o %s %s %s %s", filter->cc, filter->cflags, filter->prog, filter->code, filter->extra, math); #ifndef USE_LAUNCH snprintf(tbuf2, SZ_LINE, " 1>%s 2>%s", devnull, log); strcat(tbuf, tbuf2); #endif strcpy(pmode, "x"); break; #ifdef USE_DL case PTYPE_DYNAMIC: snprintf(tbuf, SZ_LINE, "%s %s %s %s -o %s %s %s", filter->cc, filter->cflags, filter->shflags, filter->objs ? filter->objs : " ", filter->prog, filter->code, filter->extra); #ifndef USE_LAUNCH snprintf(tbuf2, SZ_LINE, " 1>%s 2>%s", devnull, log); strcat(tbuf, tbuf2); #endif strcpy(pmode, "r"); break; #endif default: return(0); } /* issue the shell command to compile the program */ #ifdef USE_LAUNCH stdfiles[0] = NULL; stdfiles[1] = devnull; stdfiles[2] = log; got = Launch(tbuf, 1, stdfiles, NULL); #else got = system(tbuf); #endif /* delete the filter program body in any case */ if( !keep ) unlink(filter->code); /* Sun cc can leave an extraneous .o around, which we don't want */ strcpy(tbuf, filter->code); /* change .c to .o */ tbuf[strlen(tbuf)-1] = 'o'; unlink(tbuf); /* ... actually its usually left in the current directory */ if( (s = strrchr(tbuf, '/')) ) unlink(s+1); /* now we can see if we succeeded in issuing the command */ if( got < 0 ){ gerror(stderr, "could not run filter compilation\n"); return(0); } /* if we have an executable program, we succeeded */ if( (s=Find(filter->prog, pmode, NULL, NULL)) != NULL ){ unlink(log); if( s ) xfree(s); } else{ s = FileContents(log, 0, &len); if( s && *s && len ){ fprintf(stderr, "Compilation error message:\n%s\n", s); } if( !keep ){ unlink(log); } if( s ) xfree(s); gerror(stderr, "filter compilation failed\n"); return(0); } /* good news */ return(1); } /* * * FilterProgEnd_C -- end the filtering process * */ #ifdef ANSI_FUNC static int FilterProgEnd_C (Filter filter) #else int FilterProgEnd_C(filter) Filter filter; #endif { char *s; int status=0; /* make sure we have something to play with */ if( filter == NULL) return(0); /* delete the filter program */ unlink(filter->prog); /* delete the filter program body, if necessary */ if( !(s=getenv("FILTER_KEEP")) || !istrue(s) ) unlink(filter->code); return(status); } /* * * Public Routines * */ /* * * FilterProgLoad_C -- load the routines needed to support C filtering * */ #ifdef ANSI_FUNC int FilterProgLoad_C (Filter filter) #else int FilterProgLoad_C(filter) Filter filter; #endif { /* make sure we have something to work with */ if( !filter ) return(0); filter->filt_open = FilterProgOpen_C; filter->filt_prepend = FilterProgPrepend_C; filter->filt_write = FilterProgWrite_C; filter->filt_append = FilterProgAppend_C; filter->filt_close = FilterProgClose_C; filter->filt_compile = FilterProgCompile_C; filter->filt_end = FilterProgEnd_C; return(1); } funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/filter/idx.h000066400000000000000000000100451256243640000227200ustar00rootroot00000000000000/* * Copyright (c) 2005 Smithsonian Astrophysical Observatory */ /* * * idx.h - include file for indexed filters * */ #ifndef __idx_h #define __idx_h #if HAVE_CONFIG_H #include "conf.h" #endif #include "prsetup.h" #include #include #ifdef HAVE_UNISTD_H #include #endif #ifdef HAVE_STRING_H #include #endif #include "fitsy.h" #include "gio.h" #include "xalloc.h" #include "strtod.h" /* binary search edge */ #define IDX_EDGE_LEFT 1 #define IDX_EDGE_RIGHT 2 #define IDX_EDGE_BOTH (IDX_EDGE_LEFT|IDX_EDGE_RIGHT) /* type of row record */ #define IDX_ALLROWS 0 #define IDX_INDEF 1 #define IDX_ROW_LIST 2 #define IDX_SORT 3 #define IDX_OR_SORT 4 #define IDX_AND_SORT 5 /* methods of accessing data record */ #define IDX_IO_MMAP 1 #define IDX_IO_LSEEK 2 #ifdef HAVE_SYS_MMAN_H #define IDX_IO_DEFAULT IDX_IO_MMAP #else #define IDX_IO_DEFAULT IDX_IO_LSEEK #endif /* increment for storing rowlists */ #define IDX_ROW_INC 32 /* sort program */ #define IDX_SORTPROG "_funsort" /* idxinfo which values */ #define IDX_COLNAME 1 #define IDX_FILENAME 2 #define IDX_FILEROOT1 3 #define IDX_FILEROOT2 4 #define IDX_PATHNAME 5 #define IDX_SORTNAME 6 /* rows can be in memory range lists or file-based row numbers */ typedef struct _idxrowrec{ struct _idxrowrec *next; char *s; int type; int rtype; int dofilt; int dosort; int rtot; int maxrow; int nrow; int *startrow; int *stoprow; FILE *ifile; int ichan; int ochan; int pid; struct _idxvalrec *v; char *fdata; int flen; } idxrowrec; /* values can be int, float, col, region, func */ typedef struct _idxvalrec{ struct _idxvalrec *next; char *s; int type; int ntype; longlong ival; double dval; char *iname; GIO igio; FITSHead ifits; int itype; int ioffset; int in; int vtype; int voffset; int vn; int nrow; char *idata; int ilen; struct _idxvalrec *rv[2]; double rlo[2], rhi[2]; } idxvalrec; _PRbeg idxrowrec *idxall _PRx((idxrowrec *row)); idxrowrec *idxor _PRx((idxrowrec *row1, idxrowrec *row2)); idxrowrec *idxand _PRx((idxrowrec *row1, idxrowrec *row2)); idxrowrec *idxnot _PRx((idxrowrec *row)); idxrowrec *idxrowreg _PRx((idxvalrec *val)); idxrowrec *idxrowfun _PRx((idxvalrec *val)); idxrowrec *idxroweq _PRx((idxvalrec *val1, idxvalrec *val2)); idxrowrec *idxrowne _PRx((idxvalrec *val1, idxvalrec *val2)); idxrowrec *idxrowlt _PRx((idxvalrec *val1, idxvalrec *val2)); idxrowrec *idxrowle _PRx((idxvalrec *val1, idxvalrec *val2)); idxrowrec *idxrowgt _PRx((idxvalrec *val1, idxvalrec *val2)); idxrowrec *idxrowge _PRx((idxvalrec *val1, idxvalrec *val2)); idxrowrec *idxrownot _PRx((idxvalrec *val)); idxvalrec *idxvaladd _PRx((idxvalrec *val1, idxvalrec *val2)); idxvalrec *idxvalsub _PRx((idxvalrec *val1, idxvalrec *val2)); idxvalrec *idxvalmul _PRx((idxvalrec *val1, idxvalrec *val2)); idxvalrec *idxvaldiv _PRx((idxvalrec *val1, idxvalrec *val2)); idxvalrec *idxvalmod _PRx((idxvalrec *val1, idxvalrec *val2)); idxvalrec *idxvaland _PRx((idxvalrec *val1, idxvalrec *val2)); idxvalrec *idxvalor _PRx((idxvalrec *val1, idxvalrec *val2)); idxvalrec *idxvalxor _PRx((idxvalrec *val1, idxvalrec *val2)); idxvalrec *idxvalnot _PRx((idxvalrec *val)); idxvalrec *idxvalcom _PRx((idxvalrec *val)); idxvalrec *idxvalmin _PRx((idxvalrec *val)); char *idxinfo _PRx((int which)); int idxdebug _PRx((int debug)); idxvalrec *idxvalnew _PRx((char *s)); int idxvalfree _PRx((idxvalrec *v)); idxrowrec *idxrownew _PRx((void)); int idxrowfree _PRx((idxrowrec *r)); int idxinitfilenames _PRx((char *s, int *flag)); char *idxindexfilename _PRx((char *s, int *size)); idxvalrec *idxlookupfilename _PRx((char *iname)); void idxfreefilenames _PRx((void)); void idxfreeglobals _PRx((void)); int idxinitparser _PRx((char *s)); void idxendparser _PRx((void)); void *idxread _PRx((idxrowrec *row, GIO gio, FITSHead fits, void *buf, size_t size, size_t get, size_t *got, int *dofilt)); void idxstring _PRx((char *s)); int idxerror _PRx((char *mmsg)); int idxlex _PRx((void)); int idxparse _PRx((void)); _PRend #endif /* __idx.h */ funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/filter/idx.l000066400000000000000000000330331256243640000227260ustar00rootroot00000000000000%option caseless %array %{ #include #include #include #include extern int idx_debug; static int _valint(char *s, idxvalrec **v); static int _valfloat(char *s, idxvalrec **v); static int _valname(char *s, idxvalrec **v); static int _valreg(char *s, idxvalrec **v); static int _valfunc(char *s, idxvalrec **v); %} SP [ \t] DIG [0-9] DIG2 [0-9a-fA-F] /* note that negative numbers are not defined here, but in the grammar */ INT1 {DIG}+L? INT2 0[xX]{DIG2}+L? INT ({INT1}|{INT2}) FLOAT1 {DIG}+\.?([eE][-+]?{DIG}+)? FLOAT2 {DIG}*\.{DIG}+([eE][-+]?{DIG}+)? XFLOAT -142857.142857 FLOAT ({FLOAT1}|{FLOAT2}|{XFLOAT}) NUM ({INT}|{FLOAT}) NAME [A-Za-z_][0-9A-Za-z~_]*(\[[^\[]*\])? /* must match regions in filt.l */ REGION (ev|im)[vn]?(annulus|box|circle|ellipse|line|panda|pie|qtpie|point|polygon|field|bpanda|cpanda|epanda) %% {INT} {return _valint(yytext, &(idxlval.val));} {FLOAT} {return _valfloat(yytext, &(idxlval.val));} evfield"(g",{INT},{INT},{INT},{INT},"(double)"{NAME},"(double)"{NAME}")" { return _valreg(yytext, &(idxlval.val)); } {REGION}"(g",{INT},{INT},{INT},{INT},"(double)"{NAME},"(double)"{NAME}(,[+-]?{FLOAT})*,[+-]?{FLOAT}")" { return _valreg(yytext, &(idxlval.val)); } {NAME}"("[^()]*("("[^()]*")")*")" { /* support functions with one level of nested parens */ return _valfunc(yytext, &(idxlval.val)); } {NAME} {return _valname(yytext, &(idxlval.val));} "||" {return OR;} "&&" {return AND;} "==" {return EQ;} "!=" {return NE;} "<=" {return LE;} ">=" {return GE;} {SP} {;} <> { yy_delete_buffer( YY_CURRENT_BUFFER ); yyterminate(); } . {return yytext[0];} %% #ifdef YY_USE_PROTOS static int _valint(char *s, idxvalrec **v) #else static int _valint(s, v) char *s; idxvalrec **v; #endif { char *t; *v = idxvalnew(s); (*v)->ival = strtoll(s, &t, 0); if( *t ) idxerror("bad integer value"); (*v)->type = NUM; (*v)->ntype = PARSE_INTEGER; (*v)->dval = (double)(*v)->ival; return NUM; } #ifdef YY_USE_PROTOS static int _valfloat(char *s, idxvalrec **v) #else static int _valfloat(s, v) char *s; idxvalrec **v; #endif { char *t; *v = idxvalnew(s); (*v)->dval = strtod(s, &t); if( *t ) idxerror("bad float value"); (*v)->type = NUM; (*v)->ntype = PARSE_FLOAT; return NUM; } #ifdef YY_USE_PROTOS static int _valname(char *s, idxvalrec **v) #else static int _valname(s, v) char *s; idxvalrec **v; #endif { int i; int got; int oflag; int isize=0; char *iname; char *colname; char tail[SZ_LINE]; FilterSymbols sp=NULL; idxvalrec *vv; *v = idxvalnew(s); /* lookup the string */ if( !(sp=FilterSymbolLookup(FilterDefault(), s)) ){ idxerror("column name not found in data file"); (*v)->type = INDEF; return INDEF; } colname = idxinfo(IDX_COLNAME); /* see what sort of symbol it is */ switch(sp->type){ case SYM_COL: if( !(iname=idxindexfilename(s, &isize)) ){ (*v)->type = INDEF; return INDEF; } /* if we already have opened this index, just use the existing handle */ if( (vv=idxlookupfilename(iname)) ){ (*v)->igio = vv->igio; (*v)->ifits = vv->ifits; } /* open index for first time and mark iname */ else{ oflag = setgerror(0); (*v)->igio = ft_fitsheadopen(iname, &((*v)->ifits), tail, SZ_LINE, "r"); setgerror(oflag); if( !((*v)->igio) ){ idxerror("existing index file can't be opened"); (*v)->type = INDEF; return INDEF; } else{ (*v)->iname = xstrdup(iname); } } xfree(iname); if( (*v)->ifits ){ for(got=0, i=0; i<(*v)->ifits->table->tfields; i++){ if( !strcasecmp(s, (*v)->ifits->table->col[i].name) ){ (*v)->vtype = (*v)->ifits->table->col[i].type; (*v)->voffset = (*v)->ifits->table->col[i].offset; (*v)->vn = (*v)->ifits->table->col[i].n; got++; } if( !strcasecmp(colname, (*v)->ifits->table->col[i].name) ){ (*v)->itype = (*v)->ifits->table->col[i].type; (*v)->ioffset = (*v)->ifits->table->col[i].offset; (*v)->in = (*v)->ifits->table->col[i].n; got++; } } if( got == 2 ){ #ifdef HAVE_SYS_MMAN_H if( !(*v)->igio->gz ){ if(!((*v)->idata = mmap(NULL, isize, PROT_READ, MAP_PRIVATE, fileno((*v)->igio->fp), 0)) ){ idxerror("index file can't be mmap'ed"); (*v)->type = INDEF; return INDEF; } (*v)->ilen = isize; } #endif (*v)->nrow = ft_naxis((*v)->ifits,2); (*v)->type = COL; return COL; } else{ idxerror("column name and/or index not found in index file"); } } else{ (*v)->type = INDEF; return INDEF; } case SYM_PAR: (*v)->ntype=ParseDataType(sp->value, &(*v)->dval, &(*v)->ival); (*v)->type = NUM; switch((*v)->ntype){ case PARSE_INTEGER: case PARSE_HEXINT: (*v)->dval = (double)(*v)->ival; return NUM; case PARSE_FLOAT: return NUM; default: idxerror("invalid parameter type in index"); return 0; } default: idxerror("unknown symbol type in index"); return 0; } } #ifdef YY_USE_PROTOS static int _valreglims(idxvalrec *v, char *s) #else static int _valreglims(v, s) idxvalrec *v; char *s; #endif { int i; int ip=0; int nd=0, maxd=0; double xcen, ycen; double dval; double *dvals; double pts[8]; char tbuf[SZ_LINE]; char tbuf2[SZ_LINE]; double angle; double xwidth, yheight; double angl; /* l: Cartesian angle in radians */ double half_width, half_height;/* l: radii (1/2 width and height) */ double cosangl, sinangl; /* l: sine, cosine of the Cartesian angle */ double hw_cos, hw_sin; /* l: products of half_width with sin, cos */ double hh_cos, hh_sin; /* l: products of half_height with sin, cos */ if( !strcmp(v->s, "circle") || !strcmp(v->s, "ncircle") || !strcmp(v->s, "annulus") || !strcmp(v->s, "nannulus") ){ if( !word(s, tbuf, &ip)||!word(s, tbuf2, &ip) ) return 0; xcen = atof(tbuf); ycen = atof(tbuf2); dval = -1; if( *v->s == 'n' ){ if( !word(s, tbuf, &ip) || !word(s, tbuf, &ip) ) return 0; dval = MAX(atof(tbuf),dval); } else{ while( word(s, tbuf, &ip) && strcmp(tbuf, "-142857.142857") ){ dval = MAX(atof(tbuf),dval); } } v->rlo[0] = xcen - dval - 1; v->rhi[0] = xcen + dval + 1; v->rlo[1] = ycen - dval - 1; v->rhi[1] = ycen + dval + 1; return 1; } else if( !strcmp(v->s, "box") || !strcmp(v->s, "nbox") || !strcmp(v->s, "ellipse") || !strcmp(v->s, "nellipse") ){ if( !word(s, tbuf, &ip)||!word(s, tbuf2, &ip) ) return 0; xcen = atof(tbuf); ycen = atof(tbuf2); maxd = SZ_LINE; if( !(dvals=(double *)malloc(maxd*sizeof(double))) ) return 0; if( *v->s == 'n' ){ if( !word(s, tbuf, &ip) || !word(s, tbuf, &ip) ) return 0; if( !word(s, tbuf, &ip) || !word(s, tbuf2, &ip) ) return 0; dvals[nd++] = atof(tbuf); dvals[nd++] = atof(tbuf2); if( word(s, tbuf, &ip) && word(s, tbuf, &ip) ) dvals[nd++] = atof(tbuf); } else{ while( word(s, tbuf, &ip) && strcmp(tbuf, "-142857.142857") ){ dvals[nd++] = atof(tbuf); if( nd == maxd ){ maxd += SZ_LINE; if( !(dvals=(double *)realloc(dvals, maxd*sizeof(double))) ) return 0; } } } ellcom: if( nd == 2 ){ angle = 0.0; xwidth = dvals[0]; yheight = dvals[1]; } else{ angle = dvals[nd-1]; xwidth = dvals[nd-3]; yheight = dvals[nd-2]; } if( dvals ) xfree(dvals); /* Why is this done in evfilter.c??? Doesn't seem necessary */ /* angl = angle + 90.0; */ angl = angle; while (angl >= 360.0) angl = angl - 360.0; /* convert to radians */ angl = (angl / 180.0) * M_PI; sinangl = sin (angl); cosangl = cos (angl); /* Why is this done in evfilter.c??? Doesn't seem necessary */ /* since we rotate by 90.0 degrees to get from astro angle to cartesian, */ /* we also need to switch the width and height. we do this secretly so */ /* that the display will turn out right, by doing it in the half terms */ if( !strcmp(v->s, "box") ){ /* half_width = yheight / 2.0; half_height = xwidth / 2.0; */ half_width = xwidth / 2.0; half_height = yheight / 2.0; } else{ /* half_width = yheight; half_height = xwidth; */ half_width = xwidth; half_height = yheight; } hw_cos = half_width * cosangl; hw_sin = half_width * sinangl; hh_cos = half_height * cosangl; hh_sin = half_height * sinangl; pts[0] = xcen - hw_cos - hh_sin; pts[1] = ycen - hw_sin + hh_cos; pts[2] = xcen + hw_cos - hh_sin; pts[3] = ycen + hw_sin + hh_cos; pts[4] = xcen + hw_cos + hh_sin; pts[5] = ycen + hw_sin - hh_cos; pts[6] = xcen - hw_cos + hh_sin; pts[7] = ycen - hw_sin - hh_cos; v->rlo[0] = pts[0]; v->rhi[0] = pts[0]; v->rlo[1] = pts[1]; v->rhi[1] = pts[1]; for(i=2; i<8; i+=2){ v->rlo[0] = MIN(pts[i],v->rlo[0]); v->rhi[0] = MAX(pts[i],v->rhi[0]); v->rlo[1] = MIN(pts[i+1],v->rlo[1]); v->rhi[1] = MAX(pts[i+1],v->rhi[1]); } return 1; } else if( !strcmp(v->s, "line") ){ for(i=0; i<4; i++){ if( word(s, tbuf, &ip) ){ pts[i] = atof(tbuf); } } v->rlo[0] = MIN(pts[0],pts[2]); v->rhi[0] = MAX(pts[0],pts[2]); v->rlo[1] = MIN(pts[1],pts[3]); v->rhi[1] = MAX(pts[1],pts[3]); return 1; } else if( !strcmp(v->s, "point") || !strcmp(v->s, "polygon") ){ if( !word(s, tbuf, &ip)||!word(s, tbuf2, &ip) ) return 0; xcen = atof(tbuf); ycen = atof(tbuf2); v->rlo[0] = xcen-1; v->rhi[0] = xcen+1; v->rlo[1] = ycen-1; v->rhi[1] = ycen+1; while( word(s, tbuf, &ip) && strcmp(tbuf, "-142857.142857") && word(s, tbuf2, &ip) ){ dval = atof(tbuf); v->rlo[0] = MIN(dval-1,v->rlo[0]); v->rhi[0] = MAX(dval+1,v->rhi[0]); dval = atof(tbuf2); v->rlo[1] = MIN(dval-1,v->rlo[1]); v->rhi[1] = MAX(dval+1,v->rhi[1]); } return 1; } else if( !strcmp(v->s, "pie") || !strcmp(v->s, "qtpie") ){ return 0; } else if( !strcmp(v->s, "panda") || !strcmp(v->s, "cpanda") ){ maxd = SZ_LINE; if( !(dvals=(double *)malloc(maxd*sizeof(double))) ) return 0; while( word(s, tbuf, &ip) && strcmp(tbuf, "-142857.142857") ){ dvals[nd++] = atof(tbuf); if( nd == maxd ){ maxd += SZ_LINE; if( !(dvals=(double *)realloc(dvals, maxd*sizeof(double))) ) return 0; } } v->rlo[0] = dvals[0] - dvals[6] - 1; v->rhi[0] = dvals[0] + dvals[6] + 1; v->rlo[1] = dvals[1] - dvals[6] - 1; v->rhi[1] = dvals[1] + dvals[6] + 1; if( dvals ) xfree(dvals); return 1; } else if( !strcmp(v->s, "bpanda") || !strcmp(v->s, "epanda") ){ maxd = 3; if( !(dvals=(double *)malloc(maxd*sizeof(double))) ) return 0; /* grab: xcen ycen */ if( !word(s, tbuf, &ip)||!word(s, tbuf2, &ip) ) return 0; xcen = atof(tbuf); ycen = atof(tbuf2); /* skip: ang1 ang2 nang xwlo yhlo */ for(i=0; i<5; i++){ if( !word(s, tbuf, &ip) ) return 0; } /* grab: xwhi yhhi */ for(i=0; i<2; i++){ if( !word(s, tbuf, &ip) ) return 0; dvals[nd++] = atof(tbuf); } /* skip: nrad */ if( !word(s, tbuf, &ip) ) return 0; /* grab: ang */ if( !word(s, tbuf, &ip) ) return 0; dvals[nd++] = atof(tbuf); /* we can now handle this with box/ellipse code */ goto ellcom; } else if( !strcmp(v->s, "field") ){ return 0; } else{ return 0; } } #ifdef YY_USE_PROTOS static int _valreg(char *s, idxvalrec **v) #else static int _valreg(s, v) char *s; idxvalrec **v; #endif { int ip=0; char *t; char tbuf[SZ_LINE]; *v = idxvalnew(NULL); newdtable("(),"); while( *s == '(' ) s++; if( !word(s, tbuf, &ip) ){ (*v)->type = INDEF; return REG; } if( strstr(tbuf, "field") ){ (*v)->type = INDEF; return REG; } t = tbuf+2; if( *t == 'v' ) t++; (*v)->s = xstrdup(t); if( !word(s, tbuf, &ip) || !word(s, tbuf, &ip) || !word(s, tbuf, &ip) || !word(s, tbuf, &ip) ){ (*v)->type = INDEF; return REG; } /* include/exclude */ if( !atoi(tbuf) ){ (*v)->type = INDEF; return REG; } if( !word(s, tbuf, &ip) || !word(s, tbuf, &ip) || !word(s, tbuf, &ip) ){ (*v)->type = INDEF; return REG; } culc(tbuf); _valname(tbuf, &(*v)->rv[0]); if( !word(s, tbuf, &ip) || !word(s, tbuf, &ip) ){ (*v)->type = INDEF; return REG; } culc(tbuf); _valname(tbuf, &(*v)->rv[1]); if( !_valreglims(*v, &s[ip]) ){ (*v)->type = INDEF; return REG; } freedtable(); (*v)->type = REG; return REG; } #ifdef YY_USE_PROTOS static int _valfunc(char *s, idxvalrec **v) #else static int _valfunc(s, v) char *s; idxvalrec **v; #endif { *v = idxvalnew(s); (*v)->type = FUNC; return FUNC; } #ifdef YY_USE_PROTOS void idxstring(char *s) #else void idxstring(s) char *s; #endif { idx_scan_string(s); } #ifdef YY_USE_PROTOS int idxerror(char *msg) #else int idxerror(msg) char *msg; #endif { Filter filter; YY_FLUSH_BUFFER; /* turn indexing off */ if( (filter=FilterDefault()) ){ filter->doidx = -1; } /* output message, if necessary */ if( idx_debug ){ fprintf(stderr, "ERROR: %s", msg); if( !strcmp(msg, "syntax error") ){ fprintf(stderr, " (terminating index processing)"); } fprintf(stderr, "\n"); } yyterminate(); } #ifdef YY_USE_PROTOS int yywrap(void) #else int yywrap() #endif { return 1; } funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/filter/idx.output000066400000000000000000000536701256243640000240440ustar00rootroot00000000000000State 3 conflicts: 1 reduce/reduce Grammar 0 $accept: idx $end 1 idx: expr 2 expr: rowlist 3 | expr OR expr 4 | expr AND expr 5 | '(' expr ')' 6 rowlist: REG 7 | FUNC 8 | value EQ value 9 | value NE value 10 | value '<' value 11 | value LE value 12 | value '>' value 13 | value GE value 14 value: NUM 15 | COL 16 | INDEF 17 | FUNC 18 | value '+' value 19 | value '-' value 20 | value '*' value 21 | value '/' value 22 | value '%' value 23 | value '&' value 24 | value '|' value 25 | value '^' value 26 | '!' value 27 | '~' value 28 | '-' value 29 | '(' value ')' Terminals, with rules where they appear $end (0) 0 '!' (33) 26 '%' (37) 22 '&' (38) 23 '(' (40) 5 29 ')' (41) 5 29 '*' (42) 20 '+' (43) 18 '-' (45) 19 28 '/' (47) 21 '<' (60) 10 '>' (62) 12 '^' (94) 25 '|' (124) 24 '~' (126) 27 error (256) NUM (258) 14 COL (259) 15 FUNC (260) 7 17 REG (261) 6 INDEF (262) 16 OR (263) 3 AND (264) 4 NE (265) 9 EQ (266) 8 GE (267) 13 LE (268) 11 UMINUS (269) Nonterminals, with rules where they appear $accept (29) on left: 0 idx (30) on left: 1, on right: 0 expr (31) on left: 2 3 4 5, on right: 1 3 4 5 rowlist (32) on left: 6 7 8 9 10 11 12 13, on right: 2 value (33) on left: 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29, on right: 8 9 10 11 12 13 18 19 20 21 22 23 24 25 26 27 28 29 state 0 0 $accept: . idx $end NUM shift, and go to state 1 COL shift, and go to state 2 FUNC shift, and go to state 3 REG shift, and go to state 4 INDEF shift, and go to state 5 '-' shift, and go to state 6 '!' shift, and go to state 7 '~' shift, and go to state 8 '(' shift, and go to state 9 idx go to state 10 expr go to state 11 rowlist go to state 12 value go to state 13 state 1 14 value: NUM . $default reduce using rule 14 (value) state 2 15 value: COL . $default reduce using rule 15 (value) state 3 7 rowlist: FUNC . 17 value: FUNC . $end reduce using rule 7 (rowlist) OR reduce using rule 7 (rowlist) AND reduce using rule 7 (rowlist) ')' reduce using rule 7 (rowlist) ')' [reduce using rule 17 (value)] $default reduce using rule 17 (value) state 4 6 rowlist: REG . $default reduce using rule 6 (rowlist) state 5 16 value: INDEF . $default reduce using rule 16 (value) state 6 28 value: '-' . value NUM shift, and go to state 1 COL shift, and go to state 2 FUNC shift, and go to state 14 INDEF shift, and go to state 5 '-' shift, and go to state 6 '!' shift, and go to state 7 '~' shift, and go to state 8 '(' shift, and go to state 15 value go to state 16 state 7 26 value: '!' . value NUM shift, and go to state 1 COL shift, and go to state 2 FUNC shift, and go to state 14 INDEF shift, and go to state 5 '-' shift, and go to state 6 '!' shift, and go to state 7 '~' shift, and go to state 8 '(' shift, and go to state 15 value go to state 17 state 8 27 value: '~' . value NUM shift, and go to state 1 COL shift, and go to state 2 FUNC shift, and go to state 14 INDEF shift, and go to state 5 '-' shift, and go to state 6 '!' shift, and go to state 7 '~' shift, and go to state 8 '(' shift, and go to state 15 value go to state 18 state 9 5 expr: '(' . expr ')' 29 value: '(' . value ')' NUM shift, and go to state 1 COL shift, and go to state 2 FUNC shift, and go to state 3 REG shift, and go to state 4 INDEF shift, and go to state 5 '-' shift, and go to state 6 '!' shift, and go to state 7 '~' shift, and go to state 8 '(' shift, and go to state 9 expr go to state 19 rowlist go to state 12 value go to state 20 state 10 0 $accept: idx . $end $end shift, and go to state 21 state 11 1 idx: expr . 3 expr: expr . OR expr 4 | expr . AND expr OR shift, and go to state 22 AND shift, and go to state 23 $default reduce using rule 1 (idx) state 12 2 expr: rowlist . $default reduce using rule 2 (expr) state 13 8 rowlist: value . EQ value 9 | value . NE value 10 | value . '<' value 11 | value . LE value 12 | value . '>' value 13 | value . GE value 18 value: value . '+' value 19 | value . '-' value 20 | value . '*' value 21 | value . '/' value 22 | value . '%' value 23 | value . '&' value 24 | value . '|' value 25 | value . '^' value '|' shift, and go to state 24 '^' shift, and go to state 25 '&' shift, and go to state 26 NE shift, and go to state 27 EQ shift, and go to state 28 '<' shift, and go to state 29 '>' shift, and go to state 30 GE shift, and go to state 31 LE shift, and go to state 32 '+' shift, and go to state 33 '-' shift, and go to state 34 '*' shift, and go to state 35 '/' shift, and go to state 36 '%' shift, and go to state 37 state 14 17 value: FUNC . $default reduce using rule 17 (value) state 15 29 value: '(' . value ')' NUM shift, and go to state 1 COL shift, and go to state 2 FUNC shift, and go to state 14 INDEF shift, and go to state 5 '-' shift, and go to state 6 '!' shift, and go to state 7 '~' shift, and go to state 8 '(' shift, and go to state 15 value go to state 38 state 16 18 value: value . '+' value 19 | value . '-' value 20 | value . '*' value 21 | value . '/' value 22 | value . '%' value 23 | value . '&' value 24 | value . '|' value 25 | value . '^' value 28 | '-' value . $default reduce using rule 28 (value) state 17 18 value: value . '+' value 19 | value . '-' value 20 | value . '*' value 21 | value . '/' value 22 | value . '%' value 23 | value . '&' value 24 | value . '|' value 25 | value . '^' value 26 | '!' value . $default reduce using rule 26 (value) state 18 18 value: value . '+' value 19 | value . '-' value 20 | value . '*' value 21 | value . '/' value 22 | value . '%' value 23 | value . '&' value 24 | value . '|' value 25 | value . '^' value 27 | '~' value . $default reduce using rule 27 (value) state 19 3 expr: expr . OR expr 4 | expr . AND expr 5 | '(' expr . ')' OR shift, and go to state 22 AND shift, and go to state 23 ')' shift, and go to state 39 state 20 8 rowlist: value . EQ value 9 | value . NE value 10 | value . '<' value 11 | value . LE value 12 | value . '>' value 13 | value . GE value 18 value: value . '+' value 19 | value . '-' value 20 | value . '*' value 21 | value . '/' value 22 | value . '%' value 23 | value . '&' value 24 | value . '|' value 25 | value . '^' value 29 | '(' value . ')' '|' shift, and go to state 24 '^' shift, and go to state 25 '&' shift, and go to state 26 NE shift, and go to state 27 EQ shift, and go to state 28 '<' shift, and go to state 29 '>' shift, and go to state 30 GE shift, and go to state 31 LE shift, and go to state 32 '+' shift, and go to state 33 '-' shift, and go to state 34 '*' shift, and go to state 35 '/' shift, and go to state 36 '%' shift, and go to state 37 ')' shift, and go to state 40 state 21 0 $accept: idx $end . $default accept state 22 3 expr: expr OR . expr NUM shift, and go to state 1 COL shift, and go to state 2 FUNC shift, and go to state 3 REG shift, and go to state 4 INDEF shift, and go to state 5 '-' shift, and go to state 6 '!' shift, and go to state 7 '~' shift, and go to state 8 '(' shift, and go to state 9 expr go to state 41 rowlist go to state 12 value go to state 13 state 23 4 expr: expr AND . expr NUM shift, and go to state 1 COL shift, and go to state 2 FUNC shift, and go to state 3 REG shift, and go to state 4 INDEF shift, and go to state 5 '-' shift, and go to state 6 '!' shift, and go to state 7 '~' shift, and go to state 8 '(' shift, and go to state 9 expr go to state 42 rowlist go to state 12 value go to state 13 state 24 24 value: value '|' . value NUM shift, and go to state 1 COL shift, and go to state 2 FUNC shift, and go to state 14 INDEF shift, and go to state 5 '-' shift, and go to state 6 '!' shift, and go to state 7 '~' shift, and go to state 8 '(' shift, and go to state 15 value go to state 43 state 25 25 value: value '^' . value NUM shift, and go to state 1 COL shift, and go to state 2 FUNC shift, and go to state 14 INDEF shift, and go to state 5 '-' shift, and go to state 6 '!' shift, and go to state 7 '~' shift, and go to state 8 '(' shift, and go to state 15 value go to state 44 state 26 23 value: value '&' . value NUM shift, and go to state 1 COL shift, and go to state 2 FUNC shift, and go to state 14 INDEF shift, and go to state 5 '-' shift, and go to state 6 '!' shift, and go to state 7 '~' shift, and go to state 8 '(' shift, and go to state 15 value go to state 45 state 27 9 rowlist: value NE . value NUM shift, and go to state 1 COL shift, and go to state 2 FUNC shift, and go to state 14 INDEF shift, and go to state 5 '-' shift, and go to state 6 '!' shift, and go to state 7 '~' shift, and go to state 8 '(' shift, and go to state 15 value go to state 46 state 28 8 rowlist: value EQ . value NUM shift, and go to state 1 COL shift, and go to state 2 FUNC shift, and go to state 14 INDEF shift, and go to state 5 '-' shift, and go to state 6 '!' shift, and go to state 7 '~' shift, and go to state 8 '(' shift, and go to state 15 value go to state 47 state 29 10 rowlist: value '<' . value NUM shift, and go to state 1 COL shift, and go to state 2 FUNC shift, and go to state 14 INDEF shift, and go to state 5 '-' shift, and go to state 6 '!' shift, and go to state 7 '~' shift, and go to state 8 '(' shift, and go to state 15 value go to state 48 state 30 12 rowlist: value '>' . value NUM shift, and go to state 1 COL shift, and go to state 2 FUNC shift, and go to state 14 INDEF shift, and go to state 5 '-' shift, and go to state 6 '!' shift, and go to state 7 '~' shift, and go to state 8 '(' shift, and go to state 15 value go to state 49 state 31 13 rowlist: value GE . value NUM shift, and go to state 1 COL shift, and go to state 2 FUNC shift, and go to state 14 INDEF shift, and go to state 5 '-' shift, and go to state 6 '!' shift, and go to state 7 '~' shift, and go to state 8 '(' shift, and go to state 15 value go to state 50 state 32 11 rowlist: value LE . value NUM shift, and go to state 1 COL shift, and go to state 2 FUNC shift, and go to state 14 INDEF shift, and go to state 5 '-' shift, and go to state 6 '!' shift, and go to state 7 '~' shift, and go to state 8 '(' shift, and go to state 15 value go to state 51 state 33 18 value: value '+' . value NUM shift, and go to state 1 COL shift, and go to state 2 FUNC shift, and go to state 14 INDEF shift, and go to state 5 '-' shift, and go to state 6 '!' shift, and go to state 7 '~' shift, and go to state 8 '(' shift, and go to state 15 value go to state 52 state 34 19 value: value '-' . value NUM shift, and go to state 1 COL shift, and go to state 2 FUNC shift, and go to state 14 INDEF shift, and go to state 5 '-' shift, and go to state 6 '!' shift, and go to state 7 '~' shift, and go to state 8 '(' shift, and go to state 15 value go to state 53 state 35 20 value: value '*' . value NUM shift, and go to state 1 COL shift, and go to state 2 FUNC shift, and go to state 14 INDEF shift, and go to state 5 '-' shift, and go to state 6 '!' shift, and go to state 7 '~' shift, and go to state 8 '(' shift, and go to state 15 value go to state 54 state 36 21 value: value '/' . value NUM shift, and go to state 1 COL shift, and go to state 2 FUNC shift, and go to state 14 INDEF shift, and go to state 5 '-' shift, and go to state 6 '!' shift, and go to state 7 '~' shift, and go to state 8 '(' shift, and go to state 15 value go to state 55 state 37 22 value: value '%' . value NUM shift, and go to state 1 COL shift, and go to state 2 FUNC shift, and go to state 14 INDEF shift, and go to state 5 '-' shift, and go to state 6 '!' shift, and go to state 7 '~' shift, and go to state 8 '(' shift, and go to state 15 value go to state 56 state 38 18 value: value . '+' value 19 | value . '-' value 20 | value . '*' value 21 | value . '/' value 22 | value . '%' value 23 | value . '&' value 24 | value . '|' value 25 | value . '^' value 29 | '(' value . ')' '|' shift, and go to state 24 '^' shift, and go to state 25 '&' shift, and go to state 26 '+' shift, and go to state 33 '-' shift, and go to state 34 '*' shift, and go to state 35 '/' shift, and go to state 36 '%' shift, and go to state 37 ')' shift, and go to state 40 state 39 5 expr: '(' expr ')' . $default reduce using rule 5 (expr) state 40 29 value: '(' value ')' . $default reduce using rule 29 (value) state 41 3 expr: expr . OR expr 3 | expr OR expr . 4 | expr . AND expr AND shift, and go to state 23 $default reduce using rule 3 (expr) state 42 3 expr: expr . OR expr 4 | expr . AND expr 4 | expr AND expr . $default reduce using rule 4 (expr) state 43 18 value: value . '+' value 19 | value . '-' value 20 | value . '*' value 21 | value . '/' value 22 | value . '%' value 23 | value . '&' value 24 | value . '|' value 24 | value '|' value . 25 | value . '^' value '^' shift, and go to state 25 '&' shift, and go to state 26 '+' shift, and go to state 33 '-' shift, and go to state 34 '*' shift, and go to state 35 '/' shift, and go to state 36 '%' shift, and go to state 37 $default reduce using rule 24 (value) state 44 18 value: value . '+' value 19 | value . '-' value 20 | value . '*' value 21 | value . '/' value 22 | value . '%' value 23 | value . '&' value 24 | value . '|' value 25 | value . '^' value 25 | value '^' value . '&' shift, and go to state 26 '+' shift, and go to state 33 '-' shift, and go to state 34 '*' shift, and go to state 35 '/' shift, and go to state 36 '%' shift, and go to state 37 $default reduce using rule 25 (value) state 45 18 value: value . '+' value 19 | value . '-' value 20 | value . '*' value 21 | value . '/' value 22 | value . '%' value 23 | value . '&' value 23 | value '&' value . 24 | value . '|' value 25 | value . '^' value '+' shift, and go to state 33 '-' shift, and go to state 34 '*' shift, and go to state 35 '/' shift, and go to state 36 '%' shift, and go to state 37 $default reduce using rule 23 (value) state 46 9 rowlist: value NE value . 18 value: value . '+' value 19 | value . '-' value 20 | value . '*' value 21 | value . '/' value 22 | value . '%' value 23 | value . '&' value 24 | value . '|' value 25 | value . '^' value '|' shift, and go to state 24 '^' shift, and go to state 25 '&' shift, and go to state 26 '+' shift, and go to state 33 '-' shift, and go to state 34 '*' shift, and go to state 35 '/' shift, and go to state 36 '%' shift, and go to state 37 $default reduce using rule 9 (rowlist) state 47 8 rowlist: value EQ value . 18 value: value . '+' value 19 | value . '-' value 20 | value . '*' value 21 | value . '/' value 22 | value . '%' value 23 | value . '&' value 24 | value . '|' value 25 | value . '^' value '|' shift, and go to state 24 '^' shift, and go to state 25 '&' shift, and go to state 26 '+' shift, and go to state 33 '-' shift, and go to state 34 '*' shift, and go to state 35 '/' shift, and go to state 36 '%' shift, and go to state 37 $default reduce using rule 8 (rowlist) state 48 10 rowlist: value '<' value . 18 value: value . '+' value 19 | value . '-' value 20 | value . '*' value 21 | value . '/' value 22 | value . '%' value 23 | value . '&' value 24 | value . '|' value 25 | value . '^' value '|' shift, and go to state 24 '^' shift, and go to state 25 '&' shift, and go to state 26 '+' shift, and go to state 33 '-' shift, and go to state 34 '*' shift, and go to state 35 '/' shift, and go to state 36 '%' shift, and go to state 37 $default reduce using rule 10 (rowlist) state 49 12 rowlist: value '>' value . 18 value: value . '+' value 19 | value . '-' value 20 | value . '*' value 21 | value . '/' value 22 | value . '%' value 23 | value . '&' value 24 | value . '|' value 25 | value . '^' value '|' shift, and go to state 24 '^' shift, and go to state 25 '&' shift, and go to state 26 '+' shift, and go to state 33 '-' shift, and go to state 34 '*' shift, and go to state 35 '/' shift, and go to state 36 '%' shift, and go to state 37 $default reduce using rule 12 (rowlist) state 50 13 rowlist: value GE value . 18 value: value . '+' value 19 | value . '-' value 20 | value . '*' value 21 | value . '/' value 22 | value . '%' value 23 | value . '&' value 24 | value . '|' value 25 | value . '^' value '|' shift, and go to state 24 '^' shift, and go to state 25 '&' shift, and go to state 26 '+' shift, and go to state 33 '-' shift, and go to state 34 '*' shift, and go to state 35 '/' shift, and go to state 36 '%' shift, and go to state 37 $default reduce using rule 13 (rowlist) state 51 11 rowlist: value LE value . 18 value: value . '+' value 19 | value . '-' value 20 | value . '*' value 21 | value . '/' value 22 | value . '%' value 23 | value . '&' value 24 | value . '|' value 25 | value . '^' value '|' shift, and go to state 24 '^' shift, and go to state 25 '&' shift, and go to state 26 '+' shift, and go to state 33 '-' shift, and go to state 34 '*' shift, and go to state 35 '/' shift, and go to state 36 '%' shift, and go to state 37 $default reduce using rule 11 (rowlist) state 52 18 value: value . '+' value 18 | value '+' value . 19 | value . '-' value 20 | value . '*' value 21 | value . '/' value 22 | value . '%' value 23 | value . '&' value 24 | value . '|' value 25 | value . '^' value '*' shift, and go to state 35 '/' shift, and go to state 36 '%' shift, and go to state 37 $default reduce using rule 18 (value) state 53 18 value: value . '+' value 19 | value . '-' value 19 | value '-' value . 20 | value . '*' value 21 | value . '/' value 22 | value . '%' value 23 | value . '&' value 24 | value . '|' value 25 | value . '^' value '*' shift, and go to state 35 '/' shift, and go to state 36 '%' shift, and go to state 37 $default reduce using rule 19 (value) state 54 18 value: value . '+' value 19 | value . '-' value 20 | value . '*' value 20 | value '*' value . 21 | value . '/' value 22 | value . '%' value 23 | value . '&' value 24 | value . '|' value 25 | value . '^' value $default reduce using rule 20 (value) state 55 18 value: value . '+' value 19 | value . '-' value 20 | value . '*' value 21 | value . '/' value 21 | value '/' value . 22 | value . '%' value 23 | value . '&' value 24 | value . '|' value 25 | value . '^' value $default reduce using rule 21 (value) state 56 18 value: value . '+' value 19 | value . '-' value 20 | value . '*' value 21 | value . '/' value 22 | value . '%' value 22 | value '%' value . 23 | value . '&' value 24 | value . '|' value 25 | value . '^' value $default reduce using rule 22 (value) funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/filter/idx.tab.c000066400000000000000000001766241256243640000235000ustar00rootroot00000000000000/* A Bison parser, made by GNU Bison 2.0. */ /* Skeleton parser for GLR parsing with Bison, Copyright (C) 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. */ /* This is the parser code for GLR (Generalized LR) parser. */ #include #include #include #include #include /* Identify Bison output. */ #define YYBISON 1 /* Skeleton name. */ #define YYSKELETON_NAME "glr.c" /* Pure parsers. */ #define YYPURE 0 /* Using locations. */ #define YYLSP_NEEDED 0 /* Substitute the variable and function names. */ #define yyparse idxparse #define yylex idxlex #define yyerror idxerror #define yylval idxlval #define yychar idxchar #define yydebug idxdebug #define yynerrs idxnerrs #define yylloc idxlloc /* Tokens. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE /* Put the tokens into the symbol table, so that GDB and other debuggers know about them. */ enum yytokentype { NUM = 258, COL = 259, FUNC = 260, REG = 261, INDEF = 262, OR = 263, AND = 264, NE = 265, EQ = 266, GE = 267, LE = 268, UMINUS = 269 }; #endif #define NUM 258 #define COL 259 #define FUNC 260 #define REG 261 #define INDEF 262 #define OR 263 #define AND 264 #define NE 265 #define EQ 266 #define GE 267 #define LE 268 #define UMINUS 269 /* Copy the first part of user declarations. */ #line 1 "idx.y" #include #include /* Enabling traces. */ #ifndef YYDEBUG # define YYDEBUG 0 #endif /* Enabling verbose error messages. */ #ifdef YYERROR_VERBOSE # undef YYERROR_VERBOSE # define YYERROR_VERBOSE 1 #else # define YYERROR_VERBOSE 0 #endif #if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) #line 6 "idx.y" typedef union YYSTYPE { idxrowrec *row; idxvalrec *val; } YYSTYPE; /* Line 186 of glr.c. */ #line 115 "idx.tab.c" # define YYSTYPE_IS_DECLARED 1 # define YYSTYPE_IS_TRIVIAL 1 #endif #if ! defined (YYLTYPE) && ! defined (YYLTYPE_IS_DECLARED) typedef struct YYLTYPE { char yydummy; } YYLTYPE; # define YYLTYPE_IS_DECLARED 1 # define YYLTYPE_IS_TRIVIAL 1 #endif /* Default (constant) value used for initialization for null right-hand sides. Unlike the standard yacc.c template, here we set the default value of $$ to a zeroed-out value. Since the default value is undefined, this behavior is technically correct. */ static YYSTYPE yyval_default; /* Copy the second part of user declarations. */ /* Line 217 of glr.c. */ #line 142 "idx.tab.c" #ifndef YYFREE # define YYFREE free #endif #ifndef YYMALLOC # define YYMALLOC malloc #endif #ifndef YYREALLOC # define YYREALLOC realloc #endif #ifdef __cplusplus typedef bool yybool; #else typedef unsigned char yybool; #endif #define yytrue 1 #define yyfalse 0 /*-----------------. | GCC extensions. | `-----------------*/ #ifndef __attribute__ /* This feature is available in gcc versions 2.5 and later. */ # if !defined (__GNUC__) || __GNUC__ < 2 || \ (__GNUC__ == 2 && __GNUC_MINOR__ < 5) || __STRICT_ANSI__ # define __attribute__(Spec) /* empty */ # endif #endif #ifndef YYASSERT # define YYASSERT(condition) ((void) ((condition) || (abort (), 0))) #endif #ifndef ATTRIBUTE_UNUSED # define ATTRIBUTE_UNUSED __attribute__ ((__unused__)) #endif /* YYFINAL -- State number of the termination state. */ #define YYFINAL 21 /* YYLAST -- Last index in YYTABLE. */ #define YYLAST 143 /* YYNTOKENS -- Number of terminals. */ #define YYNTOKENS 29 /* YYNNTS -- Number of nonterminals. */ #define YYNNTS 5 /* YYNRULES -- Number of rules. */ #define YYNRULES 30 /* YYNRULES -- Number of states. */ #define YYNSTATES 57 /* YYMAXRHS -- Maximum number of symbols on right-hand side of rule. */ #define YYMAXRHS 3 /* YYMAXLEFT -- Maximum number of symbols to the left of a handle accessed by $0, $-1, etc., in any rule. */ #define YYMAXLEFT 0 /* YYTRANSLATE(X) -- Bison symbol number corresponding to X. */ #define YYUNDEFTOK 2 #define YYMAXUTOK 269 #define YYTRANSLATE(YYX) \ ((YYX <= 0) ? YYEOF : \ (unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) /* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ static const unsigned char yytranslate[] = { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 24, 2, 2, 2, 23, 12, 2, 27, 28, 21, 19, 2, 20, 2, 22, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 15, 2, 16, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 11, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 10, 2, 25, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 13, 14, 17, 18, 26 }; #if YYDEBUG /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in YYRHS. */ static const unsigned char yyprhs[] = { 0, 0, 3, 5, 7, 11, 15, 19, 21, 23, 27, 31, 35, 39, 43, 47, 49, 51, 53, 55, 59, 63, 67, 71, 75, 79, 83, 87, 90, 93, 96 }; /* YYRHS -- A `-1'-separated list of the rules' RHS. */ static const signed char yyrhs[] = { 30, 0, -1, 31, -1, 32, -1, 31, 8, 31, -1, 31, 9, 31, -1, 27, 31, 28, -1, 6, -1, 5, -1, 33, 14, 33, -1, 33, 13, 33, -1, 33, 15, 33, -1, 33, 18, 33, -1, 33, 16, 33, -1, 33, 17, 33, -1, 3, -1, 4, -1, 7, -1, 5, -1, 33, 19, 33, -1, 33, 20, 33, -1, 33, 21, 33, -1, 33, 22, 33, -1, 33, 23, 33, -1, 33, 12, 33, -1, 33, 10, 33, -1, 33, 11, 33, -1, 24, 33, -1, 25, 33, -1, 20, 33, -1, 27, 33, 28, -1 }; /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ static const unsigned char yyrline[] = { 0, 39, 39, 42, 43, 44, 45, 49, 50, 51, 52, 53, 54, 55, 56, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74 }; #endif #if (YYDEBUG) || YYERROR_VERBOSE /* YYTNME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. First, the terminals, then, starting at YYNTOKENS, nonterminals. */ static const char *const yytname[] = { "$end", "error", "$undefined", "NUM", "COL", "FUNC", "REG", "INDEF", "OR", "AND", "'|'", "'^'", "'&'", "NE", "EQ", "'<'", "'>'", "GE", "LE", "'+'", "'-'", "'*'", "'/'", "'%'", "'!'", "'~'", "UMINUS", "'('", "')'", "$accept", "idx", "expr", "rowlist", "value", 0 }; #endif /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ static const unsigned char yyr1[] = { 0, 29, 30, 31, 31, 31, 31, 32, 32, 32, 32, 32, 32, 32, 32, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33 }; /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ static const unsigned char yyr2[] = { 0, 2, 1, 1, 3, 3, 3, 1, 1, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 3 }; /* YYDPREC[RULE-NUM] -- Dynamic precedence of rule #RULE-NUM (0 if none). */ static const unsigned char yydprec[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; /* YYMERGER[RULE-NUM] -- Index of merging function for rule #RULE-NUM. */ static const unsigned char yymerger[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; /* YYDEFACT[S] -- default rule to reduce with in state S when YYTABLE doesn't specify something else to do. Zero means the default is an error. */ static const unsigned char yydefact[] = { 0, 15, 16, 18, 7, 17, 0, 0, 0, 0, 0, 2, 3, 0, 18, 0, 29, 27, 28, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 30, 4, 5, 25, 26, 24, 10, 9, 11, 13, 14, 12, 19, 20, 21, 22, 23 }; /* YYPDEFGOTO[NTERM-NUM]. */ static const signed char yydefgoto[] = { -1, 10, 11, 12, 13 }; /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ #define YYPACT_NINF -17 static const signed char yypact[] = { 30, -17, -17, 4, -17, -17, 36, 36, 36, 30, 8, 2, -17, 89, -17, 36, -17, -17, -17, 37, 56, -17, 30, 30, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 70, -17, -17, 5, -17, 108, 120, 114, 103, 103, 103, 103, 103, 103, -16, -16, -17, -17, -17 }; /* YYPGOTO[NTERM-NUM]. */ static const signed char yypgoto[] = { -17, -17, 29, -17, -6 }; /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If positive, shift that token. If negative, reduce the rule which number is the opposite. If zero, do what YYDEFACT says. If YYTABLE_NINF, syntax error. */ #define YYTABLE_NINF -9 static const signed char yytable[] = { 16, 17, 18, 20, -8, 35, 36, 37, 21, 38, 22, 23, -8, -8, 23, 0, 0, 0, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, -8, 1, 2, 3, 4, 5, 19, 1, 2, 14, 0, 5, 0, 22, 23, 0, 0, 0, 6, 41, 42, 0, 7, 8, 6, 9, 0, 0, 7, 8, 0, 15, 0, 39, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 24, 25, 26, 0, 40, 0, 0, 0, 0, 33, 34, 35, 36, 37, 0, 0, 0, 0, 40, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 24, 25, 26, 0, 0, 0, 25, 26, 0, 33, 34, 35, 36, 37, 33, 34, 35, 36, 37, 26, 33, 34, 35, 36, 37, 0, 33, 34, 35, 36, 37 }; /* YYCONFLP[YYPACT[STATE-NUM]] -- Pointer into YYCONFL of start of list of conflicting reductions corresponding to action entry for state STATE-NUM in yytable. 0 means no conflicts. The list in yyconfl is terminated by a rule number of 0. */ static const unsigned char yyconflp[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; /* YYCONFL[I] -- lists of conflicting rule numbers, each terminated by 0, pointed into by YYCONFLP. */ static const short int yyconfl[] = { 0, 18, 0 }; static const signed char yycheck[] = { 6, 7, 8, 9, 0, 21, 22, 23, 0, 15, 8, 9, 8, 9, 9, -1, -1, -1, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 28, 3, 4, 5, 6, 7, 9, 3, 4, 5, -1, 7, -1, 8, 9, -1, -1, -1, 20, 22, 23, -1, 24, 25, 20, 27, -1, -1, 24, 25, -1, 27, -1, 28, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 10, 11, 12, -1, 28, -1, -1, -1, -1, 19, 20, 21, 22, 23, -1, -1, -1, -1, 28, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 10, 11, 12, -1, -1, -1, 11, 12, -1, 19, 20, 21, 22, 23, 19, 20, 21, 22, 23, 12, 19, 20, 21, 22, 23, -1, 19, 20, 21, 22, 23 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing symbol of state STATE-NUM. */ static const unsigned char yystos[] = { 0, 3, 4, 5, 6, 7, 20, 24, 25, 27, 30, 31, 32, 33, 5, 27, 33, 33, 33, 31, 33, 0, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 33, 28, 28, 31, 31, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33 }; /* Prevent warning if -Wmissing-prototypes. */ int yyparse (void); /* Error token number */ #define YYTERROR 1 /* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. If N is 0, then set CURRENT to the empty location which ends the previous symbol: RHS[0] (always defined). */ #ifndef YYLLOC_DEFAULT # define YYLLOC_DEFAULT(Current, Rhs, N) ((void) 0) #endif #ifndef YY_LOCATION_PRINT # define YY_LOCATION_PRINT(File, Loc) ((void) 0) #endif /* YYLEX -- calling `yylex' with the right arguments. */ #define YYLEX yylex () YYSTYPE yylval; YYLTYPE yylloc; int yynerrs; int yychar; static const int YYEOF = 0; static const int YYEMPTY = -2; typedef enum { yyok, yyaccept, yyabort, yyerr } YYRESULTTAG; #define YYCHK(YYE) \ do { YYRESULTTAG yyflag = YYE; if (yyflag != yyok) return yyflag; } \ while (0) #if YYDEBUG #if ! defined (YYFPRINTF) # define YYFPRINTF fprintf #endif # define YYDPRINTF(Args) \ do { \ if (yydebug) \ YYFPRINTF Args; \ } while (0) /*--------------------------------. | Print this symbol on YYOUTPUT. | `--------------------------------*/ static void yysymprint (FILE *yyoutput, int yytype, YYSTYPE *yyvaluep) { /* Pacify ``unused variable'' warnings. */ (void) yyvaluep; if (yytype < YYNTOKENS) YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); else YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); # ifdef YYPRINT if (yytype < YYNTOKENS) YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); # endif switch (yytype) { default: break; } YYFPRINTF (yyoutput, ")"); } # define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ do { \ if (yydebug) \ { \ YYFPRINTF (stderr, "%s ", Title); \ yysymprint (stderr, \ Type, Value); \ YYFPRINTF (stderr, "\n"); \ } \ } while (0) /* Nonzero means print parse trace. It is left uninitialized so that multiple parsers can coexist. */ int yydebug; #else /* !YYDEBUG */ # define YYDPRINTF(Args) # define YY_SYMBOL_PRINT(Title, Type, Value, Location) #endif /* !YYDEBUG */ /* YYINITDEPTH -- initial size of the parser's stacks. */ #ifndef YYINITDEPTH # define YYINITDEPTH 200 #endif /* YYMAXDEPTH -- maximum size the stacks can grow to (effective only if the built-in stack extension method is used). Do not make this value too large; the results are undefined if SIZE_MAX < YYMAXDEPTH * sizeof (GLRStackItem) evaluated with infinite-precision integer arithmetic. */ #ifndef YYMAXDEPTH # define YYMAXDEPTH 10000 #endif /* Minimum number of free items on the stack allowed after an allocation. This is to allow allocation and initialization to be completed by functions that call expandGLRStack before the stack is expanded, thus insuring that all necessary pointers get properly redirected to new data. */ #define YYHEADROOM 2 #if (! defined (YYSTACKEXPANDABLE) \ && (! defined (__cplusplus) \ || (defined (YYSTYPE_IS_TRIVIAL) && YYSTYPE_IS_TRIVIAL))) #define YYSTACKEXPANDABLE 1 #else #define YYSTACKEXPANDABLE 0 #endif /** State numbers, as in LALR(1) machine */ typedef int yyStateNum; /** Rule numbers, as in LALR(1) machine */ typedef int yyRuleNum; /** Grammar symbol */ typedef short int yySymbol; /** Item references, as in LALR(1) machine */ typedef short int yyItemNum; typedef struct yyGLRState yyGLRState; typedef struct yySemanticOption yySemanticOption; typedef union yyGLRStackItem yyGLRStackItem; typedef struct yyGLRStack yyGLRStack; typedef struct yyGLRStateSet yyGLRStateSet; struct yyGLRState { yybool yyisState; yybool yyresolved; yyStateNum yylrState; yyGLRState* yypred; size_t yyposn; union { yySemanticOption* yyfirstVal; YYSTYPE yysval; } yysemantics; YYLTYPE yyloc; }; struct yyGLRStateSet { yyGLRState** yystates; size_t yysize, yycapacity; }; struct yySemanticOption { yybool yyisState; yyRuleNum yyrule; yyGLRState* yystate; yySemanticOption* yynext; }; union yyGLRStackItem { yyGLRState yystate; yySemanticOption yyoption; }; struct yyGLRStack { int yyerrflag; int yyerrState; yySymbol* yytokenp; jmp_buf yyexception_buffer; yyGLRStackItem* yyitems; yyGLRStackItem* yynextFree; int yyspaceLeft; yyGLRState* yysplitPoint; yyGLRState* yylastDeleted; yyGLRStateSet yytops; }; static void yyinitGLRStack (yyGLRStack* yystack, size_t yysize); static void yyexpandGLRStack (yyGLRStack* yystack); static void yyfreeGLRStack (yyGLRStack* yystack); static void yyFail (yyGLRStack* yystack, const char* yyformat, ...) { yystack->yyerrflag = 1; if (yyformat != NULL) { char yymsg[256]; va_list yyap; va_start (yyap, yyformat); vsprintf (yymsg, yyformat, yyap); yyerror (yymsg); } longjmp (yystack->yyexception_buffer, 1); } #if YYDEBUG || YYERROR_VERBOSE /** A printable representation of TOKEN. Valid until next call to * tokenName. */ static inline const char* yytokenName (yySymbol yytoken) { if (yytoken == YYEMPTY) return ""; return yytname[yytoken]; } #endif /** Fill in YYVSP[YYLOW1 .. YYLOW0-1] from the chain of states starting * at YYVSP[YYLOW0].yystate.yypred. Leaves YYVSP[YYLOW1].yystate.yypred * containing the pointer to the next state in the chain. Assumes * YYLOW1 < YYLOW0. */ static void yyfillin (yyGLRStackItem *, int, int) ATTRIBUTE_UNUSED; static void yyfillin (yyGLRStackItem *yyvsp, int yylow0, int yylow1) { yyGLRState* s; int i; s = yyvsp[yylow0].yystate.yypred; for (i = yylow0-1; i >= yylow1; i -= 1) { YYASSERT (s->yyresolved); yyvsp[i].yystate.yyresolved = yytrue; yyvsp[i].yystate.yysemantics.yysval = s->yysemantics.yysval; yyvsp[i].yystate.yyloc = s->yyloc; s = yyvsp[i].yystate.yypred = s->yypred; } } /* Do nothing if YYNORMAL or if *YYLOW <= YYLOW1. Otherwise, fill in YYVSP[YYLOW1 .. *YYLOW-1] as in yyfillin and set *YYLOW = YYLOW1. For convenience, always return YYLOW1. */ static inline int yyfill (yyGLRStackItem *, int *, int, yybool) ATTRIBUTE_UNUSED; static inline int yyfill (yyGLRStackItem *yyvsp, int *yylow, int yylow1, yybool yynormal) { if (!yynormal && yylow1 < *yylow) { yyfillin (yyvsp, *yylow, yylow1); *yylow = yylow1; } return yylow1; } /** Perform user action for rule number YYN, with RHS length YYRHSLEN, * and top stack item YYVSP. YYLVALP points to place to put semantic * value ($$), and yylocp points to place for location information * (@$). Returns yyok for normal return, yyaccept for YYACCEPT, * yyerr for YYERROR, yyabort for YYABORT. */ static YYRESULTTAG yyuserAction (yyRuleNum yyn, int yyrhslen, yyGLRStackItem* yyvsp, YYSTYPE* yyvalp, YYLTYPE* yylocp ATTRIBUTE_UNUSED, yyGLRStack* yystack ) { yybool yynormal ATTRIBUTE_UNUSED = (yystack->yysplitPoint == NULL); int yylow; # undef yyerrok # define yyerrok (yystack->yyerrState = 0) # undef YYACCEPT # define YYACCEPT return yyaccept # undef YYABORT # define YYABORT return yyabort # undef YYERROR # define YYERROR return yyerrok, yyerr # undef YYRECOVERING # define YYRECOVERING (yystack->yyerrState != 0) # undef yyclearin # define yyclearin (yychar = *(yystack->yytokenp) = YYEMPTY) # undef YYFILL # define YYFILL(N) yyfill (yyvsp, &yylow, N, yynormal) # undef YYBACKUP # define YYBACKUP(Token, Value) \ return yyerror ("syntax error: cannot back up"), \ yyerrok, yyerr yylow = 1; if (yyrhslen == 0) *yyvalp = yyval_default; else *yyvalp = yyvsp[YYFILL (1-yyrhslen)].yystate.yysemantics.yysval; YYLLOC_DEFAULT (*yylocp, yyvsp - yyrhslen, yyrhslen); switch (yyn) { case 2: #line 39 "idx.y" { idxall((((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.row)); ;} break; case 4: #line 43 "idx.y" { ((*yyvalp).row) = idxor((((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.row),(((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.row)); ;} break; case 5: #line 44 "idx.y" { ((*yyvalp).row) = idxand((((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.row),(((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.row)); ;} break; case 6: #line 45 "idx.y" { ((*yyvalp).row) = (((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.row); ;} break; case 7: #line 49 "idx.y" { ((*yyvalp).row) = idxrowreg((((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.val)); ;} break; case 8: #line 50 "idx.y" { ((*yyvalp).row) = idxrowfun((((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.val)); ;} break; case 9: #line 51 "idx.y" { ((*yyvalp).row) = idxroweq((((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.val),(((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.val)); ;} break; case 10: #line 52 "idx.y" { ((*yyvalp).row) = idxrowne((((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.val),(((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.val)); ;} break; case 11: #line 53 "idx.y" { ((*yyvalp).row) = idxrowlt((((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.val),(((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.val)); ;} break; case 12: #line 54 "idx.y" { ((*yyvalp).row) = idxrowle((((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.val),(((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.val)); ;} break; case 13: #line 55 "idx.y" { ((*yyvalp).row) = idxrowgt((((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.val),(((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.val)); ;} break; case 14: #line 56 "idx.y" { ((*yyvalp).row) = idxrowge((((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.val),(((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.val)); ;} break; case 19: #line 63 "idx.y" { ((*yyvalp).val) = idxvaladd((((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.val),(((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.val)); ;} break; case 20: #line 64 "idx.y" { ((*yyvalp).val) = idxvalsub((((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.val),(((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.val)); ;} break; case 21: #line 65 "idx.y" { ((*yyvalp).val) = idxvalmul((((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.val),(((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.val)); ;} break; case 22: #line 66 "idx.y" { ((*yyvalp).val) = idxvaldiv((((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.val),(((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.val)); ;} break; case 23: #line 67 "idx.y" { ((*yyvalp).val) = idxvalmod((((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.val),(((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.val)); ;} break; case 24: #line 68 "idx.y" { ((*yyvalp).val) = idxvaland((((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.val),(((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.val)); ;} break; case 25: #line 69 "idx.y" { ((*yyvalp).val) = idxvalor((((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.val),(((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.val)); ;} break; case 26: #line 70 "idx.y" { ((*yyvalp).val) = idxvalxor((((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.val),(((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.val)); ;} break; case 27: #line 71 "idx.y" { ((*yyvalp).val) = idxvalnot((((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.val)); ;} break; case 28: #line 72 "idx.y" { ((*yyvalp).val) = idxvalcom((((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.val)); ;} break; case 29: #line 73 "idx.y" { ((*yyvalp).val) = idxvalmin((((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.val)); ;} break; case 30: #line 74 "idx.y" { ((*yyvalp).val) = (((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.val); ;} break; } return yyok; # undef yyerrok # undef YYABORT # undef YYACCEPT # undef YYERROR # undef YYBACKUP # undef yyclearin # undef YYRECOVERING /* Line 750 of glr.c. */ #line 890 "idx.tab.c" } static void yyuserMerge (int yyn, YYSTYPE* yy0, YYSTYPE* yy1) { /* `Use' the arguments. */ (void) yy0; (void) yy1; switch (yyn) { } } /* Bison grammar-table manipulation. */ /*-----------------------------------------------. | Release the memory associated to this symbol. | `-----------------------------------------------*/ static void yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep) { /* Pacify ``unused variable'' warnings. */ (void) yyvaluep; if (!yymsg) yymsg = "Deleting"; YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); switch (yytype) { default: break; } } /** Number of symbols composing the right hand side of rule #RULE. */ static inline int yyrhsLength (yyRuleNum yyrule) { return yyr2[yyrule]; } /** Left-hand-side symbol for rule #RULE. */ static inline yySymbol yylhsNonterm (yyRuleNum yyrule) { return yyr1[yyrule]; } #define yyis_pact_ninf(yystate) \ ((yystate) == YYPACT_NINF) /** True iff LR state STATE has only a default reduction (regardless * of token). */ static inline yybool yyisDefaultedState (yyStateNum yystate) { return yyis_pact_ninf (yypact[yystate]); } /** The default reduction for STATE, assuming it has one. */ static inline yyRuleNum yydefaultAction (yyStateNum yystate) { return yydefact[yystate]; } #define yyis_table_ninf(yytable_value) \ 0 /** Set *YYACTION to the action to take in YYSTATE on seeing YYTOKEN. * Result R means * R < 0: Reduce on rule -R. * R = 0: Error. * R > 0: Shift to state R. * Set *CONFLICTS to a pointer into yyconfl to 0-terminated list of * conflicting reductions. */ static inline void yygetLRActions (yyStateNum yystate, int yytoken, int* yyaction, const short int** yyconflicts) { int yyindex = yypact[yystate] + yytoken; if (yyindex < 0 || YYLAST < yyindex || yycheck[yyindex] != yytoken) { *yyaction = -yydefact[yystate]; *yyconflicts = yyconfl; } else if (! yyis_table_ninf (yytable[yyindex])) { *yyaction = yytable[yyindex]; *yyconflicts = yyconfl + yyconflp[yyindex]; } else { *yyaction = 0; *yyconflicts = yyconfl + yyconflp[yyindex]; } } static inline yyStateNum yyLRgotoState (yyStateNum yystate, yySymbol yylhs) { int yyr; yyr = yypgoto[yylhs - YYNTOKENS] + yystate; if (0 <= yyr && yyr <= YYLAST && yycheck[yyr] == yystate) return yytable[yyr]; else return yydefgoto[yylhs - YYNTOKENS]; } static inline yybool yyisShiftAction (int yyaction) { return 0 < yyaction; } static inline yybool yyisErrorAction (int yyaction) { return yyaction == 0; } /* GLRStates */ static void yyaddDeferredAction (yyGLRStack* yystack, yyGLRState* yystate, yyGLRState* rhs, yyRuleNum yyrule) { yySemanticOption* yynewItem; yynewItem = &yystack->yynextFree->yyoption; yystack->yyspaceLeft -= 1; yystack->yynextFree += 1; yynewItem->yyisState = yyfalse; yynewItem->yystate = rhs; yynewItem->yyrule = yyrule; yynewItem->yynext = yystate->yysemantics.yyfirstVal; yystate->yysemantics.yyfirstVal = yynewItem; if (yystack->yyspaceLeft < YYHEADROOM) yyexpandGLRStack (yystack); } /* GLRStacks */ /** Initialize SET to a singleton set containing an empty stack. */ static void yyinitStateSet (yyGLRStateSet* yyset) { yyset->yysize = 1; yyset->yycapacity = 16; yyset->yystates = (yyGLRState**) YYMALLOC (16 * sizeof yyset->yystates[0]); yyset->yystates[0] = NULL; } static void yyfreeStateSet (yyGLRStateSet* yyset) { YYFREE (yyset->yystates); } /** Initialize STACK to a single empty stack, with total maximum * capacity for all stacks of SIZE. */ static void yyinitGLRStack (yyGLRStack* yystack, size_t yysize) { yystack->yyerrflag = 0; yystack->yyerrState = 0; yynerrs = 0; yystack->yyspaceLeft = yysize; yystack->yynextFree = yystack->yyitems = (yyGLRStackItem*) YYMALLOC (yysize * sizeof yystack->yynextFree[0]); yystack->yysplitPoint = NULL; yystack->yylastDeleted = NULL; yyinitStateSet (&yystack->yytops); } #define YYRELOC(YYFROMITEMS,YYTOITEMS,YYX,YYTYPE) \ &((YYTOITEMS) - ((YYFROMITEMS) - (yyGLRStackItem*) (YYX)))->YYTYPE /** If STACK is expandable, extend it. WARNING: Pointers into the stack from outside should be considered invalid after this call. We always expand when there are 1 or fewer items left AFTER an allocation, so that we can avoid having external pointers exist across an allocation. */ static void yyexpandGLRStack (yyGLRStack* yystack) { #if YYSTACKEXPANDABLE yyGLRStack yynewStack; yyGLRStackItem* yyp0, *yyp1; size_t yysize, yynewSize; size_t yyn; yysize = yystack->yynextFree - yystack->yyitems; if (YYMAXDEPTH <= yysize) yyFail (yystack, "parser stack overflow"); yynewSize = 2*yysize; if (YYMAXDEPTH < yynewSize) yynewSize = YYMAXDEPTH; yyinitGLRStack (&yynewStack, yynewSize); for (yyp0 = yystack->yyitems, yyp1 = yynewStack.yyitems, yyn = yysize; 0 < yyn; yyn -= 1, yyp0 += 1, yyp1 += 1) { *yyp1 = *yyp0; if (*(yybool *) yyp0) { yyGLRState* yys0 = &yyp0->yystate; yyGLRState* yys1 = &yyp1->yystate; if (yys0->yypred != NULL) yys1->yypred = YYRELOC (yyp0, yyp1, yys0->yypred, yystate); if (! yys0->yyresolved && yys0->yysemantics.yyfirstVal != NULL) yys1->yysemantics.yyfirstVal = YYRELOC(yyp0, yyp1, yys0->yysemantics.yyfirstVal, yyoption); } else { yySemanticOption* yyv0 = &yyp0->yyoption; yySemanticOption* yyv1 = &yyp1->yyoption; if (yyv0->yystate != NULL) yyv1->yystate = YYRELOC (yyp0, yyp1, yyv0->yystate, yystate); if (yyv0->yynext != NULL) yyv1->yynext = YYRELOC (yyp0, yyp1, yyv0->yynext, yyoption); } } if (yystack->yysplitPoint != NULL) yystack->yysplitPoint = YYRELOC (yystack->yyitems, yynewStack.yyitems, yystack->yysplitPoint, yystate); for (yyn = 0; yyn < yystack->yytops.yysize; yyn += 1) if (yystack->yytops.yystates[yyn] != NULL) yystack->yytops.yystates[yyn] = YYRELOC (yystack->yyitems, yynewStack.yyitems, yystack->yytops.yystates[yyn], yystate); YYFREE (yystack->yyitems); yystack->yyitems = yynewStack.yyitems; yystack->yynextFree = yynewStack.yynextFree + yysize; yystack->yyspaceLeft = yynewStack.yyspaceLeft - yysize; #else yyFail (yystack, "parser stack overflow"); #endif } static void yyfreeGLRStack (yyGLRStack* yystack) { YYFREE (yystack->yyitems); yyfreeStateSet (&yystack->yytops); } /** Assuming that S is a GLRState somewhere on STACK, update the * splitpoint of STACK, if needed, so that it is at least as deep as * S. */ static inline void yyupdateSplit (yyGLRStack* yystack, yyGLRState* yys) { if (yystack->yysplitPoint != NULL && yystack->yysplitPoint > yys) yystack->yysplitPoint = yys; } /** Invalidate stack #K in STACK. */ static inline void yymarkStackDeleted (yyGLRStack* yystack, int yyk) { if (yystack->yytops.yystates[yyk] != NULL) yystack->yylastDeleted = yystack->yytops.yystates[yyk]; yystack->yytops.yystates[yyk] = NULL; } /** Undelete the last stack that was marked as deleted. Can only be done once after a deletion, and only when all other stacks have been deleted. */ static void yyundeleteLastStack (yyGLRStack* yystack) { if (yystack->yylastDeleted == NULL || yystack->yytops.yysize != 0) return; yystack->yytops.yystates[0] = yystack->yylastDeleted; yystack->yytops.yysize = 1; YYDPRINTF ((stderr, "Restoring last deleted stack as stack #0.\n")); yystack->yylastDeleted = NULL; } static inline void yyremoveDeletes (yyGLRStack* yystack) { size_t yyi, yyj; yyi = yyj = 0; while (yyj < yystack->yytops.yysize) { if (yystack->yytops.yystates[yyi] == NULL) { if (yyi == yyj) { YYDPRINTF ((stderr, "Removing dead stacks.\n")); } yystack->yytops.yysize -= 1; } else { yystack->yytops.yystates[yyj] = yystack->yytops.yystates[yyi]; if (yyj != yyi) { YYDPRINTF ((stderr, "Rename stack %lu -> %lu.\n", (unsigned long int) yyi, (unsigned long int) yyj)); } yyj += 1; } yyi += 1; } } /** Shift to a new state on stack #K of STACK, corresponding to LR state * LRSTATE, at input position POSN, with (resolved) semantic value SVAL. */ static inline void yyglrShift (yyGLRStack* yystack, int yyk, yyStateNum yylrState, size_t yyposn, YYSTYPE yysval, YYLTYPE* yylocp) { yyGLRStackItem* yynewItem; yynewItem = yystack->yynextFree; yystack->yynextFree += 1; yystack->yyspaceLeft -= 1; yynewItem->yystate.yyisState = yytrue; yynewItem->yystate.yylrState = yylrState; yynewItem->yystate.yyposn = yyposn; yynewItem->yystate.yyresolved = yytrue; yynewItem->yystate.yypred = yystack->yytops.yystates[yyk]; yystack->yytops.yystates[yyk] = &yynewItem->yystate; yynewItem->yystate.yysemantics.yysval = yysval; yynewItem->yystate.yyloc = *yylocp; if (yystack->yyspaceLeft < YYHEADROOM) yyexpandGLRStack (yystack); } /** Shift stack #K of YYSTACK, to a new state corresponding to LR * state YYLRSTATE, at input position YYPOSN, with the (unresolved) * semantic value of YYRHS under the action for YYRULE. */ static inline void yyglrShiftDefer (yyGLRStack* yystack, int yyk, yyStateNum yylrState, size_t yyposn, yyGLRState* rhs, yyRuleNum yyrule) { yyGLRStackItem* yynewItem; yynewItem = yystack->yynextFree; yynewItem->yystate.yyisState = yytrue; yynewItem->yystate.yylrState = yylrState; yynewItem->yystate.yyposn = yyposn; yynewItem->yystate.yyresolved = yyfalse; yynewItem->yystate.yypred = yystack->yytops.yystates[yyk]; yynewItem->yystate.yysemantics.yyfirstVal = NULL; yystack->yytops.yystates[yyk] = &yynewItem->yystate; yystack->yynextFree += 1; yystack->yyspaceLeft -= 1; yyaddDeferredAction (yystack, &yynewItem->yystate, rhs, yyrule); } /** Pop the symbols consumed by reduction #RULE from the top of stack * #K of STACK, and perform the appropriate semantic action on their * semantic values. Assumes that all ambiguities in semantic values * have been previously resolved. Set *VALP to the resulting value, * and *LOCP to the computed location (if any). Return value is as * for userAction. */ static inline YYRESULTTAG yydoAction (yyGLRStack* yystack, int yyk, yyRuleNum yyrule, YYSTYPE* yyvalp, YYLTYPE* yylocp) { int yynrhs = yyrhsLength (yyrule); if (yystack->yysplitPoint == NULL) { /* Standard special case: single stack. */ yyGLRStackItem* rhs = (yyGLRStackItem*) yystack->yytops.yystates[yyk]; YYASSERT (yyk == 0); yystack->yynextFree -= yynrhs; yystack->yyspaceLeft += yynrhs; yystack->yytops.yystates[0] = & yystack->yynextFree[-1].yystate; return yyuserAction (yyrule, yynrhs, rhs, yyvalp, yylocp, yystack); } else { int yyi; yyGLRState* yys; yyGLRStackItem yyrhsVals[YYMAXRHS + YYMAXLEFT + 1]; yys = yyrhsVals[YYMAXRHS + YYMAXLEFT].yystate.yypred = yystack->yytops.yystates[yyk]; for (yyi = 0; yyi < yynrhs; yyi += 1) { yys = yys->yypred; YYASSERT (yys); } yyupdateSplit (yystack, yys); yystack->yytops.yystates[yyk] = yys; return yyuserAction (yyrule, yynrhs, yyrhsVals + YYMAXRHS + YYMAXLEFT - 1, yyvalp, yylocp, yystack); } } #if !YYDEBUG # define YY_REDUCE_PRINT(K, Rule) #else # define YY_REDUCE_PRINT(K, Rule) \ do { \ if (yydebug) \ yy_reduce_print (K, Rule); \ } while (0) /*----------------------------------------------------------. | Report that the RULE is going to be reduced on stack #K. | `----------------------------------------------------------*/ static inline void yy_reduce_print (size_t yyk, yyRuleNum yyrule) { int yyi; YYFPRINTF (stderr, "Reducing stack %lu by rule %d (line %lu), ", (unsigned long int) yyk, yyrule - 1, (unsigned long int) yyrline[yyrule]); /* Print the symbols being reduced, and their result. */ for (yyi = yyprhs[yyrule]; 0 <= yyrhs[yyi]; yyi++) YYFPRINTF (stderr, "%s ", yytokenName (yyrhs[yyi])); YYFPRINTF (stderr, "-> %s\n", yytokenName (yyr1[yyrule])); } #endif /** Pop items off stack #K of STACK according to grammar rule RULE, * and push back on the resulting nonterminal symbol. Perform the * semantic action associated with RULE and store its value with the * newly pushed state, if FORCEEVAL or if STACK is currently * unambiguous. Otherwise, store the deferred semantic action with * the new state. If the new state would have an identical input * position, LR state, and predecessor to an existing state on the stack, * it is identified with that existing state, eliminating stack #K from * the STACK. In this case, the (necessarily deferred) semantic value is * added to the options for the existing state's semantic value. */ static inline YYRESULTTAG yyglrReduce (yyGLRStack* yystack, size_t yyk, yyRuleNum yyrule, yybool yyforceEval) { size_t yyposn = yystack->yytops.yystates[yyk]->yyposn; if (yyforceEval || yystack->yysplitPoint == NULL) { YYSTYPE yysval; YYLTYPE yyloc; YY_REDUCE_PRINT (yyk, yyrule); YYCHK (yydoAction (yystack, yyk, yyrule, &yysval, &yyloc)); yyglrShift (yystack, yyk, yyLRgotoState (yystack->yytops.yystates[yyk]->yylrState, yylhsNonterm (yyrule)), yyposn, yysval, &yyloc); } else { size_t yyi; int yyn; yyGLRState* yys, *yys0 = yystack->yytops.yystates[yyk]; yyStateNum yynewLRState; for (yys = yystack->yytops.yystates[yyk], yyn = yyrhsLength (yyrule); 0 < yyn; yyn -= 1) { yys = yys->yypred; YYASSERT (yys); } yyupdateSplit (yystack, yys); yynewLRState = yyLRgotoState (yys->yylrState, yylhsNonterm (yyrule)); YYDPRINTF ((stderr, "Reduced stack %lu by rule #%d; action deferred. Now in state %d.\n", (unsigned long int) yyk, yyrule - 1, yynewLRState)); for (yyi = 0; yyi < yystack->yytops.yysize; yyi += 1) if (yyi != yyk && yystack->yytops.yystates[yyi] != NULL) { yyGLRState* yyp, *yysplit = yystack->yysplitPoint; yyp = yystack->yytops.yystates[yyi]; while (yyp != yys && yyp != yysplit && yyp->yyposn >= yyposn) { if (yyp->yylrState == yynewLRState && yyp->yypred == yys) { yyaddDeferredAction (yystack, yyp, yys0, yyrule); yymarkStackDeleted (yystack, yyk); YYDPRINTF ((stderr, "Merging stack %lu into stack %lu.\n", (unsigned long int) yyk, (unsigned long int) yyi)); return yyok; } yyp = yyp->yypred; } } yystack->yytops.yystates[yyk] = yys; yyglrShiftDefer (yystack, yyk, yynewLRState, yyposn, yys0, yyrule); } return yyok; } static int yysplitStack (yyGLRStack* yystack, int yyk) { if (yystack->yysplitPoint == NULL) { YYASSERT (yyk == 0); yystack->yysplitPoint = yystack->yytops.yystates[yyk]; } if (yystack->yytops.yysize >= yystack->yytops.yycapacity) { yystack->yytops.yycapacity *= 2; yystack->yytops.yystates = (yyGLRState**) YYREALLOC (yystack->yytops.yystates, (yystack->yytops.yycapacity * sizeof yystack->yytops.yystates[0])); } yystack->yytops.yystates[yystack->yytops.yysize] = yystack->yytops.yystates[yyk]; yystack->yytops.yysize += 1; return yystack->yytops.yysize-1; } /** True iff Y0 and Y1 represent identical options at the top level. * That is, they represent the same rule applied to RHS symbols * that produce the same terminal symbols. */ static yybool yyidenticalOptions (yySemanticOption* yyy0, yySemanticOption* yyy1) { if (yyy0->yyrule == yyy1->yyrule) { yyGLRState *yys0, *yys1; int yyn; for (yys0 = yyy0->yystate, yys1 = yyy1->yystate, yyn = yyrhsLength (yyy0->yyrule); yyn > 0; yys0 = yys0->yypred, yys1 = yys1->yypred, yyn -= 1) if (yys0->yyposn != yys1->yyposn) return yyfalse; return yytrue; } else return yyfalse; } /** Assuming identicalOptions (Y0,Y1), (destructively) merge the * alternative semantic values for the RHS-symbols of Y1 into the * corresponding semantic value sets of the symbols of Y0. */ static void yymergeOptionSets (yySemanticOption* yyy0, yySemanticOption* yyy1) { yyGLRState *yys0, *yys1; int yyn; for (yys0 = yyy0->yystate, yys1 = yyy1->yystate, yyn = yyrhsLength (yyy0->yyrule); yyn > 0; yys0 = yys0->yypred, yys1 = yys1->yypred, yyn -= 1) if (yys0 == yys1) break; else if (! yys0->yyresolved && ! yys1->yyresolved) { yySemanticOption* yyz; for (yyz = yys0->yysemantics.yyfirstVal; yyz->yynext != NULL; yyz = yyz->yynext) continue; yyz->yynext = yys1->yysemantics.yyfirstVal; } } /** Y0 and Y1 represent two possible actions to take in a given * parsing state; return 0 if no combination is possible, * 1 if user-mergeable, 2 if Y0 is preferred, 3 if Y1 is preferred. */ static int yypreference (yySemanticOption* y0, yySemanticOption* y1) { yyRuleNum r0 = y0->yyrule, r1 = y1->yyrule; int p0 = yydprec[r0], p1 = yydprec[r1]; if (p0 == p1) { if (yymerger[r0] == 0 || yymerger[r0] != yymerger[r1]) return 0; else return 1; } if (p0 == 0 || p1 == 0) return 0; if (p0 < p1) return 3; if (p1 < p0) return 2; return 0; } static YYRESULTTAG yyresolveValue (yySemanticOption* yyoptionList, yyGLRStack* yystack, YYSTYPE* yyvalp, YYLTYPE* yylocp); static YYRESULTTAG yyresolveStates (yyGLRState* yys, int yyn, yyGLRStack* yystack) { YYRESULTTAG yyflag; if (0 < yyn) { YYASSERT (yys->yypred); yyflag = yyresolveStates (yys->yypred, yyn-1, yystack); if (yyflag != yyok) return yyflag; if (! yys->yyresolved) { yyflag = yyresolveValue (yys->yysemantics.yyfirstVal, yystack, &yys->yysemantics.yysval, &yys->yyloc ); if (yyflag != yyok) return yyflag; yys->yyresolved = yytrue; } } return yyok; } static YYRESULTTAG yyresolveAction (yySemanticOption* yyopt, yyGLRStack* yystack, YYSTYPE* yyvalp, YYLTYPE* yylocp) { yyGLRStackItem yyrhsVals[YYMAXRHS + YYMAXLEFT + 1]; int yynrhs; yynrhs = yyrhsLength (yyopt->yyrule); YYCHK (yyresolveStates (yyopt->yystate, yynrhs, yystack)); yyrhsVals[YYMAXRHS + YYMAXLEFT].yystate.yypred = yyopt->yystate; return yyuserAction (yyopt->yyrule, yynrhs, yyrhsVals + YYMAXRHS + YYMAXLEFT - 1, yyvalp, yylocp, yystack); } #if YYDEBUG static void yyreportTree (yySemanticOption* yyx, int yyindent) { int yynrhs = yyrhsLength (yyx->yyrule); int yyi; yyGLRState* yys; yyGLRState* yystates[YYMAXRHS]; yyGLRState yyleftmost_state; for (yyi = yynrhs, yys = yyx->yystate; 0 < yyi; yyi -= 1, yys = yys->yypred) yystates[yyi] = yys; if (yys == NULL) { yyleftmost_state.yyposn = 0; yystates[0] = &yyleftmost_state; } else yystates[0] = yys; if (yyx->yystate->yyposn < yys->yyposn + 1) YYFPRINTF (stderr, "%*s%s -> \n", yyindent, "", yytokenName (yylhsNonterm (yyx->yyrule)), yyx->yyrule); else YYFPRINTF (stderr, "%*s%s -> \n", yyindent, "", yytokenName (yylhsNonterm (yyx->yyrule)), yyx->yyrule, (unsigned long int) (yys->yyposn + 1), (unsigned long int) yyx->yystate->yyposn); for (yyi = 1; yyi <= yynrhs; yyi += 1) { if (yystates[yyi]->yyresolved) { if (yystates[yyi-1]->yyposn+1 > yystates[yyi]->yyposn) YYFPRINTF (stderr, "%*s%s \n", yyindent+2, "", yytokenName (yyrhs[yyprhs[yyx->yyrule]+yyi-1])); else YYFPRINTF (stderr, "%*s%s \n", yyindent+2, "", yytokenName (yyrhs[yyprhs[yyx->yyrule]+yyi-1]), (unsigned long int) (yystates[yyi - 1]->yyposn + 1), (unsigned long int) yystates[yyi]->yyposn); } else yyreportTree (yystates[yyi]->yysemantics.yyfirstVal, yyindent+2); } } #endif static void yyreportAmbiguity (yySemanticOption* yyx0, yySemanticOption* yyx1, yyGLRStack* yystack) { /* `Unused' warnings. */ (void) yyx0; (void) yyx1; #if YYDEBUG YYFPRINTF (stderr, "Ambiguity detected.\n"); YYFPRINTF (stderr, "Option 1,\n"); yyreportTree (yyx0, 2); YYFPRINTF (stderr, "\nOption 2,\n"); yyreportTree (yyx1, 2); YYFPRINTF (stderr, "\n"); #endif yyFail (yystack, "ambiguity detected"); } /** Resolve the ambiguity represented by OPTIONLIST, perform the indicated * actions, and return the result. */ static YYRESULTTAG yyresolveValue (yySemanticOption* yyoptionList, yyGLRStack* yystack, YYSTYPE* yyvalp, YYLTYPE* yylocp) { yySemanticOption* yybest; yySemanticOption* yyp; int yymerge; yybest = yyoptionList; yymerge = 0; for (yyp = yyoptionList->yynext; yyp != NULL; yyp = yyp->yynext) { if (yyidenticalOptions (yybest, yyp)) yymergeOptionSets (yybest, yyp); else switch (yypreference (yybest, yyp)) { case 0: yyreportAmbiguity (yybest, yyp, yystack); break; case 1: yymerge = 1; break; case 2: break; case 3: yybest = yyp; yymerge = 0; break; } } if (yymerge) { int yyprec = yydprec[yybest->yyrule]; YYCHK (yyresolveAction (yybest, yystack, yyvalp, yylocp)); for (yyp = yybest->yynext; yyp != NULL; yyp = yyp->yynext) { if (yyprec == yydprec[yyp->yyrule]) { YYSTYPE yyval1; YYLTYPE yydummy; YYCHK (yyresolveAction (yyp, yystack, &yyval1, &yydummy)); yyuserMerge (yymerger[yyp->yyrule], yyvalp, &yyval1); } } return yyok; } else return yyresolveAction (yybest, yystack, yyvalp, yylocp); } static YYRESULTTAG yyresolveStack (yyGLRStack* yystack) { if (yystack->yysplitPoint != NULL) { yyGLRState* yys; int yyn; for (yyn = 0, yys = yystack->yytops.yystates[0]; yys != yystack->yysplitPoint; yys = yys->yypred, yyn += 1) continue; YYCHK (yyresolveStates (yystack->yytops.yystates[0], yyn, yystack )); } return yyok; } static void yycompressStack (yyGLRStack* yystack) { yyGLRState* yyp, *yyq, *yyr; if (yystack->yytops.yysize != 1 || yystack->yysplitPoint == NULL) return; for (yyp = yystack->yytops.yystates[0], yyq = yyp->yypred, yyr = NULL; yyp != yystack->yysplitPoint; yyr = yyp, yyp = yyq, yyq = yyp->yypred) yyp->yypred = yyr; yystack->yyspaceLeft += yystack->yynextFree - yystack->yyitems; yystack->yynextFree = ((yyGLRStackItem*) yystack->yysplitPoint) + 1; yystack->yyspaceLeft -= yystack->yynextFree - yystack->yyitems; yystack->yysplitPoint = NULL; yystack->yylastDeleted = NULL; while (yyr != NULL) { yystack->yynextFree->yystate = *yyr; yyr = yyr->yypred; yystack->yynextFree->yystate.yypred = & yystack->yynextFree[-1].yystate; yystack->yytops.yystates[0] = &yystack->yynextFree->yystate; yystack->yynextFree += 1; yystack->yyspaceLeft -= 1; } } static YYRESULTTAG yyprocessOneStack (yyGLRStack* yystack, int yyk, size_t yyposn, YYSTYPE* yylvalp, YYLTYPE* yyllocp ) { int yyaction; const short int* yyconflicts; yyRuleNum yyrule; yySymbol* const yytokenp = yystack->yytokenp; while (yystack->yytops.yystates[yyk] != NULL) { yyStateNum yystate = yystack->yytops.yystates[yyk]->yylrState; YYDPRINTF ((stderr, "Stack %d Entering state %d\n", yyk, yystate)); YYASSERT (yystate != YYFINAL); if (yyisDefaultedState (yystate)) { yyrule = yydefaultAction (yystate); if (yyrule == 0) { YYDPRINTF ((stderr, "Stack %d dies.\n", yyk)); yymarkStackDeleted (yystack, yyk); return yyok; } YYCHK (yyglrReduce (yystack, yyk, yyrule, yyfalse)); } else { if (*yytokenp == YYEMPTY) { YYDPRINTF ((stderr, "Reading a token: ")); yychar = YYLEX; *yytokenp = YYTRANSLATE (yychar); YY_SYMBOL_PRINT ("Next token is", *yytokenp, yylvalp, yyllocp); } yygetLRActions (yystate, *yytokenp, &yyaction, &yyconflicts); while (*yyconflicts != 0) { int yynewStack = yysplitStack (yystack, yyk); YYDPRINTF ((stderr, "Splitting off stack %d from %d.\n", yynewStack, yyk)); YYCHK (yyglrReduce (yystack, yynewStack, *yyconflicts, yyfalse)); YYCHK (yyprocessOneStack (yystack, yynewStack, yyposn, yylvalp, yyllocp)); yyconflicts += 1; } if (yyisShiftAction (yyaction)) { YYDPRINTF ((stderr, "On stack %d, ", yyk)); YY_SYMBOL_PRINT ("shifting", *yytokenp, yylvalp, yyllocp); yyglrShift (yystack, yyk, yyaction, yyposn+1, *yylvalp, yyllocp); YYDPRINTF ((stderr, ", now in state #%d\n", yystack->yytops.yystates[yyk]->yylrState)); break; } else if (yyisErrorAction (yyaction)) { YYDPRINTF ((stderr, "Stack %d dies.\n", yyk)); yymarkStackDeleted (yystack, yyk); break; } else YYCHK (yyglrReduce (yystack, yyk, -yyaction, yyfalse)); } } return yyok; } static void yyreportSyntaxError (yyGLRStack* yystack, YYSTYPE* yylvalp, YYLTYPE* yyllocp) { /* `Unused' warnings. */ (void) yylvalp; (void) yyllocp; if (yystack->yyerrState == 0) { #if YYERROR_VERBOSE yySymbol* const yytokenp = yystack->yytokenp; int yyn; yyn = yypact[yystack->yytops.yystates[0]->yylrState]; if (YYPACT_NINF < yyn && yyn < YYLAST) { size_t yysize = 0; const char* yyprefix; char* yymsg; int yyx; /* Start YYX at -YYN if negative to avoid negative indexes in YYCHECK. */ int yyxbegin = yyn < 0 ? -yyn : 0; /* Stay within bounds of both yycheck and yytname. */ int yychecklim = YYLAST - yyn; int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; int yycount = 0; yyprefix = ", expecting "; for (yyx = yyxbegin; yyx < yyxend; ++yyx) if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) { yysize += strlen (yyprefix) + strlen (yytokenName (yyx)); yycount += 1; if (yycount == 5) { yysize = 0; break; } yyprefix = " or "; } yysize += (sizeof ("syntax error, unexpected ") + strlen (yytokenName (*yytokenp))); yymsg = (char*) YYMALLOC (yysize); if (yymsg != 0) { char* yyp = yymsg; sprintf (yyp, "syntax error%s%s", (*yytokenp == YYEMPTY ? "" : ", unexpected "), yytokenName (*yytokenp)); yyp += strlen (yyp); if (yycount < 5) { yyprefix = ", expecting "; for (yyx = yyxbegin; yyx < yyxend; ++yyx) if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) { sprintf (yyp, "%s%s", yyprefix, yytokenName (yyx)); yyp += strlen (yyp); yyprefix = " or "; } } yyerror (yymsg); YYFREE (yymsg); } else yyerror ("syntax error; also virtual memory exhausted"); } else #endif /* YYERROR_VERBOSE */ yyerror ("syntax error"); yynerrs += 1; } } /* Recover from a syntax error on YYSTACK, assuming that YYTOKENP, YYLVALP, and YYLLOCP point to the syntactic category, semantic value, and location of the look-ahead. */ static void yyrecoverSyntaxError (yyGLRStack* yystack, YYSTYPE* yylvalp, YYLTYPE* yyllocp ATTRIBUTE_UNUSED ) { yySymbol* const yytokenp = yystack->yytokenp; size_t yyk; int yyj; if (yystack->yyerrState == 3) /* We just shifted the error token and (perhaps) took some reductions. Skip tokens until we can proceed. */ while (yytrue) { if (*yytokenp == YYEOF) { /* Now pop stack until empty and fail. */ while (yystack->yytops.yystates[0] != NULL) { yyGLRState *yys = yystack->yytops.yystates[0]; yydestruct ("Error: popping", yystos[yys->yylrState], &yys->yysemantics.yysval); yystack->yytops.yystates[0] = yys->yypred; yystack->yynextFree -= 1; yystack->yyspaceLeft += 1; } yyFail (yystack, NULL); } if (*yytokenp != YYEMPTY) { yydestruct ("Error: discarding", *yytokenp, yylvalp); } YYDPRINTF ((stderr, "Reading a token: ")); yychar = YYLEX; *yytokenp = YYTRANSLATE (yychar); YY_SYMBOL_PRINT ("Next token is", *yytokenp, yylvalp, yyllocp); yyj = yypact[yystack->yytops.yystates[0]->yylrState]; if (yyis_pact_ninf (yyj)) return; yyj += *yytokenp; if (yyj < 0 || YYLAST < yyj || yycheck[yyj] != *yytokenp) { if (yydefact[yystack->yytops.yystates[0]->yylrState] != 0) return; } else if (yytable[yyj] != 0 && ! yyis_table_ninf (yytable[yyj])) return; } /* Reduce to one stack. */ for (yyk = 0; yyk < yystack->yytops.yysize; yyk += 1) if (yystack->yytops.yystates[yyk] != NULL) break; if (yyk >= yystack->yytops.yysize) yyFail (yystack, NULL); for (yyk += 1; yyk < yystack->yytops.yysize; yyk += 1) yymarkStackDeleted (yystack, yyk); yyremoveDeletes (yystack); yycompressStack (yystack); /* Now pop stack until we find a state that shifts the error token. */ yystack->yyerrState = 3; while (yystack->yytops.yystates[0] != NULL) { yyGLRState *yys = yystack->yytops.yystates[0]; yyj = yypact[yys->yylrState]; if (! yyis_pact_ninf (yyj)) { yyj += YYTERROR; if (0 <= yyj && yyj <= YYLAST && yycheck[yyj] == YYTERROR && yyisShiftAction (yytable[yyj])) { /* Shift the error token having adjusted its location. */ YYLTYPE yyerrloc; YY_SYMBOL_PRINT ("Shifting", yystos[yytable[yyj]], yylvalp, &yyerrloc); yyglrShift (yystack, 0, yytable[yyj], yys->yyposn, *yylvalp, &yyerrloc); yys = yystack->yytops.yystates[0]; break; } } yydestruct ("Error: popping", yystos[yys->yylrState], &yys->yysemantics.yysval); yystack->yytops.yystates[0] = yys->yypred; yystack->yynextFree -= 1; yystack->yyspaceLeft += 1; } if (yystack->yytops.yystates[0] == NULL) yyFail (yystack, NULL); } #define YYCHK1(YYE) \ do { \ switch (YYE) { \ default: \ break; \ case yyabort: \ yystack.yyerrflag = 1; \ goto yyDone; \ case yyaccept: \ yystack.yyerrflag = 0; \ goto yyDone; \ case yyerr: \ goto yyuser_error; \ } \ } while (0) /*----------. | yyparse. | `----------*/ int yyparse (void) { yySymbol yytoken; yyGLRStack yystack; size_t yyposn; YYSTYPE* const yylvalp = &yylval; YYLTYPE* const yyllocp = &yylloc; yyinitGLRStack (&yystack, YYINITDEPTH); yystack.yytokenp = &yytoken; YYDPRINTF ((stderr, "Starting parse\n")); if (setjmp (yystack.yyexception_buffer) != 0) goto yyDone; yylval = yyval_default; yyglrShift (&yystack, 0, 0, 0, yylval, &yylloc); yytoken = YYEMPTY; yyposn = 0; while (yytrue) { /* For efficiency, we have two loops, the first of which is specialized to deterministic operation (single stack, no potential ambiguity). */ /* Standard mode */ while (yytrue) { yyRuleNum yyrule; int yyaction; const short int* yyconflicts; yyStateNum yystate = yystack.yytops.yystates[0]->yylrState; YYDPRINTF ((stderr, "Entering state %d\n", yystate)); if (yystate == YYFINAL) goto yyDone; if (yyisDefaultedState (yystate)) { yyrule = yydefaultAction (yystate); if (yyrule == 0) { yyreportSyntaxError (&yystack, yylvalp, yyllocp); goto yyuser_error; } YYCHK1 (yyglrReduce (&yystack, 0, yyrule, yytrue)); } else { if (yytoken == YYEMPTY) { YYDPRINTF ((stderr, "Reading a token: ")); yychar = YYLEX; yytoken = YYTRANSLATE (yychar); YY_SYMBOL_PRINT ("Next token is", yytoken, yylvalp, yyllocp); } yygetLRActions (yystate, yytoken, &yyaction, &yyconflicts); if (*yyconflicts != 0) break; if (yyisShiftAction (yyaction)) { YY_SYMBOL_PRINT ("Shifting", yytoken, yylvalp, yyllocp); if (yytoken != YYEOF) yytoken = YYEMPTY; yyposn += 1; yyglrShift (&yystack, 0, yyaction, yyposn, yylval, yyllocp); if (0 < yystack.yyerrState) yystack.yyerrState -= 1; } else if (yyisErrorAction (yyaction)) { yyreportSyntaxError (&yystack, yylvalp, yyllocp); goto yyuser_error; } else YYCHK1 (yyglrReduce (&yystack, 0, -yyaction, yytrue)); } } while (yytrue) { int yys; int yyn = yystack.yytops.yysize; for (yys = 0; yys < yyn; yys += 1) YYCHK1 (yyprocessOneStack (&yystack, yys, yyposn, yylvalp, yyllocp)); yytoken = YYEMPTY; yyposn += 1; yyremoveDeletes (&yystack); if (yystack.yytops.yysize == 0) { yyundeleteLastStack (&yystack); if (yystack.yytops.yysize == 0) yyFail (&yystack, "syntax error"); YYCHK1 (yyresolveStack (&yystack)); YYDPRINTF ((stderr, "Returning to deterministic operation.\n")); yyreportSyntaxError (&yystack, yylvalp, yyllocp); goto yyuser_error; } else if (yystack.yytops.yysize == 1) { YYCHK1 (yyresolveStack (&yystack)); YYDPRINTF ((stderr, "Returning to deterministic operation.\n")); yycompressStack (&yystack); break; } } continue; yyuser_error: yyrecoverSyntaxError (&yystack, yylvalp, yyllocp); yyposn = yystack.yytops.yystates[0]->yyposn; } yyDone: /* On YYABORT, free the lookahead. */ if (yystack.yyerrflag == 1 && yytoken != YYEMPTY) yydestruct ("Error: discarding lookahead", yytoken, yylvalp); yyfreeGLRStack (&yystack); return yystack.yyerrflag; } /* DEBUGGING ONLY */ #ifdef YYDEBUG static void yypstack (yyGLRStack* yystack, int yyk) ATTRIBUTE_UNUSED; static void yypdumpstack (yyGLRStack* yystack) ATTRIBUTE_UNUSED; static void yy_yypstack (yyGLRState* yys) { if (yys->yypred) { yy_yypstack (yys->yypred); fprintf (stderr, " -> "); } fprintf (stderr, "%d@%lu", yys->yylrState, (unsigned long int) yys->yyposn); } static void yypstates (yyGLRState* yyst) { if (yyst == NULL) fprintf (stderr, ""); else yy_yypstack (yyst); fprintf (stderr, "\n"); } static void yypstack (yyGLRStack* yystack, int yyk) { yypstates (yystack->yytops.yystates[yyk]); } #define YYINDEX(YYX) \ ((YYX) == NULL ? -1 : (yyGLRStackItem*) (YYX) - yystack->yyitems) static void yypdumpstack (yyGLRStack* yystack) { yyGLRStackItem* yyp; size_t yyi; for (yyp = yystack->yyitems; yyp < yystack->yynextFree; yyp += 1) { fprintf (stderr, "%3lu. ", (unsigned long int) (yyp - yystack->yyitems)); if (*(yybool *) yyp) { fprintf (stderr, "Res: %d, LR State: %d, posn: %lu, pred: %ld", yyp->yystate.yyresolved, yyp->yystate.yylrState, (unsigned long int) yyp->yystate.yyposn, (long int) YYINDEX (yyp->yystate.yypred)); if (! yyp->yystate.yyresolved) fprintf (stderr, ", firstVal: %ld", (long int) YYINDEX (yyp->yystate.yysemantics.yyfirstVal)); } else { fprintf (stderr, "Option. rule: %d, state: %ld, next: %ld", yyp->yyoption.yyrule, (long int) YYINDEX (yyp->yyoption.yystate), (long int) YYINDEX (yyp->yyoption.yynext)); } fprintf (stderr, "\n"); } fprintf (stderr, "Tops:"); for (yyi = 0; yyi < yystack->yytops.yysize; yyi += 1) fprintf (stderr, "%lu: %ld; ", (unsigned long int) yyi, (long int) YYINDEX (yystack->yytops.yystates[yyi])); fprintf (stderr, "\n"); } #endif #line 77 "idx.y" funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/filter/idx.tab.h000066400000000000000000000036001256243640000234640ustar00rootroot00000000000000/* A Bison parser, made by GNU Bison 2.0. */ /* Skeleton parser for GLR parsing with Bison, Copyright (C) 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. */ /* Tokens. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE /* Put the tokens into the symbol table, so that GDB and other debuggers know about them. */ enum yytokentype { NUM = 258, COL = 259, FUNC = 260, REG = 261, INDEF = 262, OR = 263, AND = 264, NE = 265, EQ = 266, GE = 267, LE = 268, UMINUS = 269 }; #endif #define NUM 258 #define COL 259 #define FUNC 260 #define REG 261 #define INDEF 262 #define OR 263 #define AND 264 #define NE 265 #define EQ 266 #define GE 267 #define LE 268 #define UMINUS 269 #if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) #line 6 "idx.y" typedef union YYSTYPE { idxrowrec *row; idxvalrec *val; } YYSTYPE; /* Line 2089 of glr.c. */ #line 65 "idx.tab.h" # define YYSTYPE_IS_DECLARED 1 # define YYSTYPE_IS_TRIVIAL 1 #endif extern YYSTYPE idxlval; #if ! defined (YYLTYPE) && ! defined (YYLTYPE_IS_DECLARED) typedef struct YYLTYPE { char yydummy; } YYLTYPE; # define YYLTYPE_IS_DECLARED 1 # define YYLTYPE_IS_TRIVIAL 1 #endif funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/filter/idx.y000066400000000000000000000030531256243640000227420ustar00rootroot00000000000000%{ #include #include %} %union{ idxrowrec *row; idxvalrec *val; } %token NUM %token COL %token FUNC %token REG %token INDEF %left OR %left AND %left '|' %left '^' %left '&' %nonassoc EQ NE %nonassoc '<' LE '>' GE %left '+' '-' %left '*' '/' '%' %right '!' '~' UMINUS %type idx %type expr %type rowlist %type value %glr-parser %expect-rr 1 %% /* combines lists of row numbers */ idx: expr { idxall($1); } ; expr: rowlist | expr OR expr { $$ = idxor($1,$3); } | expr AND expr { $$ = idxand($1,$3); } | '(' expr ')' { $$ = $2; } ; /* generates lists of row numbers */ rowlist:REG { $$ = idxrowreg($1); } | FUNC { $$ = idxrowfun($1); } | value EQ value { $$ = idxroweq($1,$3); } | value NE value { $$ = idxrowne($1,$3); } | value '<' value { $$ = idxrowlt($1,$3); } | value LE value { $$ = idxrowle($1,$3); } | value '>' value { $$ = idxrowgt($1,$3); } | value GE value { $$ = idxrowge($1,$3); } ; value: NUM | COL | INDEF | FUNC | value '+' value { $$ = idxvaladd($1,$3); } | value '-' value { $$ = idxvalsub($1,$3); } | value '*' value { $$ = idxvalmul($1,$3); } | value '/' value { $$ = idxvaldiv($1,$3); } | value '%' value { $$ = idxvalmod($1,$3); } | value '&' value { $$ = idxvaland($1,$3); } | value '|' value { $$ = idxvalor($1,$3); } | value '^' value { $$ = idxvalxor($1,$3); } | '!' value { $$ = idxvalnot($2); } | '~' value { $$ = idxvalcom($2); } | '-' value %prec UMINUS { $$ = idxvalmin($2); } | '(' value ')' { $$ = $2; } ; %% funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/filter/idxacts.c000066400000000000000000001472741256243640000236050ustar00rootroot00000000000000/* * Copyright (c) 2005 Smithsonian Astrophysical Observatory */ /* * * idxacts.c -- action routines for idx * */ #include #include #include #if HAVE_LONG_LONG #define LFMT "%lld" #else #define LFMT "%ld" #endif #define IDX_DEBUG 1 #if IDX_DEBUG #define IPRINTF(x) if( idx_debug ) fprintf x #else #define IPRINTF(x) #endif /* used by idx.l, so it must be global */ int idx_debug=0; /* * * private routines * */ #define MAXD 3 static char dbuf[MAXD][SZ_LINE]; static int nd=0; static char _swapped[8]; static int idx_io=IDX_IO_DEFAULT; static char *idxcolname=NULL; static char *idxfilename=NULL; static char *idxfileroot1=NULL; static char *idxfileroot2=NULL; static char *idxpath=NULL; static char *idxsort=NULL; static char fmt[SZ_LINE]; #ifdef ANSI_FUNC static void * _swap(void *ibuf, int isize) #else static void *_swap(ibuf, isize) void *ibuf; int isize; #endif { return ft_dataswap(_swapped, ibuf, isize, isize*8); } #if IDX_DEBUG #ifdef ANSI_FUNC static char * rowdisp(idxrowrec *row) #else static char *rowdisp(row) idxrowrec *row; #endif { int i; char tbuf[SZ_LINE]; if( nd >= MAXD ) nd = 0; *dbuf[nd] = '\0'; switch(row->rtype){ case IDX_ROW_LIST: if( row->s ){ snprintf(dbuf[nd], SZ_LINE-1, "%s[ROW", row->s); } else{ snprintf(dbuf[nd], SZ_LINE-1, "[ROW"); } for(i=0; inrow; i++){ strncat(dbuf[nd], " ", SZ_LINE-1); snprintf(tbuf, SZ_LINE-1, "%d:%d", row->startrow[i], row->stoprow[i]); strncat(dbuf[nd], tbuf, SZ_LINE-1); } strncat(dbuf[nd], "]", SZ_LINE-1); break; case IDX_SORT: snprintf(dbuf[nd], SZ_LINE-1, "[IDX_SORT]"); break; case IDX_OR_SORT: snprintf(dbuf[nd], SZ_LINE-1, "[IDX_OR_SORT]"); break; case IDX_AND_SORT: snprintf(dbuf[nd], SZ_LINE-1, "[IDX_AND_SORT]"); break; case IDX_INDEF: snprintf(dbuf[nd], SZ_LINE-1, "[INDEF]"); break; } if( !*dbuf[nd] ){ snprintf(dbuf[nd], SZ_LINE-1, "type=%d?", row->rtype); } return dbuf[nd++]; } #endif #ifdef ANSI_FUNC static int _idxvalfree(idxvalrec *v) #else static int _idxvalfree(v) idxvalrec *v; #endif { if( !v ) return 0; if( v->s ) xfree(v->s); #ifdef HAVE_SYS_MMAN_H if( v->idata ) munmap(v->idata, v->ilen); #endif /* these are linked (i.e. if iname does not exist, its a copy of another */ if( v->iname && v->igio && v->ifits ){ gclose(v->igio); xfree(v->iname); ft_headfree(v->ifits, 1); } xfree(v); return 1; } #ifdef ANSI_FUNC static int _idxrowfree(idxrowrec *r) #else static int _idxrowfree(r) idxrowrec *r; #endif { int tries=0; int exit_status; if( !r ) return 0; if( r->s ) xfree(r->s); if( r->startrow ) xfree(r->startrow); if( r->stoprow ) xfree(r->stoprow); if( r->ifile ) fclose(r->ifile); else if( r->ichan ) close(r->ichan); if( r->ochan ) close(r->ochan); #if HAVE_MINGW32==0 if( r->pid ){ while( (waitpid(r->pid, &exit_status, WNOHANG)==0) && (tries<10) ){ gsleep(10); tries++; } r->pid = 0; } #endif if( r->fdata ){ #ifdef HAVE_SYS_MMAN_H munmap(r->fdata, r->flen); #endif } xfree(r); return 1; } #ifdef ANSI_FUNC static int _idxstartsort(int type, int *ichan, int *ochan, int *pid) #else static int _idxstartsort(type, ichan, ochan, pid) int type; int *ichan; int *ochan; int *pid; #endif { char *s; char cmd[SZ_LINE]; if( !idxsort ){ if( idxpath ) return 0; if( (s=(char *)getenv("PATH")) ){ idxpath = xstrdup(s); } if( !(idxsort=Find(IDX_SORTPROG, "x", NULL, idxpath)) && !(idxsort=Find(IDX_SORTPROG, "x", NULL, ".")) ){ idxerror("index sort program cannot be found"); return 0; } } /* construct command line for sort program */ switch(type){ case IDX_SORT: snprintf(cmd, SZ_LINE-1, "%s -B4 +i0", idxsort); break; case IDX_OR_SORT: snprintf(cmd, SZ_LINE-1, "%s -B4 +i0 -u", idxsort); break; case IDX_AND_SORT: snprintf(cmd, SZ_LINE-1, "%s -B4 +i0 -D", idxsort); break; default: snprintf(cmd, SZ_LINE-1, "%s -B4 +i0", idxsort); break; } /* start the sort program */ if( !ProcessOpen(cmd, ichan, ochan, pid) ){ idxerror("index sort process cannot be started"); return 0; } return 1; } #ifdef ANSI_FUNC static int _idxwritesort(idxrowrec *x, idxrowrec *row) #else static int _idxwritesort(x, row) idxrowrec *x; idxrowrec *row; #endif { int i, j, k=0; int rowsize; int ioffset; int itype; int isize; int obuf[SZ_LINE]; long ipos; char nbuf[8]; idxvalrec *v=NULL; v = row->v; rowsize = ft_naxis(v->ifits, 1); ioffset = v->ioffset; itype = v->itype; isize = ft_sizeof(v->itype); for(i=0; inrow; i++){ for(j=row->startrow[i]; j<=row->stoprow[i]; j++){ ipos = v->ifits->data + ((j-1)*rowsize) + ioffset; switch( idx_io ){ case IDX_IO_MMAP: if( v->idata ){ #ifdef HAVE_SYS_MMAN_H memcpy(nbuf, &v->idata[ipos], isize); #else idxerror("mmap not supported on this system"); #endif break; } case IDX_IO_LSEEK: if( gseek(v->igio, (off_t)ipos, 0) < 0 ){ idxerror("can't lseek into index file"); return 0; } if( !gread(v->igio, nbuf, isize, 1) ){ idxerror("can't read index file"); return 0; } break; } switch(itype){ case 'B': obuf[k++] = (int)*(unsigned char *)(nbuf); break; case 'I': obuf[k++] = (int)*(short *)_swap(nbuf,2); break; case 'U': obuf[k++] = (int)*(unsigned short *)_swap(nbuf,2); break; case 'J': obuf[k++] = (int)*(int *)_swap(nbuf,4); break; case 'V': obuf[k++] = (int)*(unsigned int *)_swap(nbuf,4); break; case 'K': idxerror("64-bit integer not supported for index"); break; default: idxerror("illegal index data type"); } if( k == SZ_LINE ){ if( write(x->ochan, obuf, k*sizeof(int)) != (int)(k*sizeof(int)) ){ idxerror("can't write index value to sort"); return 0; } k = 0; } } } if( k ){ if( write(x->ochan, obuf, k*sizeof(int)) != (int)(k*sizeof(int)) ){ idxerror("can't write index value to sort"); return 0; } } return 1; } #ifdef ANSI_FUNC static int _idxcompare(char *buf, int type, int offset, int n, double d, longlong l, int t) #else static int _idxcompare(buf, type, offset, n, d, l, t) char *buf; int type; int offset; int n; double d; longlong l; int t; #endif { unsigned short sval; unsigned int xval; int xn; double dval=0.0; longlong lval=0; int isint=0; switch(type){ case 'X': isint = 1; if( n == 16 ){ xn = 1; n = 1; } else if( n == 32 ){ xn = 2; n = 1; } else if( n == 64 ){ xn = 3; n = 1; } else{ xn = 0; n = (n+7)/8; } switch(xn){ case 1: memcpy(&sval, _swap(buf+offset,2), sizeof(unsigned short)); dval = (double)sval; lval = (longlong)sval; break; case 2: memcpy(&xval, _swap(buf+offset,4), sizeof(unsigned int)); dval = (double)xval; lval = (longlong)xval; break; case 3: memcpy(&lval, _swap(buf+offset,8), sizeof(unsigned int)); dval = (double)lval; break; case 0: default: xval = (unsigned int)*(unsigned char *)(buf+offset); dval = (double)xval; lval = (longlong)xval; break; } case 'B': isint = 1; dval = (double)*(unsigned char *)(buf+offset); lval = (longlong)*(unsigned char *)(buf+offset); break; case 'I': isint = 1; dval = (double)*(short *)_swap(buf+offset,2); lval = (longlong)*(short *)_swap(buf+offset,2); break; case 'U': isint = 1; dval = (double)*(unsigned short *)_swap(buf+offset,2); lval = (longlong)*(unsigned short *)_swap(buf+offset,2); break; case 'J': isint = 1; dval = (double)*(int *)_swap(buf+offset,4); lval = (longlong)*(int *)_swap(buf+offset,4); break; case 'V': isint = 1; dval = (double)*(unsigned int *)_swap(buf+offset,4); lval = (longlong)*(unsigned int *)_swap(buf+offset,4); break; case 'K': isint = 1; dval = (double)*(longlong *)_swap(buf+offset,8); lval = (longlong)*(longlong *)_swap(buf+offset,8); break; case 'E': isint = 0; dval = (double)*(float *)_swap(buf+offset,4); lval = (longlong)*(float *)_swap(buf+offset,4); break; case 'D': isint = 0; dval = *(double *)_swap(buf+offset,8); lval = *(longlong *)_swap(buf+offset,8); break; case 'L': isint = 1; dval = (double)*(unsigned char *)(buf+offset); lval = (longlong)*(unsigned char *)(buf+offset); break; case 'A': default: gerror(stderr, "illegal numeric value for compare: %d\n", type); break; } if( t == PARSE_INTEGER ){ if( isint ){ if( lval < l ) return -1; else if( lval > l ) return 1; else return 0; } else{ if( dval < l ) return -1; else if( dval > l ) return 1; else return 0; } } else{ if( isint ){ if( lval < d ) return -1; else if( lval > d ) return 1; else return 0; } else{ if( dval < d ) return -1; else if( dval > d ) return 1; else return 0; } } } #ifdef ANSI_FUNC static int _idxbsearch(GIO gio, FITSHead fits, int type, int offset, int n, int exact, int edge, double d, longlong l, int t) #else static int _idxbsearch(gio, fits, type, offset, n, exact, edge, d, l, t) GIO gio; FITSHead fits; int type; int offset; int n; int exact; int edge; double d; longlong l; int t; #endif { int high, low, try; int cmp; int rowsize; size_t got; long ipos; char *buf=NULL; /* sanity check */ if( !gio || !fits ) return -1; /* set limits */ low = 0; high = ft_naxis(fits, 2)+1; rowsize = ft_naxis(fits, 1); /* search */ while( (high - low) > 1){ try = (high + low) / 2; /* grab desired row in index */ ipos = fits->data + ((try-1)*rowsize); if( gseek(gio, (off_t)ipos, 0) < 0 ) return -1; buf = _gread(gio, NULL, sizeof(char), rowsize, &got); if( !buf || (got != (size_t)rowsize) ) return -1; /* compare row to key value */ cmp = _idxcompare(buf, type, offset, n, d, l, t); if( buf ) xfree(buf); switch(cmp){ /* thisval < val */ case -1: low = try; break; /* thisval == val */ case 0: /* to find first record, set hi */ if( edge == -1 ) high = try; /* for last record, set lo */ else low = try; break; /* thisval > val */ case 1: high = try; break; } } /* check for out of bounds and get candidate row */ if( edge == 1 ){ if( low == 0 ) { if( exact ) return -1; else return 0; } try = low; } else{ if( high == (ft_naxis(fits, 2)+1) ){ if( exact ) return -1; else return ft_naxis(fits, 2)+1;; } try = high; } /* grab desired row in index */ ipos = fits->data + ((try-1)*rowsize); if( gseek(gio, (off_t)ipos, 0) < 0 ) return -1; buf = _gread(gio, NULL, sizeof(char), rowsize, &got); if( !buf || (got != (size_t)rowsize) ) return -1; /* compare row to key value */ cmp = _idxcompare(buf, type, offset, n, d, l, t); if( buf ) xfree(buf); /* if row == key value, we got a match */ if( !cmp || !exact ){ if( edge == 1 ) return low; else return high; } else return -1; } #ifdef ANSI_FUNC static int _idxrowcommon(idxvalrec *val1, idxvalrec *val2, int exact, int which, idxrowrec **x, int *start, int *stop, int *nrow) #else static int _idxrowcommon(val1, val2, exact, which, x, start, stop, nrow) idxvalrec *val1, *val2; int exact; int which; idxrowrec **x; int *start, *stop; int *nrow #endif { idxvalrec *v1=NULL, *v2=NULL; *start = -1; *stop = -1; *nrow = -1; *x = idxrownew(); if( (val1->type == COL) && (val2->type == NUM) ){ v1 = val1; v2 = val2; } if( v1 && v2 ){ (*x)->type = COL; (*x)->rtype = IDX_ROW_LIST; (*x)->dofilt = 0; (*x)->s = xstrdup(v1->s); (*x)->v = v1; *nrow = v1->nrow; if( which & IDX_EDGE_LEFT ) *start = _idxbsearch(v1->igio, v1->ifits, v1->vtype, v1->voffset, v1->vn, exact, -1, v2->dval, v2->ival, v2->ntype); if( which & IDX_EDGE_RIGHT ) *stop = _idxbsearch(v1->igio, v1->ifits, v1->vtype, v1->voffset, v1->vn, exact, 1, v2->dval, v2->ival, v2->ntype); return 1; } else{ (*x)->type = IDX_INDEF; (*x)->rtype = IDX_INDEF; (*x)->dofilt = 1; return 0; } } #ifdef ANSI_FUNC static int _idxrowaddrow(idxrowrec *r, int start, int stop) #else static int _idxrowaddrow(r, start, stop) idxrowrec *r; int start; int stop; #endif { if( !r ) return 0; if( r->nrow >= r->maxrow ){ r->maxrow += IDX_ROW_INC; r->startrow = xrealloc(r->startrow, r->maxrow*sizeof(int)); r->stoprow = xrealloc(r->stoprow, r->maxrow*sizeof(int)); } r->startrow[r->nrow] = start; r->stoprow[r->nrow] = stop; r->nrow++; return r->nrow; } #ifdef ANSI_FUNC static void idxrowmark(idxrowrec *row1, idxrowrec *row2, char **mbuf, int *nm) #else static void idxrowmark(row1, row2, mbuf, nm) idxrowrec *row1, *row2; char **mbuf; int *nm; #endif { int i, j; *nm=0; for(i=0; inrow; i++){ *nm = MAX(*nm, row1->stoprow[i]); } for(i=0; inrow; i++){ *nm = MAX(*nm, row2->stoprow[i]); } *nm += 1; if( !(*mbuf = xcalloc(*nm, sizeof(char))) ){ idxerror("can't allocate memory for index"); } for(i=0; inrow; i++){ for(j=row1->startrow[i]; j<=row1->stoprow[i]; j++){ (*mbuf)[j-1] |= 1; } } for(i=0; inrow; i++){ for(j=row2->startrow[i]; j<=row2->stoprow[i]; j++){ (*mbuf)[j-1] |= 2; } } } #ifdef ANSI_FUNC static idxrowrec * _idxrowmerge(idxrowrec *x, idxrowrec *row1, idxrowrec *row2, int type) #else static idxrowrec *_idxrowmerge(x, row1, row2, type) idxrowrec *x; idxrowrec *row1; idxrowrec *row2 int type; #endif { int last=-1; int in1=-1, in2=-1, on=0; int igot1=-1, igot2=-1; int fd[2]; int ibuf1[SZ_LINE]; int ibuf2[SZ_LINE]; int obuf[SZ_LINE]; FILE *ifd1, *ifd2, *ofd; #if HAVE_MINGW32==0 /* we fork a process that will read the output from 2 instances of sort and either OR and AND the results. Doing this avoids having the main process read the output of the sorts and write to a new merge process */ if( pipe(fd) < 0 ){ x->type = IDX_INDEF; x->rtype = IDX_INDEF; x->dofilt = 1; return x; } if( (x->pid = fork()) < 0 ){ x->type = IDX_INDEF; x->rtype = IDX_INDEF; x->dofilt = 1; return x; } else if( x->pid != 0 ){ /* parent */ IPRINTF((stderr, "idxmerge(%d): %s %s\n", type, rowdisp(row1), rowdisp(row2))); close(fd[1]); x->ichan = fd[0]; close(row1->ichan); row1->ichan=0; close(row2->ichan); row2->ichan=0; return x; } else{ /* child */ close(fd[0]); if( !(ifd1 = fdopen(row1->ichan, "r")) || !(ifd2 = fdopen(row2->ichan, "r")) || !(ofd = fdopen(fd[1], "w")) ){ _exit(1); } while( 1 ){ if( in1 == igot1 ){ igot1 = fread(ibuf1, sizeof(int), SZ_LINE, ifd1); if( igot1 != 0 ){ in1 = 0; } } if( in2 == igot2 ){ igot2 = fread(ibuf2, sizeof(int), SZ_LINE, ifd2); if( igot2 != 0 ){ in2 = 0; } } if( igot1 && igot2 ){ if( ibuf1[in1] < ibuf2[in2] ){ switch(type){ case IDX_SORT: obuf[on++] = ibuf1[in1]; break; case IDX_AND_SORT: if( ibuf1[in1] == last ) obuf[on++] = ibuf1[in1]; break; case IDX_OR_SORT: if( ibuf1[in1] != last ) obuf[on++] = ibuf1[in1]; break; } last = ibuf1[in1++]; } else{ switch(type){ case IDX_SORT: obuf[on++] = ibuf2[in2]; break; case IDX_AND_SORT: if( ibuf2[in2] == last ) obuf[on++] = ibuf2[in2]; break; case IDX_OR_SORT: if( ibuf2[in2] != last ) obuf[on++] = ibuf2[in2]; break; } last = ibuf2[in2++]; } } else if( igot1 ){ switch(type){ case IDX_SORT: obuf[on++] = ibuf2[in2]; break; case IDX_AND_SORT: if( ibuf1[in1] == last ) obuf[on++] = ibuf1[in1]; break; case IDX_OR_SORT: if( ibuf1[in1] != last ) obuf[on++] = ibuf1[in1]; break; } last = ibuf1[in1++]; } else if( igot2 ){ switch(type){ case IDX_SORT: obuf[on++] = ibuf2[in2]; break; case IDX_AND_SORT: if( ibuf2[in2] == last ) obuf[on++] = ibuf2[in2]; break; case IDX_OR_SORT: if( ibuf2[in2] != last ) obuf[on++] = ibuf2[in2]; break; } last = ibuf2[in2++]; } else{ break; } if( on == SZ_LINE ){ fwrite(obuf, sizeof(int), on, ofd); fflush(ofd); on = 0; } } fwrite(obuf, sizeof(int), on, ofd); fflush(ofd); _exit(0); } #else idxerror("can't use index optimization with MinGW"); #endif /* shouldn't get here */ return NULL; } /* * * public routines * */ #ifdef ANSI_FUNC idxrowrec *idxall(idxrowrec *row) #else idxrowrec *idxall(row) idxrowrec *row; #endif { Filter filt; idxrowrec *x; /* sanity check */ if( !(filt = FilterDefault()) ) idxerror("filter symbol table not initialized"); /* most range list columns need to be sorted; col==val already is sorted */ if( (row->type == COL) && (row->rtype == IDX_ROW_LIST) && row->dosort ){ x = idxrownew(); if( _idxstartsort(0, &(x->ichan), &(x->ochan), &(x->pid)) && _idxwritesort(x, row) ){ x->type = row->type; /* doesn't matter which sort we use here */ x->rtype = IDX_SORT; x->dofilt = row->dofilt; /* close input to start sort */ close(x->ochan); x->ochan = 0; } else{ x->type = IDX_INDEF; x->rtype = IDX_INDEF; x->dofilt = 1; } } /* everything else is fine as is */ else{ x = row; } IPRINTF((stderr, "idxall(%d): %s\n", x->dofilt, rowdisp(x))); filt->idx = x; return x; } #ifdef ANSI_FUNC void * idxread(idxrowrec *row, GIO gio, FITSHead fits, void *buf, size_t size, size_t get, size_t *got, int *dofilt) #else void *idxread(row, gio, fits, buf, size, get, got, dofilt) idxrowrec *row; GIO gio; FITSHead fits; void *buf; size_t size; size_t get; size_t *got; int *dofilt; #endif { int j, k=0; int left; int nrow; int rowsize; int ioffset; int itype; int isize; int start, stop; int *ibuf=NULL; size_t i; char nbuf[8]; long ipos; struct stat fbuf; /* initialize */ *got = 0; *dofilt = row->dofilt; /* handle particular io method */ switch( idx_io ){ case IDX_IO_MMAP: #ifdef HAVE_SYS_MMAN_H if( !row->fdata ){ if( fstat(fileno(gio->fp), &fbuf) < 0 ){ *got = 0; idxerror("can't fstat data file"); goto done; } row->flen = fbuf.st_size; if( (row->fdata = mmap(NULL, row->flen, PROT_READ, MAP_PRIVATE, fileno(gio->fp), 0)) == MAP_FAILED ){ *got = 0; idxerror("can't mmap data file"); perror("mmap"); goto done; } } #else idxerror("mmap not supported on this system"); #endif break; case IDX_IO_LSEEK: break; } /* get rows */ switch(row->rtype){ case IDX_ROW_LIST: if( !(ibuf = xcalloc(get, sizeof(int))) ){ *got = 0; idxerror("can't allocate index record buffer"); goto done; } rowsize = ft_naxis(row->v->ifits, 1); ioffset = row->v->ioffset; itype = row->v->itype; isize = ft_sizeof(row->v->itype); for(left=get, i=0; (left>0) && (i<(size_t)row->nrow); i++){ if( (row->startrow[i]<0) && (row->stoprow[i]<0) ) continue; nrow = row->stoprow[i] - row->startrow[i] + 1; if( left > nrow ){ start = row->startrow[i]; stop = row->stoprow[i]; row->startrow[i] = -1; row->stoprow[i] = -1; *got += nrow; left -= nrow; } else if( nrow == left ){ start = row->startrow[i]; stop = row->stoprow[i]; row->startrow[i] = -1; row->stoprow[i] = -1; *got += nrow; left = 0; } else{ start = row->startrow[i]; stop = start + left - 1; row->startrow[i] += left; *got += left; left = 0; } for(j=start; j<=stop; j++){ ipos = row->v->ifits->data + ((j-1)*rowsize) + ioffset; switch( idx_io ){ case IDX_IO_MMAP: if( row->v->idata ){ #ifdef HAVE_SYS_MMAN_H memcpy(nbuf, &(row->v->idata[ipos]), isize); #else idxerror("mmap not supported on this system"); #endif break; } case IDX_IO_LSEEK: if( gseek(row->v->igio, (off_t)ipos, 0) < 0 ){ *got = 0; idxerror("can't seek into index file"); goto done; } if( !gread(row->v->igio, nbuf, isize, 1) ){ *got = 0; idxerror("can't read index file"); goto done; } break; } switch(itype){ case 'B': ibuf[k++] = (int)*(unsigned char *)(nbuf); break; case 'I': ibuf[k++] = (int)*(short *)_swap(nbuf,2); break; case 'U': ibuf[k++] = (int)*(unsigned short *)_swap(nbuf,2); break; case 'J': ibuf[k++] = (int)*(int *)_swap(nbuf,4); break; case 'V': ibuf[k++] = (int)*(unsigned int *)_swap(nbuf,4); break; case 'K': idxerror("64-bit integer not supported for index"); break; default: *got = 0; idxerror("illegal index data type"); goto done; } } } /* now grab the row associated with each row value */ for(i=0; i<*got; i++){ /* grab desired row in index */ ipos = fits->data + ((ibuf[i]-1)*size); switch( idx_io ){ case IDX_IO_MMAP: #ifdef HAVE_SYS_MMAN_H memcpy((char *)buf+(i*size), &(row->fdata[ipos]), size); #else idxerror("mmap not supported on this system"); #endif break; case IDX_IO_LSEEK: if( gseek(gio, (off_t)ipos, 0) < 0 ){ return 0; } if( !gread(gio, (char *)buf+(i*size), size, 1) ){ *got = i; } break; } } break; case IDX_SORT: case IDX_OR_SORT: case IDX_AND_SORT: if( !row->ifile && !(row->ifile = fdopen(row->ichan, "r")) ){ *got = 0; idxerror("can't fdup input index records"); goto done; } if( !(ibuf = xcalloc(get, sizeof(int))) ){ *got = 0; idxerror("can't allocate index record buffer"); goto done; } /* read the row values */ *got=fread(ibuf, sizeof(int), get, row->ifile); /* now grab the row associated with each row value */ for(i=0; i<*got; i++){ /* grab desired row in index */ ipos = fits->data + ((ibuf[i]-1)*size); switch( idx_io ){ case IDX_IO_MMAP: #ifdef HAVE_SYS_MMAN_H memcpy((char *)buf+(i*size), &(row->fdata[ipos]), size); #else idxerror("mmap not supported on this system"); #endif break; case IDX_IO_LSEEK: if( gseek(gio, (off_t)ipos, 0) < 0 ){ return 0; } if( !gread(gio, (char *)buf+(i*size), size, 1) ){ *got = i; } break; } } break; case IDX_INDEF: default: *dofilt = 1; _gread(gio, (void *)buf, size, get, got); break; } done: if( ibuf ) xfree(ibuf); return (void *)buf; } #ifdef ANSI_FUNC idxrowrec *idxor(idxrowrec *row1, idxrowrec *row2) #else idxrowrec *idxor(row1, row2) idxrowrec *row1, *row2; #endif { int i; int nm=0; int start=0, stop=0; char *mbuf=NULL; idxrowrec *x=NULL; idxrowrec *r1, *r2;; x = idxrownew(); if( (row1->type == IDX_INDEF) || (row2->type == IDX_INDEF) ){ /* if we have an indef we will have to go through all of the rows. */ x->type = IDX_INDEF; x->rtype = IDX_INDEF; x->dofilt = 1; IPRINTF((stderr, "idxor(%d): INDEF %s\n", x->dofilt, rowdisp(x))); return x; } if( (row1->type == COL) && (row2->type == COL) && (row1->rtype == IDX_ROW_LIST) && (row2->rtype == IDX_ROW_LIST) && row1->s && row2->s && !strcmp(row1->s, row2->s) ){ IPRINTF((stderr, "idxor: %s %s", rowdisp(row1), rowdisp(row2))); x->type = COL; x->rtype = IDX_ROW_LIST; x->dofilt = 0; x->s = xstrdup(row1->s); x->v = row1->v; /* a bit quicker when we have a simple OR */ if( (row1->nrow == 1) && (row2->nrow == 1) ){ if( (row1->stoprow[0] < row2->startrow[0]) || (row2->stoprow[0] < row1->startrow[0]) ){ _idxrowaddrow(x, row1->startrow[0], row1->stoprow[0]); _idxrowaddrow(x, row2->startrow[0], row2->stoprow[0]); } else{ start = MIN(row1->startrow[0], row2->startrow[0]); stop = MAX(row1->stoprow[0], row2->stoprow[0]); _idxrowaddrow(x, start, stop); } IPRINTF((stderr, " =>(q) %s\n", rowdisp(x))); return x; } idxrowmark(row1, row2, &mbuf, &nm); for(i=0; i %s\n", rowdisp(x))); return x; } else{ if( (row1->type == REG) || (row2->type == REG) ){ x->type = REG; x->dofilt = 1; } else{ x->type = COL; x->dofilt = 0; } x->rtype = IDX_OR_SORT; /* two row lists: we sort both at once */ if( (row1->rtype == IDX_ROW_LIST) && (row2->rtype == IDX_ROW_LIST) ){ IPRINTF((stderr, "idxor sort: %s %s\n", rowdisp(row1), rowdisp(row2))); /* open sort program and return only unique records */ if( !_idxstartsort(IDX_OR_SORT, &(x->ichan), &(x->ochan), &(x->pid)) || !_idxwritesort(x, row1) || !_idxwritesort(x, row2) ){ x->type = IDX_INDEF; x->rtype = IDX_INDEF; x->dofilt = 1; return x; } /* close input to start sort */ close(x->ochan); x->ochan = 0; /* return here */ return x; } /* at least one sorted process: we set up a merge (and maybe a sort) */ else if( row1->rtype == IDX_ROW_LIST ){ IPRINTF((stderr, "idxor sort/merge: %s %s\n", rowdisp(row1), rowdisp(row2))); r1 = row2; r2 = idxrownew(); r2->type = row1->type; r2->rtype = row1->rtype; r2->s = xstrdup(row1->s); r2->dofilt = row1->dofilt; /* open sort program to return all records */ if( !_idxstartsort(0, &(r2->ichan), &(r2->ochan), &(r2->pid)) || !_idxwritesort(r2, row1) ){ x->type = IDX_INDEF; x->rtype = IDX_INDEF; x->dofilt = 1; return x; } /* close input to start sort */ close(r2->ochan); r2->ochan = 0; /* common merge code */ return _idxrowmerge(x, r1, r2, IDX_OR_SORT); } /* at least one sorted process: we set up a merge (and maybe a sort) */ else if( row2->rtype == IDX_ROW_LIST ){ r1 = row1; IPRINTF((stderr, "idxor sort/merge: %s %s\n", rowdisp(row1), rowdisp(row2))); r2 = idxrownew(); r2->type = row2->type; r2->rtype = row2->rtype; r2->s = xstrdup(row2->s); r2->dofilt = row2->dofilt; /* open sort program to return all records */ if( !_idxstartsort(0, &(r2->ichan), &(r2->ochan), &(r2->pid)) || !_idxwritesort(r2, row2) ){ x->type = IDX_INDEF; x->rtype = IDX_INDEF; x->dofilt = 1; return x; } /* close input to start sort */ close(r2->ochan); r2->ochan = 0; /* common merge code */ return _idxrowmerge(x, r1, r2, IDX_OR_SORT); } else{ return _idxrowmerge(x, row1, row2, IDX_OR_SORT); } } } #ifdef ANSI_FUNC idxrowrec *idxand(idxrowrec *row1, idxrowrec *row2) #else idxrowrec *idxand(row1, row2) idxrowrec *row1, *row2; #endif { int i; int nm=0; int start=0, stop=0; char *mbuf=NULL; idxrowrec *x=NULL; idxrowrec *r1, *r2; if( (row1->type == IDX_INDEF) || (row2->type == IDX_INDEF) ){ /* if we have an indef we return the other row and turn dofilter on. this works with AND but not with OR */ if( (row1->type != IDX_INDEF) ){ x = row1; x->dofilt = 1; } else if( (row2->type != IDX_INDEF) ){ x = row2; x->dofilt = 1; } /* can't happen */ else{ x = idxrownew(); x->type = IDX_INDEF; x->rtype = IDX_INDEF; x->dofilt = 1; } IPRINTF((stderr, "idxand(%d): INDEF %s\n", x->dofilt, rowdisp(x))); return x; } x = idxrownew(); if( (row1->type == COL) && (row2->type == COL) && (row1->rtype == IDX_ROW_LIST) && (row2->rtype == IDX_ROW_LIST) && row1->s && row2->s && !strcmp(row1->s, row2->s) ){ IPRINTF((stderr, "idxand: %s %s", rowdisp(row1), rowdisp(row2))); x->type = COL; x->rtype = IDX_ROW_LIST; x->dofilt = 0; x->s = xstrdup(row1->s); x->v = row1->v; /* a bit quicker when we have a simple AND */ if( (row1->nrow == 1) && (row2->nrow == 1) ){ start = MAX(row1->startrow[0], row2->startrow[0]); stop = MIN(row1->stoprow[0], row2->stoprow[0]); if( start <= stop ){ _idxrowaddrow(x, start, stop); } IPRINTF((stderr, " =>(q) %s\n", rowdisp(x))); return x; } idxrowmark(row1, row2, &mbuf, &nm); for(i=0; i %s\n", rowdisp(x))); return x; } else{ if( (row1->type == REG) || (row2->type == REG) ){ x->type = REG; x->dofilt = 1; } else{ x->type = COL; x->dofilt = 0; } x->rtype = IDX_OR_SORT; /* two row lists: we sort both at once */ if( (row1->rtype == IDX_ROW_LIST) && (row2->rtype == IDX_ROW_LIST) ){ IPRINTF((stderr, "idxand sort: %s %s\n", rowdisp(row1), rowdisp(row2))); /* open sort program and return only dup records */ if( !_idxstartsort(IDX_AND_SORT, &(x->ichan), &(x->ochan), &(x->pid)) || !_idxwritesort(x, row1) || !_idxwritesort(x, row2) ){ x->type = IDX_INDEF; x->rtype = IDX_INDEF; x->dofilt = 1; return x; } /* close input to start sort */ close(x->ochan); x->ochan = 0; /* return here */ return x; } /* at least one sorted process: we set up a merge (and maybe a sort) */ else if( row1->rtype == IDX_ROW_LIST ){ IPRINTF((stderr, "idxor sort/merge: %s %s\n", rowdisp(row1), rowdisp(row2))); r1 = row2; r2 = idxrownew(); r2->type = row1->type; r2->rtype = row1->rtype; r2->s = xstrdup(row1->s); r2->dofilt = row1->dofilt; /* open sort program to return all records */ if( !_idxstartsort(0, &(r2->ichan), &(r2->ochan), &(r2->pid)) || !_idxwritesort(r2, row1) ){ x->type = IDX_INDEF; x->rtype = IDX_INDEF; x->dofilt = 1; return x; } /* close input to start sort */ close(r2->ochan); r2->ochan = 0; /* common merge code */ return _idxrowmerge(x, r1, r2, IDX_AND_SORT); } /* at least one sorted process: we set up a merge (and maybe a sort) */ else if( row2->rtype == IDX_ROW_LIST ){ r1 = row1; IPRINTF((stderr, "idxor sort/merge: %s %s\n", rowdisp(row1), rowdisp(row2))); r2 = idxrownew(); r2->type = row2->type; r2->rtype = row2->rtype; r2->s = xstrdup(row2->s); r2->dofilt = row2->dofilt; /* open sort program to return all records */ if( !_idxstartsort(0, &(r2->ichan), &(r2->ochan), &(r2->pid)) || !_idxwritesort(r2, row2) ){ x->type = IDX_INDEF; x->rtype = IDX_INDEF; x->dofilt = 1; return x; } /* close input to start sort */ close(r2->ochan); r2->ochan = 0; /* common merge code */ return _idxrowmerge(x, r1, r2, IDX_AND_SORT); } else{ return _idxrowmerge(x, row1, row2, IDX_AND_SORT); } } } #ifdef ANSI_FUNC idxrowrec *idxrowreg(idxvalrec *val) #else idxrowrec *idxrowreg(idxvalrec *val) idxvalrec *val; #endif { int i=0, j=0; idxrowrec *x=NULL; idxrowrec *r[2]; int start[2], stop[2]; x = idxrownew(); if( (val->type == INDEF) || ((val->rv[0]->type == INDEF) && (val->rv[1]->type == INDEF)) ){ x->type = IDX_INDEF; x->rtype = IDX_INDEF; x->dofilt = 1; return x; } for(i=0; i<2; i++){ r[i] = idxrownew(); /* handle case where one of the regions has no index */ if( val->rv[i]->type == INDEF ){ r[i]->type = IDX_INDEF; r[i]->rtype = IDX_INDEF; r[i]->dofilt = 1; continue; } /* j will be the index of the valid val record we use in the output row */ j = i; r[i]->type = REG; r[i]->rtype = IDX_ROW_LIST; r[i]->s = xstrdup(val->rv[i]->s); r[i]->v = val->rv[i]; start[i] = _idxbsearch(val->rv[i]->igio, val->rv[i]->ifits, val->rv[i]->vtype, val->rv[i]->voffset, val->rv[i]->vn, 0, -1, val->rlo[i], (longlong)0, PARSE_FLOAT); stop[i] = _idxbsearch(val->rv[i]->igio, val->rv[i]->ifits, val->rv[i]->vtype, val->rv[i]->voffset, val->rv[i]->vn, 0, 1, val->rhi[i], (longlong)0, PARSE_FLOAT); if( (start[i] > 0) && (stop[i] > 0) ){ _idxrowaddrow(r[i], start[i], stop[i]); } } x = idxand(r[0], r[1]); x->type = REG; x->dofilt = 1; x->v = val->rv[j]; return x; } #ifdef ANSI_FUNC idxrowrec *idxrowfun(idxvalrec *val) #else idxrowrec *idxrowfun(idxvalrec *val) idxvalrec *val; #endif { idxrowrec *x=NULL; /* avoid -W unused parameter warning */ if( 0 ) val = val; x = idxrownew(); x->type = IDX_INDEF; x->rtype = IDX_INDEF; x->dofilt = 1; return x; } #ifdef ANSI_FUNC idxrowrec *idxroweq(idxvalrec *val1, idxvalrec *val2) #else idxrowrec *idxroweq(val1, val2) idxvalrec *val1, *val2; #endif { int start, stop; int nrow; idxrowrec *x=NULL; if( (val1->type == NUM) && (val2->type == COL) ){ return idxroweq(val2, val1); } IPRINTF((stderr, "idxeq: ")); if( _idxrowcommon(val1, val2, 1, IDX_EDGE_BOTH, &x, &start, &stop, &nrow) ){ IPRINTF((stderr, "%s start=%d,stop=%d", x->s, start, stop)); if( (start > 0) && (stop > 0) ){ _idxrowaddrow(x, start, stop); } IPRINTF((stderr, " => ")); } IPRINTF((stderr, "%s\n", rowdisp(x))); /* this is the only operator resulting in a sorted range list */ x->dosort = 0; return x; } #ifdef ANSI_FUNC idxrowrec *idxrowne(idxvalrec *val1, idxvalrec *val2) #else idxrowrec *idxrowne(val1, val2) idxvalrec *val1, *val2; #endif { int start, stop; int nrow; int i=0; idxrowrec *x=NULL; if( (val1->type == NUM) && (val2->type == COL) ){ return idxrowne(val2, val1); } IPRINTF((stderr, "idxne: ")); if( _idxrowcommon(val1, val2, 0, IDX_EDGE_BOTH, &x, &start, &stop, &nrow) ){ IPRINTF((stderr, "%s start=%d,stop=%d", x->s, start, stop)); if( start > 1 ){ _idxrowaddrow(x, 1, start-1); i++; } if( stop && (stop < nrow) ){ _idxrowaddrow(x, stop+1, nrow); IPRINTF((stderr, " start=%d,stop=%d", x->startrow[i], x->stoprow[i])); } IPRINTF((stderr, " => ")); } IPRINTF((stderr, "%s\n", rowdisp(x))); return x; } #ifdef ANSI_FUNC idxrowrec *idxrowlt(idxvalrec *val1, idxvalrec *val2) #else idxrowrec *idxrowlt(val1, val2) idxvalrec *val1, *val2; #endif { int start, stop; int nrow; int i=0; idxrowrec *x=NULL; if( (val1->type == NUM) && (val2->type == COL) ){ return idxrowgt(val2, val1); } IPRINTF((stderr, "idxlt: ")); if( _idxrowcommon(val1, val2, 0, IDX_EDGE_LEFT, &x, &start, &stop, &nrow) ){ IPRINTF((stderr, "%s start=%d,stop=%d", x->s, start, stop)); if( start > 1 ){ _idxrowaddrow(x, 1, start-1); i++; } IPRINTF((stderr, " => ")); } IPRINTF((stderr, "%s\n", rowdisp(x))); return x; } #ifdef ANSI_FUNC idxrowrec *idxrowle(idxvalrec *val1, idxvalrec *val2) #else idxrowrec *idxrowle(val1, val2) idxvalrec *val1, *val2; #endif { int start, stop; int nrow; idxrowrec *x=NULL; if( (val1->type == NUM) && (val2->type == COL) ){ return idxrowge(val2, val1); } IPRINTF((stderr, "idxle: ")); if( _idxrowcommon(val1, val2, 0, IDX_EDGE_RIGHT, &x, &start, &stop, &nrow) ){ IPRINTF((stderr, "%s start=%d,stop=%d", x->s, start, stop)); if( stop > 0 ){ _idxrowaddrow(x, 1, stop); } IPRINTF((stderr, " => ")); } IPRINTF((stderr, "%s\n", rowdisp(x))); return x; } #ifdef ANSI_FUNC idxrowrec *idxrowgt(idxvalrec *val1, idxvalrec *val2) #else idxrowrec *idxrowgt(val1, val2) idxvalrec *val1, *val2; #endif { int start, stop; int nrow; int i=0; idxrowrec *x=NULL; if( (val1->type == NUM) && (val2->type == COL) ){ return idxrowlt(val2, val1); } IPRINTF((stderr, "idxgt: ")); if( _idxrowcommon(val1, val2, 0, IDX_EDGE_RIGHT, &x, &start, &stop, &nrow) ){ IPRINTF((stderr, "%s start=%d,stop=%d ", x->s, start, stop)); if( (stop >= 0) && (stop < nrow) ){ _idxrowaddrow(x, stop+1, nrow); i++; } IPRINTF((stderr, " => ")); } IPRINTF((stderr, "%s\n", rowdisp(x))); return x; } #ifdef ANSI_FUNC idxrowrec *idxrowge(idxvalrec *val1, idxvalrec *val2) #else idxrowrec *idxrowge(val1, val2) idxvalrec *val1, *val2; #endif { int start, stop; int nrow; int i=0; idxrowrec *x=NULL; if( (val1->type == NUM) && (val2->type == COL) ){ return idxrowle(val2, val1); } IPRINTF((stderr, "idxge: ")); if( _idxrowcommon(val1, val2, 0, IDX_EDGE_LEFT, &x, &start, &stop, &nrow) ){ IPRINTF((stderr, "%s start=%d,stop=%d ", x->s, start, stop)); if( (start > 0) && (start <= nrow) ){ _idxrowaddrow(x, start, nrow); i++; } IPRINTF((stderr, " => ")); } IPRINTF((stderr, "%s\n", rowdisp(x))); return x; } #ifdef ANSI_FUNC idxvalrec *idxvaladd(idxvalrec *val1, idxvalrec *val2) #else idxvalrec *idxvaladd(val1, val2) idxvalrec *val1, *val2; #endif { idxvalrec *x=NULL; x = idxvalnew(NULL); if( (val1->type == NUM) && (val2->type == NUM) ){ x->type = NUM; if( (val1->ntype == PARSE_FLOAT) || (val2->ntype == PARSE_FLOAT) ){ x->ntype = PARSE_FLOAT; x->dval = val1->dval + val2->dval; IPRINTF((stderr, "valadd: %f + %f => %f\n", val1->dval, val2->dval, x->dval)); } else{ x->ntype = PARSE_INTEGER; x->ival = val1->ival + val2->ival; x->dval = x->ival; snprintf(fmt, SZ_LINE, "valadd: %s + %s => %s\n", LFMT, LFMT, LFMT); IPRINTF((stderr, fmt, val1->ival, val2->ival, x->ival)); } } else{ x->type = INDEF; } return x; } #ifdef ANSI_FUNC idxvalrec *idxvalsub(idxvalrec *val1, idxvalrec *val2) #else idxvalrec *idxvalsub(val1, val2) idxvalrec *val1, *val2; #endif { idxvalrec *x=NULL; x = idxvalnew(NULL); if( (val1->type == NUM) && (val2->type == NUM) ){ x->type = NUM; if( (val1->ntype == PARSE_FLOAT) || (val2->ntype == PARSE_FLOAT) ){ x->ntype = PARSE_FLOAT; x->dval = val1->dval - val2->dval; IPRINTF((stderr, "valsub: %f - %f => %f\n", val1->dval, val2->dval, x->dval)); } else{ x->ntype = PARSE_INTEGER; x->ival = val1->ival - val2->ival; x->dval = x->ival; snprintf(fmt, SZ_LINE, "valsub: %s - %s => %s\n", LFMT, LFMT, LFMT); IPRINTF((stderr, fmt, val1->ival, val2->ival, x->ival)); } } else{ x->type = INDEF; } return x; } #ifdef ANSI_FUNC idxvalrec *idxvalmul(idxvalrec *val1, idxvalrec *val2) #else idxvalrec *idxvalmul(val1, val2) idxvalrec *val1, *val2; #endif { idxvalrec *x=NULL; x = idxvalnew(NULL); if( (val1->type == NUM) && (val2->type == NUM) ){ x->type = NUM; if( (val1->ntype == PARSE_FLOAT) || (val2->ntype == PARSE_FLOAT) ){ x->ntype = PARSE_FLOAT; x->dval = val1->dval * val2->dval; IPRINTF((stderr, "valmul: %f * %f => %f\n", val1->dval, val2->dval, x->dval)); } else{ x->ntype = PARSE_INTEGER; x->ival = val1->ival * val2->ival; x->dval = x->ival; snprintf(fmt, SZ_LINE, "valmul: %s * %s => %s\n", LFMT, LFMT, LFMT); IPRINTF((stderr, fmt, val1->ival, val2->ival, x->ival)); } } else{ x->type = INDEF; } return x; } #ifdef ANSI_FUNC idxvalrec *idxvaldiv(idxvalrec *val1, idxvalrec *val2) #else idxvalrec *idxvaldiv(val1, val2) idxvalrec *val1, *val2; #endif { idxvalrec *x=NULL; x = idxvalnew(NULL); if( (val1->type == NUM) && (val2->type == NUM) ){ x->type = NUM; if( val2->dval == 0.0 ) idxerror("can't divide by zero"); if( (val1->ntype == PARSE_FLOAT) || (val2->ntype == PARSE_FLOAT) ){ x->dval = val1->dval / val2->dval; x->ntype = PARSE_FLOAT; } else{ x->ival = val1->ival / val2->ival; x->ntype = PARSE_INTEGER; } IPRINTF((stderr, "valdiv: %f / %f => %f\n", val1->dval, val2->dval, x->dval)); } else{ x->type = INDEF; } return x; } #ifdef ANSI_FUNC idxvalrec *idxvalmod(idxvalrec *val1, idxvalrec *val2) #else idxvalrec *idxvalmod(val1, val2) idxvalrec *val1, *val2; #endif { idxvalrec *x=NULL; x = idxvalnew(NULL); if( (val1->type == NUM) && (val2->type == NUM) ){ x->type = NUM; if( (val1->ntype == PARSE_FLOAT) || (val2->ntype == PARSE_FLOAT) ){ idxerror("can't use mod operator with floating point value"); } else{ x->ntype = PARSE_INTEGER; x->ival = val1->ival % val2->ival; x->dval = x->ival; snprintf(fmt, SZ_LINE, "valmod: %s mod %s => %s\n", LFMT, LFMT, LFMT); IPRINTF((stderr, fmt, val1->ival, val2->ival, x->ival)); } } else{ x->type = INDEF; } return x; } #ifdef ANSI_FUNC idxvalrec *idxvaland(idxvalrec *val1, idxvalrec *val2) #else idxvalrec *idxvaland(val1, val2) idxvalrec *val1, *val2; #endif { idxvalrec *x=NULL; x = idxvalnew(NULL); if( (val1->type == NUM) && (val2->type == NUM) ){ x->type = NUM; x->ntype = PARSE_INTEGER; if( (val1->ntype == PARSE_FLOAT) || (val2->ntype == PARSE_FLOAT) ) x->ival = (longlong)val1->dval & (longlong)val2->dval; else x->ival = val1->ival & val2->ival; x->dval = x->ival; snprintf(fmt, SZ_LINE, "valand: %s & %s => %s\n", LFMT, LFMT, LFMT); IPRINTF((stderr, fmt, val1->ival, val2->ival, x->ival)); } else{ x->type = INDEF; } return x; } #ifdef ANSI_FUNC idxvalrec *idxvalor(idxvalrec *val1, idxvalrec *val2) #else idxvalrec *idxvalor(val1, val2) idxvalrec *val1, *val2; #endif { idxvalrec *x=NULL; x = idxvalnew(NULL); if( (val1->type == NUM) && (val2->type == NUM) ){ x->type = NUM; x->ntype = PARSE_INTEGER; if( (val1->ntype == PARSE_FLOAT) || (val2->ntype == PARSE_FLOAT) ) x->ival = (longlong)val1->dval | (longlong)val2->dval; else x->ival = val1->ival | val2->ival; x->dval = x->ival; snprintf(fmt, SZ_LINE, "valor: %s | %s => %s\n", LFMT, LFMT, LFMT); IPRINTF((stderr, fmt, val1->ival, val2->ival, x->ival)); } else{ x->type = INDEF; } return x; } #ifdef ANSI_FUNC idxvalrec *idxvalxor(idxvalrec *val1, idxvalrec *val2) #else idxvalrec *idxvalxor(val1, val2) idxvalrec *val1, *val2; #endif { idxvalrec *x=NULL; x = idxvalnew(NULL); if( (val1->type == NUM) && (val2->type == NUM) ){ x->type = NUM; x->ntype = PARSE_INTEGER; if( (val1->ntype == PARSE_FLOAT) || (val2->ntype == PARSE_FLOAT) ) x->ival = (longlong)val1->dval ^ (longlong)val2->dval; else x->ival = val1->ival ^ val2->ival; x->dval = x->ival; snprintf(fmt, SZ_LINE, "valxor: %s ^ %s => %s\n", LFMT, LFMT, LFMT); IPRINTF((stderr, fmt, val1->ival, val2->ival, x->ival)); } else{ x->type = INDEF; } return x; } #ifdef ANSI_FUNC idxvalrec *idxvalnot(idxvalrec *val) #else idxvalrec *idxvalnot(val) idxvalrec *val; #endif { idxvalrec *x=NULL; x = idxvalnew(NULL); x->type = NUM; x->ntype = PARSE_INTEGER; if( val->ntype == PARSE_FLOAT ) x->ival = !val->dval; else x->ival = !val->ival; x->dval = x->ival; snprintf(fmt, SZ_LINE, "valnot: %s => %s\n", LFMT, LFMT); IPRINTF((stderr, fmt, val->ival, x->ival)); return x; } #ifdef ANSI_FUNC idxvalrec *idxvalcom(idxvalrec *val) #else idxvalrec *idxvalcom(val) idxvalrec *val; #endif { idxvalrec *x=NULL; x = idxvalnew(NULL); x->type = NUM; x->ntype = PARSE_INTEGER; if( val->ntype == PARSE_FLOAT ) x->ival = ~(longlong)val->dval; else x->ival = ~val->ival; x->dval = x->ival; snprintf(fmt, SZ_LINE, "valcom: %s => %s\n", LFMT, LFMT); IPRINTF((stderr, fmt, val->ival, x->ival)); return x; } #ifdef ANSI_FUNC idxvalrec *idxvalmin(idxvalrec *val) #else idxvalrec *idxvalmin(val) idxvalrec *val; #endif { idxvalrec *x=NULL; x = idxvalnew(NULL); x->type = NUM; x->ntype = val->ntype; x->dval = -val->dval; x->ival = -val->ival; if( val->ntype == PARSE_FLOAT ){ IPRINTF((stderr, "valmin: %f => %f\n", val->dval, x->dval)); } else{ snprintf(fmt, SZ_LINE, "valmin: %s => %s\n", LFMT, LFMT); IPRINTF((stderr, fmt, val->ival, x->ival)); } return x; } #ifdef ANSI_FUNC idxvalrec *idxvalnew(char *s) #else idxvalrec *idxvalnew(s) char *s; #endif { idxvalrec *v=NULL; Filter filt; if( !(filt = FilterDefault()) ) idxerror("filter symbol table not initialized"); if( !(v=xcalloc(1, sizeof(struct _idxvalrec))) ) idxerror("can't allocate idxvalrec"); if( s ) v->s = xstrdup(s); v->next = filt->valhead; filt->valhead = v; return v; } #ifdef ANSI_FUNC int idxvalfree(idxvalrec *v) #else int idxvalfree(v) idxvalrec *v; #endif { idxvalrec *t; int n=0; Filter filt; if( !(filt = FilterDefault()) ) idxerror("filter symbol table not initialized"); if( v ){ if( filt->valhead == v ){ filt->valhead = v->next; } else{ for(t=filt->valhead; t; t=t->next){ if( t->next == v ){ t->next = v->next; break; } } } _idxvalfree(v); n = 1; } else{ for(v=filt->valhead; v; n++){ t = v->next; _idxvalfree(v); v = t; } filt->valhead = NULL; } return n; } #ifdef ANSI_FUNC idxvalrec * idxlookupfilename(char *iname) #else idxvalrec *idxlookupfilename(iname) char *iname #endif { idxvalrec *t; Filter filt; if( !(filt = FilterDefault()) ) return NULL; for(t=filt->valhead; t; t=t->next){ if( t->iname && !strcmp(t->iname, iname) ){ return t; } } return NULL; } #ifdef ANSI_FUNC idxrowrec *idxrownew(void) #else idxrowrec *idxrownew() #endif { idxrowrec *r=NULL; Filter filt; if( !(filt = FilterDefault()) ) idxerror("filter symbol table not initialized"); if( !(r=xcalloc(1, sizeof(struct _idxrowrec))) ) idxerror("can't allocate idxrowrec"); r->maxrow = IDX_ROW_INC; r->startrow = xcalloc(r->maxrow, sizeof(int)); r->stoprow = xcalloc(r->maxrow, sizeof(int)); r->nrow = 0; r->dosort = 1; r->next = filt->rowhead; filt->rowhead = r; return r; } #ifdef ANSI_FUNC int idxrowfree(idxrowrec *r) #else int idxrowfree(r) idxrowrec *r; #endif { idxrowrec *t; int n=0; Filter filt; if( !(filt = FilterDefault()) ) idxerror("filter symbol table not initialized"); if( r ){ if( filt->rowhead == r ){ filt->rowhead = r->next; } else{ for(t=filt->rowhead; t; t=t->next){ if( t->next == r ){ t->next = r->next; break; } } } _idxrowfree(r); n = 1; } else{ for(r=filt->rowhead; r; n++){ t = r->next; _idxrowfree(r); r = t; } filt->rowhead = NULL; } return n; } #ifdef ANSI_FUNC int idxinitfilenames(char *t, int *flag) #else int idxinitfilenames(t, flag) char *t; int *flag; #endif { char *u=NULL; int havegz=0; /* initialize */ if( flag ) *flag = 0; /* free current values */ idxfreefilenames(); /* sanity check */ if( !t || !*t) return 0; if( (u=strchr(t, ':')) ){ if( !strncasecmp(t, "pipe:", 5) || !strncasecmp(t, "mmap:", 5) || !strncasecmp(t, "shm:", 4) || !strncasecmp(t, "mem:", 4) || !strncasecmp(t, "buf:", 4) || !strncasecmp(t, "file:", 5) || !strncasecmp(t, "gzip:", 5) || !strncasecmp(t, "unfile:", 7) ){ t = u+1; } } idxfilename = xstrdup(t); if( (idxfileroot2=xstrdup(t)) ){ if( (t=strrchr(idxfileroot2, '.')) ){ if( !strcmp(t, ".gz") ){ havegz=1; *t = '\0'; if( (t=strrchr(idxfileroot2, '.')) ){ *t = '\0'; } } else{ *t = '\0'; } } if( (t=strrchr(idxfileroot2, '/')) ){ idxfileroot1 = xstrdup(t+1); } else{ idxfileroot1 = xstrdup(idxfileroot2); } } if( flag ) *flag = havegz; return 1; } #ifdef ANSI_FUNC void idxfreefilenames(void) #else void idxfreefilenames() #endif { if( idxfilename ){ xfree(idxfilename); idxfilename=NULL; } if( idxfileroot1 ){ xfree(idxfileroot1); idxfileroot1=NULL; } if( idxfileroot2 ){ xfree(idxfileroot2); idxfileroot2=NULL; } } #ifdef ANSI_FUNC void idxfreeglobals(void) #else void idxfreeglobals() #endif { if( idxcolname ){ xfree(idxcolname); idxcolname=NULL; } if( idxpath ){ xfree(idxpath); idxpath=NULL; } if( idxsort ){ xfree(idxsort); idxsort=NULL; } idxfreefilenames(); } #ifdef ANSI_FUNC char * idxindexfilename(char *col, int *size) #else char *idxindexfilename(col, size) char *col; int *size; #endif { int i; char *iname=NULL; char *fname=NULL; char *idxname=NULL; char *suffix=""; char colbuf[SZ_LINE]; char tbuf[SZ_LINE]; char tbuf1[SZ_LINE]; char tbuf2[SZ_LINE]; struct stat ibuf; struct stat fbuf; /* sanity checks */ if( !col ) return NULL; if( !idxinfo(IDX_FILENAME) ) return NULL; if( !idxinfo(IDX_FILEROOT1) || !idxinfo(IDX_FILEROOT2) ) return NULL; /* we try using the column name as is, in lower case, and in upper case */ /* we also try with and without a .gz extension */ strncpy(colbuf, col, SZ_LINE-1); for(i=0; i<6; i++){ switch(i){ case 0: break; case 1: culc(colbuf); break; case 2: cluc(colbuf); break; case 3: suffix=".gz"; break; case 4: culc(colbuf); suffix=".gz"; break; case 5: cluc(colbuf); suffix=".gz"; break; } snprintf(tbuf1, SZ_LINE-1, "%s_%s.idx%s", idxinfo(IDX_FILEROOT1), colbuf, suffix); snprintf(tbuf2, SZ_LINE-1, "%s_%s.idx%s", idxinfo(IDX_FILEROOT2), colbuf, suffix); if( (iname=Find(tbuf1, "r", NULL, "." )) || (iname=Find(tbuf1, "r", NULL, FilterPath())) || (iname=Find(tbuf2, "r", NULL, "." )) || (iname=Find(tbuf2, "r", NULL, FilterPath())) ){ if( (fname=Find(idxinfo(IDX_FILENAME), "r", NULL, "." )) || (fname=Find(idxinfo(IDX_FILENAME), "r", NULL, FilterPath())) ){ if( (stat(fname, &fbuf) <0) || (stat(iname, &ibuf) <0) ){ goto done; } else if( fbuf.st_mtime > ibuf.st_mtime ){ goto done; } } snprintf(tbuf, SZ_LINE-1, "%s[1]", iname); idxname = xstrdup(tbuf); break; } } done: if( iname ) xfree(iname); if( fname ) xfree(fname); if( size ) *size = ibuf.st_size; return idxname; } #ifdef ANSI_FUNC int idxinitparser(char *s) #else int idxinitparser(s) char *s; #endif { char *t; int havegz=0; Filter filt; /* sanity checks */ if( !(filt = FilterDefault()) ) return 0; if( !filt->fhd->filename ) return 0; /* initialize index file name info */ idxinitfilenames(filt->fhd->filename, &havegz); /* process index environent */ if( (t=getenv("FILTER_IDX_COLNAME")) ){ idxcolname = xstrdup(t); } else{ idxcolname = xstrdup("n"); } if( (t=getenv("FILTER_IDX_IO")) ){ if( !strncasecmp(t, "mmap", 4) ){ #ifdef HAVE_SYS_MMAN_H idx_io = IDX_IO_MMAP; #else idx_io = IDX_IO_LSEEK; #endif } else if( !strncasecmp(t, "lseek", 5) ){ idx_io = IDX_IO_LSEEK; } else{ idx_io = IDX_IO_DEFAULT; } } /* oops ... if we have a gz file, we can't use mmap */ if( havegz ){ idx_io = IDX_IO_LSEEK; } if( s ) idxstring(s); return 1; } #ifdef ANSI_FUNC void idxendparser(void) #else void idxendparser() #endif { idxvalfree(NULL); idxrowfree(NULL); idxfreeglobals(); } #ifdef ANSI_FUNC char * idxinfo(int which) #else char *idxinfo(which) int which; #endif { switch(which){ case IDX_COLNAME: return idxcolname; case IDX_FILENAME: return idxfilename; case IDX_FILEROOT1: return idxfileroot1; case IDX_FILEROOT2: return idxfileroot2; case IDX_PATHNAME: return idxpath; case IDX_SORTNAME: return idxsort; default: return NULL; } } #ifdef ANSI_FUNC int idxdebug(int debug) #else int idxdebug(debug) int debug; #endif { int odebug; odebug = idx_debug; idx_debug = debug; return odebug; } funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/filter/image_c.h000066400000000000000000000164361256243640000235320ustar00rootroot00000000000000static char *IMAGE_C="\n\n#ifdef TEST\n#include \n#include \n#define IMFILTRTN _FilterImage\n#define NMASK 0\n#define MASKDIM 0\n#define _masks NULL\n#define NSHAPE 2\n#define NREGION 2\n#define FILTER ((imcircle(g,1,1,1,4,(double)x,(double)y,8.0,8.0,5.0)))&&(imcircle(g,2,2,0,1,(double)x,(double)y,8.0,8.0,3.0))\n#define FILTSTR \"((imcircle(g,1,1,1,4,(double)x,(double)y,8.0,8.0,5.0)))&&(imcircle(g,2,2,0,1,(double)x,(double)y,8.0,8.0,3.0))\"\n#define FINIT imcirclei(g,1,1,1,4,(double)x,(double)y,8.0,8.0,5.0);imcirclei(g,2,2,0,1,(double)x,(double)y,8.0,8.0,3.0);\n#include \"regions.h\"\n#endif\n\n\nFilterMask masks=NULL; \nint maxmask; \nint nmask; \nint nreg; \nint rid; \nint x, y; \nint rlen; \nint *rbuf; \nint *rptr; \n\nvoid incnmask(void)\n{\n int omax;\n nmask++;\n if( nmask >= maxmask ){\n omax = maxmask;\n maxmask += MASKINC;\n masks = (FilterMask)realloc(masks, maxmask*sizeof(FilterMaskRec));\n memset(masks+omax, 0, (maxmask-omax)*sizeof(FilterMaskRec));\n }\n}\n\nFilterMask\nIMFILTRTN(int txmin, int txmax, int tymin, int tymax, int tblock, int *got)\n{\n int i, j;\n int fieldonly;\n GFilt g;\n Scan scan, tscan;\n\n \n if( NSHAPE <=0 ){\n *got = 0;\n return NULL;\n }\n \n g = (GFilt)calloc(1, sizeof(GFiltRec));\n \n fieldonly = (NSHAPE==1) && strstr(FILTSTR, \"field\");\n \n g->nshapes = NSHAPE;\n g->maxshapes = (NSHAPE*(XSNO+1))+1;\n g->shapes = (Shape)calloc(g->maxshapes, sizeof(ShapeRec));\n \n g->block= max(1,tblock);\n g->xmin = max(1,txmin); \n g->xmax = txmax;\n g->ymin = max(1,tymin);\n g->ymax = tymax;\n \n g->x0 = 1;\n g->y0 = 1;\n g->x1 = (g->xmax-g->xmin)/g->block+1;\n g->y1 = (g->ymax-g->ymin)/g->block+1;\n \n rlen = g->x1 - g->x0 + 1;\n rbuf = (int *)calloc(rlen+1, sizeof(int));\n \n maxmask = MASKINC;\n masks = (FilterMask)calloc(maxmask, sizeof(FilterMaskRec));\n \n nmask = 0;\n masks[nmask].region = 0;\n \n nreg = 0;\n \n g->ybuf = (int *)calloc(g->y1+1, sizeof(int));\n g->x0s = (int *)calloc(g->y1+1, sizeof(int));\n g->x1s = (int *)calloc(g->y1+1, sizeof(int));\n \n for(i=0; i<=g->y1; i++) g->x0s[i] = g->x1;\n for(i=0; i<=g->y1; i++) g->x1s[i] = g->x0;\n \n if( NMASK ){\n g->nmask = NMASK; \n g->maskdim = MASKDIM;\n g->masks = _masks;\n }\n \n FINIT;\n \n for(y=g->y0; y<=g->y1; y++){\n if( fieldonly ){\n \n masks[nmask].region = 1;\n masks[nmask].y = y - g->y0 + 1;\n masks[nmask].xstart = 1;\n masks[nmask].xstop = (g->x1 - g->x0 + 1);\n incnmask();\n continue;\n }\n if( g->ybuf[y] ){\n \n if( masks[nmask].region ){\n \n incnmask();\n masks[nmask].region = 0;\n }\n \n for(x=g->x0s[y], rptr=&rbuf[1+(g->x0s[y]-g->x0)]; x<=g->x1s[y];\n x++, rptr++){\n \n g->rid = 0;\n if( FILTER ){\n \n if( *rptr == 0 ){\n nreg++;\n *rptr = g->rid ? g->rid : -1;\n }\n \n else if( (*rptr == -1) && (g->rid >0) ){\n *rptr = g->rid;\n }\n }\n }\n }\n \n if( nreg ){\n for(i=1; i<=rlen; i++){\n if( rbuf[i] != masks[nmask].region ){\n \n if( masks[nmask].region ){\n masks[nmask].xstop = i - 1;\n \n incnmask();\n }\n masks[nmask].y = y - g->y0 + 1;\n masks[nmask].region = rbuf[i];\n masks[nmask].xstart = i;\n }\n }\n \n if( masks[nmask].region ){\n masks[nmask].xstop = (g->x1 - g->x0 + 1);\n \n incnmask();\n }\n \n (void)memset(rbuf, 0, (rlen+1)*sizeof(int));\n rptr = rbuf;\n nreg = 0;\n }\n }\n \n if( rbuf) free(rbuf);\n \n if( g ){\n for(i=0; imaxshapes; i++){\n if( g->shapes[i].scanlist ){\n for(j=0; j<=g->y1; j++){\n if( g->shapes[i].scanlist[j] ){\n for(scan=g->shapes[i].scanlist[j]; scan; ){\n tscan = scan->next;\n free(scan);\n scan = tscan;\n }\n }\n }\n free(g->shapes[i].scanlist);\n }\n if( g->shapes[i].pts ) free(g->shapes[i].pts);\n if( g->shapes[i].xv ) free(g->shapes[i].xv);\n }\n if( g->masks ) free(g->masks);\n if( g->shapes ) free(g->shapes);\n if( g->ybuf ) free(g->ybuf);\n if( g->x0s ) free(g->x0s);\n if( g->x1s ) free(g->x1s);\n if( g ) free(g);\n }\n \n *got = nmask;\n return masks;\n}\n\nint main(int argc, char **argv)\n{\n int i;\n int get, got;\n#if DO_FILTER_SWAP\n int sgot;\n#endif\n#if HAVE_MINGW32==0\n int pipes[4];\n#endif\n int txmin, txmax, tymin, tymax, tblock;\n char tbuf[SZ_LINE];\n char *s=NULL, *t=NULL, *u=NULL;\n#if USE_WIN32\n HANDLE hStdin, hStdout; \n DWORD dwRead, dwWritten; \n#endif\n\n \n#if HAVE_MINGW32==0\n if( (s=getenv(\"LAUNCH_PIPES\")) ){\n t = (char *)strdup(s);\n for(i=0, u=(char *)strtok(t, \",\"); i<4 && u; \n i++, u=(char *)strtok(NULL,\",\")){\n pipes[i] = atoi(u);\n }\n if( t ) free(t);\n if( i < 4 ) return(1);\n close(pipes[0]);\n close(pipes[3]);\n dup2(pipes[2], 0); close(pipes[2]);\n dup2(pipes[1], 1); close(pipes[1]);\n }\n#endif\n\n#if USE_WIN32\n hStdout = GetStdHandle(STD_OUTPUT_HANDLE); \n hStdin = GetStdHandle(STD_INPUT_HANDLE); \n if( (hStdout == INVALID_HANDLE_VALUE) || (hStdin == INVALID_HANDLE_VALUE) ){\n unlink(argv[0]);\n return 0;\n }\n#endif\n\n \n#ifdef TEST\n while( fgets(tbuf, SZ_LINE, stdin) ){\n#else\n#if USE_WIN32\n while((ReadFile(hStdin, &get, sizeof(int), &dwRead, NULL) != FALSE) && \n (dwRead == sizeof(int)) ){\n#else\n while( read(0, &get, sizeof(int)) == sizeof(int) ){\n#endif\n#if DO_FILTER_SWAP\n switch(sizeof(int)){\n case 2:\n _sw2((char *)&get,2,NULL,0);\n break;\n case 4:\n _sw4((char *)&get,4,NULL,0);\n break;\n case 8:\n _sw8((char *)&get,8,NULL,0);\n break;\n }\n#endif\n#if USE_WIN32\n if((ReadFile(hStdin, tbuf, get, &dwRead, NULL)==FALSE) || (dwRead != get))\n break;\n#else\n if(read(0, tbuf, get) != get) \n break;\n#endif\n#endif \n if(sscanf(tbuf, \"%d %d %d %d %d\",\n &txmin, &txmax, &tymin, &tymax, &tblock)!=5){\n break;\n }\n masks = IMFILTRTN(txmin, txmax, tymin, tymax, tblock, &got);\n#ifdef TEST\n \n fprintf(stdout, \"nmask=%d\\n\", nmask);\n for(i=0; i #include #define IMFILTRTN _FilterImage #define NMASK 0 #define MASKDIM 0 #define _masks NULL #define NSHAPE 2 #define NREGION 2 #define FILTER ((imcircle(g,1,1,1,4,(double)x,(double)y,8.0,8.0,5.0)))&&(imcircle(g,2,2,0,1,(double)x,(double)y,8.0,8.0,3.0)) #define FILTSTR "((imcircle(g,1,1,1,4,(double)x,(double)y,8.0,8.0,5.0)))&&(imcircle(g,2,2,0,1,(double)x,(double)y,8.0,8.0,3.0))" #define FINIT imcirclei(g,1,1,1,4,(double)x,(double)y,8.0,8.0,5.0);imcirclei(g,2,2,0,1,(double)x,(double)y,8.0,8.0,3.0); #include "regions.h" #endif /* these are global for use with special region routines */ FilterMask masks=NULL; /* array valid region masks for one row */ int maxmask; /* max masks allocated thus far */ int nmask; /* number of mask segments */ int nreg; /* number of regions in this set of rows */ int rid; /* first valid region for current pixel */ int x, y; /* current row and column */ int rlen; /* length of temp region buf */ int *rbuf; /* temp region flags */ int *rptr; /* pointer into region buffer */ void incnmask(void) { int omax; nmask++; if( nmask >= maxmask ){ omax = maxmask; maxmask += MASKINC; masks = (FilterMask)realloc(masks, maxmask*sizeof(FilterMaskRec)); memset(masks+omax, 0, (maxmask-omax)*sizeof(FilterMaskRec)); } } FilterMask IMFILTRTN(int txmin, int txmax, int tymin, int tymax, int tblock, int *got) { int i, j; int fieldonly; GFilt g; Scan scan, tscan; /* make sure we have something to process */ if( NSHAPE <=0 ){ *got = 0; return NULL; } /* allocate space for the globals */ g = (GFilt)calloc(1, sizeof(GFiltRec)); /* see if we have only the field shape */ fieldonly = (NSHAPE==1) && strstr(FILTSTR, "field"); /* allocate region records */ g->nshapes = NSHAPE; g->maxshapes = (NSHAPE*(XSNO+1))+1; g->shapes = (Shape)calloc(g->maxshapes, sizeof(ShapeRec)); /* make sure we start at 1 */ g->block= max(1,tblock); g->xmin = max(1,txmin); g->xmax = txmax; g->ymin = max(1,tymin); g->ymax = tymax; /* get x and y limits on subsection */ g->x0 = 1; g->y0 = 1; g->x1 = (g->xmax-g->xmin)/g->block+1; g->y1 = (g->ymax-g->ymin)/g->block+1; /* allocate a temp region buffer */ rlen = g->x1 - g->x0 + 1; rbuf = (int *)calloc(rlen+1, sizeof(int)); /* allocate an array of masks, which will be written to caller */ maxmask = MASKINC; masks = (FilterMask)calloc(maxmask, sizeof(FilterMaskRec)); /* seed the first region mask value */ nmask = 0; masks[nmask].region = 0; /* keep track of how many hits we had for this set of rows */ nreg = 0; /* allocate a buffer for valid y row flags */ g->ybuf = (int *)calloc(g->y1+1, sizeof(int)); g->x0s = (int *)calloc(g->y1+1, sizeof(int)); g->x1s = (int *)calloc(g->y1+1, sizeof(int)); /* seed impossible values for x limits */ for(i=0; i<=g->y1; i++) g->x0s[i] = g->x1; for(i=0; i<=g->y1; i++) g->x1s[i] = g->x0; /* save image mask values */ if( NMASK ){ g->nmask = NMASK; g->maskdim = MASKDIM; g->masks = _masks; } /* initialize ybuf */ FINIT; /* process all valid rows */ for(y=g->y0; y<=g->y1; y++){ if( fieldonly ){ /* inc the mask count, (extend mask array, if necessary) */ masks[nmask].region = 1; masks[nmask].y = y - g->y0 + 1; masks[nmask].xstart = 1; masks[nmask].xstop = (g->x1 - g->x0 + 1); incnmask(); continue; } if( g->ybuf[y] ){ /* to start this line, we make a seed mask with no region */ if( masks[nmask].region ){ /* inc the mask count, (extend mask array, if necessary) */ incnmask(); masks[nmask].region = 0; } /* process each pixel in this row where there is a region */ for(x=g->x0s[y], rptr=&rbuf[1+(g->x0s[y]-g->x0)]; x<=g->x1s[y]; x++, rptr++){ /* get filter result, which is the region id or 0 */ g->rid = 0; if( FILTER ){ /* never change a region id to a -1 */ if( *rptr == 0 ){ nreg++; *rptr = g->rid ? g->rid : -1; } /* but always overwrite a -1 */ else if( (*rptr == -1) && (g->rid >0) ){ *rptr = g->rid; } } } } /* if we have processed a row, make up the segments */ if( nreg ){ for(i=1; i<=rlen; i++){ if( rbuf[i] != masks[nmask].region ){ /* if previous was non-zero region, finish it and bump to next */ if( masks[nmask].region ){ masks[nmask].xstop = i - 1; /* inc the mask count, (extend mask array, if necessary) */ incnmask(); } masks[nmask].y = y - g->y0 + 1; masks[nmask].region = rbuf[i]; masks[nmask].xstart = i; } } /* finish last non-zero segment, inc number of mask segs */ if( masks[nmask].region ){ masks[nmask].xstop = (g->x1 - g->x0 + 1); /* inc the mask count, (extend mask array, if necessary) */ incnmask(); } /* reset counters for next set of rows */ (void)memset(rbuf, 0, (rlen+1)*sizeof(int)); rptr = rbuf; nreg = 0; } } /* free buffers */ if( rbuf) free(rbuf); /* free region information */ if( g ){ for(i=0; imaxshapes; i++){ if( g->shapes[i].scanlist ){ for(j=0; j<=g->y1; j++){ if( g->shapes[i].scanlist[j] ){ for(scan=g->shapes[i].scanlist[j]; scan; ){ tscan = scan->next; free(scan); scan = tscan; } } } free(g->shapes[i].scanlist); } if( g->shapes[i].pts ) free(g->shapes[i].pts); if( g->shapes[i].xv ) free(g->shapes[i].xv); } if( g->masks ) free(g->masks); if( g->shapes ) free(g->shapes); if( g->ybuf ) free(g->ybuf); if( g->x0s ) free(g->x0s); if( g->x1s ) free(g->x1s); if( g ) free(g); } /* return mask info */ *got = nmask; return masks; } int main(int argc, char **argv) { int i; int get, got; #if DO_FILTER_SWAP int sgot; #endif #if HAVE_MINGW32==0 int pipes[4]; #endif int txmin, txmax, tymin, tymax, tblock; char tbuf[SZ_LINE]; char *s=NULL, *t=NULL, *u=NULL; #if USE_WIN32 HANDLE hStdin, hStdout; DWORD dwRead, dwWritten; #endif /* Launch() sometimes rearranges passed pipes to be stdin/stdout */ #if HAVE_MINGW32==0 if( (s=getenv("LAUNCH_PIPES")) ){ t = (char *)strdup(s); for(i=0, u=(char *)strtok(t, ","); i<4 && u; i++, u=(char *)strtok(NULL,",")){ pipes[i] = atoi(u); } if( t ) free(t); if( i < 4 ) return(1); close(pipes[0]); close(pipes[3]); dup2(pipes[2], 0); close(pipes[2]); dup2(pipes[1], 1); close(pipes[1]); } #endif #if USE_WIN32 hStdout = GetStdHandle(STD_OUTPUT_HANDLE); hStdin = GetStdHandle(STD_INPUT_HANDLE); if( (hStdout == INVALID_HANDLE_VALUE) || (hStdin == INVALID_HANDLE_VALUE) ){ unlink(argv[0]); return 0; } #endif /* process requests for region information for sections of the image */ #ifdef TEST while( fgets(tbuf, SZ_LINE, stdin) ){ #else #if USE_WIN32 while((ReadFile(hStdin, &get, sizeof(int), &dwRead, NULL) != FALSE) && (dwRead == sizeof(int)) ){ #else while( read(0, &get, sizeof(int)) == sizeof(int) ){ #endif #if DO_FILTER_SWAP switch(sizeof(int)){ case 2: _sw2((char *)&get,2,NULL,0); break; case 4: _sw4((char *)&get,4,NULL,0); break; case 8: _sw8((char *)&get,8,NULL,0); break; } #endif #if USE_WIN32 if((ReadFile(hStdin, tbuf, get, &dwRead, NULL)==FALSE) || (dwRead != get)) break; #else if(read(0, tbuf, get) != get) break; #endif #endif /* #ifdef TEST */ if(sscanf(tbuf, "%d %d %d %d %d", &txmin, &txmax, &tymin, &tymax, &tblock)!=5){ break; } masks = IMFILTRTN(txmin, txmax, tymin, tymax, tblock, &got); #ifdef TEST /* display segments for debugging */ fprintf(stdout, "nmask=%d\n", nmask); for(i=0; i #endif /* panda and pie incorrectly used astronomical angles. fixed 4/2004 */ #define USE_ASTRO_ANGLE 0 /* we might want to avoid (x86) extended precision problems */ #define USE_FPU_DOUBLE 0 #if USE_FPU_DOUBLE #include static fpu_control_t _cw; #define FPU_DOUBLE {fpu_control_t _cw2; _FPU_GETCW(_cw); _cw2 = _cw & ~_FPU_EXTENDED; _cw2 |= _FPU_DOUBLE; _FPU_SETCW(_cw2);} #define FPU_RESTORE {_FPU_SETCW(_cw);} #else #define FPU_DOUBLE #define FPU_RESTORE #endif /* add to FilterOpen to cause this module to be loaded for dynamic linking */ static int imregno=0; void initimregions(void) { imregno++; return; } static void markx(GFilt g, int sno, int flag, int type, int x, int y) { /* avoid -W unused parameter warning */ if( 0 ){ sno = sno; } /* don't mark exclude regions */ if( type == TOK_EREG ) return; /* for include, we might extend the x limits */ if( flag ){ if( x <= g->x0s[y] ) g->x0s[y] = max(x,g->x0); if( x >= g->x1s[y] ) g->x1s[y] = min(x,g->x1); } /* for exclude, we have to look at the full line */ else{ g->x0s[y] = g->x0; g->x1s[y] = g->x1; } } static void marky(GFilt g, int sno, int flag, int type) { int i; /* don't mark exclude regions */ if( type == TOK_EREG ) return; /* mark include shape */ if( flag ){ for(i=max(g->y0,g->shapes[sno].ystart); i<=min(g->y1,g->shapes[sno].ystop); i++) g->ybuf[i] = 1; } /* mark exclude shape */ else{ for(i=g->y0; i<=g->shapes[sno].ystart-1; i++) g->ybuf[i] = 1; for(i=g->shapes[sno].ystop+1; i<=g->y1; i++) g->ybuf[i] = 1; } } static int imagemaskcmp(const void *s1, const void *s2) { FilterMask f1 = (FilterMask)s1; FilterMask f2 = (FilterMask)s2; if( f1->y < f2->y ){ return -1; } else if( f1->y > f2->y ){ return 1; } else{ if( f1->xstart < f2->xstart ){ return -1; } else{ return 1; } } } /* ***************************** shape support ***************************** */ static void quadeq(double a, double b, double c, double *x1, double *x2, int *nr, int *nc) { double dis, q; if( feq(a,0.0) ){ *nc = 0; if( feq(b,0.0) ){ *nr = 0; *x1 = 0.0; } else{ *nr = 1; *x1 = -c / b; } *x2 = *x1; } else{ dis = b*b - 4.0 * a * c; if( dis > 0.0 ){ *nr = 2; *nc = 0; dis = sqrt(dis); if( b < 0.0 ) dis = -dis; q = -0.5 * (b + dis); *x1 = q/a; *x2 = c/q; if(*x1 > *x2){ q = *x1; *x1 = *x2; *x2 = q; } } else if( feq(dis,0.0) ){ *nr = 1; *nc = 0; *x1 = - 0.5 * b / a; *x2 = *x1; } else{ *nr = 0; *nc = 2; *x1 = - 0.5 * b / a; *x2 = 0.5 * sqrt(-dis) / a; } } } static void rgs_mark(GFilt g, Scan *scanlist, int sno, int flag, int type, int xval, int yval ) { Scan scanmark, mark; /* since yval is used as an index, make sure its within limits */ if(yval < g->y0) yval = g->y0; if(yval > g->y1) yval = g->y1; mark = (Scan)calloc(1, sizeof(ScanRec)); mark->x = xval; /* sanity check */ if( !scanlist ) return; /* starts are installed at back of list for given x */ if( !scanlist[yval] || ((scanlist[yval])->x > xval) ){ mark->next = scanlist[yval]; scanlist[yval] = mark; } else { scanmark = scanlist[yval]; while( scanmark->next && ((scanmark->next)->x < xval) ) scanmark = scanmark->next; mark->next = scanmark->next; scanmark->next = mark; } markx(g, sno, flag, type, xval, yval); } static void rgs_segment(GFilt g, Scan *scanlist, int width, int height, int sno, int flag, int type, double x1, double y1, double x2, double y2) { int ystart, ystop, yval, xval; double invslope, xoffset; ystart = PIXINCL(y1); if( ystart < 1 ) ystart = 1; /* note: PIXINCL(stop) is 1st pixel not counted */ ystop = PIXINCL(y2) - 1; if( ystop > height ) ystop = height; /* ignore segment if there is no positive slope in integer coords */ if( (ystart > ystop) || (ystop < 1) ) return; /* use inverse slope (run/rise) to get x given y with a multiply */ invslope = (x1 - x2) / (y1 - y2); xoffset = x1 + ((ystart - y1) * invslope); for(yval=ystart; yval<=ystop; yval++){ xval = PIXINCL(xoffset); /* clip line to edges of image area (actually bend line) */ if(xval < 1) xval = 1; if(xval > width) xval = width + 1; rgs_mark(g, scanlist, sno, flag, type, xval, yval); xoffset = xoffset + invslope; } } static void _polygoni(GFilt g, int qt, int rno, int sno, int flag, int type, double *vx, double *vy, int count) { int i, j; double xlo, xhi; double ylo, yhi; #ifdef ALREADY_DONE /* divide by block factor to get real endpoints */ for(i=0; ixmin)/g->block + 1.0; vy[i] = (vy[i] - g->ymin)/g->block + 1.0; } #endif /* avoid -W unused parameter warning */ if( 0 ){ rno = rno; } /* find the limits */ xlo = vx[0]; xhi = xlo; ylo = vy[0]; yhi = ylo; for(i=0; i xhi) xhi = vx[i]; if(vx[i] < xlo) xlo = vx[i]; if(vy[i] > yhi) yhi = vy[i]; if(vy[i] < ylo) ylo = vy[i]; } if( qt && (sno > 1) ){ g->shapes[sno].ystart = g->shapes[sno-1].ystart; g->shapes[sno].ystop = g->shapes[sno-1].ystop; } else{ g->shapes[sno].ystart = max(g->y0,PIXINCL(ylo)); g->shapes[sno].ystop = min(g->y1,PIXINCL(yhi) - 1); } g->shapes[sno].scanlist = (Scan *)calloc(g->y1+1, sizeof(Scan)); marky(g, sno, flag, type); /* mark all horizontal segment crossings */ /* start with segment between last and first point */ j = count-1; for(i=0; i vy[j]){ rgs_segment(g, g->shapes[sno].scanlist, g->x1, g->y1, sno, flag, type, vx[j], vy[j], vx[i], vy[i]); } else{ rgs_segment(g, g->shapes[sno].scanlist, g->x1, g->y1, sno, flag, type, vx[i], vy[i], vx[j], vy[j]); } j = i; } } static int corner_vertex(int index, int width, int height, double *x, double *y) { switch (index) { case 1: *x = 0.0; *y = height + 1; break; case 2: *x = 0.0; *y = 0.0; break; case 3: *x = width + 1; *y = 0.0; break; case 4: *x = width + 1; *y = height + 1; default: break; } index = index + 1; if(index > 4) index = 1; return(index); } static int pie_intercept(int width, int height, double xcen, double ycen, double angle, double *xcept, double *ycept) { double angl, slope; /* l: angle and slope of ray */ angl = angle; /* put angles in normal range */ while (angl < 0.0) angl = angl + 360.0; while (angl >= 360.0) angl = angl - 360.0; /* check for a horizontal angle */ #if USE_ASTRO_ANGLE if(fabs(angl - 90.0) < SMALL_NUMBER) { #else if(fabs(angl - 180.0) < SMALL_NUMBER) { #endif *xcept = 0.0; *ycept = ycen; return(2); } #if USE_ASTRO_ANGLE if(fabs(angl - 270.0) < SMALL_NUMBER) { #else if(fabs(angl - 0.0) < SMALL_NUMBER) { #endif *xcept = width + 1; *ycept = ycen; return(4); } #if USE_ASTRO_ANGLE /* convert to a Cartesian angle */ angl = angl + 90.0; #else angl = angl; #endif if(angl >= 360.0) angl = angl - 360.0; if(angl < 180.0) { *ycept = height + 1; /* rule out vertical line */ if(fabs(angl - 90.0) < SMALL_NUMBER) { *xcept = xcen; return(1); } } else { *ycept = 0.0; /* rule out vertical line */ if(fabs(angl - 270.0) < SMALL_NUMBER) { *xcept = xcen; return(3); } } /* convert to radians */ angl = (angl / 180.0) * M_PI; /* calculate slope */ slope = tan(angl); /* calculate intercept with designated y edge */ *xcept = xcen + ((*ycept - ycen) / slope); if(*xcept < 0) { *ycept = (ycen - (xcen * slope)); *xcept = 0.0; return(2); } else if(*xcept > (width + 1)) { *ycept = (ycen + ((width + 1 - xcen) * slope)); *xcept = width + 1; return(4); } else { if(*ycept < height) return(3); else return(1); } } void _impiei(GFilt g, int qt, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, double angle1, double angle2) { int width, height; /* l: image mask width and height */ double sweep; /* l: sweep between cut angles */ double vx[7], vy[7]; /* l: arrays of vertices for polygon */ int count; /* l: number of polygon vertices */ int intrcpt1, intrcpt2; /* l: side intercepted by each cut */ double x2, y2; /* l: coordinates of second intercept */ /* NB: do not use x and y variables, they have bogus values */ /* avoid -W unused parameter warning */ if( 0 ){ x = x; y = y; } /* divide by block factor to get "real" parameters */ xcen = (xcen - g->xmin)/g->block + 1.0; ycen = (ycen - g->ymin)/g->block + 1.0; /* temps */ width = g->x1; height = g->y1; /* start listing vertices of polygon */ vx[0] = xcen; vy[0] = ycen; sweep = angle2 - angle1; /* if sweep is too small to be noticed, don't bother */ if(fabs(sweep) < SMALL_NUMBER) return; if (sweep < 0.0) sweep = sweep + 360.0; intrcpt1 = pie_intercept(width, height, xcen, ycen, angle1, &(vx[1]), &(vy[1])); intrcpt2 = pie_intercept(width, height, xcen, ycen, angle2, &x2, &y2); count = 2; /* if angles intercept same side and slice is between them, no corners */ /* else, mark corners until reaching side with second angle intercept */ if((intrcpt1 != intrcpt2) || (sweep > 180.0)){ do{ intrcpt1 = corner_vertex(intrcpt1, width, height, &(vx[count]), &(vy[count])); count = count + 1; }while(intrcpt1 != intrcpt2); } vx[count] = x2; vy[count] = y2; count++; _polygoni(g, qt, rno, sno, flag, type, vx, vy, count); } /* ***************************** shapes ********************************** */ void imannulusi(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, double iradius, double oradius) { int yy; double dval; double xoff, yoff; Scan *scanlist; /* NB: do not use x and y variables, they have bogus values */ if( iradius == 0 ){ imcirclei(g, rno, sno, flag, type, x, y, xcen, ycen, oradius); return; } /* divide by block factor to get "real" parameters */ xcen = (xcen - g->xmin)/g->block + 1.0; ycen = (ycen - g->ymin)/g->block + 1.0; iradius /= (double)g->block; oradius /= (double)g->block; /* set y limits */ if( PIXSTART(ycen - oradius) < PIXSTOP(ycen + oradius) ){ g->shapes[sno].ystart = max(g->y0,PIXSTART(ycen - oradius)); g->shapes[sno].ystop = min(g->y1,PIXSTOP(ycen + oradius)); } else{ g->shapes[sno].ystart = min(g->y1,PIXSTOP(ycen + oradius)); g->shapes[sno].ystop = max(g->y0,PIXSTART(ycen - oradius)); } g->shapes[sno].scanlist = (Scan *)calloc(g->y1+1, sizeof(Scan)); scanlist = g->shapes[sno].scanlist; marky(g, sno, flag, type); /* calculate start/stop values for each y line */ for(yy=g->shapes[sno].ystart; yy<=g->shapes[sno].ystop; yy++){ yoff = PIXCEN(yy) - ycen; if( (dval=(oradius * oradius) - (yoff * yoff)) > 0.0 ){ xoff = sqrt(dval); if( PIXSTART(xcen - xoff) <= PIXSTOP(xcen + xoff) ){ rgs_mark(g, scanlist, sno, flag, type, PIXSTART(xcen - xoff), yy); rgs_mark(g, scanlist, sno, flag, type, PIXSTOP(xcen + xoff), yy); } if( (dval=(iradius * iradius) - (yoff * yoff)) > 0.0 ){ xoff = sqrt(dval); if( PIXSTART(xcen - xoff) <= PIXSTOP(xcen + xoff) ){ rgs_mark(g, scanlist, sno, flag, type, PIXSTART(xcen - xoff), yy); rgs_mark(g, scanlist, sno, flag, type, PIXSTOP(xcen + xoff), yy); } } } } } int imannulus(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, double iradius, double oradius) { Scan scan; if( iradius == 0 ){ return(imcircle(g, rno, sno, flag, type, x, y, xcen, ycen, oradius)); } if( g->evsect ){ if( g->usebinsiz ){ x = (int)((x - g->tlminx)/g->binsizx + 1.0); y = (int)((y - g->tlminy)/g->binsizy + 1.0); } else{ x = (int)((x - g->tlminx) + 1.0); y = (int)((y - g->tlminy) + 1.0); } x = (int)((x - g->xmin)/g->block + 1.0); y = (int)((y - g->ymin)/g->block + 1.0); if(y < g->y0) return 0; if(y > g->y1) return 0; if(x < g->x0) return 0; if(x > g->x1) return 0; } if( flag ){ if(y < g->shapes[sno].ystart ) return 0; if(y > g->shapes[sno].ystop ) return 0; } scan = g->shapes[sno].scanlist[(int)y]; if( (scan && ((y >= g->shapes[sno].ystart) && (y <= g->shapes[sno].ystop)) && (scan->next->next ? (((x >= scan->x) && (x <= scan->next->next->next->x)) && !((x >= scan->next->x) && (x <= scan->next->next->x))) : ((x >= scan->x) && (x <= scan->next->x)))) ==flag ){ if( rno && flag ) g->rid = rno; return 1; } else return 0; } void imboxi(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, double xwidth, double yheight, double angle) { double angl; /* l: Cartesian angle in radians */ double half_width, half_height;/* l: radii (1/2 width and height) */ double cosangl, sinangl; /* l: sine, cosine of the Cartesian angle */ double hw_cos, hw_sin; /* l: products of half_width with sin, cos */ double hh_cos, hh_sin; /* l: products of half_height with sin, cos */ double cornerx[4], cornery[4]; /* l: arrays of x and y coords of 4 corners */ /* NB: do not use x and y variables, they have bogus values */ /* avoid -W unused parameter warning */ if( 0 ){ x = x; y = y; } if( (xwidth == 0) && (yheight==0) ){ return; } /* divide by block factor to get "real" parameters */ xcen = (xcen - g->xmin)/g->block + 1.0; ycen = (ycen - g->ymin)/g->block + 1.0; xwidth /= (double)g->block; yheight /= (double)g->block; #if USE_ASTRO_ANGLE /* convert to a Cartesian angle; save angle for use in multi or slices */ angl = angle + 90.0; #else angl = angle; #endif while (angl >= 360.0) angl = angl - 360.0; /* convert to radians */ angl = (angl / 180.0) * M_PI; sinangl = sin (angl); cosangl = cos (angl); #if USE_ASTRO_ANGLE /* since we rotate by 90.0 degrees to get from astro angle to cartesian, */ /* we also need to switch the width and height. we do this secretly so */ /* that the display will turn out right, by doing it in the half terms */ half_width = yheight / 2.0; half_height = xwidth / 2.0; #else half_width = xwidth / 2.0; half_height = yheight / 2.0; #endif hw_cos = half_width * cosangl; hw_sin = half_width * sinangl; hh_cos = half_height * cosangl; hh_sin = half_height * sinangl; #if USE_ASTRO_ANGLE cornerx[0] = xcen - hw_cos - hh_sin; cornery[0] = ycen - hw_sin + hh_cos; cornerx[1] = xcen + hw_cos - hh_sin; cornery[1] = ycen + hw_sin + hh_cos; cornerx[2] = xcen + hw_cos + hh_sin; cornery[2] = ycen + hw_sin - hh_cos; cornerx[3] = xcen - hw_cos + hh_sin; cornery[3] = ycen - hw_sin - hh_cos; #else cornerx[0] = xcen - hw_cos + hh_sin; cornery[0] = ycen - hh_cos - hw_sin; cornerx[1] = xcen - hw_cos - hh_sin; cornery[1] = ycen + hh_cos - hw_sin; cornerx[2] = xcen + hw_cos - hh_sin; cornery[2] = ycen + hh_cos + hw_sin; cornerx[3] = xcen + hw_cos + hh_sin; cornery[3] = ycen - hh_cos + hw_sin; #endif _polygoni(g, 0, rno, sno, flag, type, cornerx, cornery, 4); } int imbox(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, double xwidth, double yheight, double angle) { /* avoid -W unused parameter warning */ if( 0 ){ xcen = xcen; ycen = ycen; angle = angle; } if( (xwidth == 0) && (yheight==0) ){ return(!flag); } return impolygon(g, rno, sno, flag, type, x, y); } void imcirclei(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, double radius) { int yy; double dval; double xoff, yoff; Scan *scanlist; /* NB: do not use x and y variables, they have bogus values */ /* avoid -W unused parameter warning */ if( 0 ){ rno = rno; x = x; y = y; } if( radius == 0 ){ return; } /* divide by block factor to get "real" parameters */ xcen = (xcen - g->xmin)/g->block + 1.0; ycen = (ycen - g->ymin)/g->block + 1.0; radius /= (double)g->block; /* set y limits */ if( PIXSTART(ycen - radius) < PIXSTOP(ycen + radius) ){ g->shapes[sno].ystart = max(g->y0,PIXSTART(ycen - radius)); g->shapes[sno].ystop = min(g->y1,PIXSTOP(ycen + radius)); } else{ g->shapes[sno].ystart = min(g->y1,PIXSTOP(ycen + radius)); g->shapes[sno].ystop = max(g->y0,PIXSTART(ycen - radius)); } g->shapes[sno].scanlist = (Scan *)calloc(g->y1+1, sizeof(Scan)); scanlist = g->shapes[sno].scanlist; marky(g, sno, flag, type); /* calculate start/stop values for each y line */ for(yy=g->shapes[sno].ystart; yy<=g->shapes[sno].ystop; yy++){ yoff = PIXCEN(yy) - ycen; if( (dval=(radius * radius) - (yoff * yoff))>=0.0 ){ xoff = sqrt(dval); if( PIXSTART(xcen - xoff) <= PIXSTOP(xcen + xoff) ){ rgs_mark(g, scanlist, sno, flag, type, PIXSTART(xcen - xoff), yy); rgs_mark(g, scanlist, sno, flag, type, PIXSTOP(xcen + xoff), yy); } } } } int imcircle(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, double radius) { Scan scan; /* avoid -W unused parameter warning */ if( 0 ){ type = type; xcen = xcen; ycen = ycen; } if( radius == 0 ){ return(!flag); } if( g->evsect ){ if( g->usebinsiz ){ x = (int)((x - g->tlminx)/g->binsizx + 1.0); y = (int)((y - g->tlminy)/g->binsizy + 1.0); } else{ x = (int)((x - g->tlminx) + 1.0); y = (int)((y - g->tlminy) + 1.0); } x = (int)((x - g->xmin)/g->block + 1.0); y = (int)((y - g->ymin)/g->block + 1.0); if(y < g->y0) return 0; if(y > g->y1) return 0; if(x < g->x0) return 0; if(x > g->x1) return 0; } if( flag ){ if(y < g->shapes[sno].ystart ) return 0; if(y > g->shapes[sno].ystop ) return 0; } scan = g->shapes[sno].scanlist[(int)y]; if( (scan && ((y>=g->shapes[sno].ystart) && (y<=g->shapes[sno].ystop)) && ((x >= scan->x) && (x <= (scan->next)->x))) == flag ){ if( rno && flag ) g->rid = rno; return 1; } else{ return 0; } } void imellipsei(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, double xrad, double yrad, double angle) { int yy; int nr, nc; double yhi; double yoff; double xboff, xfoff; double angl; double sinangl, cosangl; double cossq, sinsq, xradsq, yradsq; double a, b_partial, c_partial; double b, c; Scan *scanlist; /* NB: do not use x and y variables, they have bogus values */ if( xrad == yrad ){ imcirclei(g, rno, sno, flag, type, x, y, xcen, ycen, xrad); return; } /* divide by block factor to get "real" parameters */ xcen = (xcen - g->xmin)/g->block + 1.0; ycen = (ycen - g->ymin)/g->block + 1.0; xrad /= (double)g->block; yrad /= (double)g->block; /* set worst case limits (xrad axis parallel to vertical axis) */ #if USE_ASTRO_ANGLE /* convert to a Cartesian angle; save "angle" for use by other routines */ angl = angle + 90.0; #else angl = angle; #endif while( angl >= 360.0 ) angl = angl - 360.0; /* convert to radians */ angl = (angl / 180.0) * M_PI; sinangl = sin(angl); cosangl = cos(angl); /* calculate approximate y limits */ /* choose lesser of containing rotbox and circle */ FPU_DOUBLE #if USE_ASTRO_ANGLE yhi = fabs(sinangl * yrad) + fabs(cosangl * xrad); #else yhi = fabs(sinangl * xrad) + fabs(cosangl * yrad); #endif yhi = min(yhi, max(yrad, xrad)); /* set y limits */ if( PIXSTART(ycen - yhi) < PIXSTOP(ycen + yhi) ){ g->shapes[sno].ystart = max(g->y0,PIXSTART(ycen - yhi)); g->shapes[sno].ystop = min(g->y1,PIXSTOP(ycen + yhi)); } else{ g->shapes[sno].ystart = min(g->y1,PIXSTOP(ycen + yhi)); g->shapes[sno].ystop = max(g->y0,PIXSTART(ycen - yhi)); } FPU_RESTORE g->shapes[sno].scanlist = (Scan *)calloc(g->y1+1, sizeof(Scan)); scanlist = g->shapes[sno].scanlist; marky(g, sno, flag, type); /* prepare partials for quadratic equation solutions to coordinates */ cossq = cosangl * cosangl; sinsq = sinangl * sinangl; #if USE_ASTRO_ANGLE /* because we rotate by 90.0 degrees to get from astro angle to */ /* cartesian, we also need to switch the x and y axes. we do this */ /* secretly so that the display will turn out right, by doing it in */ /* the sq terms */ xradsq = yrad * yrad; yradsq = xrad * xrad; #else xradsq = xrad * xrad; yradsq = yrad * yrad; #endif /* fill in as much of a,b,c as we can */ a = (cossq / xradsq) + (sinsq / yradsq); b_partial = (2.0 * sinangl) * ((cosangl / xradsq) - (cosangl / yradsq)); c_partial = (sinsq / xradsq) + (cossq / yradsq); /* calculate start/stop values for each y line */ for(yy=g->shapes[sno].ystart; yy<=g->shapes[sno].ystop; yy++){ yoff = yy - ycen; b = b_partial * yoff; c = (c_partial * yoff * yoff) - 1.0; /* solve quadratic */ quadeq (a, b, c, &xboff, &xfoff, &nr, &nc); /* if real roots */ if( nr != 0 ) { /* translate x coordinates */ rgs_mark(g, scanlist, sno, flag, type, PIXSTART(xcen + xboff), yy); rgs_mark(g, scanlist, sno, flag, type, PIXSTOP(xcen + xfoff), yy); } } } int imellipse(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, double xrad, double yrad, double angle) { Scan scan; /* avoid -W unused parameter warning */ if( 0 ){ angle = angle; } if( xrad == yrad ){ return(imcircle(g, rno, sno, flag, type, x, y, xcen, ycen, xrad)); } if( g->evsect ){ if( g->usebinsiz ){ x = (int)((x - g->tlminx)/g->binsizx + 1.0); y = (int)((y - g->tlminy)/g->binsizy + 1.0); } else{ x = (int)((x - g->tlminx) + 1.0); y = (int)((y - g->tlminy) + 1.0); } x = (int)((x - g->xmin)/g->block + 1.0); y = (int)((y - g->ymin)/g->block + 1.0); if(y < g->y0) return 0; if(y > g->y1) return 0; if(x < g->x0) return 0; if(x > g->x1) return 0; } if( flag ){ if(y < g->shapes[sno].ystart ) return 0; if(y > g->shapes[sno].ystop ) return 0; } scan = g->shapes[sno].scanlist[(int)y]; FPU_DOUBLE if( (scan && ((y>=g->shapes[sno].ystart) && (y<=g->shapes[sno].ystop)) && ((x >= scan->x) && (x <= (scan->next)->x))) == flag ){ if( rno && flag ) g->rid = rno; FPU_RESTORE return 1; } else{ FPU_RESTORE return 0; } } void imfieldi(GFilt g, int rno, int sno, int flag, int type, double x, double y) { int yy; Scan *scanlist; /* avoid -W unused parameter warning */ if( 0 ){ rno = rno; } /* NB: do not use x and y variables, they have bogus values */ /* avoid -W unused parameter warning */ if( 0 ){ sno = sno; type = type; x = x; y = y; } g->shapes[sno].ystart = g->y0; g->shapes[sno].ystop = g->y1; g->shapes[sno].scanlist = (Scan *)calloc(g->y1+1, sizeof(Scan)); scanlist = g->shapes[sno].scanlist; marky(g, sno, flag, type); /* calculate start/stop values for each y line */ for(yy=g->shapes[sno].ystart; yy<=g->shapes[sno].ystop; yy++){ rgs_mark(g, scanlist, sno, flag, type, g->x0, yy); rgs_mark(g, scanlist, sno, flag, type, g->x1, yy); } } int imfield(GFilt g, int rno, int sno, int flag, int type, double x, double y) { /* avoid -W unused parameter warning */ if( 0 ){ sno = sno; type = type; x = x; y = y; } if( flag ){ if( rno && flag ) g->rid = rno; return 1; } else{ return 0; } } void imlinei(GFilt g, int rno, int sno, int flag, int type, double x, double y, double x1, double y1, double x2, double y2) { double vx[2]; double vy[2]; int xval, yval; double invslope, xoffset; /* NB: do not use x and y variables, they have bogus values */ /* avoid -W unused parameter warning */ if( 0 ){ rno = rno; x = x; y = y; } /* divide by block factor to get "real" parameters */ x1 = (x1 - g->xmin)/g->block + 1.0; y1 = (y1 - g->ymin)/g->block + 1.0; x2 = (x2 - g->xmin)/g->block + 1.0; y2 = (y2 - g->ymin)/g->block + 1.0; /* order by increasing y */ if( y1 < y2 ){ vx[0] = x1; vy[0] = y1; vx[1] = x2; vy[1] = y2; } else{ vx[0] = x2; vy[0] = y2; vx[1] = x1; vy[1] = y1; } /* set y limits */ g->shapes[sno].ystart = PIXNUM(vy[0]); g->shapes[sno].ystop = PIXNUM(vy[1]); g->shapes[sno].scanlist = (Scan *)calloc(g->y1+1, sizeof(Scan)); marky(g, sno, flag, type); if( feq(vy[0],vy[1]) ){ rgs_mark(g, g->shapes[sno].scanlist, sno, flag, type, (int)min(vx[0],vx[1]), (int)vy[0]); rgs_mark(g, g->shapes[sno].scanlist, sno, flag, type, (int)max(vx[0],vx[1]), (int)vy[0]); } else{ /* mark all horizontal segment crossings */ invslope = (vx[0] - vx[1]) / (vy[0] - vy[1]); xoffset = vx[0]; for(yval=vy[0]; yval<=vy[1]; yval++){ xval = xoffset; rgs_mark(g, g->shapes[sno].scanlist, sno, flag, type, xval, yval); xoffset = xoffset + invslope; } } } int imline(GFilt g, int rno, int sno, int flag, int type, double x, double y, double x1, double y1, double x2, double y2) { Scan scan; /* avoid -W unused parameter warning */ if( 0 ){ type = type; x1 = x1; y1 = y1; x2 = x2; y2 = y2; } if( g->evsect ){ if( g->usebinsiz ){ x = (int)((x - g->tlminx)/g->binsizx + 1.0); y = (int)((y - g->tlminy)/g->binsizy + 1.0); } else{ x = (int)((x - g->tlminx) + 1.0); y = (int)((y - g->tlminy) + 1.0); } x = (int)((x - g->xmin)/g->block + 1.0); y = (int)((y - g->ymin)/g->block + 1.0); if(y < g->y0) return 0; if(y > g->y1) return 0; if(x < g->x0) return 0; if(x > g->x1) return 0; } if( flag ){ if(y < g->shapes[sno].ystart ) return 0; if(y > g->shapes[sno].ystop ) return 0; } scan = g->shapes[sno].scanlist[(int)y]; if( (scan && ((x==(int)scan->x) || (scan->next&&((x>=(int)scan->x)&&(x<=(int)scan->next->x)))))==flag ) { if( rno && flag ) g->rid = rno; return 1; } else return 0; } void impiei(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, double angle1, double angle2) { _impiei(g, 0, rno, sno, flag, type, x, y, xcen, ycen, angle1, angle2); } int impie(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, double angle1, double angle2) { /* avoid -W unused parameter warning */ if( 0 ){ xcen = xcen; ycen = ycen; angle1 = angle1; angle2 = angle2; } return impolygon(g, rno, sno, flag, type, x, y); } void imqtpiei(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, double angle1, double angle2) { _impiei(g, 1, rno, sno, flag, type, x, y, xcen, ycen, angle1, angle2); } int imqtpie(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, double angle1, double angle2) { /* avoid -W unused parameter warning */ if( 0 ){ xcen = xcen; ycen = ycen; angle1 = angle1; angle2 = angle2; } return impolygon(g, rno, sno, flag, type, x, y); } void impointi(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen) { /* NB: do not use x and y variables, they have bogus values */ /* avoid -W unused parameter warning */ if( 0 ){ rno = rno; x = x; y = y; } /* divide by block factor to get "real" parameters */ xcen = (xcen - g->xmin)/g->block + 1.0; ycen = (ycen - g->ymin)/g->block + 1.0; /* set y limits */ g->shapes[sno].ystart = PIXNUM(ycen); g->shapes[sno].ystop = PIXNUM(ycen); g->shapes[sno].scanlist = (Scan *)calloc(g->y1+1, sizeof(Scan)); marky(g, sno, flag, type); rgs_mark(g, g->shapes[sno].scanlist, sno, flag, type, PIXNUM(xcen), PIXNUM(ycen)); } int impoint(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen) { Scan scan; /* avoid -W unused parameter warning */ if( 0 ){ type = type; xcen = xcen; ycen = ycen; } if( g->evsect ){ if( g->usebinsiz ){ x = (int)((x - g->tlminx)/g->binsizx + 1.0); y = (int)((y - g->tlminy)/g->binsizy + 1.0); } else{ x = (int)((x - g->tlminx) + 1.0); y = (int)((y - g->tlminy) + 1.0); } x = (int)((x - g->xmin)/g->block + 1.0); y = (int)((y - g->ymin)/g->block + 1.0); if(y < g->y0) return 0; if(y > g->y1) return 0; if(x < g->x0) return 0; if(x > g->x1) return 0; } if( flag ){ if(y < g->shapes[sno].ystart ) return 0; if(y > g->shapes[sno].ystop ) return 0; } scan = g->shapes[sno].scanlist[(int)y]; if( (scan && (y == (int)g->shapes[sno].ystart) && (x == (int)scan->x))==flag ) { if( rno && flag ) g->rid = rno; return 1; } else return 0; } #ifdef __STDC__ void impolygoni(GFilt g, int rno, int sno, int flag, int type, double x, double y, ...) { double *vx=NULL, *vy=NULL; int count, maxcount; va_list args; va_start(args, y); #else void impolygoni(va_alist) va_dcl { GFilt g; int rno, sno, flag, type; double x, y; double *vx=NULL, *vy=NULL; int count, maxcount; va_list args; va_start(args); g = va_arg(args, GFilt); rno = va_arg(args, int); sno = va_arg(args, int); flag = va_arg(args, int); type = va_arg(args, int); x = va_arg(args, double); y = va_arg(args, double); #endif /* NB: do not use x and y variables, they have bogus values */ /* avoid -W unused parameter warning */ if( 0 ){ x = x; } /* allocate space for x,y arguments */ maxcount = MASKINC; vx = (double *)calloc(maxcount, sizeof(double)); vy = (double *)calloc(maxcount, sizeof(double)); /* look for x,y arguments */ count = 0; while( 1 ){ if( (count + 1) >= maxcount ){ maxcount += MASKINC; vx = (double *)realloc(vx, maxcount*sizeof(double)); vy = (double *)realloc(vy, maxcount*sizeof(double)); } vx[count] = va_arg(args, double); vy[count] = va_arg(args, double); if( feq(vx[count],PSTOP) && feq(vy[count],PSTOP) ) break; vx[count] = (vx[count] - g->xmin)/g->block + 1.0; vy[count] = (vy[count] - g->ymin)/g->block + 1.0; count ++; } va_end(args); /* realloc to actual size */ vx = (double *)realloc(vx, count*sizeof(double)); vy = (double *)realloc(vy, count*sizeof(double)); /* call the common routine */ _polygoni(g, 0, rno, sno, flag, type, vx, vy, count); if( vx ) free(vx); if( vy ) free(vy); } #ifdef __STDC__ int impolygon(GFilt g, int rno, int sno, int flag, int type, double x, double y, ...) { int crossings; Scan scan; va_list args; va_start(args, y); #else int impolygon(va_alist) va_dcl { GFilt g; int rno, sno, flag, type; double x, y; int crossings; Scan scan; va_list args; va_start(args); g = va_arg(args, GFilt); rno = va_arg(args, int); sno = va_arg(args, int); flag = va_arg(args, int); type = va_arg(args, int); x = va_arg(args, double); y = va_arg(args, double); #endif va_end(args); /* avoid -W unused parameter warning */ if( 0 ){ type = type; } if( g->evsect ){ if( g->usebinsiz ){ x = (int)((x - g->tlminx)/g->binsizx + 1.0); y = (int)((y - g->tlminy)/g->binsizy + 1.0); } else{ x = (int)((x - g->tlminx) + 1.0); y = (int)((y - g->tlminy) + 1.0); } x = (int)((x - g->xmin)/g->block + 1.0); y = (int)((y - g->ymin)/g->block + 1.0); if(y < g->y0) return 0; if(y > g->y1) return 0; if(x < g->x0) return 0; if(x > g->x1) return 0; } if( flag ){ if(y < g->shapes[sno].ystart ) return 0; if(y > g->shapes[sno].ystop ) return 0; } /* no initialization of x for this row, just jump right in */ if( (y>=g->shapes[sno].ystart)&&(y<=g->shapes[sno].ystop) ){ crossings = 0; for(scan=g->shapes[sno].scanlist[(int)y]; scan; scan=scan->next){ if( x >= scan->x ) crossings++; else break; } if( (crossings%2) == flag ){ if( rno && flag ) g->rid = rno; return 1; } else{ return 0; } } else{ return !flag; } } void imnannulusi(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, double lo, double hi, int n) { int i; int xsno; double dinc; /* NB: do not use x and y variables, they have bogus values */ /* get limits */ dinc = (hi - lo)/n; xsno = (g->nshapes+1)+((sno-1)*XSNO); /* init all shapes */ imannulusi(g, 0, xsno, flag, type, x, y, xcen, ycen, lo, hi); for(i=0; inshapes+1)+((sno-1)*XSNO); /* init all shapes */ imboxi(g, 0, xsno, flag, type, x, y, xcen, ycen, hix, hiy, ang); imboxi(g, 0, xsno+1, flag, type, x, y, xcen, ycen, lox, loy, ang); for(i=0; inshapes+1)+((sno-1)*XSNO); /* init all shapes */ imellipsei(g, 0, xsno, flag, type, x, y, xcen, ycen, hix, hiy, ang); imellipsei(g, 0, xsno+1, flag, type, x, y, xcen, ycen, lox, loy, ang); for(i=0; i hi ) lo -= 360.0; dinc = (hi - lo)/n; xsno = (g->nshapes+1)+((sno-1)*XSNO); /* init all shapes */ impiei(g, 0, xsno, flag, type, x, y, xcen, ycen, lo, hi); for(i=0; i anghi ) anglo -= 360.0; ainc = (anghi - anglo)/angn; ahi = (int)angn; rinc = (radhi - radlo)/radn; rhi = (int)radn; xsno = (g->nshapes+1)+((sno-1)*XSNO); /* init pies and annuli */ imannulusi(g, 0, xsno, flag, type, x, y, xcen, ycen, radlo, radhi); imqtpiei(g, 0, xsno+1, flag, type, x, y, xcen, ycen, anglo, anghi); for(a=0; a anghi ) anglo -= 360.0; ainc = (anghi - anglo)/angn; ahi = (int)angn; xinc = (xhi - xlo)/radn; yinc = (yhi - ylo)/radn; rhi = (int)radn; xsno = (g->nshapes+1)+((sno-1)*XSNO); /* init pies and ellipses */ imboxi(g, 0, xsno, flag, type, x, y, xcen, ycen, xhi, yhi, ang); imqtpiei(g, 0, xsno+1, flag, type, x, y, xcen, ycen, anglo, anghi); imboxi(g, 0, xsno+2, flag, type, x, y, xcen, ycen, xlo, ylo, ang); for(a=0; a anghi ) anglo -= 360.0; ainc = (anghi - anglo)/angn; ahi = (int)angn; xinc = (xhi - xlo)/radn; yinc = (yhi - ylo)/radn; rhi = (int)radn; xsno = (g->nshapes+1)+((sno-1)*XSNO); /* init pies and ellipses */ imellipsei(g, 0, xsno, flag, type, x, y, xcen, ycen, xhi, yhi, ang); imqtpiei(g, 0, xsno+1, flag, type, x, y, xcen, ycen, anglo, anghi); imellipsei(g, 0, xsno+2, flag, type, x, y, xcen, ycen, xlo, ylo, ang); for(a=0; anshapes+1)+((sno-1)*XSNO); if( flag ){ /* if its not somewhere inside the entire region we lose ... */ if( !imannulus(g, 0, xsno, flag, type, x, y, xcen, ycen, lo, hi) ){ return(0); } /* look through all of them to find the right one */ for(i=0; inshapes+1)+((sno-1)*XSNO); if( flag ){ /* if its not somewhere inside the entire region we lose ... */ if( !imbox(g, 0, xsno, flag, type, x, y, xcen, ycen, hix, hiy, ang) ){ return(0); } /* if its in the inner region we lose */ if( imbox(g, 0, xsno+1, flag, type, x, y, xcen, ycen, lox, loy, ang) ){ return(0); } /* look through all of them to find the right one */ for(i=0; inshapes+1)+((sno-1)*XSNO); if( flag ){ /* if its not somewhere inside the entire region we lose ... */ if( !imellipse(g, 0, xsno, flag, type, x, y, xcen, ycen, hix, hiy, ang) ){ return(0); } /* if its in the inner region we lose */ if( imellipse(g, 0, xsno+1, flag, type, x, y, xcen, ycen, lox, loy, ang) ){ return(0); } /* look through all of them to find the right one */ for(i=0; i hi ) lo -= 360.0; dinc = (hi - lo)/n; xsno = (g->nshapes+1)+((sno-1)*XSNO); if( flag ){ /* check limits */ if( !impie(g, 0, xsno, flag, type, x, y, xcen, ycen, lo, hi) ){ return(0); } /* look through all of them to find the right one */ for(i=0; i anghi ) anglo -= 360.0; ainc = (anghi - anglo)/angn; ahi = (int)angn; rinc = (radhi - radlo)/radn; rhi = (int)radn; xsno = (g->nshapes+1)+((sno-1)*XSNO); if( flag ){ /* if its not somewhere inside the entire region we lose ... */ if( !imannulus(g, 0, xsno, flag, type, x, y, xcen, ycen, radlo, radhi) || !impie(g, 0, xsno+1, flag, type, x, y, xcen, ycen, anglo, anghi) ){ return(0); } /* look through all of them to find the right one */ for(a=1; a<=ahi; a++){ for(r=1; r<=rhi; r++){ if( imannulus(g, rno+n, sno+(2*n), flag, type, x, y, xcen, ycen, radlo+((r-1)*rinc), radlo+(r*rinc)) && impie(g, rno+n, sno+(2*n+1), flag, type, x, y, xcen, ycen, anglo+((a-1)*ainc), anglo+(a*ainc)) ){ return(1); } n++; } } return(0); } else{ /* if its not somewhere inside the entire region we win ... */ if( !imannulus(g, 0, xsno, 1, type, x, y, xcen, ycen, radlo, radhi) ) return(1); else if( !impie(g, 0, xsno+1, 1, type, x, y, xcen, ycen, anglo, anghi) ){ return(1); } else{ return(0); } } } int imbpanda(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, double anglo, double anghi, double angn, double xlo, double ylo, double xhi, double yhi, double radn, double ang) { int a, r; int ahi, rhi; int xsno; int n=0; double ainc, xinc, yinc; /* get limits */ anglo += ang; anghi += ang; while( anglo > anghi ) anglo -= 360.0; ainc = (anghi - anglo)/angn; ahi = (int)angn; xinc = (xhi - xlo)/radn; yinc = (yhi - ylo)/radn; rhi = (int)radn; xsno = (g->nshapes+1)+((sno-1)*XSNO); if( flag ){ /* if its not somewhere inside the entire region we lose ... */ if( !imbox(g, 0, xsno, flag, type, x, y, xcen, ycen, xhi, yhi, ang) ){ return(0); } /* but if its in the inner region we lose */ else if( imbox(g, 0, xsno+2, flag, type, x, y, xcen, ycen, xlo, ylo, ang) ){ return(0); } /* its in the box .. must also be in the pie */ else if( !impie(g, 0, xsno+1, flag, type, x, y, xcen, ycen, anglo, anghi)){ return(0); } /* look through all of them to find the right one */ for(a=0; a anghi ) anglo -= 360.0; ainc = (anghi - anglo)/angn; ahi = (int)angn; xinc = (xhi - xlo)/radn; yinc = (yhi - ylo)/radn; rhi = (int)radn; xsno = (g->nshapes+1)+((sno-1)*XSNO); if( flag ){ /* if its not somewhere inside the entire region we lose ... */ if( !imellipse(g, 0, xsno, flag, type, x, y, xcen, ycen, xhi, yhi, ang) ){ return(0); } /* but if its in the inner region we lose */ else if( imellipse(g, 0, xsno+2, flag, type, x, y, xcen, ycen, xlo, ylo, ang) ){ return(0); } /* its in the ellipse .. must also be in the pie */ else if( !impie(g, 0, xsno+1, flag, type, x, y, xcen, ycen, anglo, anghi)){ return(0); } /* look through all of them to find the right one */ for(a=0; anshapes+1)+((sno-1)*XSNO); if( !g->shapes[xsno].xv ){ maxpts = MASKINC; g->shapes[xsno].xv = (double *)calloc(maxpts, sizeof(double)); g->shapes[xsno].nv = 0; while( 1 ){ if( g->shapes[xsno].nv >= maxpts ){ maxpts += MASKINC; g->shapes[xsno].xv = (double *)realloc(g->shapes[xsno].xv, maxpts*sizeof(double)); } g->shapes[xsno].xv[g->shapes[xsno].nv] = va_arg(args, double); if( feq(g->shapes[xsno].xv[g->shapes[xsno].nv],PSTOP) && feq(g->shapes[xsno].xv[g->shapes[xsno].nv-1],PSTOP) ){ g->shapes[xsno].nv--; break; } g->shapes[xsno].nv++; } va_end(args); g->shapes[xsno].xv = (double *)realloc(g->shapes[xsno].xv, g->shapes[xsno].nv*sizeof(double)); } n = g->shapes[xsno].nv; xv = g->shapes[xsno].xv; /* this should be impossible ... */ if( n == 2 ){ imannulusi(g, rno, sno, flag, type, x, y, xcen, ycen, xv[0], xv[1]); return; } imannulusi(g, 0, xsno, flag, type, x, y, xcen, ycen, xv[0], xv[n-1]); for(i=0; i<(n-1); i++){ imannulusi(g, rno+i, sno+i, flag, type, x, y, xcen, ycen, xv[i], xv[i+1]); } } #ifdef __STDC__ void imvboxi(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, ...) { int i, j, n; int maxpts; int xsno; double ang; double *xv; va_list args; va_start(args, ycen); #else int imvboxi(va_alist) va_dcl { GFilt g; int rno, sno, flag, type; double x, y; double xcen, ycen; double ang; double *xv; int i, j, n; int maxpts; int xsno; va_list args; va_start(args); g = va_arg(args, GFilt); rno = va_arg(args, int); sno = va_arg(args, int); flag = va_arg(args, int); type = va_arg(args, int); x = va_arg(args, double); y = va_arg(args, double); xcen = va_arg(args, double); ycen = va_arg(args, double); #endif xsno = (g->nshapes+1)+((sno-1)*XSNO); if( !g->shapes[xsno].xv ){ maxpts = MASKINC; g->shapes[xsno].xv = (double *)calloc(maxpts, sizeof(double)); g->shapes[xsno].nv = 0; while( 1 ){ if( g->shapes[xsno].nv >= maxpts ){ maxpts += MASKINC; g->shapes[xsno].xv = (double *)realloc(g->shapes[xsno].xv, maxpts*sizeof(double)); } g->shapes[xsno].xv[g->shapes[xsno].nv] = va_arg(args, double); if( feq(g->shapes[xsno].xv[g->shapes[xsno].nv],PSTOP) && feq(g->shapes[xsno].xv[g->shapes[xsno].nv-1],PSTOP) ){ g->shapes[xsno].nv--; break; } g->shapes[xsno].nv++; } va_end(args); g->shapes[xsno].xv = (double *)realloc(g->shapes[xsno].xv, g->shapes[xsno].nv*sizeof(double)); } n = g->shapes[xsno].nv; xv = g->shapes[xsno].xv; ang = xv[--n]; /* this should be impossible ... */ if( n == 2 ){ imboxi(g, rno, sno, flag, type, x, y, xcen, ycen, xv[0], xv[1], ang); return; } imboxi(g, 0, xsno, flag, type, x, y, xcen, ycen, xv[n-2], xv[n-1], ang); imboxi(g, 0, xsno+1, flag, type, x, y, xcen, ycen, xv[0], xv[1], ang); for(i=2, j=0; inshapes+1)+((sno-1)*XSNO); if( !g->shapes[xsno].xv ){ maxpts = MASKINC; g->shapes[xsno].xv = (double *)calloc(maxpts, sizeof(double)); g->shapes[xsno].nv = 0; while( 1 ){ if( g->shapes[xsno].nv >= maxpts ){ maxpts += MASKINC; g->shapes[xsno].xv = (double *)realloc(g->shapes[xsno].xv, maxpts*sizeof(double)); } g->shapes[xsno].xv[g->shapes[xsno].nv] = va_arg(args, double); if( feq(g->shapes[xsno].xv[g->shapes[xsno].nv],PSTOP) && feq(g->shapes[xsno].xv[g->shapes[xsno].nv-1],PSTOP) ){ g->shapes[xsno].nv--; break; } g->shapes[xsno].nv++; } va_end(args); g->shapes[xsno].xv = (double *)realloc(g->shapes[xsno].xv, g->shapes[xsno].nv*sizeof(double)); } n = g->shapes[xsno].nv; xv = g->shapes[xsno].xv; ang = xv[--n]; /* this should be impossible ... */ if( n == 2 ){ imellipsei(g, rno, sno, flag, type, x, y, xcen, ycen, xv[0], xv[1], ang); return; } imellipsei(g, 0, xsno, flag, type, x, y, xcen, ycen, xv[n-2], xv[n-1], ang); imellipsei(g, 0, xsno+1, flag, type, x, y, xcen, ycen, xv[0], xv[1], ang); for(i=2, j=0; inshapes+1)+((sno-1)*XSNO); if( !g->shapes[xsno].xv ){ maxpts = MASKINC; g->shapes[xsno].xv = (double *)calloc(maxpts, sizeof(double)); g->shapes[xsno].nv = 0; while( 1 ){ if( g->shapes[xsno].nv >= maxpts ){ maxpts += MASKINC; g->shapes[xsno].xv = (double *)realloc(g->shapes[xsno].xv, maxpts*sizeof(double)); } g->shapes[xsno].xv[g->shapes[xsno].nv] = va_arg(args, double); if( feq(g->shapes[xsno].xv[g->shapes[xsno].nv],PSTOP) && feq(g->shapes[xsno].xv[g->shapes[xsno].nv-1],PSTOP) ){ g->shapes[xsno].nv--; break; } g->shapes[xsno].nv++; } va_end(args); g->shapes[xsno].xv = (double *)realloc(g->shapes[xsno].xv, g->shapes[xsno].nv*sizeof(double)); } n = g->shapes[xsno].nv; xv = g->shapes[xsno].xv; /* this should be impossible ... */ if( n == 2 ){ impiei(g, rno, sno, flag, type, x, y, xcen, ycen, xv[0], xv[1]); return; } impiei(g, 0, xsno, flag, type, x, y, xcen, ycen, xv[0], xv[n-1]); for(i=0; i<(n-1); i++){ impiei(g, rno+i, sno+i, flag, type, x, y, xcen, ycen, xv[i], xv[i+1]); } } #ifdef __STDC__ void imvpointi(GFilt g, int rno, int sno, int flag, int type, double x, double y, ...) { int i, j, n; int maxpts; int xsno; double *xv; va_list args; va_start(args, y); #else int imvpointi(va_alist) va_dcl { GFilt g; int rno, sno, flag, type; double x, y; double *xv; int i, j, n; int maxpts; int xsno; va_list args; va_start(args); g = va_arg(args, GFilt); rno = va_arg(args, int); sno = va_arg(args, int); flag = va_arg(args, int); type = va_arg(args, int); x = va_arg(args, double); y = va_arg(args, double); #endif xsno = (g->nshapes+1)+((sno-1)*XSNO); if( !g->shapes[xsno].xv ){ maxpts = MASKINC; g->shapes[xsno].xv = (double *)calloc(maxpts, sizeof(double)); g->shapes[xsno].nv = 0; while( 1 ){ if( g->shapes[xsno].nv >= maxpts ){ maxpts += MASKINC; g->shapes[xsno].xv = (double *)realloc(g->shapes[xsno].xv, maxpts*sizeof(double)); } g->shapes[xsno].xv[g->shapes[xsno].nv] = va_arg(args, double); if( feq(g->shapes[xsno].xv[g->shapes[xsno].nv],PSTOP) && feq(g->shapes[xsno].xv[g->shapes[xsno].nv-1],PSTOP) ){ g->shapes[xsno].nv--; break; } g->shapes[xsno].nv++; } va_end(args); g->shapes[xsno].xv = (double *)realloc(g->shapes[xsno].xv, g->shapes[xsno].nv*sizeof(double)); } n = g->shapes[xsno].nv; xv = g->shapes[xsno].xv; for(i=0, j=0; inshapes+1)+((sno-1)*XSNO); if( !g->shapes[xsno].xv ){ maxpts = MASKINC; g->shapes[xsno].xv = (double *)calloc(maxpts, sizeof(double)); g->shapes[xsno].nv = 0; while( 1 ){ if( g->shapes[xsno].nv >= maxpts ){ maxpts += MASKINC; g->shapes[xsno].xv = (double *)realloc(g->shapes[xsno].xv, maxpts*sizeof(double)); } g->shapes[xsno].xv[g->shapes[xsno].nv] = va_arg(args, double); if( feq(g->shapes[xsno].xv[g->shapes[xsno].nv],PSTOP) && feq(g->shapes[xsno].xv[g->shapes[xsno].nv-1],PSTOP) ){ g->shapes[xsno].nv--; break; } g->shapes[xsno].nv++; } va_end(args); g->shapes[xsno].xv = (double *)realloc(g->shapes[xsno].xv, g->shapes[xsno].nv*sizeof(double)); } n = g->shapes[xsno].nv; xv = g->shapes[xsno].xv; /* this should be impossible ... */ if( n == 2 ){ return(imannulus(g, rno, sno, flag, type, x, y, xcen, ycen, xv[0], xv[1])); } if( flag ){ /* if its not somewhere inside the entire region we lose ... */ if( !imannulus(g, 0, xsno, flag, type, x, y, xcen, ycen, xv[0], xv[n-1]) ){ return(0); } /* look through all of them to find the right one */ for(i=0; inshapes+1)+((sno-1)*XSNO); if( !g->shapes[xsno].xv ){ maxpts = MASKINC; g->shapes[xsno].xv = (double *)calloc(maxpts, sizeof(double)); g->shapes[xsno].nv = 0; while( 1 ){ if( g->shapes[xsno].nv >= maxpts ){ maxpts += MASKINC; g->shapes[xsno].xv = (double *)realloc(g->shapes[xsno].xv, maxpts*sizeof(double)); } g->shapes[xsno].xv[g->shapes[xsno].nv] = va_arg(args, double); if( feq(g->shapes[xsno].xv[g->shapes[xsno].nv],PSTOP) && feq(g->shapes[xsno].xv[g->shapes[xsno].nv-1],PSTOP) ){ g->shapes[xsno].nv--; break; } g->shapes[xsno].nv++; } va_end(args); g->shapes[xsno].xv = (double *)realloc(g->shapes[xsno].xv, g->shapes[xsno].nv*sizeof(double)); } n = g->shapes[xsno].nv; xv = g->shapes[xsno].xv; ang = xv[--n]; /* this should be impossible ... */ if( n == 2 ){ return(imbox(g, rno, sno, flag, type, x, y, xcen, ycen, xv[0], xv[1], ang)); } if( flag ){ /* if its not somewhere inside the entire region we lose ... */ if( !imbox(g, 0, xsno, flag, type, x, y, xcen, ycen, xv[n-2], xv[n-1], ang) ){ return(0); } /* if its in the inner region we lose */ if( imbox(g, 0, xsno+1, flag, type, x, y, xcen, ycen, xv[0], xv[1], ang) ){ return(0); } /* look through all of them to find the right one */ for(i=2, j=0; inshapes+1)+((sno-1)*XSNO); if( !g->shapes[xsno].xv ){ maxpts = MASKINC; g->shapes[xsno].xv = (double *)calloc(maxpts, sizeof(double)); g->shapes[xsno].nv = 0; while( 1 ){ if( g->shapes[xsno].nv >= maxpts ){ maxpts += MASKINC; g->shapes[xsno].xv = (double *)realloc(g->shapes[xsno].xv, maxpts*sizeof(double)); } g->shapes[xsno].xv[g->shapes[xsno].nv] = va_arg(args, double); if( feq(g->shapes[xsno].xv[g->shapes[xsno].nv],PSTOP) && feq(g->shapes[xsno].xv[g->shapes[xsno].nv-1],PSTOP) ){ g->shapes[xsno].nv--; break; } g->shapes[xsno].nv++; } va_end(args); g->shapes[xsno].xv = (double *)realloc(g->shapes[xsno].xv, g->shapes[xsno].nv*sizeof(double)); } n = g->shapes[xsno].nv; xv = g->shapes[xsno].xv; ang = xv[--n]; /* this should be impossible ... */ if( n == 2 ){ return(imellipse(g, rno, sno, flag, type, x, y, xcen, ycen, xv[0], xv[1], ang)); } if( flag ){ /* if its not somewhere inside the entire region we lose ... */ if( !imellipse(g, 0, xsno, flag, type, x, y, xcen, ycen, xv[n-2], xv[n-1], ang) ){ return(0); } /* if its in the inner region we lose */ if( imellipse(g, 0, xsno+1, flag, type, x, y, xcen, ycen, xv[0], xv[1], ang) ){ return(0); } /* look through all of them to find the right one */ for(i=2, j=0; inshapes+1)+((sno-1)*XSNO); if( !g->shapes[xsno].xv ){ maxpts = MASKINC; g->shapes[xsno].xv = (double *)calloc(maxpts, sizeof(double)); g->shapes[xsno].nv = 0; while( 1 ){ if( g->shapes[xsno].nv >= maxpts ){ maxpts += MASKINC; g->shapes[xsno].xv = (double *)realloc(g->shapes[xsno].xv, maxpts*sizeof(double)); } g->shapes[xsno].xv[g->shapes[xsno].nv] = va_arg(args, double); if( feq(g->shapes[xsno].xv[g->shapes[xsno].nv],PSTOP) && feq(g->shapes[xsno].xv[g->shapes[xsno].nv-1],PSTOP) ){ g->shapes[xsno].nv--; break; } g->shapes[xsno].nv++; } va_end(args); g->shapes[xsno].xv = (double *)realloc(g->shapes[xsno].xv, g->shapes[xsno].nv*sizeof(double)); } n = g->shapes[xsno].nv; xv = g->shapes[xsno].xv; /* this should be impossible ... */ if( n == 2 ){ return(impie(g, rno, sno, flag, type, x, y, xcen, ycen, xv[0], xv[1])); } if( flag ){ /* if its not somewhere inside the entire region we lose ... */ if( !impie(g, 0, xsno, flag, type, x, y, xcen, ycen, xv[0], xv[n-1]) ){ return(0); } /* look through all of them to find the right one */ for(i=0; inshapes+1)+((sno-1)*XSNO); if( !g->shapes[xsno].xv ){ maxpts = MASKINC; g->shapes[xsno].xv = (double *)calloc(maxpts, sizeof(double)); g->shapes[xsno].nv = 0; while( 1 ){ if( g->shapes[xsno].nv >= maxpts ){ maxpts += MASKINC; g->shapes[xsno].xv = (double *)realloc(g->shapes[xsno].xv, maxpts*sizeof(double)); } g->shapes[xsno].xv[g->shapes[xsno].nv] = va_arg(args, double); if( feq(g->shapes[xsno].xv[g->shapes[xsno].nv],PSTOP) && feq(g->shapes[xsno].xv[g->shapes[xsno].nv-1],PSTOP) ){ g->shapes[xsno].nv--; break; } g->shapes[xsno].nv++; } va_end(args); g->shapes[xsno].xv = (double *)realloc(g->shapes[xsno].xv, g->shapes[xsno].nv*sizeof(double)); } n = g->shapes[xsno].nv; xv = g->shapes[xsno].xv; /* look through all of them to find the right one */ for(i=0, j=0; ixmax - g->xmin + 1)/g->block)/(double)g->maskdim) + 0.5); if( mblock < 1 ){ g->masks = NULL; g->nmask = 0; } /* copy all masks and translate x,y positions as needed */ fsize = g->nmask * sizeof(FilterMaskRec) * mblock; xmasks = (FilterMask)calloc(1, fsize); for(got=0, i=0; inmask; i++){ xmasks[got].region = g->masks[i].region; xmasks[got].y = (g->masks[i].y - 1.0) * mblock + 1.0; xmasks[got].xstart = (g->masks[i].xstart - 1.0) * mblock + 1.0; xmasks[got].xstop = (g->masks[i].xstop - 1.0) * mblock + 1.0; /* replicate the segment up to the block factor */ for(j=1; jmasks ) free(g->masks); */ /* set up new mask records */ g->masks = xmasks; g->nmask = got; /* now mark each y line that has a y mask value */ for(i=0; iybuf[g->masks[i].y] ) g->ybuf[g->masks[i].y] = i+1; } } int imimagemask(GFilt g, int rno, int sno, int flag, int type, double x, double y) { int i; int ix, iy; if( g->nmask == 0 ) return(0); /* avoid -W unused parameter warning */ if( 0 ){ rno = rno; sno = sno; flag = flag; type = type; } if( g->evsect ){ if( g->usebinsiz ){ x = (int)((x - g->tlminx)/g->binsizx + 1.0); y = (int)((y - g->tlminy)/g->binsizy + 1.0); } else{ x = (int)((x - g->tlminx) + 1.0); y = (int)((y - g->tlminy) + 1.0); } x = (int)((x - g->xmin)/g->block + 1.0); y = (int)((y - g->ymin)/g->block + 1.0); if(y < g->y0) return 0; if(y > g->y1) return 0; if(x < g->x0) return 0; if(x > g->x1) return 0; } ix = (int)x; iy = (int)y; /* look for mask segment containing ix, iy */ i = g->ybuf[iy]; /* ybuf contains offset+1 of first mask record containing iy */ if( i != 0 ){ i--; for(; inmask; i++){ if( g->masks[i].y > iy ){ return(0); } if( (ix >= g->masks[i].xstart) && (ix <= g->masks[i].xstop) ){ g->rid = g->masks[i].region; return(1); } } } return(0); } funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/filter/imregions_c.h000066400000000000000000002000211256243640000244250ustar00rootroot00000000000000static char *IMREGIONS_C="\n/*\n NB: MAKE SURE YOU EDIT THE TEMPLATE FILE!!!!\n*/\n\n#ifndef FILTER_PTYPE\n#include \n#endif\n\n\n#define USE_ASTRO_ANGLE 0\n\n\n#define USE_FPU_DOUBLE 0\n#if USE_FPU_DOUBLE\n#include \nstatic fpu_control_t _cw;\n#define FPU_DOUBLE {fpu_control_t _cw2; _FPU_GETCW(_cw); _cw2 = _cw & ~_FPU_EXTENDED; _cw2 |= _FPU_DOUBLE; _FPU_SETCW(_cw2);}\n#define FPU_RESTORE {_FPU_SETCW(_cw);}\n#else\n#define FPU_DOUBLE\n#define FPU_RESTORE\n#endif\n\n\nstatic int imregno=0;\nvoid initimregions(void)\n{\n imregno++;\n return;\n}\n\nstatic void markx(GFilt g, int sno, int flag, int type, int x, int y)\n{\n \n if( 0 ){\n sno = sno;\n }\n\n \n if( type == TOK_EREG )\n return;\n \n if( flag ){\n if( x <= g->x0s[y] )\n g->x0s[y] = max(x,g->x0);\n if( x >= g->x1s[y] )\n g->x1s[y] = min(x,g->x1);\n }\n \n else{\n g->x0s[y] = g->x0;\n g->x1s[y] = g->x1;\n }\n}\n\nstatic void marky(GFilt g, int sno, int flag, int type)\n{\n int i;\n \n if( type == TOK_EREG )\n return;\n \n if( flag ){\n for(i=max(g->y0,g->shapes[sno].ystart);\n i<=min(g->y1,g->shapes[sno].ystop);\n i++)\n g->ybuf[i] = 1;\n }\n \n else{\n for(i=g->y0; i<=g->shapes[sno].ystart-1; i++)\n g->ybuf[i] = 1;\n for(i=g->shapes[sno].ystop+1; i<=g->y1; i++)\n g->ybuf[i] = 1;\n }\n}\n\nstatic int\nimagemaskcmp(const void *s1, const void *s2)\n{\n FilterMask f1 = (FilterMask)s1;\n FilterMask f2 = (FilterMask)s2;\n \n if( f1->y < f2->y ){\n return -1;\n }\n else if( f1->y > f2->y ){\n return 1;\n }\n else{\n if( f1->xstart < f2->xstart ){\n return -1;\n }\n else{\n return 1;\n }\n }\n}\n\n\n\nstatic void quadeq(double a, double b, double c, \n double *x1, double *x2, int *nr, int *nc)\n{\n double dis, q;\n if( feq(a,0.0) ){\n *nc = 0;\n if( feq(b,0.0) ){\n *nr = 0; *x1 = 0.0;\n }\n else{\n *nr = 1; *x1 = -c / b;\n }\n *x2 = *x1;\n }\n else{\n dis = b*b - 4.0 * a * c;\n if( dis > 0.0 ){\n *nr = 2; *nc = 0;\n dis = sqrt(dis);\n if( b < 0.0 ) dis = -dis;\n q = -0.5 * (b + dis);\n *x1 = q/a; *x2 = c/q;\n if(*x1 > *x2){\n q = *x1; *x1 = *x2; *x2 = q;\n }\n } \n else if( feq(dis,0.0) ){\n *nr = 1; *nc = 0; *x1 = - 0.5 * b / a; *x2 = *x1;\n }\n else{\n *nr = 0; *nc = 2; *x1 = - 0.5 * b / a; *x2 = 0.5 * sqrt(-dis) / a;\n }\n }\n}\n\nstatic void rgs_mark(GFilt g, Scan *scanlist,\n int sno, int flag, int type, int xval, int yval )\n{\n Scan scanmark, mark;\n \n if(yval < g->y0) yval = g->y0;\n if(yval > g->y1) yval = g->y1;\n mark = (Scan)calloc(1, sizeof(ScanRec));\n mark->x = xval;\n \n if( !scanlist ) return;\n \n if( !scanlist[yval] || ((scanlist[yval])->x > xval) ){\n mark->next = scanlist[yval];\n scanlist[yval] = mark;\n } else {\n scanmark = scanlist[yval];\n while( scanmark->next && ((scanmark->next)->x < xval) )\n scanmark = scanmark->next;\n mark->next = scanmark->next;\n scanmark->next = mark;\n }\n markx(g, sno, flag, type, xval, yval);\n}\n\nstatic void rgs_segment(GFilt g, Scan *scanlist, int width, int height, \n int sno, int flag, int type, \n double x1, double y1, double x2, double y2)\n{\n int ystart, ystop, yval, xval;\n double invslope, xoffset;\n\n ystart = PIXINCL(y1);\n if( ystart < 1 ) ystart = 1;\n \n ystop = PIXINCL(y2) - 1;\n if( ystop > height ) ystop = height;\n \n if( (ystart > ystop) || (ystop < 1) )\n return;\n \n invslope = (x1 - x2) / (y1 - y2);\n xoffset = x1 + ((ystart - y1) * invslope);\n for(yval=ystart; yval<=ystop; yval++){\n xval = PIXINCL(xoffset);\n \n if(xval < 1) xval = 1;\n if(xval > width) xval = width + 1;\n rgs_mark(g, scanlist, sno, flag, type, xval, yval);\n xoffset = xoffset + invslope;\n }\n}\n\nstatic void _polygoni(GFilt g, int qt, int rno, int sno, int flag, int type,\n double *vx, double *vy, int count)\n{\n int i, j;\n double xlo, xhi;\n double ylo, yhi;\n\n#ifdef ALREADY_DONE\n \n for(i=0; ixmin)/g->block + 1.0;\n vy[i] = (vy[i] - g->ymin)/g->block + 1.0;\n }\n#endif\n \n if( 0 ){\n rno = rno;\n }\n\n \n xlo = vx[0];\n xhi = xlo;\n ylo = vy[0];\n yhi = ylo;\n for(i=0; i xhi) xhi = vx[i];\n if(vx[i] < xlo) xlo = vx[i];\n if(vy[i] > yhi) yhi = vy[i];\n if(vy[i] < ylo) ylo = vy[i];\n }\n if( qt && (sno > 1) ){\n g->shapes[sno].ystart = g->shapes[sno-1].ystart;\n g->shapes[sno].ystop = g->shapes[sno-1].ystop;\n }\n else{\n g->shapes[sno].ystart = max(g->y0,PIXINCL(ylo));\n g->shapes[sno].ystop = min(g->y1,PIXINCL(yhi) - 1);\n }\n g->shapes[sno].scanlist = (Scan *)calloc(g->y1+1, sizeof(Scan));\n marky(g, sno, flag, type);\n\n \n \n j = count-1;\n for(i=0; i vy[j]){\n rgs_segment(g, g->shapes[sno].scanlist, g->x1, g->y1,\n sno, flag, type, vx[j], vy[j], vx[i], vy[i]);\n }\n else{\n rgs_segment(g, g->shapes[sno].scanlist, g->x1, g->y1,\n sno, flag, type, vx[i], vy[i], vx[j], vy[j]);\n }\n j = i;\n }\n}\n\nstatic int corner_vertex(int index, int width, int height,\n double *x, double *y)\n{\n switch (index) {\n case 1:\n *x = 0.0;\n *y = height + 1;\n break;\n case 2:\n *x = 0.0;\n *y = 0.0;\n break;\n case 3:\n *x = width + 1;\n *y = 0.0;\n break;\n case 4:\n *x = width + 1;\n *y = height + 1;\n default:\n break;\n }\n index = index + 1;\n if(index > 4) index = 1;\n return(index);\n}\n\nstatic int pie_intercept(int width, int height, double xcen, double ycen,\n double angle, double *xcept, double *ycept)\n{\n double angl, slope; \n angl = angle;\n \n while (angl < 0.0)\n angl = angl + 360.0;\n while (angl >= 360.0)\n angl = angl - 360.0;\n \n#if USE_ASTRO_ANGLE\n if(fabs(angl - 90.0) < SMALL_NUMBER) {\n#else\n if(fabs(angl - 180.0) < SMALL_NUMBER) {\n#endif\n *xcept = 0.0;\n *ycept = ycen;\n return(2);\n }\n#if USE_ASTRO_ANGLE\n if(fabs(angl - 270.0) < SMALL_NUMBER) {\n#else\n if(fabs(angl - 0.0) < SMALL_NUMBER) {\n#endif\n *xcept = width + 1;\n *ycept = ycen;\n return(4);\n }\n#if USE_ASTRO_ANGLE\n \n angl = angl + 90.0;\n#else\n angl = angl;\n#endif\n if(angl >= 360.0)\n angl = angl - 360.0;\n if(angl < 180.0) {\n *ycept = height + 1;\n \n if(fabs(angl - 90.0) < SMALL_NUMBER) {\n *xcept = xcen;\n return(1);\n }\n } else {\n *ycept = 0.0;\n \n if(fabs(angl - 270.0) < SMALL_NUMBER) {\n *xcept = xcen;\n return(3);\n }\n }\n \n angl = (angl / 180.0) * M_PI;\n \n slope = tan(angl);\n \n *xcept = xcen + ((*ycept - ycen) / slope);\n if(*xcept < 0) {\n *ycept = (ycen - (xcen * slope));\n *xcept = 0.0;\n return(2);\n } else if(*xcept > (width + 1)) {\n *ycept = (ycen + ((width + 1 - xcen) * slope));\n *xcept = width + 1;\n return(4);\n } else {\n if(*ycept < height)\n return(3);\n else\n return(1);\n }\n}\n\nvoid _impiei(GFilt g, int qt, int rno, int sno, int flag, int type,\n double x, double y,\n double xcen, double ycen, double angle1, double angle2)\n{\n int width, height; \n double sweep; \n double vx[7], vy[7]; \n int count; \n int intrcpt1, intrcpt2; \n double x2, y2; \n\n \n \n if( 0 ){\n x = x;\n y = y;\n }\n\n \n xcen = (xcen - g->xmin)/g->block + 1.0;\n ycen = (ycen - g->ymin)/g->block + 1.0;\n \n width = g->x1;\n height = g->y1;\n \n vx[0] = xcen;\n vy[0] = ycen;\n sweep = angle2 - angle1;\n \n if(fabs(sweep) < SMALL_NUMBER)\n return;\n if (sweep < 0.0) sweep = sweep + 360.0;\n intrcpt1 = pie_intercept(width, height, xcen, ycen, angle1,\n &(vx[1]), &(vy[1]));\n intrcpt2 = pie_intercept(width, height, xcen, ycen, angle2,\n &x2, &y2);\n count = 2;\n \n \n if((intrcpt1 != intrcpt2) || (sweep > 180.0)){\n do{\n intrcpt1 = corner_vertex(intrcpt1, width, height, \n &(vx[count]), &(vy[count]));\n count = count + 1;\n }while(intrcpt1 != intrcpt2);\n }\n vx[count] = x2;\n vy[count] = y2;\n count++;\n _polygoni(g, qt, rno, sno, flag, type, vx, vy, count);\n}\n\n\n\nvoid imannulusi(GFilt g, int rno, int sno, int flag, int type,\n double x, double y,\n double xcen, double ycen, double iradius, double oradius)\n{\n int yy;\n double dval;\n double xoff, yoff;\n Scan *scanlist;\n\n \n\n if( iradius == 0 ){\n imcirclei(g, rno, sno, flag, type, x, y, xcen, ycen, oradius);\n return;\n }\n \n xcen = (xcen - g->xmin)/g->block + 1.0;\n ycen = (ycen - g->ymin)/g->block + 1.0;\n iradius /= (double)g->block;\n oradius /= (double)g->block;\n \n if( PIXSTART(ycen - oradius) < PIXSTOP(ycen + oradius) ){\n g->shapes[sno].ystart = max(g->y0,PIXSTART(ycen - oradius));\n g->shapes[sno].ystop = min(g->y1,PIXSTOP(ycen + oradius));\n }\n else{\n g->shapes[sno].ystart = min(g->y1,PIXSTOP(ycen + oradius));\n g->shapes[sno].ystop = max(g->y0,PIXSTART(ycen - oradius));\n }\n g->shapes[sno].scanlist = (Scan *)calloc(g->y1+1, sizeof(Scan));\n scanlist = g->shapes[sno].scanlist;\n marky(g, sno, flag, type);\n \n for(yy=g->shapes[sno].ystart; yy<=g->shapes[sno].ystop; yy++){\n yoff = PIXCEN(yy) - ycen;\n if( (dval=(oradius * oradius) - (yoff * yoff)) > 0.0 ){\n xoff = sqrt(dval);\n if( PIXSTART(xcen - xoff) <= PIXSTOP(xcen + xoff) ){\n rgs_mark(g, scanlist, sno, flag, type, PIXSTART(xcen - xoff), yy);\n rgs_mark(g, scanlist, sno, flag, type, PIXSTOP(xcen + xoff), yy);\n }\n if( (dval=(iradius * iradius) - (yoff * yoff)) > 0.0 ){\n xoff = sqrt(dval);\n if( PIXSTART(xcen - xoff) <= PIXSTOP(xcen + xoff) ){\n rgs_mark(g, scanlist, sno, flag, type, PIXSTART(xcen - xoff), yy);\n rgs_mark(g, scanlist, sno, flag, type, PIXSTOP(xcen + xoff), yy);\n }\n }\n }\n }\n}\n\nint imannulus(GFilt g, int rno, int sno, int flag, int type,\n double x, double y,\n double xcen, double ycen, double iradius, double oradius)\n{\n Scan scan;\n\n if( iradius == 0 ){\n return(imcircle(g, rno, sno, flag, type, x, y, xcen, ycen, oradius));\n }\n if( g->evsect ){\n if( g->usebinsiz ){\n x = (int)((x - g->tlminx)/g->binsizx + 1.0);\n y = (int)((y - g->tlminy)/g->binsizy + 1.0);\n }\n else{\n x = (int)((x - g->tlminx) + 1.0);\n y = (int)((y - g->tlminy) + 1.0);\n }\n x = (int)((x - g->xmin)/g->block + 1.0);\n y = (int)((y - g->ymin)/g->block + 1.0);\n if(y < g->y0) return 0;\n if(y > g->y1) return 0;\n if(x < g->x0) return 0;\n if(x > g->x1) return 0;\n }\n if( flag ){\n if(y < g->shapes[sno].ystart ) return 0;\n if(y > g->shapes[sno].ystop ) return 0;\n }\n scan = g->shapes[sno].scanlist[(int)y];\n if( (scan && \n ((y >= g->shapes[sno].ystart) && (y <= g->shapes[sno].ystop)) &&\n (scan->next->next ?\n (((x >= scan->x) && (x <= scan->next->next->next->x)) &&\n !((x >= scan->next->x) && (x <= scan->next->next->x))) :\n ((x >= scan->x) && (x <= scan->next->x))))\n ==flag ){\n if( rno && flag ) g->rid = rno;\n return 1;\n }\n else\n return 0;\n}\n\nvoid imboxi(GFilt g, int rno, int sno, int flag, int type,\n double x, double y,\n double xcen, double ycen, double xwidth, double yheight,\n double angle)\n{\n double angl; \n double half_width, half_height;\n double cosangl, sinangl; \n double hw_cos, hw_sin; \n double hh_cos, hh_sin; \n double cornerx[4], cornery[4]; \n\n \n \n if( 0 ){\n x = x;\n y = y;\n }\n\n if( (xwidth == 0) && (yheight==0) ){\n return;\n }\n \n xcen = (xcen - g->xmin)/g->block + 1.0;\n ycen = (ycen - g->ymin)/g->block + 1.0;\n xwidth /= (double)g->block;\n yheight /= (double)g->block;\n#if USE_ASTRO_ANGLE\n \n angl = angle + 90.0;\n#else\n angl = angle;\n#endif\n while (angl >= 360.0) angl = angl - 360.0;\n \n angl = (angl / 180.0) * M_PI;\n sinangl = sin (angl);\n cosangl = cos (angl);\n#if USE_ASTRO_ANGLE\n \n \n \n half_width = yheight / 2.0;\n half_height = xwidth / 2.0;\n#else\n half_width = xwidth / 2.0;\n half_height = yheight / 2.0;\n#endif\n hw_cos = half_width * cosangl;\n hw_sin = half_width * sinangl;\n hh_cos = half_height * cosangl;\n hh_sin = half_height * sinangl;\n#if USE_ASTRO_ANGLE\n cornerx[0] = xcen - hw_cos - hh_sin;\n cornery[0] = ycen - hw_sin + hh_cos;\n cornerx[1] = xcen + hw_cos - hh_sin;\n cornery[1] = ycen + hw_sin + hh_cos;\n cornerx[2] = xcen + hw_cos + hh_sin;\n cornery[2] = ycen + hw_sin - hh_cos;\n cornerx[3] = xcen - hw_cos + hh_sin;\n cornery[3] = ycen - hw_sin - hh_cos;\n#else\n cornerx[0] = xcen - hw_cos + hh_sin;\n cornery[0] = ycen - hh_cos - hw_sin;\n cornerx[1] = xcen - hw_cos - hh_sin;\n cornery[1] = ycen + hh_cos - hw_sin;\n cornerx[2] = xcen + hw_cos - hh_sin;\n cornery[2] = ycen + hh_cos + hw_sin;\n cornerx[3] = xcen + hw_cos + hh_sin;\n cornery[3] = ycen - hh_cos + hw_sin;\n#endif\n _polygoni(g, 0, rno, sno, flag, type, cornerx, cornery, 4);\n}\n\nint imbox(GFilt g, int rno, int sno, int flag, int type,\n double x, double y,\n double xcen, double ycen, double xwidth, double yheight,\n double angle)\n{\n \n if( 0 ){\n xcen = xcen;\n ycen = ycen;\n angle = angle;\n }\n\n if( (xwidth == 0) && (yheight==0) ){\n return(!flag);\n }\n return impolygon(g, rno, sno, flag, type, x, y);\n}\n\nvoid imcirclei(GFilt g, int rno, int sno, int flag, int type,\n double x, double y,\n double xcen, double ycen, double radius)\n{\n int yy;\n double dval;\n double xoff, yoff;\n Scan *scanlist;\n\n \n \n if( 0 ){\n rno = rno;\n x = x;\n y = y;\n }\n\n if( radius == 0 ){\n return;\n }\n \n xcen = (xcen - g->xmin)/g->block + 1.0;\n ycen = (ycen - g->ymin)/g->block + 1.0;\n radius /= (double)g->block;\n \n if( PIXSTART(ycen - radius) < PIXSTOP(ycen + radius) ){\n g->shapes[sno].ystart = max(g->y0,PIXSTART(ycen - radius));\n g->shapes[sno].ystop = min(g->y1,PIXSTOP(ycen + radius));\n }\n else{\n g->shapes[sno].ystart = min(g->y1,PIXSTOP(ycen + radius));\n g->shapes[sno].ystop = max(g->y0,PIXSTART(ycen - radius));\n }\n g->shapes[sno].scanlist = (Scan *)calloc(g->y1+1, sizeof(Scan));\n scanlist = g->shapes[sno].scanlist;\n marky(g, sno, flag, type);\n \n for(yy=g->shapes[sno].ystart; yy<=g->shapes[sno].ystop; yy++){\n yoff = PIXCEN(yy) - ycen;\n if( (dval=(radius * radius) - (yoff * yoff))>=0.0 ){\n xoff = sqrt(dval);\n if( PIXSTART(xcen - xoff) <= PIXSTOP(xcen + xoff) ){\n rgs_mark(g, scanlist, sno, flag, type, PIXSTART(xcen - xoff), yy);\n rgs_mark(g, scanlist, sno, flag, type, PIXSTOP(xcen + xoff), yy);\n }\n }\n }\n}\n\nint imcircle(GFilt g, int rno, int sno, int flag, int type,\n double x, double y,\n double xcen, double ycen, double radius)\n{\n Scan scan;\n\n \n if( 0 ){\n type = type;\n xcen = xcen;\n ycen = ycen;\n }\n\n if( radius == 0 ){\n return(!flag);\n }\n if( g->evsect ){\n if( g->usebinsiz ){\n x = (int)((x - g->tlminx)/g->binsizx + 1.0);\n y = (int)((y - g->tlminy)/g->binsizy + 1.0);\n }\n else{\n x = (int)((x - g->tlminx) + 1.0);\n y = (int)((y - g->tlminy) + 1.0);\n }\n x = (int)((x - g->xmin)/g->block + 1.0);\n y = (int)((y - g->ymin)/g->block + 1.0);\n if(y < g->y0) return 0;\n if(y > g->y1) return 0;\n if(x < g->x0) return 0;\n if(x > g->x1) return 0;\n }\n if( flag ){\n if(y < g->shapes[sno].ystart ) return 0;\n if(y > g->shapes[sno].ystop ) return 0;\n }\n scan = g->shapes[sno].scanlist[(int)y];\n if( (scan && \n ((y>=g->shapes[sno].ystart) && (y<=g->shapes[sno].ystop)) &&\n ((x >= scan->x) && (x <= (scan->next)->x))) == flag ){\n if( rno && flag ) g->rid = rno;\n return 1;\n }\n else{\n return 0;\n }\n}\n\nvoid imellipsei(GFilt g, int rno, int sno, int flag, int type,\n double x, double y,\n double xcen, double ycen, double xrad, double yrad,\n double angle)\n{\n int yy;\n int nr, nc;\n double yhi;\n double yoff;\n double xboff, xfoff;\n double angl;\n double sinangl, cosangl;\n double cossq, sinsq, xradsq, yradsq;\n double a, b_partial, c_partial;\n double b, c;\n Scan *scanlist;\n\n \n\n if( xrad == yrad ){\n imcirclei(g, rno, sno, flag, type, x, y, xcen, ycen, xrad);\n return;\n }\n \n xcen = (xcen - g->xmin)/g->block + 1.0;\n ycen = (ycen - g->ymin)/g->block + 1.0;\n xrad /= (double)g->block;\n yrad /= (double)g->block;\n \n#if USE_ASTRO_ANGLE\n \n angl = angle + 90.0;\n#else\n angl = angle;\n#endif\n while( angl >= 360.0 )\n angl = angl - 360.0;\n \n angl = (angl / 180.0) * M_PI;\n sinangl = sin(angl);\n cosangl = cos(angl);\n \n \n FPU_DOUBLE\n#if USE_ASTRO_ANGLE\n yhi = fabs(sinangl * yrad) + fabs(cosangl * xrad);\n#else\n yhi = fabs(sinangl * xrad) + fabs(cosangl * yrad);\n#endif\n yhi = min(yhi, max(yrad, xrad));\n \n if( PIXSTART(ycen - yhi) < PIXSTOP(ycen + yhi) ){\n g->shapes[sno].ystart = max(g->y0,PIXSTART(ycen - yhi));\n g->shapes[sno].ystop = min(g->y1,PIXSTOP(ycen + yhi));\n }\n else{\n g->shapes[sno].ystart = min(g->y1,PIXSTOP(ycen + yhi));\n g->shapes[sno].ystop = max(g->y0,PIXSTART(ycen - yhi));\n }\n FPU_RESTORE\n g->shapes[sno].scanlist = (Scan *)calloc(g->y1+1, sizeof(Scan));\n scanlist = g->shapes[sno].scanlist;\n marky(g, sno, flag, type);\n \n cossq = cosangl * cosangl;\n sinsq = sinangl * sinangl;\n#if USE_ASTRO_ANGLE\n \n \n \n \n xradsq = yrad * yrad;\n yradsq = xrad * xrad;\n#else\n xradsq = xrad * xrad;\n yradsq = yrad * yrad;\n#endif\n \n a = (cossq / xradsq) + (sinsq / yradsq);\n b_partial = (2.0 * sinangl) * ((cosangl / xradsq) - (cosangl / yradsq));\n c_partial = (sinsq / xradsq) + (cossq / yradsq);\n \n for(yy=g->shapes[sno].ystart; yy<=g->shapes[sno].ystop; yy++){\n yoff = yy - ycen;\n b = b_partial * yoff;\n c = (c_partial * yoff * yoff) - 1.0;\n \n quadeq (a, b, c, &xboff, &xfoff, &nr, &nc);\n \n if( nr != 0 ) {\n \n rgs_mark(g, scanlist, sno, flag, type, PIXSTART(xcen + xboff), yy);\n rgs_mark(g, scanlist, sno, flag, type, PIXSTOP(xcen + xfoff), yy);\n }\n }\n}\n\nint imellipse(GFilt g, int rno, int sno, int flag, int type,\n double x, double y,\n double xcen, double ycen, double xrad, double yrad, double angle)\n{\n Scan scan;\n\n \n if( 0 ){\n angle = angle;\n }\n\n if( xrad == yrad ){\n return(imcircle(g, rno, sno, flag, type, x, y, xcen, ycen, xrad));\n }\n if( g->evsect ){\n if( g->usebinsiz ){\n x = (int)((x - g->tlminx)/g->binsizx + 1.0);\n y = (int)((y - g->tlminy)/g->binsizy + 1.0);\n }\n else{\n x = (int)((x - g->tlminx) + 1.0);\n y = (int)((y - g->tlminy) + 1.0);\n }\n x = (int)((x - g->xmin)/g->block + 1.0);\n y = (int)((y - g->ymin)/g->block + 1.0);\n if(y < g->y0) return 0;\n if(y > g->y1) return 0;\n if(x < g->x0) return 0;\n if(x > g->x1) return 0;\n }\n if( flag ){\n if(y < g->shapes[sno].ystart ) return 0;\n if(y > g->shapes[sno].ystop ) return 0;\n }\n scan = g->shapes[sno].scanlist[(int)y];\n FPU_DOUBLE\n if( (scan && \n ((y>=g->shapes[sno].ystart) && (y<=g->shapes[sno].ystop)) &&\n ((x >= scan->x) && (x <= (scan->next)->x))) == flag ){\n if( rno && flag ) g->rid = rno;\n FPU_RESTORE\n return 1;\n }\n else{\n FPU_RESTORE\n return 0;\n }\n}\n\nvoid imfieldi(GFilt g, int rno, int sno, int flag, int type,\n double x, double y)\n{\n int yy;\n Scan *scanlist;\n\n \n if( 0 ){\n rno = rno;\n }\n\n \n \n if( 0 ){\n sno = sno;\n type = type; \n x = x;\n y = y;\n }\n\n g->shapes[sno].ystart = g->y0;\n g->shapes[sno].ystop = g->y1;\n g->shapes[sno].scanlist = (Scan *)calloc(g->y1+1, sizeof(Scan));\n scanlist = g->shapes[sno].scanlist;\n marky(g, sno, flag, type);\n \n for(yy=g->shapes[sno].ystart; yy<=g->shapes[sno].ystop; yy++){\n rgs_mark(g, scanlist, sno, flag, type, g->x0, yy);\n rgs_mark(g, scanlist, sno, flag, type, g->x1, yy);\n }\n}\n\nint imfield(GFilt g, int rno, int sno, int flag, int type,\n double x, double y)\n{\n \n if( 0 ){\n sno = sno; \n type = type; \n x = x;\n y = y;\n }\n if( flag ){\n if( rno && flag ) g->rid = rno;\n return 1;\n }\n else{\n return 0;\n }\n}\n\nvoid imlinei(GFilt g, int rno, int sno, int flag, int type,\n double x, double y,\n double x1, double y1, double x2, double y2)\n{\n double vx[2];\n double vy[2];\n int xval, yval;\n double invslope, xoffset;\n\n \n \n if( 0 ){\n rno = rno;\n x = x;\n y = y;\n }\n\n \n x1 = (x1 - g->xmin)/g->block + 1.0;\n y1 = (y1 - g->ymin)/g->block + 1.0;\n x2 = (x2 - g->xmin)/g->block + 1.0;\n y2 = (y2 - g->ymin)/g->block + 1.0;\n \n if( y1 < y2 ){\n vx[0] = x1;\n vy[0] = y1;\n vx[1] = x2;\n vy[1] = y2;\n }\n else{\n vx[0] = x2;\n vy[0] = y2;\n vx[1] = x1;\n vy[1] = y1;\n }\n \n g->shapes[sno].ystart = PIXNUM(vy[0]);\n g->shapes[sno].ystop = PIXNUM(vy[1]);\n g->shapes[sno].scanlist = (Scan *)calloc(g->y1+1, sizeof(Scan));\n marky(g, sno, flag, type);\n if( feq(vy[0],vy[1]) ){\n rgs_mark(g, g->shapes[sno].scanlist, sno, flag, type,\n (int)min(vx[0],vx[1]), (int)vy[0]);\n rgs_mark(g, g->shapes[sno].scanlist, sno, flag, type,\n (int)max(vx[0],vx[1]), (int)vy[0]);\n }\n else{\n \n invslope = (vx[0] - vx[1]) / (vy[0] - vy[1]);\n xoffset = vx[0];\n for(yval=vy[0]; yval<=vy[1]; yval++){\n xval = xoffset;\n rgs_mark(g, g->shapes[sno].scanlist, sno, flag, type, xval, yval);\n xoffset = xoffset + invslope;\n }\n }\n}\n\nint imline(GFilt g, int rno, int sno, int flag, int type,\n double x, double y,\n double x1, double y1, double x2, double y2)\n{\n Scan scan;\n\n\n \n if( 0 ){\n type = type; \n x1 = x1;\n y1 = y1;\n x2 = x2;\n y2 = y2;\n }\n if( g->evsect ){\n if( g->usebinsiz ){\n x = (int)((x - g->tlminx)/g->binsizx + 1.0);\n y = (int)((y - g->tlminy)/g->binsizy + 1.0);\n }\n else{\n x = (int)((x - g->tlminx) + 1.0);\n y = (int)((y - g->tlminy) + 1.0);\n }\n x = (int)((x - g->xmin)/g->block + 1.0);\n y = (int)((y - g->ymin)/g->block + 1.0);\n if(y < g->y0) return 0;\n if(y > g->y1) return 0;\n if(x < g->x0) return 0;\n if(x > g->x1) return 0;\n }\n if( flag ){\n if(y < g->shapes[sno].ystart ) return 0;\n if(y > g->shapes[sno].ystop ) return 0;\n }\n scan = g->shapes[sno].scanlist[(int)y];\n if( (scan &&\n ((x==(int)scan->x) ||\n (scan->next&&((x>=(int)scan->x)&&(x<=(int)scan->next->x)))))==flag ) {\n if( rno && flag ) g->rid = rno;\n return 1;\n }\n else\n return 0;\n}\n\nvoid impiei(GFilt g, int rno, int sno, int flag, int type,\n double x, double y,\n double xcen, double ycen, double angle1, double angle2)\n{\n _impiei(g, 0, rno, sno, flag, type, x, y, xcen, ycen, angle1, angle2);\n}\n\nint impie(GFilt g, int rno, int sno, int flag, int type,\n double x, double y,\n double xcen, double ycen, double angle1, double angle2)\n{\n \n if( 0 ){\n xcen = xcen;\n ycen = ycen;\n angle1 = angle1;\n angle2 = angle2;\n }\n\n return impolygon(g, rno, sno, flag, type, x, y);\n}\n\nvoid imqtpiei(GFilt g, int rno, int sno, int flag, int type,\n double x, double y,\n double xcen, double ycen, double angle1, double angle2)\n{\n _impiei(g, 1, rno, sno, flag, type, x, y, xcen, ycen, angle1, angle2);\n}\n\nint imqtpie(GFilt g, int rno, int sno, int flag, int type,\n double x, double y,\n double xcen, double ycen, double angle1, double angle2)\n{\n \n if( 0 ){\n xcen = xcen;\n ycen = ycen;\n angle1 = angle1;\n angle2 = angle2;\n }\n\n return impolygon(g, rno, sno, flag, type, x, y);\n}\n\nvoid impointi(GFilt g, int rno, int sno, int flag, int type,\n double x, double y,\n double xcen, double ycen)\n{\n \n \n if( 0 ){\n rno = rno;\n x = x;\n y = y;\n }\n\n \n xcen = (xcen - g->xmin)/g->block + 1.0;\n ycen = (ycen - g->ymin)/g->block + 1.0;\n \n g->shapes[sno].ystart = PIXNUM(ycen);\n g->shapes[sno].ystop = PIXNUM(ycen);\n g->shapes[sno].scanlist = (Scan *)calloc(g->y1+1, sizeof(Scan));\n marky(g, sno, flag, type);\n rgs_mark(g, g->shapes[sno].scanlist, sno, flag, type,\n PIXNUM(xcen), PIXNUM(ycen));\n}\n\nint impoint(GFilt g, int rno, int sno, int flag, int type,\n double x, double y,\n double xcen, double ycen)\n{\n Scan scan;\n\n \n if( 0 ){\n type = type;\n xcen = xcen;\n ycen = ycen;\n }\n\n if( g->evsect ){\n if( g->usebinsiz ){\n x = (int)((x - g->tlminx)/g->binsizx + 1.0);\n y = (int)((y - g->tlminy)/g->binsizy + 1.0);\n }\n else{\n x = (int)((x - g->tlminx) + 1.0);\n y = (int)((y - g->tlminy) + 1.0);\n }\n x = (int)((x - g->xmin)/g->block + 1.0);\n y = (int)((y - g->ymin)/g->block + 1.0);\n if(y < g->y0) return 0;\n if(y > g->y1) return 0;\n if(x < g->x0) return 0;\n if(x > g->x1) return 0;\n }\n if( flag ){\n if(y < g->shapes[sno].ystart ) return 0;\n if(y > g->shapes[sno].ystop ) return 0;\n }\n scan = g->shapes[sno].scanlist[(int)y];\n if( (scan &&\n (y == (int)g->shapes[sno].ystart) && \n (x == (int)scan->x))==flag ) {\n if( rno && flag ) g->rid = rno;\n return 1;\n }\n else\n return 0;\n}\n\n#ifdef __STDC__\nvoid\nimpolygoni(GFilt g, int rno, int sno, int flag, int type,\n double x, double y, ...)\n{\n double *vx=NULL, *vy=NULL;\n int count, maxcount;\n va_list args;\n va_start(args, y);\n#else\nvoid impolygoni(va_alist) va_dcl\n{\n GFilt g;\n int rno, sno, flag, type;\n double x, y;\n double *vx=NULL, *vy=NULL;\n int count, maxcount;\n va_list args;\n va_start(args);\n g = va_arg(args, GFilt);\n rno = va_arg(args, int);\n sno = va_arg(args, int);\n flag = va_arg(args, int);\n type = va_arg(args, int);\n x = va_arg(args, double);\n y = va_arg(args, double);\n#endif\n \n \n if( 0 ){\n x = x;\n }\n\n \n maxcount = MASKINC;\n vx = (double *)calloc(maxcount, sizeof(double));\n vy = (double *)calloc(maxcount, sizeof(double));\n \n count = 0;\n while( 1 ){\n if( (count + 1) >= maxcount ){\n maxcount += MASKINC;\n vx = (double *)realloc(vx, maxcount*sizeof(double));\n vy = (double *)realloc(vy, maxcount*sizeof(double));\n }\n vx[count] = va_arg(args, double);\n vy[count] = va_arg(args, double);\n if( feq(vx[count],PSTOP) && feq(vy[count],PSTOP) )\n break;\n vx[count] = (vx[count] - g->xmin)/g->block + 1.0;\n vy[count] = (vy[count] - g->ymin)/g->block + 1.0;\n count ++;\n }\n va_end(args);\n \n vx = (double *)realloc(vx, count*sizeof(double));\n vy = (double *)realloc(vy, count*sizeof(double));\n \n _polygoni(g, 0, rno, sno, flag, type, vx, vy, count);\n if( vx ) free(vx);\n if( vy ) free(vy);\n}\n\n#ifdef __STDC__\nint\nimpolygon(GFilt g, int rno, int sno, int flag, int type,\n double x, double y, ...)\n{\n int crossings;\n Scan scan;\n va_list args;\n va_start(args, y);\n#else\nint impolygon(va_alist) va_dcl\n{\n GFilt g;\n int rno, sno, flag, type;\n double x, y;\n int crossings;\n Scan scan;\n va_list args;\n va_start(args);\n g = va_arg(args, GFilt);\n rno = va_arg(args, int);\n sno = va_arg(args, int);\n flag = va_arg(args, int);\n type = va_arg(args, int);\n x = va_arg(args, double);\n y = va_arg(args, double);\n#endif\n va_end(args);\n \n if( 0 ){\n type = type;\n }\n\n if( g->evsect ){\n if( g->usebinsiz ){\n x = (int)((x - g->tlminx)/g->binsizx + 1.0);\n y = (int)((y - g->tlminy)/g->binsizy + 1.0);\n }\n else{\n x = (int)((x - g->tlminx) + 1.0);\n y = (int)((y - g->tlminy) + 1.0);\n }\n x = (int)((x - g->xmin)/g->block + 1.0);\n y = (int)((y - g->ymin)/g->block + 1.0);\n if(y < g->y0) return 0;\n if(y > g->y1) return 0;\n if(x < g->x0) return 0;\n if(x > g->x1) return 0;\n }\n if( flag ){\n if(y < g->shapes[sno].ystart ) return 0;\n if(y > g->shapes[sno].ystop ) return 0;\n }\n \n if( (y>=g->shapes[sno].ystart)&&(y<=g->shapes[sno].ystop) ){\n crossings = 0;\n for(scan=g->shapes[sno].scanlist[(int)y]; scan; scan=scan->next){\n if( x >= scan->x )\n crossings++;\n else\n break;\n }\n if( (crossings%2) == flag ){\n if( rno && flag ) g->rid = rno;\n return 1;\n }\n else{\n return 0;\n }\n }\n else{\n return !flag;\n }\n}\n\nvoid imnannulusi(GFilt g, int rno, int sno, int flag, int type,\n double x, double y,\n double xcen, double ycen,\n double lo, double hi, int n)\n{\n int i;\n int xsno;\n double dinc;\n\n \n\n \n dinc = (hi - lo)/n;\n xsno = (g->nshapes+1)+((sno-1)*XSNO);\n \n imannulusi(g, 0, xsno, flag, type, x, y, xcen, ycen, lo, hi);\n for(i=0; inshapes+1)+((sno-1)*XSNO);\n \n imboxi(g, 0, xsno, flag, type, x, y, xcen, ycen, hix, hiy, ang);\n imboxi(g, 0, xsno+1, flag, type, x, y, xcen, ycen, lox, loy, ang);\n for(i=0; inshapes+1)+((sno-1)*XSNO);\n \n imellipsei(g, 0, xsno, flag, type, x, y, xcen, ycen, hix, hiy, ang);\n imellipsei(g, 0, xsno+1, flag, type, x, y, xcen, ycen, lox, loy, ang);\n for(i=0; i hi ) lo -= 360.0;\n dinc = (hi - lo)/n;\n xsno = (g->nshapes+1)+((sno-1)*XSNO);\n \n impiei(g, 0, xsno, flag, type, x, y, xcen, ycen, lo, hi);\n for(i=0; i anghi ) anglo -= 360.0;\n ainc = (anghi - anglo)/angn;\n ahi = (int)angn;\n rinc = (radhi - radlo)/radn;\n rhi = (int)radn;\n xsno = (g->nshapes+1)+((sno-1)*XSNO);\n \n imannulusi(g, 0, xsno, flag, type, x, y, xcen, ycen, radlo, radhi);\n imqtpiei(g, 0, xsno+1, flag, type, x, y, xcen, ycen, anglo, anghi);\n for(a=0; a anghi ) anglo -= 360.0;\n ainc = (anghi - anglo)/angn;\n ahi = (int)angn;\n xinc = (xhi - xlo)/radn;\n yinc = (yhi - ylo)/radn;\n rhi = (int)radn;\n xsno = (g->nshapes+1)+((sno-1)*XSNO);\n \n imboxi(g, 0, xsno, flag, type, x, y, xcen, ycen, xhi, yhi, ang);\n imqtpiei(g, 0, xsno+1, flag, type, x, y, xcen, ycen, anglo, anghi);\n imboxi(g, 0, xsno+2, flag, type, x, y, xcen, ycen, xlo, ylo, ang);\n for(a=0; a anghi ) anglo -= 360.0;\n ainc = (anghi - anglo)/angn;\n ahi = (int)angn;\n xinc = (xhi - xlo)/radn;\n yinc = (yhi - ylo)/radn;\n rhi = (int)radn;\n xsno = (g->nshapes+1)+((sno-1)*XSNO);\n \n imellipsei(g, 0, xsno, flag, type, x, y, xcen, ycen, xhi, yhi, ang);\n imqtpiei(g, 0, xsno+1, flag, type, x, y, xcen, ycen, anglo, anghi);\n imellipsei(g, 0, xsno+2, flag, type, x, y, xcen, ycen, xlo, ylo, ang);\n for(a=0; anshapes+1)+((sno-1)*XSNO);\n if( flag ){\n \n if( !imannulus(g, 0, xsno, flag, type, x, y, xcen, ycen, lo, hi) ){\n return(0);\n }\n \n for(i=0; inshapes+1)+((sno-1)*XSNO);\n if( flag ){\n \n if( !imbox(g, 0, xsno, flag, type, x, y, xcen, ycen, hix, hiy, ang) ){\n return(0);\n }\n \n if( imbox(g, 0, xsno+1, flag, type, x, y, xcen, ycen, lox, loy, ang) ){\n return(0);\n }\n \n for(i=0; inshapes+1)+((sno-1)*XSNO);\n if( flag ){\n \n if( !imellipse(g, 0, xsno, flag, type, x, y, xcen, ycen, hix, hiy, ang) ){\n return(0);\n }\n \n if( imellipse(g, 0, xsno+1, flag, type, x, y, xcen, ycen, lox, loy, ang) ){\n return(0);\n }\n \n for(i=0; i hi ) lo -= 360.0;\n dinc = (hi - lo)/n;\n xsno = (g->nshapes+1)+((sno-1)*XSNO);\n if( flag ){\n \n if( !impie(g, 0, xsno, flag, type, x, y, xcen, ycen, lo, hi) ){\n return(0);\n }\n \n for(i=0; i anghi ) anglo -= 360.0;\n ainc = (anghi - anglo)/angn;\n ahi = (int)angn;\n rinc = (radhi - radlo)/radn;\n rhi = (int)radn;\n xsno = (g->nshapes+1)+((sno-1)*XSNO);\n if( flag ){\n \n if( !imannulus(g, 0, xsno, flag, type, x, y, xcen, ycen, radlo, radhi) ||\n !impie(g, 0, xsno+1, flag, type, x, y, xcen, ycen, anglo, anghi) ){\n return(0);\n }\n \n for(a=1; a<=ahi; a++){\n for(r=1; r<=rhi; r++){\n if( imannulus(g, rno+n, sno+(2*n), flag, type, x, y,\n xcen, ycen, radlo+((r-1)*rinc), radlo+(r*rinc)) &&\n impie(g, rno+n, sno+(2*n+1), flag, type, x, y,\n xcen, ycen, anglo+((a-1)*ainc), anglo+(a*ainc)) ){\n return(1);\n }\n n++;\n }\n }\n return(0);\n }\n else{\n \n if( !imannulus(g, 0, xsno, 1, type, x, y, xcen, ycen, radlo, radhi) )\n return(1);\n else if( !impie(g, 0, xsno+1, 1, type, x, y, xcen, ycen, anglo, anghi) ){\n return(1);\n }\n else{\n return(0);\n }\n }\n}\n\nint imbpanda(GFilt g, int rno, int sno, int flag, int type,\n double x, double y,\n double xcen, double ycen,\n double anglo, double anghi, double angn,\n double xlo, double ylo, double xhi, double yhi, double radn,\n double ang)\n{\n \n int a, r;\n int ahi, rhi;\n int xsno;\n int n=0;\n double ainc, xinc, yinc;\n\n \n anglo += ang;\n anghi += ang;\n while( anglo > anghi ) anglo -= 360.0;\n ainc = (anghi - anglo)/angn;\n ahi = (int)angn;\n xinc = (xhi - xlo)/radn;\n yinc = (yhi - ylo)/radn;\n rhi = (int)radn;\n xsno = (g->nshapes+1)+((sno-1)*XSNO);\n if( flag ){\n \n if( !imbox(g, 0, xsno, flag, type, x, y, xcen, ycen, xhi, yhi,\n ang) ){\n return(0);\n }\n \n else if( imbox(g, 0, xsno+2, flag, type, x, y, xcen, ycen, xlo, ylo,\n ang) ){\n return(0);\n }\n \n else if( !impie(g, 0, xsno+1, flag, type, x, y, xcen, ycen, anglo, anghi)){\n return(0);\n }\n \n for(a=0; a anghi ) anglo -= 360.0;\n ainc = (anghi - anglo)/angn;\n ahi = (int)angn;\n xinc = (xhi - xlo)/radn;\n yinc = (yhi - ylo)/radn;\n rhi = (int)radn;\n xsno = (g->nshapes+1)+((sno-1)*XSNO);\n if( flag ){\n \n if( !imellipse(g, 0, xsno, flag, type, x, y, xcen, ycen, xhi, yhi,\n ang) ){\n return(0);\n }\n \n else if( imellipse(g, 0, xsno+2, flag, type, x, y, xcen, ycen, xlo, ylo,\n ang) ){\n return(0);\n }\n \n else if( !impie(g, 0, xsno+1, flag, type, x, y, xcen, ycen, anglo, anghi)){\n return(0);\n }\n \n for(a=0; anshapes+1)+((sno-1)*XSNO);\n if( !g->shapes[xsno].xv ){\n maxpts = MASKINC;\n g->shapes[xsno].xv = (double *)calloc(maxpts, sizeof(double));\n g->shapes[xsno].nv = 0;\n while( 1 ){\n if( g->shapes[xsno].nv >= maxpts ){\n maxpts += MASKINC;\n g->shapes[xsno].xv = (double *)realloc(g->shapes[xsno].xv,\n maxpts*sizeof(double));\n }\n g->shapes[xsno].xv[g->shapes[xsno].nv] = va_arg(args, double);\n if( feq(g->shapes[xsno].xv[g->shapes[xsno].nv],PSTOP) &&\n feq(g->shapes[xsno].xv[g->shapes[xsno].nv-1],PSTOP) ){\n g->shapes[xsno].nv--;\n break;\n }\n g->shapes[xsno].nv++;\n }\n va_end(args);\n g->shapes[xsno].xv = (double *)realloc(g->shapes[xsno].xv,\n g->shapes[xsno].nv*sizeof(double));\n }\n n = g->shapes[xsno].nv;\n xv = g->shapes[xsno].xv;\n \n if( n == 2 ){\n imannulusi(g, rno, sno, flag, type, x, y, xcen, ycen, xv[0], xv[1]);\n return;\n }\n imannulusi(g, 0, xsno, flag, type, x, y, xcen, ycen, xv[0], xv[n-1]);\n for(i=0; i<(n-1); i++){\n imannulusi(g, rno+i, sno+i, flag, type, x, y, xcen, ycen, xv[i], xv[i+1]);\n }\n}\n\n#ifdef __STDC__\nvoid\nimvboxi(GFilt g, int rno, int sno, int flag, int type,\n double x, double y, double xcen, double ycen, ...)\n{\n int i, j, n;\n int maxpts;\n int xsno;\n double ang;\n double *xv;\n va_list args;\n va_start(args, ycen);\n#else\nint imvboxi(va_alist) va_dcl\n{\n GFilt g;\n int rno, sno, flag, type;\n double x, y;\n double xcen, ycen;\n double ang;\n double *xv;\n int i, j, n;\n int maxpts;\n int xsno;\n va_list args;\n va_start(args);\n g = va_arg(args, GFilt);\n rno = va_arg(args, int);\n sno = va_arg(args, int);\n flag = va_arg(args, int);\n type = va_arg(args, int);\n x = va_arg(args, double);\n y = va_arg(args, double);\n xcen = va_arg(args, double);\n ycen = va_arg(args, double);\n#endif\n xsno = (g->nshapes+1)+((sno-1)*XSNO);\n if( !g->shapes[xsno].xv ){\n maxpts = MASKINC;\n g->shapes[xsno].xv = (double *)calloc(maxpts, sizeof(double));\n g->shapes[xsno].nv = 0;\n while( 1 ){\n if( g->shapes[xsno].nv >= maxpts ){\n maxpts += MASKINC;\n g->shapes[xsno].xv = (double *)realloc(g->shapes[xsno].xv,\n maxpts*sizeof(double));\n }\n g->shapes[xsno].xv[g->shapes[xsno].nv] = va_arg(args, double);\n if( feq(g->shapes[xsno].xv[g->shapes[xsno].nv],PSTOP) &&\n feq(g->shapes[xsno].xv[g->shapes[xsno].nv-1],PSTOP) ){\n g->shapes[xsno].nv--;\n break;\n }\n g->shapes[xsno].nv++;\n }\n va_end(args);\n g->shapes[xsno].xv = (double *)realloc(g->shapes[xsno].xv,\n g->shapes[xsno].nv*sizeof(double));\n }\n n = g->shapes[xsno].nv;\n xv = g->shapes[xsno].xv;\n ang = xv[--n];\n \n if( n == 2 ){\n imboxi(g, rno, sno, flag, type, x, y, xcen, ycen, xv[0], xv[1], ang);\n return;\n }\n imboxi(g, 0, xsno, flag, type, x, y, xcen, ycen, xv[n-2], xv[n-1], ang);\n imboxi(g, 0, xsno+1, flag, type, x, y, xcen, ycen, xv[0], xv[1], ang);\n for(i=2, j=0; inshapes+1)+((sno-1)*XSNO);\n if( !g->shapes[xsno].xv ){\n maxpts = MASKINC;\n g->shapes[xsno].xv = (double *)calloc(maxpts, sizeof(double));\n g->shapes[xsno].nv = 0;\n while( 1 ){\n if( g->shapes[xsno].nv >= maxpts ){\n maxpts += MASKINC;\n g->shapes[xsno].xv = (double *)realloc(g->shapes[xsno].xv,\n maxpts*sizeof(double));\n }\n g->shapes[xsno].xv[g->shapes[xsno].nv] = va_arg(args, double);\n if( feq(g->shapes[xsno].xv[g->shapes[xsno].nv],PSTOP) &&\n feq(g->shapes[xsno].xv[g->shapes[xsno].nv-1],PSTOP) ){\n g->shapes[xsno].nv--;\n break;\n }\n g->shapes[xsno].nv++;\n }\n va_end(args);\n g->shapes[xsno].xv = (double *)realloc(g->shapes[xsno].xv,\n g->shapes[xsno].nv*sizeof(double));\n }\n n = g->shapes[xsno].nv;\n xv = g->shapes[xsno].xv;\n ang = xv[--n];\n \n if( n == 2 ){\n imellipsei(g, rno, sno, flag, type, x, y, xcen, ycen, xv[0], xv[1], ang);\n return;\n }\n imellipsei(g, 0, xsno, flag, type, x, y, xcen, ycen, xv[n-2], xv[n-1], ang);\n imellipsei(g, 0, xsno+1, flag, type, x, y, xcen, ycen, xv[0], xv[1], ang);\n for(i=2, j=0; inshapes+1)+((sno-1)*XSNO);\n if( !g->shapes[xsno].xv ){\n maxpts = MASKINC;\n g->shapes[xsno].xv = (double *)calloc(maxpts, sizeof(double));\n g->shapes[xsno].nv = 0;\n while( 1 ){\n if( g->shapes[xsno].nv >= maxpts ){\n maxpts += MASKINC;\n g->shapes[xsno].xv = (double *)realloc(g->shapes[xsno].xv,\n maxpts*sizeof(double));\n }\n g->shapes[xsno].xv[g->shapes[xsno].nv] = va_arg(args, double);\n if( feq(g->shapes[xsno].xv[g->shapes[xsno].nv],PSTOP) &&\n feq(g->shapes[xsno].xv[g->shapes[xsno].nv-1],PSTOP) ){\n g->shapes[xsno].nv--;\n break;\n }\n g->shapes[xsno].nv++;\n }\n va_end(args);\n g->shapes[xsno].xv = (double *)realloc(g->shapes[xsno].xv,\n g->shapes[xsno].nv*sizeof(double));\n }\n n = g->shapes[xsno].nv;\n xv = g->shapes[xsno].xv;\n \n if( n == 2 ){\n impiei(g, rno, sno, flag, type, x, y, xcen, ycen, xv[0], xv[1]);\n return;\n }\n impiei(g, 0, xsno, flag, type, x, y, xcen, ycen, xv[0], xv[n-1]);\n for(i=0; i<(n-1); i++){\n impiei(g, rno+i, sno+i, flag, type, x, y, xcen, ycen, xv[i], xv[i+1]);\n }\n}\n\n#ifdef __STDC__\nvoid\nimvpointi(GFilt g, int rno, int sno, int flag, int type, \n double x, double y, ...)\n{\n int i, j, n;\n int maxpts;\n int xsno;\n double *xv;\n va_list args;\n va_start(args, y);\n#else\nint imvpointi(va_alist) va_dcl\n{\n GFilt g;\n int rno, sno, flag, type;\n double x, y;\n double *xv;\n int i, j, n;\n int maxpts;\n int xsno;\n va_list args;\n va_start(args);\n g = va_arg(args, GFilt);\n rno = va_arg(args, int);\n sno = va_arg(args, int);\n flag = va_arg(args, int);\n type = va_arg(args, int);\n x = va_arg(args, double);\n y = va_arg(args, double);\n#endif\n xsno = (g->nshapes+1)+((sno-1)*XSNO);\n if( !g->shapes[xsno].xv ){\n maxpts = MASKINC;\n g->shapes[xsno].xv = (double *)calloc(maxpts, sizeof(double));\n g->shapes[xsno].nv = 0;\n while( 1 ){\n if( g->shapes[xsno].nv >= maxpts ){\n maxpts += MASKINC;\n g->shapes[xsno].xv = (double *)realloc(g->shapes[xsno].xv,\n maxpts*sizeof(double));\n }\n g->shapes[xsno].xv[g->shapes[xsno].nv] = va_arg(args, double);\n if( feq(g->shapes[xsno].xv[g->shapes[xsno].nv],PSTOP) &&\n feq(g->shapes[xsno].xv[g->shapes[xsno].nv-1],PSTOP) ){\n g->shapes[xsno].nv--;\n break;\n }\n g->shapes[xsno].nv++;\n }\n va_end(args);\n g->shapes[xsno].xv = (double *)realloc(g->shapes[xsno].xv,\n g->shapes[xsno].nv*sizeof(double));\n }\n n = g->shapes[xsno].nv;\n xv = g->shapes[xsno].xv;\n for(i=0, j=0; inshapes+1)+((sno-1)*XSNO);\n if( !g->shapes[xsno].xv ){\n maxpts = MASKINC;\n g->shapes[xsno].xv = (double *)calloc(maxpts, sizeof(double));\n g->shapes[xsno].nv = 0;\n while( 1 ){\n if( g->shapes[xsno].nv >= maxpts ){\n maxpts += MASKINC;\n g->shapes[xsno].xv = (double *)realloc(g->shapes[xsno].xv,\n maxpts*sizeof(double));\n }\n g->shapes[xsno].xv[g->shapes[xsno].nv] = va_arg(args, double);\n if( feq(g->shapes[xsno].xv[g->shapes[xsno].nv],PSTOP) &&\n feq(g->shapes[xsno].xv[g->shapes[xsno].nv-1],PSTOP) ){\n g->shapes[xsno].nv--;\n break;\n }\n g->shapes[xsno].nv++;\n }\n va_end(args);\n g->shapes[xsno].xv = (double *)realloc(g->shapes[xsno].xv,\n g->shapes[xsno].nv*sizeof(double));\n }\n n = g->shapes[xsno].nv;\n xv = g->shapes[xsno].xv;\n \n if( n == 2 ){\n return(imannulus(g, rno, sno, flag, type, x, y, xcen, ycen, xv[0], xv[1]));\n }\n if( flag ){\n \n if( !imannulus(g, 0, xsno, flag, type, x, y, xcen, ycen, xv[0], xv[n-1]) ){\n return(0);\n }\n \n for(i=0; inshapes+1)+((sno-1)*XSNO);\n if( !g->shapes[xsno].xv ){\n maxpts = MASKINC;\n g->shapes[xsno].xv = (double *)calloc(maxpts, sizeof(double));\n g->shapes[xsno].nv = 0;\n while( 1 ){\n if( g->shapes[xsno].nv >= maxpts ){\n maxpts += MASKINC;\n g->shapes[xsno].xv = (double *)realloc(g->shapes[xsno].xv,\n maxpts*sizeof(double));\n }\n g->shapes[xsno].xv[g->shapes[xsno].nv] = va_arg(args, double);\n if( feq(g->shapes[xsno].xv[g->shapes[xsno].nv],PSTOP) &&\n feq(g->shapes[xsno].xv[g->shapes[xsno].nv-1],PSTOP) ){\n g->shapes[xsno].nv--;\n break;\n }\n g->shapes[xsno].nv++;\n }\n va_end(args);\n g->shapes[xsno].xv = (double *)realloc(g->shapes[xsno].xv,\n g->shapes[xsno].nv*sizeof(double));\n }\n n = g->shapes[xsno].nv;\n xv = g->shapes[xsno].xv;\n ang = xv[--n];\n \n if( n == 2 ){\n return(imbox(g, rno, sno, flag, type, x, y, \n xcen, ycen, xv[0], xv[1], ang));\n }\n if( flag ){\n \n if( !imbox(g, 0, xsno, flag, type, x, y, xcen, ycen, xv[n-2], xv[n-1],\n ang) ){\n return(0);\n }\n \n if( imbox(g, 0, xsno+1, flag, type, x, y, xcen, ycen, xv[0], xv[1], ang) ){\n return(0);\n }\n \n for(i=2, j=0; inshapes+1)+((sno-1)*XSNO);\n if( !g->shapes[xsno].xv ){\n maxpts = MASKINC;\n g->shapes[xsno].xv = (double *)calloc(maxpts, sizeof(double));\n g->shapes[xsno].nv = 0;\n while( 1 ){\n if( g->shapes[xsno].nv >= maxpts ){\n maxpts += MASKINC;\n g->shapes[xsno].xv = (double *)realloc(g->shapes[xsno].xv,\n maxpts*sizeof(double));\n }\n g->shapes[xsno].xv[g->shapes[xsno].nv] = va_arg(args, double);\n if( feq(g->shapes[xsno].xv[g->shapes[xsno].nv],PSTOP) &&\n feq(g->shapes[xsno].xv[g->shapes[xsno].nv-1],PSTOP) ){\n g->shapes[xsno].nv--;\n break;\n }\n g->shapes[xsno].nv++;\n }\n va_end(args);\n g->shapes[xsno].xv = (double *)realloc(g->shapes[xsno].xv,\n g->shapes[xsno].nv*sizeof(double));\n }\n n = g->shapes[xsno].nv;\n xv = g->shapes[xsno].xv;\n ang = xv[--n];\n \n if( n == 2 ){\n return(imellipse(g, rno, sno, flag, type, x, y,\n xcen, ycen, xv[0], xv[1], ang));\n }\n if( flag ){\n \n if( !imellipse(g, 0, xsno, flag, type, x, y, xcen, ycen, xv[n-2], xv[n-1],\n ang) ){\n return(0);\n }\n \n if( imellipse(g, 0, xsno+1, flag, type, x, y, xcen, ycen, xv[0], xv[1],\n ang) ){\n return(0);\n }\n \n for(i=2, j=0; inshapes+1)+((sno-1)*XSNO);\n if( !g->shapes[xsno].xv ){\n maxpts = MASKINC;\n g->shapes[xsno].xv = (double *)calloc(maxpts, sizeof(double));\n g->shapes[xsno].nv = 0;\n while( 1 ){\n if( g->shapes[xsno].nv >= maxpts ){\n maxpts += MASKINC;\n g->shapes[xsno].xv = (double *)realloc(g->shapes[xsno].xv,\n maxpts*sizeof(double));\n }\n g->shapes[xsno].xv[g->shapes[xsno].nv] = va_arg(args, double);\n if( feq(g->shapes[xsno].xv[g->shapes[xsno].nv],PSTOP) &&\n feq(g->shapes[xsno].xv[g->shapes[xsno].nv-1],PSTOP) ){\n g->shapes[xsno].nv--;\n break;\n }\n g->shapes[xsno].nv++;\n }\n va_end(args);\n g->shapes[xsno].xv = (double *)realloc(g->shapes[xsno].xv,\n g->shapes[xsno].nv*sizeof(double));\n }\n n = g->shapes[xsno].nv;\n xv = g->shapes[xsno].xv;\n \n if( n == 2 ){\n return(impie(g, rno, sno, flag, type, x, y,\n xcen, ycen, xv[0], xv[1]));\n }\n if( flag ){\n \n if( !impie(g, 0, xsno, flag, type, x, y, xcen, ycen, xv[0], xv[n-1]) ){\n return(0);\n }\n \n for(i=0; inshapes+1)+((sno-1)*XSNO);\n if( !g->shapes[xsno].xv ){\n maxpts = MASKINC;\n g->shapes[xsno].xv = (double *)calloc(maxpts, sizeof(double));\n g->shapes[xsno].nv = 0;\n while( 1 ){\n if( g->shapes[xsno].nv >= maxpts ){\n maxpts += MASKINC;\n g->shapes[xsno].xv = (double *)realloc(g->shapes[xsno].xv,\n maxpts*sizeof(double));\n }\n g->shapes[xsno].xv[g->shapes[xsno].nv] = va_arg(args, double);\n if( feq(g->shapes[xsno].xv[g->shapes[xsno].nv],PSTOP) &&\n feq(g->shapes[xsno].xv[g->shapes[xsno].nv-1],PSTOP) ){\n g->shapes[xsno].nv--;\n break;\n }\n g->shapes[xsno].nv++;\n }\n va_end(args);\n g->shapes[xsno].xv = (double *)realloc(g->shapes[xsno].xv,\n g->shapes[xsno].nv*sizeof(double));\n }\n n = g->shapes[xsno].nv;\n xv = g->shapes[xsno].xv;\n \n for(i=0, j=0; ixmax - g->xmin + 1)/g->block)/(double)g->maskdim) + 0.5);\n if( mblock < 1 ){\n g->masks = NULL;\n g->nmask = 0;\n }\n \n fsize = g->nmask * sizeof(FilterMaskRec) * mblock;\n xmasks = (FilterMask)calloc(1, fsize);\n for(got=0, i=0; inmask; i++){\n xmasks[got].region = g->masks[i].region;\n xmasks[got].y = (g->masks[i].y - 1.0) * mblock + 1.0;\n xmasks[got].xstart = (g->masks[i].xstart - 1.0) * mblock + 1.0;\n xmasks[got].xstop = (g->masks[i].xstop - 1.0) * mblock + 1.0;\n \n for(j=1; jmasks = xmasks;\n g->nmask = got;\n\n \n for(i=0; iybuf[g->masks[i].y] )\n g->ybuf[g->masks[i].y] = i+1;\n }\n}\n\nint imimagemask(GFilt g, int rno, int sno, int flag, int type,\n double x, double y)\n{\n int i;\n int ix, iy;\n\n if( g->nmask == 0 )\n return(0);\n\n \n if( 0 ){\n rno = rno;\n sno = sno;\n flag = flag;\n type = type; \n }\n if( g->evsect ){\n if( g->usebinsiz ){\n x = (int)((x - g->tlminx)/g->binsizx + 1.0);\n y = (int)((y - g->tlminy)/g->binsizy + 1.0);\n }\n else{\n x = (int)((x - g->tlminx) + 1.0);\n y = (int)((y - g->tlminy) + 1.0);\n }\n x = (int)((x - g->xmin)/g->block + 1.0);\n y = (int)((y - g->ymin)/g->block + 1.0);\n if(y < g->y0) return 0;\n if(y > g->y1) return 0;\n if(x < g->x0) return 0;\n if(x > g->x1) return 0;\n }\n ix = (int)x;\n iy = (int)y;\n \n i = g->ybuf[iy];\n \n if( i != 0 ){\n i--;\n for(; inmask; i++){\n if( g->masks[i].y > iy ){\n return(0);\n }\n if( (ix >= g->masks[i].xstart) && (ix <= g->masks[i].xstop) ){\n g->rid = g->masks[i].region;\n return(1);\n }\n }\n }\n return(0);\n}\n\n"; funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/filter/imregions_c.tmpl000066400000000000000000002164361256243640000251730ustar00rootroot00000000000000/* NB: MAKE SURE YOU EDIT THE TEMPLATE FILE!!!! */ #ifndef FILTER_PTYPE #include #endif /* panda and pie incorrectly used astronomical angles. fixed 4/2004 */ #define USE_ASTRO_ANGLE 0 /* we might want to avoid (x86) extended precision problems */ #define USE_FPU_DOUBLE _FPUDBL_ #if USE_FPU_DOUBLE #include static fpu_control_t _cw; #define FPU_DOUBLE {fpu_control_t _cw2; _FPU_GETCW(_cw); _cw2 = _cw & ~_FPU_EXTENDED; _cw2 |= _FPU_DOUBLE; _FPU_SETCW(_cw2);} #define FPU_RESTORE {_FPU_SETCW(_cw);} #else #define FPU_DOUBLE #define FPU_RESTORE #endif /* add to FilterOpen to cause this module to be loaded for dynamic linking */ static int imregno=0; void initimregions(void) { imregno++; return; } static void markx(GFilt g, int sno, int flag, int type, int x, int y) { /* avoid -W unused parameter warning */ if( 0 ){ sno = sno; } /* don't mark exclude regions */ if( type == TOK_EREG ) return; /* for include, we might extend the x limits */ if( flag ){ if( x <= g->x0s[y] ) g->x0s[y] = max(x,g->x0); if( x >= g->x1s[y] ) g->x1s[y] = min(x,g->x1); } /* for exclude, we have to look at the full line */ else{ g->x0s[y] = g->x0; g->x1s[y] = g->x1; } } static void marky(GFilt g, int sno, int flag, int type) { int i; /* don't mark exclude regions */ if( type == TOK_EREG ) return; /* mark include shape */ if( flag ){ for(i=max(g->y0,g->shapes[sno].ystart); i<=min(g->y1,g->shapes[sno].ystop); i++) g->ybuf[i] = 1; } /* mark exclude shape */ else{ for(i=g->y0; i<=g->shapes[sno].ystart-1; i++) g->ybuf[i] = 1; for(i=g->shapes[sno].ystop+1; i<=g->y1; i++) g->ybuf[i] = 1; } } static int imagemaskcmp(const void *s1, const void *s2) { FilterMask f1 = (FilterMask)s1; FilterMask f2 = (FilterMask)s2; if( f1->y < f2->y ){ return -1; } else if( f1->y > f2->y ){ return 1; } else{ if( f1->xstart < f2->xstart ){ return -1; } else{ return 1; } } } /* ***************************** shape support ***************************** */ static void quadeq(double a, double b, double c, double *x1, double *x2, int *nr, int *nc) { double dis, q; if( feq(a,0.0) ){ *nc = 0; if( feq(b,0.0) ){ *nr = 0; *x1 = 0.0; } else{ *nr = 1; *x1 = -c / b; } *x2 = *x1; } else{ dis = b*b - 4.0 * a * c; if( dis > 0.0 ){ *nr = 2; *nc = 0; dis = sqrt(dis); if( b < 0.0 ) dis = -dis; q = -0.5 * (b + dis); *x1 = q/a; *x2 = c/q; if(*x1 > *x2){ q = *x1; *x1 = *x2; *x2 = q; } } else if( feq(dis,0.0) ){ *nr = 1; *nc = 0; *x1 = - 0.5 * b / a; *x2 = *x1; } else{ *nr = 0; *nc = 2; *x1 = - 0.5 * b / a; *x2 = 0.5 * sqrt(-dis) / a; } } } static void rgs_mark(GFilt g, Scan *scanlist, int sno, int flag, int type, int xval, int yval ) { Scan scanmark, mark; /* since yval is used as an index, make sure its within limits */ if(yval < g->y0) yval = g->y0; if(yval > g->y1) yval = g->y1; mark = (Scan)calloc(1, sizeof(ScanRec)); mark->x = xval; /* sanity check */ if( !scanlist ) return; /* starts are installed at back of list for given x */ if( !scanlist[yval] || ((scanlist[yval])->x > xval) ){ mark->next = scanlist[yval]; scanlist[yval] = mark; } else { scanmark = scanlist[yval]; while( scanmark->next && ((scanmark->next)->x < xval) ) scanmark = scanmark->next; mark->next = scanmark->next; scanmark->next = mark; } markx(g, sno, flag, type, xval, yval); } static void rgs_segment(GFilt g, Scan *scanlist, int width, int height, int sno, int flag, int type, double x1, double y1, double x2, double y2) { int ystart, ystop, yval, xval; double invslope, xoffset; ystart = PIXINCL(y1); if( ystart < 1 ) ystart = 1; /* note: PIXINCL(stop) is 1st pixel not counted */ ystop = PIXINCL(y2) - 1; if( ystop > height ) ystop = height; /* ignore segment if there is no positive slope in integer coords */ if( (ystart > ystop) || (ystop < 1) ) return; /* use inverse slope (run/rise) to get x given y with a multiply */ invslope = (x1 - x2) / (y1 - y2); xoffset = x1 + ((ystart - y1) * invslope); for(yval=ystart; yval<=ystop; yval++){ xval = PIXINCL(xoffset); /* clip line to edges of image area (actually bend line) */ if(xval < 1) xval = 1; if(xval > width) xval = width + 1; rgs_mark(g, scanlist, sno, flag, type, xval, yval); xoffset = xoffset + invslope; } } static void _polygoni(GFilt g, int qt, int rno, int sno, int flag, int type, double *vx, double *vy, int count) { int i, j; double xlo, xhi; double ylo, yhi; #ifdef ALREADY_DONE /* divide by block factor to get real endpoints */ for(i=0; ixmin)/g->block + 1.0; vy[i] = (vy[i] - g->ymin)/g->block + 1.0; } #endif /* avoid -W unused parameter warning */ if( 0 ){ rno = rno; } /* find the limits */ xlo = vx[0]; xhi = xlo; ylo = vy[0]; yhi = ylo; for(i=0; i xhi) xhi = vx[i]; if(vx[i] < xlo) xlo = vx[i]; if(vy[i] > yhi) yhi = vy[i]; if(vy[i] < ylo) ylo = vy[i]; } if( qt && (sno > 1) ){ g->shapes[sno].ystart = g->shapes[sno-1].ystart; g->shapes[sno].ystop = g->shapes[sno-1].ystop; } else{ g->shapes[sno].ystart = max(g->y0,PIXINCL(ylo)); g->shapes[sno].ystop = min(g->y1,PIXINCL(yhi) - 1); } g->shapes[sno].scanlist = (Scan *)calloc(g->y1+1, sizeof(Scan)); marky(g, sno, flag, type); /* mark all horizontal segment crossings */ /* start with segment between last and first point */ j = count-1; for(i=0; i vy[j]){ rgs_segment(g, g->shapes[sno].scanlist, g->x1, g->y1, sno, flag, type, vx[j], vy[j], vx[i], vy[i]); } else{ rgs_segment(g, g->shapes[sno].scanlist, g->x1, g->y1, sno, flag, type, vx[i], vy[i], vx[j], vy[j]); } j = i; } } static int corner_vertex(int index, int width, int height, double *x, double *y) { switch (index) { case 1: *x = 0.0; *y = height + 1; break; case 2: *x = 0.0; *y = 0.0; break; case 3: *x = width + 1; *y = 0.0; break; case 4: *x = width + 1; *y = height + 1; default: break; } index = index + 1; if(index > 4) index = 1; return(index); } static int pie_intercept(int width, int height, double xcen, double ycen, double angle, double *xcept, double *ycept) { double angl, slope; /* l: angle and slope of ray */ angl = angle; /* put angles in normal range */ while (angl < 0.0) angl = angl + 360.0; while (angl >= 360.0) angl = angl - 360.0; /* check for a horizontal angle */ #if USE_ASTRO_ANGLE if(fabs(angl - 90.0) < SMALL_NUMBER) { #else if(fabs(angl - 180.0) < SMALL_NUMBER) { #endif *xcept = 0.0; *ycept = ycen; return(2); } #if USE_ASTRO_ANGLE if(fabs(angl - 270.0) < SMALL_NUMBER) { #else if(fabs(angl - 0.0) < SMALL_NUMBER) { #endif *xcept = width + 1; *ycept = ycen; return(4); } #if USE_ASTRO_ANGLE /* convert to a Cartesian angle */ angl = angl + 90.0; #else angl = angl; #endif if(angl >= 360.0) angl = angl - 360.0; if(angl < 180.0) { *ycept = height + 1; /* rule out vertical line */ if(fabs(angl - 90.0) < SMALL_NUMBER) { *xcept = xcen; return(1); } } else { *ycept = 0.0; /* rule out vertical line */ if(fabs(angl - 270.0) < SMALL_NUMBER) { *xcept = xcen; return(3); } } /* convert to radians */ angl = (angl / 180.0) * M_PI; /* calculate slope */ slope = tan(angl); /* calculate intercept with designated y edge */ *xcept = xcen + ((*ycept - ycen) / slope); if(*xcept < 0) { *ycept = (ycen - (xcen * slope)); *xcept = 0.0; return(2); } else if(*xcept > (width + 1)) { *ycept = (ycen + ((width + 1 - xcen) * slope)); *xcept = width + 1; return(4); } else { if(*ycept < height) return(3); else return(1); } } void _impiei(GFilt g, int qt, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, double angle1, double angle2) { int width, height; /* l: image mask width and height */ double sweep; /* l: sweep between cut angles */ double vx[7], vy[7]; /* l: arrays of vertices for polygon */ int count; /* l: number of polygon vertices */ int intrcpt1, intrcpt2; /* l: side intercepted by each cut */ double x2, y2; /* l: coordinates of second intercept */ /* NB: do not use x and y variables, they have bogus values */ /* avoid -W unused parameter warning */ if( 0 ){ x = x; y = y; } /* divide by block factor to get "real" parameters */ xcen = (xcen - g->xmin)/g->block + 1.0; ycen = (ycen - g->ymin)/g->block + 1.0; /* temps */ width = g->x1; height = g->y1; /* start listing vertices of polygon */ vx[0] = xcen; vy[0] = ycen; sweep = angle2 - angle1; /* if sweep is too small to be noticed, don't bother */ if(fabs(sweep) < SMALL_NUMBER) return; if (sweep < 0.0) sweep = sweep + 360.0; intrcpt1 = pie_intercept(width, height, xcen, ycen, angle1, &(vx[1]), &(vy[1])); intrcpt2 = pie_intercept(width, height, xcen, ycen, angle2, &x2, &y2); count = 2; /* if angles intercept same side and slice is between them, no corners */ /* else, mark corners until reaching side with second angle intercept */ if((intrcpt1 != intrcpt2) || (sweep > 180.0)){ do{ intrcpt1 = corner_vertex(intrcpt1, width, height, &(vx[count]), &(vy[count])); count = count + 1; }while(intrcpt1 != intrcpt2); } vx[count] = x2; vy[count] = y2; count++; _polygoni(g, qt, rno, sno, flag, type, vx, vy, count); } /* ***************************** shapes ********************************** */ void imannulusi(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, double iradius, double oradius) { int yy; double dval; double xoff, yoff; Scan *scanlist; /* NB: do not use x and y variables, they have bogus values */ if( iradius == 0 ){ imcirclei(g, rno, sno, flag, type, x, y, xcen, ycen, oradius); return; } /* divide by block factor to get "real" parameters */ xcen = (xcen - g->xmin)/g->block + 1.0; ycen = (ycen - g->ymin)/g->block + 1.0; iradius /= (double)g->block; oradius /= (double)g->block; /* set y limits */ if( PIXSTART(ycen - oradius) < PIXSTOP(ycen + oradius) ){ g->shapes[sno].ystart = max(g->y0,PIXSTART(ycen - oradius)); g->shapes[sno].ystop = min(g->y1,PIXSTOP(ycen + oradius)); } else{ g->shapes[sno].ystart = min(g->y1,PIXSTOP(ycen + oradius)); g->shapes[sno].ystop = max(g->y0,PIXSTART(ycen - oradius)); } g->shapes[sno].scanlist = (Scan *)calloc(g->y1+1, sizeof(Scan)); scanlist = g->shapes[sno].scanlist; marky(g, sno, flag, type); /* calculate start/stop values for each y line */ for(yy=g->shapes[sno].ystart; yy<=g->shapes[sno].ystop; yy++){ yoff = PIXCEN(yy) - ycen; if( (dval=(oradius * oradius) - (yoff * yoff)) > 0.0 ){ xoff = sqrt(dval); if( PIXSTART(xcen - xoff) <= PIXSTOP(xcen + xoff) ){ rgs_mark(g, scanlist, sno, flag, type, PIXSTART(xcen - xoff), yy); rgs_mark(g, scanlist, sno, flag, type, PIXSTOP(xcen + xoff), yy); } if( (dval=(iradius * iradius) - (yoff * yoff)) > 0.0 ){ xoff = sqrt(dval); if( PIXSTART(xcen - xoff) <= PIXSTOP(xcen + xoff) ){ rgs_mark(g, scanlist, sno, flag, type, PIXSTART(xcen - xoff), yy); rgs_mark(g, scanlist, sno, flag, type, PIXSTOP(xcen + xoff), yy); } } } } } int imannulus(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, double iradius, double oradius) { Scan scan; if( iradius == 0 ){ return(imcircle(g, rno, sno, flag, type, x, y, xcen, ycen, oradius)); } if( g->evsect ){ if( g->usebinsiz ){ x = (int)((x - g->tlminx)/g->binsizx + 1.0); y = (int)((y - g->tlminy)/g->binsizy + 1.0); } else{ x = (int)((x - g->tlminx) + 1.0); y = (int)((y - g->tlminy) + 1.0); } x = (int)((x - g->xmin)/g->block + 1.0); y = (int)((y - g->ymin)/g->block + 1.0); if(y < g->y0) return 0; if(y > g->y1) return 0; if(x < g->x0) return 0; if(x > g->x1) return 0; } if( flag ){ if(y < g->shapes[sno].ystart ) return 0; if(y > g->shapes[sno].ystop ) return 0; } scan = g->shapes[sno].scanlist[(int)y]; if( (scan && ((y >= g->shapes[sno].ystart) && (y <= g->shapes[sno].ystop)) && (scan->next->next ? (((x >= scan->x) && (x <= scan->next->next->next->x)) && !((x >= scan->next->x) && (x <= scan->next->next->x))) : ((x >= scan->x) && (x <= scan->next->x)))) ==flag ){ if( rno && flag ) g->rid = rno; return 1; } else return 0; } void imboxi(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, double xwidth, double yheight, double angle) { double angl; /* l: Cartesian angle in radians */ double half_width, half_height;/* l: radii (1/2 width and height) */ double cosangl, sinangl; /* l: sine, cosine of the Cartesian angle */ double hw_cos, hw_sin; /* l: products of half_width with sin, cos */ double hh_cos, hh_sin; /* l: products of half_height with sin, cos */ double cornerx[4], cornery[4]; /* l: arrays of x and y coords of 4 corners */ /* NB: do not use x and y variables, they have bogus values */ /* avoid -W unused parameter warning */ if( 0 ){ x = x; y = y; } if( (xwidth == 0) && (yheight==0) ){ return; } /* divide by block factor to get "real" parameters */ xcen = (xcen - g->xmin)/g->block + 1.0; ycen = (ycen - g->ymin)/g->block + 1.0; xwidth /= (double)g->block; yheight /= (double)g->block; #if USE_ASTRO_ANGLE /* convert to a Cartesian angle; save angle for use in multi or slices */ angl = angle + 90.0; #else angl = angle; #endif while (angl >= 360.0) angl = angl - 360.0; /* convert to radians */ angl = (angl / 180.0) * M_PI; sinangl = sin (angl); cosangl = cos (angl); #if USE_ASTRO_ANGLE /* since we rotate by 90.0 degrees to get from astro angle to cartesian, */ /* we also need to switch the width and height. we do this secretly so */ /* that the display will turn out right, by doing it in the half terms */ half_width = yheight / 2.0; half_height = xwidth / 2.0; #else half_width = xwidth / 2.0; half_height = yheight / 2.0; #endif hw_cos = half_width * cosangl; hw_sin = half_width * sinangl; hh_cos = half_height * cosangl; hh_sin = half_height * sinangl; #if USE_ASTRO_ANGLE cornerx[0] = xcen - hw_cos - hh_sin; cornery[0] = ycen - hw_sin + hh_cos; cornerx[1] = xcen + hw_cos - hh_sin; cornery[1] = ycen + hw_sin + hh_cos; cornerx[2] = xcen + hw_cos + hh_sin; cornery[2] = ycen + hw_sin - hh_cos; cornerx[3] = xcen - hw_cos + hh_sin; cornery[3] = ycen - hw_sin - hh_cos; #else cornerx[0] = xcen - hw_cos + hh_sin; cornery[0] = ycen - hh_cos - hw_sin; cornerx[1] = xcen - hw_cos - hh_sin; cornery[1] = ycen + hh_cos - hw_sin; cornerx[2] = xcen + hw_cos - hh_sin; cornery[2] = ycen + hh_cos + hw_sin; cornerx[3] = xcen + hw_cos + hh_sin; cornery[3] = ycen - hh_cos + hw_sin; #endif _polygoni(g, 0, rno, sno, flag, type, cornerx, cornery, 4); } int imbox(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, double xwidth, double yheight, double angle) { /* avoid -W unused parameter warning */ if( 0 ){ xcen = xcen; ycen = ycen; angle = angle; } if( (xwidth == 0) && (yheight==0) ){ return(!flag); } return impolygon(g, rno, sno, flag, type, x, y); } void imcirclei(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, double radius) { int yy; double dval; double xoff, yoff; Scan *scanlist; /* NB: do not use x and y variables, they have bogus values */ /* avoid -W unused parameter warning */ if( 0 ){ rno = rno; x = x; y = y; } if( radius == 0 ){ return; } /* divide by block factor to get "real" parameters */ xcen = (xcen - g->xmin)/g->block + 1.0; ycen = (ycen - g->ymin)/g->block + 1.0; radius /= (double)g->block; /* set y limits */ if( PIXSTART(ycen - radius) < PIXSTOP(ycen + radius) ){ g->shapes[sno].ystart = max(g->y0,PIXSTART(ycen - radius)); g->shapes[sno].ystop = min(g->y1,PIXSTOP(ycen + radius)); } else{ g->shapes[sno].ystart = min(g->y1,PIXSTOP(ycen + radius)); g->shapes[sno].ystop = max(g->y0,PIXSTART(ycen - radius)); } g->shapes[sno].scanlist = (Scan *)calloc(g->y1+1, sizeof(Scan)); scanlist = g->shapes[sno].scanlist; marky(g, sno, flag, type); /* calculate start/stop values for each y line */ for(yy=g->shapes[sno].ystart; yy<=g->shapes[sno].ystop; yy++){ yoff = PIXCEN(yy) - ycen; if( (dval=(radius * radius) - (yoff * yoff))>=0.0 ){ xoff = sqrt(dval); if( PIXSTART(xcen - xoff) <= PIXSTOP(xcen + xoff) ){ rgs_mark(g, scanlist, sno, flag, type, PIXSTART(xcen - xoff), yy); rgs_mark(g, scanlist, sno, flag, type, PIXSTOP(xcen + xoff), yy); } } } } int imcircle(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, double radius) { Scan scan; /* avoid -W unused parameter warning */ if( 0 ){ type = type; xcen = xcen; ycen = ycen; } if( radius == 0 ){ return(!flag); } if( g->evsect ){ if( g->usebinsiz ){ x = (int)((x - g->tlminx)/g->binsizx + 1.0); y = (int)((y - g->tlminy)/g->binsizy + 1.0); } else{ x = (int)((x - g->tlminx) + 1.0); y = (int)((y - g->tlminy) + 1.0); } x = (int)((x - g->xmin)/g->block + 1.0); y = (int)((y - g->ymin)/g->block + 1.0); if(y < g->y0) return 0; if(y > g->y1) return 0; if(x < g->x0) return 0; if(x > g->x1) return 0; } if( flag ){ if(y < g->shapes[sno].ystart ) return 0; if(y > g->shapes[sno].ystop ) return 0; } scan = g->shapes[sno].scanlist[(int)y]; if( (scan && ((y>=g->shapes[sno].ystart) && (y<=g->shapes[sno].ystop)) && ((x >= scan->x) && (x <= (scan->next)->x))) == flag ){ if( rno && flag ) g->rid = rno; return 1; } else{ return 0; } } void imellipsei(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, double xrad, double yrad, double angle) { int yy; int nr, nc; double yhi; double yoff; double xboff, xfoff; double angl; double sinangl, cosangl; double cossq, sinsq, xradsq, yradsq; double a, b_partial, c_partial; double b, c; Scan *scanlist; /* NB: do not use x and y variables, they have bogus values */ if( xrad == yrad ){ imcirclei(g, rno, sno, flag, type, x, y, xcen, ycen, xrad); return; } /* divide by block factor to get "real" parameters */ xcen = (xcen - g->xmin)/g->block + 1.0; ycen = (ycen - g->ymin)/g->block + 1.0; xrad /= (double)g->block; yrad /= (double)g->block; /* set worst case limits (xrad axis parallel to vertical axis) */ #if USE_ASTRO_ANGLE /* convert to a Cartesian angle; save "angle" for use by other routines */ angl = angle + 90.0; #else angl = angle; #endif while( angl >= 360.0 ) angl = angl - 360.0; /* convert to radians */ angl = (angl / 180.0) * M_PI; sinangl = sin(angl); cosangl = cos(angl); /* calculate approximate y limits */ /* choose lesser of containing rotbox and circle */ FPU_DOUBLE #if USE_ASTRO_ANGLE yhi = fabs(sinangl * yrad) + fabs(cosangl * xrad); #else yhi = fabs(sinangl * xrad) + fabs(cosangl * yrad); #endif yhi = min(yhi, max(yrad, xrad)); /* set y limits */ if( PIXSTART(ycen - yhi) < PIXSTOP(ycen + yhi) ){ g->shapes[sno].ystart = max(g->y0,PIXSTART(ycen - yhi)); g->shapes[sno].ystop = min(g->y1,PIXSTOP(ycen + yhi)); } else{ g->shapes[sno].ystart = min(g->y1,PIXSTOP(ycen + yhi)); g->shapes[sno].ystop = max(g->y0,PIXSTART(ycen - yhi)); } FPU_RESTORE g->shapes[sno].scanlist = (Scan *)calloc(g->y1+1, sizeof(Scan)); scanlist = g->shapes[sno].scanlist; marky(g, sno, flag, type); /* prepare partials for quadratic equation solutions to coordinates */ cossq = cosangl * cosangl; sinsq = sinangl * sinangl; #if USE_ASTRO_ANGLE /* because we rotate by 90.0 degrees to get from astro angle to */ /* cartesian, we also need to switch the x and y axes. we do this */ /* secretly so that the display will turn out right, by doing it in */ /* the sq terms */ xradsq = yrad * yrad; yradsq = xrad * xrad; #else xradsq = xrad * xrad; yradsq = yrad * yrad; #endif /* fill in as much of a,b,c as we can */ a = (cossq / xradsq) + (sinsq / yradsq); b_partial = (2.0 * sinangl) * ((cosangl / xradsq) - (cosangl / yradsq)); c_partial = (sinsq / xradsq) + (cossq / yradsq); /* calculate start/stop values for each y line */ for(yy=g->shapes[sno].ystart; yy<=g->shapes[sno].ystop; yy++){ yoff = yy - ycen; b = b_partial * yoff; c = (c_partial * yoff * yoff) - 1.0; /* solve quadratic */ quadeq (a, b, c, &xboff, &xfoff, &nr, &nc); /* if real roots */ if( nr != 0 ) { /* translate x coordinates */ rgs_mark(g, scanlist, sno, flag, type, PIXSTART(xcen + xboff), yy); rgs_mark(g, scanlist, sno, flag, type, PIXSTOP(xcen + xfoff), yy); } } } int imellipse(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, double xrad, double yrad, double angle) { Scan scan; /* avoid -W unused parameter warning */ if( 0 ){ angle = angle; } if( xrad == yrad ){ return(imcircle(g, rno, sno, flag, type, x, y, xcen, ycen, xrad)); } if( g->evsect ){ if( g->usebinsiz ){ x = (int)((x - g->tlminx)/g->binsizx + 1.0); y = (int)((y - g->tlminy)/g->binsizy + 1.0); } else{ x = (int)((x - g->tlminx) + 1.0); y = (int)((y - g->tlminy) + 1.0); } x = (int)((x - g->xmin)/g->block + 1.0); y = (int)((y - g->ymin)/g->block + 1.0); if(y < g->y0) return 0; if(y > g->y1) return 0; if(x < g->x0) return 0; if(x > g->x1) return 0; } if( flag ){ if(y < g->shapes[sno].ystart ) return 0; if(y > g->shapes[sno].ystop ) return 0; } scan = g->shapes[sno].scanlist[(int)y]; FPU_DOUBLE if( (scan && ((y>=g->shapes[sno].ystart) && (y<=g->shapes[sno].ystop)) && ((x >= scan->x) && (x <= (scan->next)->x))) == flag ){ if( rno && flag ) g->rid = rno; FPU_RESTORE return 1; } else{ FPU_RESTORE return 0; } } void imfieldi(GFilt g, int rno, int sno, int flag, int type, double x, double y) { int yy; Scan *scanlist; /* avoid -W unused parameter warning */ if( 0 ){ rno = rno; } /* NB: do not use x and y variables, they have bogus values */ /* avoid -W unused parameter warning */ if( 0 ){ sno = sno; type = type; x = x; y = y; } g->shapes[sno].ystart = g->y0; g->shapes[sno].ystop = g->y1; g->shapes[sno].scanlist = (Scan *)calloc(g->y1+1, sizeof(Scan)); scanlist = g->shapes[sno].scanlist; marky(g, sno, flag, type); /* calculate start/stop values for each y line */ for(yy=g->shapes[sno].ystart; yy<=g->shapes[sno].ystop; yy++){ rgs_mark(g, scanlist, sno, flag, type, g->x0, yy); rgs_mark(g, scanlist, sno, flag, type, g->x1, yy); } } int imfield(GFilt g, int rno, int sno, int flag, int type, double x, double y) { /* avoid -W unused parameter warning */ if( 0 ){ sno = sno; type = type; x = x; y = y; } if( flag ){ if( rno && flag ) g->rid = rno; return 1; } else{ return 0; } } void imlinei(GFilt g, int rno, int sno, int flag, int type, double x, double y, double x1, double y1, double x2, double y2) { double vx[2]; double vy[2]; int xval, yval; double invslope, xoffset; /* NB: do not use x and y variables, they have bogus values */ /* avoid -W unused parameter warning */ if( 0 ){ rno = rno; x = x; y = y; } /* divide by block factor to get "real" parameters */ x1 = (x1 - g->xmin)/g->block + 1.0; y1 = (y1 - g->ymin)/g->block + 1.0; x2 = (x2 - g->xmin)/g->block + 1.0; y2 = (y2 - g->ymin)/g->block + 1.0; /* order by increasing y */ if( y1 < y2 ){ vx[0] = x1; vy[0] = y1; vx[1] = x2; vy[1] = y2; } else{ vx[0] = x2; vy[0] = y2; vx[1] = x1; vy[1] = y1; } /* set y limits */ g->shapes[sno].ystart = PIXNUM(vy[0]); g->shapes[sno].ystop = PIXNUM(vy[1]); g->shapes[sno].scanlist = (Scan *)calloc(g->y1+1, sizeof(Scan)); marky(g, sno, flag, type); if( feq(vy[0],vy[1]) ){ rgs_mark(g, g->shapes[sno].scanlist, sno, flag, type, (int)min(vx[0],vx[1]), (int)vy[0]); rgs_mark(g, g->shapes[sno].scanlist, sno, flag, type, (int)max(vx[0],vx[1]), (int)vy[0]); } else{ /* mark all horizontal segment crossings */ invslope = (vx[0] - vx[1]) / (vy[0] - vy[1]); xoffset = vx[0]; for(yval=vy[0]; yval<=vy[1]; yval++){ xval = xoffset; rgs_mark(g, g->shapes[sno].scanlist, sno, flag, type, xval, yval); xoffset = xoffset + invslope; } } } int imline(GFilt g, int rno, int sno, int flag, int type, double x, double y, double x1, double y1, double x2, double y2) { Scan scan; /* avoid -W unused parameter warning */ if( 0 ){ type = type; x1 = x1; y1 = y1; x2 = x2; y2 = y2; } if( g->evsect ){ if( g->usebinsiz ){ x = (int)((x - g->tlminx)/g->binsizx + 1.0); y = (int)((y - g->tlminy)/g->binsizy + 1.0); } else{ x = (int)((x - g->tlminx) + 1.0); y = (int)((y - g->tlminy) + 1.0); } x = (int)((x - g->xmin)/g->block + 1.0); y = (int)((y - g->ymin)/g->block + 1.0); if(y < g->y0) return 0; if(y > g->y1) return 0; if(x < g->x0) return 0; if(x > g->x1) return 0; } if( flag ){ if(y < g->shapes[sno].ystart ) return 0; if(y > g->shapes[sno].ystop ) return 0; } scan = g->shapes[sno].scanlist[(int)y]; if( (scan && ((x==(int)scan->x) || (scan->next&&((x>=(int)scan->x)&&(x<=(int)scan->next->x)))))==flag ) { if( rno && flag ) g->rid = rno; return 1; } else return 0; } void impiei(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, double angle1, double angle2) { _impiei(g, 0, rno, sno, flag, type, x, y, xcen, ycen, angle1, angle2); } int impie(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, double angle1, double angle2) { /* avoid -W unused parameter warning */ if( 0 ){ xcen = xcen; ycen = ycen; angle1 = angle1; angle2 = angle2; } return impolygon(g, rno, sno, flag, type, x, y); } void imqtpiei(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, double angle1, double angle2) { _impiei(g, 1, rno, sno, flag, type, x, y, xcen, ycen, angle1, angle2); } int imqtpie(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, double angle1, double angle2) { /* avoid -W unused parameter warning */ if( 0 ){ xcen = xcen; ycen = ycen; angle1 = angle1; angle2 = angle2; } return impolygon(g, rno, sno, flag, type, x, y); } void impointi(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen) { /* NB: do not use x and y variables, they have bogus values */ /* avoid -W unused parameter warning */ if( 0 ){ rno = rno; x = x; y = y; } /* divide by block factor to get "real" parameters */ xcen = (xcen - g->xmin)/g->block + 1.0; ycen = (ycen - g->ymin)/g->block + 1.0; /* set y limits */ g->shapes[sno].ystart = PIXNUM(ycen); g->shapes[sno].ystop = PIXNUM(ycen); g->shapes[sno].scanlist = (Scan *)calloc(g->y1+1, sizeof(Scan)); marky(g, sno, flag, type); rgs_mark(g, g->shapes[sno].scanlist, sno, flag, type, PIXNUM(xcen), PIXNUM(ycen)); } int impoint(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen) { Scan scan; /* avoid -W unused parameter warning */ if( 0 ){ type = type; xcen = xcen; ycen = ycen; } if( g->evsect ){ if( g->usebinsiz ){ x = (int)((x - g->tlminx)/g->binsizx + 1.0); y = (int)((y - g->tlminy)/g->binsizy + 1.0); } else{ x = (int)((x - g->tlminx) + 1.0); y = (int)((y - g->tlminy) + 1.0); } x = (int)((x - g->xmin)/g->block + 1.0); y = (int)((y - g->ymin)/g->block + 1.0); if(y < g->y0) return 0; if(y > g->y1) return 0; if(x < g->x0) return 0; if(x > g->x1) return 0; } if( flag ){ if(y < g->shapes[sno].ystart ) return 0; if(y > g->shapes[sno].ystop ) return 0; } scan = g->shapes[sno].scanlist[(int)y]; if( (scan && (y == (int)g->shapes[sno].ystart) && (x == (int)scan->x))==flag ) { if( rno && flag ) g->rid = rno; return 1; } else return 0; } #ifdef __STDC__ void impolygoni(GFilt g, int rno, int sno, int flag, int type, double x, double y, ...) { double *vx=NULL, *vy=NULL; int count, maxcount; va_list args; va_start(args, y); #else void impolygoni(va_alist) va_dcl { GFilt g; int rno, sno, flag, type; double x, y; double *vx=NULL, *vy=NULL; int count, maxcount; va_list args; va_start(args); g = va_arg(args, GFilt); rno = va_arg(args, int); sno = va_arg(args, int); flag = va_arg(args, int); type = va_arg(args, int); x = va_arg(args, double); y = va_arg(args, double); #endif /* NB: do not use x and y variables, they have bogus values */ /* avoid -W unused parameter warning */ if( 0 ){ x = x; } /* allocate space for x,y arguments */ maxcount = MASKINC; vx = (double *)calloc(maxcount, sizeof(double)); vy = (double *)calloc(maxcount, sizeof(double)); /* look for x,y arguments */ count = 0; while( 1 ){ if( (count + 1) >= maxcount ){ maxcount += MASKINC; vx = (double *)realloc(vx, maxcount*sizeof(double)); vy = (double *)realloc(vy, maxcount*sizeof(double)); } vx[count] = va_arg(args, double); vy[count] = va_arg(args, double); if( feq(vx[count],PSTOP) && feq(vy[count],PSTOP) ) break; vx[count] = (vx[count] - g->xmin)/g->block + 1.0; vy[count] = (vy[count] - g->ymin)/g->block + 1.0; count ++; } va_end(args); /* realloc to actual size */ vx = (double *)realloc(vx, count*sizeof(double)); vy = (double *)realloc(vy, count*sizeof(double)); /* call the common routine */ _polygoni(g, 0, rno, sno, flag, type, vx, vy, count); if( vx ) free(vx); if( vy ) free(vy); } #ifdef __STDC__ int impolygon(GFilt g, int rno, int sno, int flag, int type, double x, double y, ...) { int crossings; Scan scan; va_list args; va_start(args, y); #else int impolygon(va_alist) va_dcl { GFilt g; int rno, sno, flag, type; double x, y; int crossings; Scan scan; va_list args; va_start(args); g = va_arg(args, GFilt); rno = va_arg(args, int); sno = va_arg(args, int); flag = va_arg(args, int); type = va_arg(args, int); x = va_arg(args, double); y = va_arg(args, double); #endif va_end(args); /* avoid -W unused parameter warning */ if( 0 ){ type = type; } if( g->evsect ){ if( g->usebinsiz ){ x = (int)((x - g->tlminx)/g->binsizx + 1.0); y = (int)((y - g->tlminy)/g->binsizy + 1.0); } else{ x = (int)((x - g->tlminx) + 1.0); y = (int)((y - g->tlminy) + 1.0); } x = (int)((x - g->xmin)/g->block + 1.0); y = (int)((y - g->ymin)/g->block + 1.0); if(y < g->y0) return 0; if(y > g->y1) return 0; if(x < g->x0) return 0; if(x > g->x1) return 0; } if( flag ){ if(y < g->shapes[sno].ystart ) return 0; if(y > g->shapes[sno].ystop ) return 0; } /* no initialization of x for this row, just jump right in */ if( (y>=g->shapes[sno].ystart)&&(y<=g->shapes[sno].ystop) ){ crossings = 0; for(scan=g->shapes[sno].scanlist[(int)y]; scan; scan=scan->next){ if( x >= scan->x ) crossings++; else break; } if( (crossings%2) == flag ){ if( rno && flag ) g->rid = rno; return 1; } else{ return 0; } } else{ return !flag; } } void imnannulusi(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, double lo, double hi, int n) { int i; int xsno; double dinc; /* NB: do not use x and y variables, they have bogus values */ /* get limits */ dinc = (hi - lo)/n; xsno = (g->nshapes+1)+((sno-1)*XSNO); /* init all shapes */ imannulusi(g, 0, xsno, flag, type, x, y, xcen, ycen, lo, hi); for(i=0; inshapes+1)+((sno-1)*XSNO); /* init all shapes */ imboxi(g, 0, xsno, flag, type, x, y, xcen, ycen, hix, hiy, ang); imboxi(g, 0, xsno+1, flag, type, x, y, xcen, ycen, lox, loy, ang); for(i=0; inshapes+1)+((sno-1)*XSNO); /* init all shapes */ imellipsei(g, 0, xsno, flag, type, x, y, xcen, ycen, hix, hiy, ang); imellipsei(g, 0, xsno+1, flag, type, x, y, xcen, ycen, lox, loy, ang); for(i=0; i hi ) lo -= 360.0; dinc = (hi - lo)/n; xsno = (g->nshapes+1)+((sno-1)*XSNO); /* init all shapes */ impiei(g, 0, xsno, flag, type, x, y, xcen, ycen, lo, hi); for(i=0; i anghi ) anglo -= 360.0; ainc = (anghi - anglo)/angn; ahi = (int)angn; rinc = (radhi - radlo)/radn; rhi = (int)radn; xsno = (g->nshapes+1)+((sno-1)*XSNO); /* init pies and annuli */ imannulusi(g, 0, xsno, flag, type, x, y, xcen, ycen, radlo, radhi); imqtpiei(g, 0, xsno+1, flag, type, x, y, xcen, ycen, anglo, anghi); for(a=0; a anghi ) anglo -= 360.0; ainc = (anghi - anglo)/angn; ahi = (int)angn; xinc = (xhi - xlo)/radn; yinc = (yhi - ylo)/radn; rhi = (int)radn; xsno = (g->nshapes+1)+((sno-1)*XSNO); /* init pies and ellipses */ imboxi(g, 0, xsno, flag, type, x, y, xcen, ycen, xhi, yhi, ang); imqtpiei(g, 0, xsno+1, flag, type, x, y, xcen, ycen, anglo, anghi); imboxi(g, 0, xsno+2, flag, type, x, y, xcen, ycen, xlo, ylo, ang); for(a=0; a anghi ) anglo -= 360.0; ainc = (anghi - anglo)/angn; ahi = (int)angn; xinc = (xhi - xlo)/radn; yinc = (yhi - ylo)/radn; rhi = (int)radn; xsno = (g->nshapes+1)+((sno-1)*XSNO); /* init pies and ellipses */ imellipsei(g, 0, xsno, flag, type, x, y, xcen, ycen, xhi, yhi, ang); imqtpiei(g, 0, xsno+1, flag, type, x, y, xcen, ycen, anglo, anghi); imellipsei(g, 0, xsno+2, flag, type, x, y, xcen, ycen, xlo, ylo, ang); for(a=0; anshapes+1)+((sno-1)*XSNO); if( flag ){ /* if its not somewhere inside the entire region we lose ... */ if( !imannulus(g, 0, xsno, flag, type, x, y, xcen, ycen, lo, hi) ){ return(0); } /* look through all of them to find the right one */ for(i=0; inshapes+1)+((sno-1)*XSNO); if( flag ){ /* if its not somewhere inside the entire region we lose ... */ if( !imbox(g, 0, xsno, flag, type, x, y, xcen, ycen, hix, hiy, ang) ){ return(0); } /* if its in the inner region we lose */ if( imbox(g, 0, xsno+1, flag, type, x, y, xcen, ycen, lox, loy, ang) ){ return(0); } /* look through all of them to find the right one */ for(i=0; inshapes+1)+((sno-1)*XSNO); if( flag ){ /* if its not somewhere inside the entire region we lose ... */ if( !imellipse(g, 0, xsno, flag, type, x, y, xcen, ycen, hix, hiy, ang) ){ return(0); } /* if its in the inner region we lose */ if( imellipse(g, 0, xsno+1, flag, type, x, y, xcen, ycen, lox, loy, ang) ){ return(0); } /* look through all of them to find the right one */ for(i=0; i hi ) lo -= 360.0; dinc = (hi - lo)/n; xsno = (g->nshapes+1)+((sno-1)*XSNO); if( flag ){ /* check limits */ if( !impie(g, 0, xsno, flag, type, x, y, xcen, ycen, lo, hi) ){ return(0); } /* look through all of them to find the right one */ for(i=0; i anghi ) anglo -= 360.0; ainc = (anghi - anglo)/angn; ahi = (int)angn; rinc = (radhi - radlo)/radn; rhi = (int)radn; xsno = (g->nshapes+1)+((sno-1)*XSNO); if( flag ){ /* if its not somewhere inside the entire region we lose ... */ if( !imannulus(g, 0, xsno, flag, type, x, y, xcen, ycen, radlo, radhi) || !impie(g, 0, xsno+1, flag, type, x, y, xcen, ycen, anglo, anghi) ){ return(0); } /* look through all of them to find the right one */ for(a=1; a<=ahi; a++){ for(r=1; r<=rhi; r++){ if( imannulus(g, rno+n, sno+(2*n), flag, type, x, y, xcen, ycen, radlo+((r-1)*rinc), radlo+(r*rinc)) && impie(g, rno+n, sno+(2*n+1), flag, type, x, y, xcen, ycen, anglo+((a-1)*ainc), anglo+(a*ainc)) ){ return(1); } n++; } } return(0); } else{ /* if its not somewhere inside the entire region we win ... */ if( !imannulus(g, 0, xsno, 1, type, x, y, xcen, ycen, radlo, radhi) ) return(1); else if( !impie(g, 0, xsno+1, 1, type, x, y, xcen, ycen, anglo, anghi) ){ return(1); } else{ return(0); } } } int imbpanda(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, double anglo, double anghi, double angn, double xlo, double ylo, double xhi, double yhi, double radn, double ang) { int a, r; int ahi, rhi; int xsno; int n=0; double ainc, xinc, yinc; /* get limits */ anglo += ang; anghi += ang; while( anglo > anghi ) anglo -= 360.0; ainc = (anghi - anglo)/angn; ahi = (int)angn; xinc = (xhi - xlo)/radn; yinc = (yhi - ylo)/radn; rhi = (int)radn; xsno = (g->nshapes+1)+((sno-1)*XSNO); if( flag ){ /* if its not somewhere inside the entire region we lose ... */ if( !imbox(g, 0, xsno, flag, type, x, y, xcen, ycen, xhi, yhi, ang) ){ return(0); } /* but if its in the inner region we lose */ else if( imbox(g, 0, xsno+2, flag, type, x, y, xcen, ycen, xlo, ylo, ang) ){ return(0); } /* its in the box .. must also be in the pie */ else if( !impie(g, 0, xsno+1, flag, type, x, y, xcen, ycen, anglo, anghi)){ return(0); } /* look through all of them to find the right one */ for(a=0; a anghi ) anglo -= 360.0; ainc = (anghi - anglo)/angn; ahi = (int)angn; xinc = (xhi - xlo)/radn; yinc = (yhi - ylo)/radn; rhi = (int)radn; xsno = (g->nshapes+1)+((sno-1)*XSNO); if( flag ){ /* if its not somewhere inside the entire region we lose ... */ if( !imellipse(g, 0, xsno, flag, type, x, y, xcen, ycen, xhi, yhi, ang) ){ return(0); } /* but if its in the inner region we lose */ else if( imellipse(g, 0, xsno+2, flag, type, x, y, xcen, ycen, xlo, ylo, ang) ){ return(0); } /* its in the ellipse .. must also be in the pie */ else if( !impie(g, 0, xsno+1, flag, type, x, y, xcen, ycen, anglo, anghi)){ return(0); } /* look through all of them to find the right one */ for(a=0; anshapes+1)+((sno-1)*XSNO); if( !g->shapes[xsno].xv ){ maxpts = MASKINC; g->shapes[xsno].xv = (double *)calloc(maxpts, sizeof(double)); g->shapes[xsno].nv = 0; while( 1 ){ if( g->shapes[xsno].nv >= maxpts ){ maxpts += MASKINC; g->shapes[xsno].xv = (double *)realloc(g->shapes[xsno].xv, maxpts*sizeof(double)); } g->shapes[xsno].xv[g->shapes[xsno].nv] = va_arg(args, double); if( feq(g->shapes[xsno].xv[g->shapes[xsno].nv],PSTOP) && feq(g->shapes[xsno].xv[g->shapes[xsno].nv-1],PSTOP) ){ g->shapes[xsno].nv--; break; } g->shapes[xsno].nv++; } va_end(args); g->shapes[xsno].xv = (double *)realloc(g->shapes[xsno].xv, g->shapes[xsno].nv*sizeof(double)); } n = g->shapes[xsno].nv; xv = g->shapes[xsno].xv; /* this should be impossible ... */ if( n == 2 ){ imannulusi(g, rno, sno, flag, type, x, y, xcen, ycen, xv[0], xv[1]); return; } imannulusi(g, 0, xsno, flag, type, x, y, xcen, ycen, xv[0], xv[n-1]); for(i=0; i<(n-1); i++){ imannulusi(g, rno+i, sno+i, flag, type, x, y, xcen, ycen, xv[i], xv[i+1]); } } #ifdef __STDC__ void imvboxi(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, ...) { int i, j, n; int maxpts; int xsno; double ang; double *xv; va_list args; va_start(args, ycen); #else int imvboxi(va_alist) va_dcl { GFilt g; int rno, sno, flag, type; double x, y; double xcen, ycen; double ang; double *xv; int i, j, n; int maxpts; int xsno; va_list args; va_start(args); g = va_arg(args, GFilt); rno = va_arg(args, int); sno = va_arg(args, int); flag = va_arg(args, int); type = va_arg(args, int); x = va_arg(args, double); y = va_arg(args, double); xcen = va_arg(args, double); ycen = va_arg(args, double); #endif xsno = (g->nshapes+1)+((sno-1)*XSNO); if( !g->shapes[xsno].xv ){ maxpts = MASKINC; g->shapes[xsno].xv = (double *)calloc(maxpts, sizeof(double)); g->shapes[xsno].nv = 0; while( 1 ){ if( g->shapes[xsno].nv >= maxpts ){ maxpts += MASKINC; g->shapes[xsno].xv = (double *)realloc(g->shapes[xsno].xv, maxpts*sizeof(double)); } g->shapes[xsno].xv[g->shapes[xsno].nv] = va_arg(args, double); if( feq(g->shapes[xsno].xv[g->shapes[xsno].nv],PSTOP) && feq(g->shapes[xsno].xv[g->shapes[xsno].nv-1],PSTOP) ){ g->shapes[xsno].nv--; break; } g->shapes[xsno].nv++; } va_end(args); g->shapes[xsno].xv = (double *)realloc(g->shapes[xsno].xv, g->shapes[xsno].nv*sizeof(double)); } n = g->shapes[xsno].nv; xv = g->shapes[xsno].xv; ang = xv[--n]; /* this should be impossible ... */ if( n == 2 ){ imboxi(g, rno, sno, flag, type, x, y, xcen, ycen, xv[0], xv[1], ang); return; } imboxi(g, 0, xsno, flag, type, x, y, xcen, ycen, xv[n-2], xv[n-1], ang); imboxi(g, 0, xsno+1, flag, type, x, y, xcen, ycen, xv[0], xv[1], ang); for(i=2, j=0; inshapes+1)+((sno-1)*XSNO); if( !g->shapes[xsno].xv ){ maxpts = MASKINC; g->shapes[xsno].xv = (double *)calloc(maxpts, sizeof(double)); g->shapes[xsno].nv = 0; while( 1 ){ if( g->shapes[xsno].nv >= maxpts ){ maxpts += MASKINC; g->shapes[xsno].xv = (double *)realloc(g->shapes[xsno].xv, maxpts*sizeof(double)); } g->shapes[xsno].xv[g->shapes[xsno].nv] = va_arg(args, double); if( feq(g->shapes[xsno].xv[g->shapes[xsno].nv],PSTOP) && feq(g->shapes[xsno].xv[g->shapes[xsno].nv-1],PSTOP) ){ g->shapes[xsno].nv--; break; } g->shapes[xsno].nv++; } va_end(args); g->shapes[xsno].xv = (double *)realloc(g->shapes[xsno].xv, g->shapes[xsno].nv*sizeof(double)); } n = g->shapes[xsno].nv; xv = g->shapes[xsno].xv; ang = xv[--n]; /* this should be impossible ... */ if( n == 2 ){ imellipsei(g, rno, sno, flag, type, x, y, xcen, ycen, xv[0], xv[1], ang); return; } imellipsei(g, 0, xsno, flag, type, x, y, xcen, ycen, xv[n-2], xv[n-1], ang); imellipsei(g, 0, xsno+1, flag, type, x, y, xcen, ycen, xv[0], xv[1], ang); for(i=2, j=0; inshapes+1)+((sno-1)*XSNO); if( !g->shapes[xsno].xv ){ maxpts = MASKINC; g->shapes[xsno].xv = (double *)calloc(maxpts, sizeof(double)); g->shapes[xsno].nv = 0; while( 1 ){ if( g->shapes[xsno].nv >= maxpts ){ maxpts += MASKINC; g->shapes[xsno].xv = (double *)realloc(g->shapes[xsno].xv, maxpts*sizeof(double)); } g->shapes[xsno].xv[g->shapes[xsno].nv] = va_arg(args, double); if( feq(g->shapes[xsno].xv[g->shapes[xsno].nv],PSTOP) && feq(g->shapes[xsno].xv[g->shapes[xsno].nv-1],PSTOP) ){ g->shapes[xsno].nv--; break; } g->shapes[xsno].nv++; } va_end(args); g->shapes[xsno].xv = (double *)realloc(g->shapes[xsno].xv, g->shapes[xsno].nv*sizeof(double)); } n = g->shapes[xsno].nv; xv = g->shapes[xsno].xv; /* this should be impossible ... */ if( n == 2 ){ impiei(g, rno, sno, flag, type, x, y, xcen, ycen, xv[0], xv[1]); return; } impiei(g, 0, xsno, flag, type, x, y, xcen, ycen, xv[0], xv[n-1]); for(i=0; i<(n-1); i++){ impiei(g, rno+i, sno+i, flag, type, x, y, xcen, ycen, xv[i], xv[i+1]); } } #ifdef __STDC__ void imvpointi(GFilt g, int rno, int sno, int flag, int type, double x, double y, ...) { int i, j, n; int maxpts; int xsno; double *xv; va_list args; va_start(args, y); #else int imvpointi(va_alist) va_dcl { GFilt g; int rno, sno, flag, type; double x, y; double *xv; int i, j, n; int maxpts; int xsno; va_list args; va_start(args); g = va_arg(args, GFilt); rno = va_arg(args, int); sno = va_arg(args, int); flag = va_arg(args, int); type = va_arg(args, int); x = va_arg(args, double); y = va_arg(args, double); #endif xsno = (g->nshapes+1)+((sno-1)*XSNO); if( !g->shapes[xsno].xv ){ maxpts = MASKINC; g->shapes[xsno].xv = (double *)calloc(maxpts, sizeof(double)); g->shapes[xsno].nv = 0; while( 1 ){ if( g->shapes[xsno].nv >= maxpts ){ maxpts += MASKINC; g->shapes[xsno].xv = (double *)realloc(g->shapes[xsno].xv, maxpts*sizeof(double)); } g->shapes[xsno].xv[g->shapes[xsno].nv] = va_arg(args, double); if( feq(g->shapes[xsno].xv[g->shapes[xsno].nv],PSTOP) && feq(g->shapes[xsno].xv[g->shapes[xsno].nv-1],PSTOP) ){ g->shapes[xsno].nv--; break; } g->shapes[xsno].nv++; } va_end(args); g->shapes[xsno].xv = (double *)realloc(g->shapes[xsno].xv, g->shapes[xsno].nv*sizeof(double)); } n = g->shapes[xsno].nv; xv = g->shapes[xsno].xv; for(i=0, j=0; inshapes+1)+((sno-1)*XSNO); if( !g->shapes[xsno].xv ){ maxpts = MASKINC; g->shapes[xsno].xv = (double *)calloc(maxpts, sizeof(double)); g->shapes[xsno].nv = 0; while( 1 ){ if( g->shapes[xsno].nv >= maxpts ){ maxpts += MASKINC; g->shapes[xsno].xv = (double *)realloc(g->shapes[xsno].xv, maxpts*sizeof(double)); } g->shapes[xsno].xv[g->shapes[xsno].nv] = va_arg(args, double); if( feq(g->shapes[xsno].xv[g->shapes[xsno].nv],PSTOP) && feq(g->shapes[xsno].xv[g->shapes[xsno].nv-1],PSTOP) ){ g->shapes[xsno].nv--; break; } g->shapes[xsno].nv++; } va_end(args); g->shapes[xsno].xv = (double *)realloc(g->shapes[xsno].xv, g->shapes[xsno].nv*sizeof(double)); } n = g->shapes[xsno].nv; xv = g->shapes[xsno].xv; /* this should be impossible ... */ if( n == 2 ){ return(imannulus(g, rno, sno, flag, type, x, y, xcen, ycen, xv[0], xv[1])); } if( flag ){ /* if its not somewhere inside the entire region we lose ... */ if( !imannulus(g, 0, xsno, flag, type, x, y, xcen, ycen, xv[0], xv[n-1]) ){ return(0); } /* look through all of them to find the right one */ for(i=0; inshapes+1)+((sno-1)*XSNO); if( !g->shapes[xsno].xv ){ maxpts = MASKINC; g->shapes[xsno].xv = (double *)calloc(maxpts, sizeof(double)); g->shapes[xsno].nv = 0; while( 1 ){ if( g->shapes[xsno].nv >= maxpts ){ maxpts += MASKINC; g->shapes[xsno].xv = (double *)realloc(g->shapes[xsno].xv, maxpts*sizeof(double)); } g->shapes[xsno].xv[g->shapes[xsno].nv] = va_arg(args, double); if( feq(g->shapes[xsno].xv[g->shapes[xsno].nv],PSTOP) && feq(g->shapes[xsno].xv[g->shapes[xsno].nv-1],PSTOP) ){ g->shapes[xsno].nv--; break; } g->shapes[xsno].nv++; } va_end(args); g->shapes[xsno].xv = (double *)realloc(g->shapes[xsno].xv, g->shapes[xsno].nv*sizeof(double)); } n = g->shapes[xsno].nv; xv = g->shapes[xsno].xv; ang = xv[--n]; /* this should be impossible ... */ if( n == 2 ){ return(imbox(g, rno, sno, flag, type, x, y, xcen, ycen, xv[0], xv[1], ang)); } if( flag ){ /* if its not somewhere inside the entire region we lose ... */ if( !imbox(g, 0, xsno, flag, type, x, y, xcen, ycen, xv[n-2], xv[n-1], ang) ){ return(0); } /* if its in the inner region we lose */ if( imbox(g, 0, xsno+1, flag, type, x, y, xcen, ycen, xv[0], xv[1], ang) ){ return(0); } /* look through all of them to find the right one */ for(i=2, j=0; inshapes+1)+((sno-1)*XSNO); if( !g->shapes[xsno].xv ){ maxpts = MASKINC; g->shapes[xsno].xv = (double *)calloc(maxpts, sizeof(double)); g->shapes[xsno].nv = 0; while( 1 ){ if( g->shapes[xsno].nv >= maxpts ){ maxpts += MASKINC; g->shapes[xsno].xv = (double *)realloc(g->shapes[xsno].xv, maxpts*sizeof(double)); } g->shapes[xsno].xv[g->shapes[xsno].nv] = va_arg(args, double); if( feq(g->shapes[xsno].xv[g->shapes[xsno].nv],PSTOP) && feq(g->shapes[xsno].xv[g->shapes[xsno].nv-1],PSTOP) ){ g->shapes[xsno].nv--; break; } g->shapes[xsno].nv++; } va_end(args); g->shapes[xsno].xv = (double *)realloc(g->shapes[xsno].xv, g->shapes[xsno].nv*sizeof(double)); } n = g->shapes[xsno].nv; xv = g->shapes[xsno].xv; ang = xv[--n]; /* this should be impossible ... */ if( n == 2 ){ return(imellipse(g, rno, sno, flag, type, x, y, xcen, ycen, xv[0], xv[1], ang)); } if( flag ){ /* if its not somewhere inside the entire region we lose ... */ if( !imellipse(g, 0, xsno, flag, type, x, y, xcen, ycen, xv[n-2], xv[n-1], ang) ){ return(0); } /* if its in the inner region we lose */ if( imellipse(g, 0, xsno+1, flag, type, x, y, xcen, ycen, xv[0], xv[1], ang) ){ return(0); } /* look through all of them to find the right one */ for(i=2, j=0; inshapes+1)+((sno-1)*XSNO); if( !g->shapes[xsno].xv ){ maxpts = MASKINC; g->shapes[xsno].xv = (double *)calloc(maxpts, sizeof(double)); g->shapes[xsno].nv = 0; while( 1 ){ if( g->shapes[xsno].nv >= maxpts ){ maxpts += MASKINC; g->shapes[xsno].xv = (double *)realloc(g->shapes[xsno].xv, maxpts*sizeof(double)); } g->shapes[xsno].xv[g->shapes[xsno].nv] = va_arg(args, double); if( feq(g->shapes[xsno].xv[g->shapes[xsno].nv],PSTOP) && feq(g->shapes[xsno].xv[g->shapes[xsno].nv-1],PSTOP) ){ g->shapes[xsno].nv--; break; } g->shapes[xsno].nv++; } va_end(args); g->shapes[xsno].xv = (double *)realloc(g->shapes[xsno].xv, g->shapes[xsno].nv*sizeof(double)); } n = g->shapes[xsno].nv; xv = g->shapes[xsno].xv; /* this should be impossible ... */ if( n == 2 ){ return(impie(g, rno, sno, flag, type, x, y, xcen, ycen, xv[0], xv[1])); } if( flag ){ /* if its not somewhere inside the entire region we lose ... */ if( !impie(g, 0, xsno, flag, type, x, y, xcen, ycen, xv[0], xv[n-1]) ){ return(0); } /* look through all of them to find the right one */ for(i=0; inshapes+1)+((sno-1)*XSNO); if( !g->shapes[xsno].xv ){ maxpts = MASKINC; g->shapes[xsno].xv = (double *)calloc(maxpts, sizeof(double)); g->shapes[xsno].nv = 0; while( 1 ){ if( g->shapes[xsno].nv >= maxpts ){ maxpts += MASKINC; g->shapes[xsno].xv = (double *)realloc(g->shapes[xsno].xv, maxpts*sizeof(double)); } g->shapes[xsno].xv[g->shapes[xsno].nv] = va_arg(args, double); if( feq(g->shapes[xsno].xv[g->shapes[xsno].nv],PSTOP) && feq(g->shapes[xsno].xv[g->shapes[xsno].nv-1],PSTOP) ){ g->shapes[xsno].nv--; break; } g->shapes[xsno].nv++; } va_end(args); g->shapes[xsno].xv = (double *)realloc(g->shapes[xsno].xv, g->shapes[xsno].nv*sizeof(double)); } n = g->shapes[xsno].nv; xv = g->shapes[xsno].xv; /* look through all of them to find the right one */ for(i=0, j=0; ixmax - g->xmin + 1)/g->block)/(double)g->maskdim) + 0.5); if( mblock < 1 ){ g->masks = NULL; g->nmask = 0; } /* copy all masks and translate x,y positions as needed */ fsize = g->nmask * sizeof(FilterMaskRec) * mblock; xmasks = (FilterMask)calloc(1, fsize); for(got=0, i=0; inmask; i++){ xmasks[got].region = g->masks[i].region; xmasks[got].y = (g->masks[i].y - 1.0) * mblock + 1.0; xmasks[got].xstart = (g->masks[i].xstart - 1.0) * mblock + 1.0; xmasks[got].xstop = (g->masks[i].xstop - 1.0) * mblock + 1.0; /* replicate the segment up to the block factor */ for(j=1; jmasks ) free(g->masks); */ /* set up new mask records */ g->masks = xmasks; g->nmask = got; /* now mark each y line that has a y mask value */ for(i=0; iybuf[g->masks[i].y] ) g->ybuf[g->masks[i].y] = i+1; } } int imimagemask(GFilt g, int rno, int sno, int flag, int type, double x, double y) { int i; int ix, iy; if( g->nmask == 0 ) return(0); /* avoid -W unused parameter warning */ if( 0 ){ rno = rno; sno = sno; flag = flag; type = type; } if( g->evsect ){ if( g->usebinsiz ){ x = (int)((x - g->tlminx)/g->binsizx + 1.0); y = (int)((y - g->tlminy)/g->binsizy + 1.0); } else{ x = (int)((x - g->tlminx) + 1.0); y = (int)((y - g->tlminy) + 1.0); } x = (int)((x - g->xmin)/g->block + 1.0); y = (int)((y - g->ymin)/g->block + 1.0); if(y < g->y0) return 0; if(y > g->y1) return 0; if(x < g->x0) return 0; if(x > g->x1) return 0; } ix = (int)x; iy = (int)y; /* look for mask segment containing ix, iy */ i = g->ybuf[iy]; /* ybuf contains offset+1 of first mask record containing iy */ if( i != 0 ){ i--; for(; inmask; i++){ if( g->masks[i].y > iy ){ return(0); } if( (ix >= g->masks[i].xstart) && (ix <= g->masks[i].xstop) ){ g->rid = g->masks[i].region; return(1); } } } return(0); } funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/filter/inc.sed000077500000000000000000000002521256243640000232330ustar00rootroot00000000000000: NAME="$1" sed ' 1i\ static char *XXXX="\\n s#/\*.*\*/##g s/"/\\"/g s/\\n/\\\\n/g s/$/\\n/ $a\ \" ' | sed "s/XXXX/$NAME/" | awk '{printf("%s", $0)};END{printf(";\n")}' funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/filter/install-sh000077500000000000000000000142531256243640000237740ustar00rootroot00000000000000#!/bin/sh # # install - install a program, script, or datafile # This comes from X11R5 (mit/util/scripts/install.sh). # # Copyright 1991 by the Massachusetts Institute of Technology # # Permission to use, copy, modify, distribute, and sell this software and its # documentation for any purpose is hereby granted without fee, provided that # the above copyright notice appear in all copies and that both that # copyright notice and this permission notice appear in supporting # documentation, and that the name of M.I.T. not be used in advertising or # publicity pertaining to distribution of the software without specific, # written prior permission. M.I.T. makes no representations about the # suitability of this software for any purpose. It is provided "as is" # without express or implied warranty. # # 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}" transformbasename="" transform_arg="" instcmd="$mvprog" chmodcmd="$chmodprog 0755" chowncmd="" chgrpcmd="" stripcmd="" rmcmd="$rmprog -f" mvcmd="$mvprog" src="" dst="" dir_arg="" while [ x"$1" != x ]; do case $1 in -c) instcmd=$cpprog shift continue;; -d) dir_arg=true shift continue;; -m) chmodcmd="$chmodprog $2" shift shift continue;; -o) chowncmd="$chownprog $2" shift shift continue;; -g) chgrpcmd="$chgrpprog $2" shift shift continue;; -s) stripcmd=$stripprog shift continue;; -t=*) transformarg=`echo $1 | sed 's/-t=//'` shift continue;; -b=*) transformbasename=`echo $1 | sed 's/-b=//'` shift continue;; *) if [ x"$src" = x ] then src=$1 else # this colon is to work around a 386BSD /bin/sh bug : dst=$1 fi shift continue;; esac done if [ x"$src" = x ] then echo "$0: no input file specified" >&2 exit 1 else : fi if [ x"$dir_arg" != x ]; then dst=$src src="" if [ -d "$dst" ]; then instcmd=: chmodcmd="" else instcmd=$mkdirprog fi else # Waiting for this to be detected by the "$instcmd $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if [ -f "$src" ] || [ -d "$src" ] then : else echo "$0: $src does not exist" >&2 exit 1 fi if [ x"$dst" = x ] then echo "$0: no destination specified" >&2 exit 1 else : fi # If destination is a directory, append the input filename; if your system # does not like double slashes in filenames, you may need to add some logic if [ -d "$dst" ] then dst=$dst/`basename "$src"` else : fi fi ## this sed command emulates the dirname command dstdir=`echo "$dst" | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` # Make sure that the destination directory exists. # this part is taken from Noah Friedman's mkinstalldirs script # Skip lots of stat calls in the usual case. if [ ! -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 [ $# -ne 0 ] ; do pathcomp=$pathcomp$1 shift if [ ! -d "$pathcomp" ] ; then $mkdirprog "$pathcomp" else : fi pathcomp=$pathcomp/ done fi if [ x"$dir_arg" != x ] then $doit $instcmd "$dst" && if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dst"; else : ; fi && if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dst"; else : ; fi && if [ x"$stripcmd" != x ]; then $doit $stripcmd "$dst"; else : ; fi && if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dst"; else : ; fi else # If we're going to rename the final executable, determine the name now. if [ x"$transformarg" = x ] then dstfile=`basename "$dst"` else dstfile=`basename "$dst" $transformbasename | sed $transformarg`$transformbasename fi # don't allow the sed command to completely eliminate the filename if [ x"$dstfile" = x ] then dstfile=`basename "$dst"` else : fi # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/#inst.$$# rmtmp=$dstdir/#rm.$$# # Trap to clean up temp files at exit. trap 'status=$?; rm -f "$dsttmp" "$rmtmp" && exit $status' 0 trap '(exit $?); exit' 1 2 13 15 # Move or copy the file name to the temp name $doit $instcmd "$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 $instcmd $src $dsttmp" command. if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dsttmp"; else :;fi && if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dsttmp"; else :;fi && if [ x"$stripcmd" != x ]; then $doit $stripcmd "$dsttmp"; else :;fi && if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dsttmp"; else :;fi && # 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 [ -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 && # The final little trick to "correctly" pass the exit status to the exit trap. { (exit 0); exit } funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/filter/lex.filt.c000066400000000000000000012630711256243640000236660ustar00rootroot00000000000000#define yy_create_buffer filt_create_buffer #define yy_delete_buffer filt_delete_buffer #define yy_scan_buffer filt_scan_buffer #define yy_scan_string filt_scan_string #define yy_scan_bytes filt_scan_bytes #define yy_flex_debug filt_flex_debug #define yy_init_buffer filt_init_buffer #define yy_flush_buffer filt_flush_buffer #define yy_load_buffer_state filt_load_buffer_state #define yy_switch_to_buffer filt_switch_to_buffer #define yyin filtin #define yyleng filtleng #define yylex filtlex #define yyout filtout #define yyrestart filtrestart #define yytext filttext #define yywrap filtwrap /* A lexical scanner generated by flex*/ /* Scanner skeleton version: * $Header: /home/daffy/u0/vern/flex/RCS/flex.skl,v 2.91 96/09/10 16:58:48 vern Exp $ */ #define FLEX_SCANNER #define YY_FLEX_MAJOR_VERSION 2 #define YY_FLEX_MINOR_VERSION 5 #include #include /* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */ #ifdef c_plusplus #ifndef __cplusplus #define __cplusplus #endif #endif #ifdef __cplusplus #include /* Use prototypes in function declarations. */ #define YY_USE_PROTOS /* The "const" storage-class-modifier is valid. */ #define YY_USE_CONST #else /* ! __cplusplus */ #if __STDC__ #define YY_USE_PROTOS #define YY_USE_CONST #endif /* __STDC__ */ #endif /* ! __cplusplus */ #ifdef __TURBOC__ #pragma warn -rch #pragma warn -use #include #include #define YY_USE_CONST #define YY_USE_PROTOS #endif #ifdef YY_USE_CONST #define yyconst const #else #define yyconst #endif #ifdef YY_USE_PROTOS #define YY_PROTO(proto) proto #else #define YY_PROTO(proto) () #endif /* Returned upon end-of-file. */ #define YY_NULL 0 /* Promotes a possibly negative, possibly signed char to an unsigned * integer for use as an array index. If the signed char is negative, * we want to instead treat it as an 8-bit unsigned char, hence the * double cast. */ #define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) /* Enter a start condition. This macro really ought to take a parameter, * but we do it the disgusting crufty way forced on us by the ()-less * definition of BEGIN. */ #define BEGIN yy_start = 1 + 2 * /* Translate the current start state into a value that can be later handed * to BEGIN to return to the state. The YYSTATE alias is for lex * compatibility. */ #define YY_START ((yy_start - 1) / 2) #define YYSTATE YY_START /* Action number for EOF rule of a given start state. */ #define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) /* Special action meaning "start processing a new file". */ #define YY_NEW_FILE yyrestart( yyin ) #define YY_END_OF_BUFFER_CHAR 0 /* Size of default input buffer. */ #define YY_BUF_SIZE 16384 typedef struct yy_buffer_state *YY_BUFFER_STATE; extern int yyleng; extern FILE *yyin, *yyout; #define EOB_ACT_CONTINUE_SCAN 0 #define EOB_ACT_END_OF_FILE 1 #define EOB_ACT_LAST_MATCH 2 /* The funky do-while in the following #define is used to turn the definition * int a single C statement (which needs a semi-colon terminator). This * avoids problems with code like: * * if ( condition_holds ) * yyless( 5 ); * else * do_something_else(); * * Prior to using the do-while the compiler would get upset at the * "else" because it interpreted the "if" statement as being all * done when it reached the ';' after the yyless() call. */ /* Return all but the first 'n' matched characters back to the input stream. */ #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ *yy_cp = yy_hold_char; \ YY_RESTORE_YY_MORE_OFFSET \ yy_c_buf_p = yy_cp = yy_bp + n - YY_MORE_ADJ; \ YY_DO_BEFORE_ACTION; /* set up yytext again */ \ } \ while ( 0 ) #define unput(c) yyunput( c, filttext_ptr ) /* Some routines like yy_flex_realloc() are emitted as static but are not called by all lexers. This generates warnings in some compilers, notably GCC. Arrange to suppress these. */ #ifdef __GNUC__ #define YY_MAY_BE_UNUSED __attribute__((unused)) #else #define YY_MAY_BE_UNUSED #endif /* The following is because we cannot portably get our hands on size_t * (without autoconf's help, which isn't available because we want * flex-generated scanners to compile on their own). */ typedef unsigned int yy_size_t; struct yy_buffer_state { FILE *yy_input_file; char *yy_ch_buf; /* input buffer */ char *yy_buf_pos; /* current position in input buffer */ /* Size of input buffer in bytes, not including room for EOB * characters. */ yy_size_t yy_buf_size; /* Number of characters read into yy_ch_buf, not including EOB * characters. */ int yy_n_chars; /* Whether we "own" the buffer - i.e., we know we created it, * and can realloc() it to grow it, and should free() it to * delete it. */ int yy_is_our_buffer; /* Whether this is an "interactive" input source; if so, and * if we're using stdio for input, then we want to use getc() * instead of fread(), to make sure we stop fetching input after * each newline. */ int yy_is_interactive; /* Whether we're considered to be at the beginning of a line. * If so, '^' rules will be active on the next match, otherwise * not. */ int yy_at_bol; /* Whether to try to fill the input buffer when we reach the * end of it. */ int yy_fill_buffer; int yy_buffer_status; #define YY_BUFFER_NEW 0 #define YY_BUFFER_NORMAL 1 /* When an EOF's been seen but there's still some text to process * then we mark the buffer as YY_EOF_PENDING, to indicate that we * shouldn't try reading from the input source any more. We might * still have a bunch of tokens to match, though, because of * possible backing-up. * * When we actually see the EOF, we change the status to "new" * (via yyrestart()), so that the user can continue scanning by * just pointing yyin at a new input file. */ #define YY_BUFFER_EOF_PENDING 2 }; static YY_BUFFER_STATE yy_current_buffer = 0; /* We provide macros for accessing buffer states in case in the * future we want to put the buffer states in a more general * "scanner state". */ #define YY_CURRENT_BUFFER yy_current_buffer /* yy_hold_char holds the character lost when yytext is formed. */ static char yy_hold_char; static int yy_n_chars; /* number of characters read into yy_ch_buf */ int yyleng; /* Points to current character in buffer. */ static char *yy_c_buf_p = (char *) 0; static int yy_init = 1; /* whether we need to initialize */ static int yy_start = 0; /* start state number */ /* Flag which is used to allow yywrap()'s to do buffer switches * instead of setting up a fresh yyin. A bit of a hack ... */ static int yy_did_buffer_switch_on_eof; void yyrestart YY_PROTO(( FILE *input_file )); void yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer )); void yy_load_buffer_state YY_PROTO(( void )); YY_BUFFER_STATE yy_create_buffer YY_PROTO(( FILE *file, int size )); void yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b )); void yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file )); void yy_flush_buffer YY_PROTO(( YY_BUFFER_STATE b )); #define YY_FLUSH_BUFFER yy_flush_buffer( yy_current_buffer ) YY_BUFFER_STATE yy_scan_buffer YY_PROTO(( char *base, yy_size_t size )); YY_BUFFER_STATE yy_scan_string YY_PROTO(( yyconst char *yy_str )); YY_BUFFER_STATE yy_scan_bytes YY_PROTO(( yyconst char *bytes, int len )); static void *yy_flex_alloc YY_PROTO(( yy_size_t )); static void *yy_flex_realloc YY_PROTO(( void *, yy_size_t )) YY_MAY_BE_UNUSED; static void yy_flex_free YY_PROTO(( void * )); #define yy_new_buffer yy_create_buffer #define yy_set_interactive(is_interactive) \ { \ if ( ! yy_current_buffer ) \ yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \ yy_current_buffer->yy_is_interactive = is_interactive; \ } #define yy_set_bol(at_bol) \ { \ if ( ! yy_current_buffer ) \ yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \ yy_current_buffer->yy_at_bol = at_bol; \ } #define YY_AT_BOL() (yy_current_buffer->yy_at_bol) #define YY_USES_REJECT typedef unsigned char YY_CHAR; FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; typedef int yy_state_type; extern char yytext[]; static yy_state_type yy_get_previous_state YY_PROTO(( void )); static yy_state_type yy_try_NUL_trans YY_PROTO(( yy_state_type current_state )); static int yy_get_next_buffer YY_PROTO(( void )); static void yy_fatal_error YY_PROTO(( yyconst char msg[] )); /* Done after the current pattern has been matched and before the * corresponding action - sets up yytext. */ #define YY_DO_BEFORE_ACTION \ filttext_ptr = yy_bp; \ yyleng = (int) (yy_cp - yy_bp); \ yy_hold_char = *yy_cp; \ *yy_cp = '\0'; \ if ( yyleng >= YYLMAX ) \ YY_FATAL_ERROR( "token too large, exceeds YYLMAX" ); \ yy_flex_strncpy( yytext, filttext_ptr, yyleng + 1 ); \ yy_c_buf_p = yy_cp; #define YY_NUM_RULES 68 #define YY_END_OF_BUFFER 69 static yyconst short int yy_acclist[1847] = { 0, 60, 60, 60, 60, 60, 60, 60, 60, 69, 67, 68, 60, 67, 68, 66, 68, 67, 68, 67, 68, 6, 67, 68, 63, 67, 68, 63, 67, 68, 67, 68, 64, 67, 68, 65, 67, 68, 63, 67, 68, 66, 67, 68, 67, 68, 62, 67, 68, 62, 67, 68, 63, 67, 68, 63, 67, 68, 63, 67, 68, 58, 67, 68, 67, 68, 59, 67, 68,16425,16426, 59, 67, 68,16425,16426, 59, 67, 68,16425,16426, 59, 67, 68,16425,16426, 59, 67, 68,16425,16426, 59, 67, 68,16425,16426, 59, 67, 68,16425,16426, 59, 67, 68,16425,16426, 59, 67, 68,16425,16426, 59, 67, 68,16425,16426, 59, 67, 68,16425,16426, 59, 67, 68,16425,16426, 59, 67, 68,16425,16426, 59, 67, 68,16425,16426, 59, 67, 68,16425,16426, 59, 67, 68,16425,16426, 63, 67, 68, 53, 66, 68,16433,16434, 67, 68, 52, 63, 67, 68, 52, 63, 67, 68, 51, 65, 67, 68, 52, 63, 67, 68, 48, 66, 67, 68,16433,16434, 67, 68, 46, 62, 67, 68, 46, 62, 67, 68, 67, 68, 53, 66, 67, 68,16433,16434, 52, 63, 67, 68, 47, 52, 63, 67, 68, 52, 63, 67, 68, 67, 68, 52, 63, 67, 68, 56, 64, 67, 68, 57, 65, 67, 68, 55, 66, 67, 68, 60, 67, 68, 40, 66, 68, 67, 68, 39, 63, 67, 68, 39, 63, 67, 68, 36, 64, 67, 68, 38, 65, 67, 68, 39, 63, 67, 68, 34, 66, 67, 68, 67, 68, 23, 62, 67, 68,16416, 23, 62, 67, 68,16416, 40, 66, 67, 68, 39, 63, 67, 68, 39, 63, 67, 68, 39, 63, 67, 68, 33, 58, 67, 68, 67, 68, 59, 67, 68,16425,16426, 59, 67, 68, 16425,16426, 59, 67, 68,16425,16426, 59, 67, 68, 16425,16426, 59, 67, 68,16425,16426, 59, 67, 68, 16425,16426, 59, 67, 68,16425,16426, 59, 67, 68, 16425,16426, 59, 67, 68,16425,16426, 59, 67, 68, 16425,16426, 59, 67, 68,16425,16426, 59, 67, 68, 16425,16426, 59, 67, 68,16425,16426, 59, 67, 68, 16425,16426, 59, 67, 68,16425,16426, 59, 67, 68, 16425,16426, 59, 67, 68,16425,16426, 67, 68, 39, 63, 67, 68, 68, 17, 68, 18, 68, 16, 68, 19, 68, 15, 68, 9, 68, 7, 68, 9, 68, 60, 63, 61, 62, 62, 62, 62, 62, 58, 66, 16425,16426, 54, 59,16425,16426, 59,16425,16426, 59, 16425,16426, 59,16425,16426, 59,16425,16426, 59,16425, 16426, 59,16425,16426, 59,16425,16426, 59,16425,16426, 59,16425,16426, 59,16425,16426, 59,16425,16426, 59, 16425,16426, 59,16425,16426, 59,16425,16426, 59,16425, 16426, 59,16425,16426, 59,16425,16426, 59,16425,16426, 59,16425,16426, 59,16425,16426, 59,16425,16426, 59, 16425,16426, 59,16425,16426, 59,16425,16426, 59,16425, 16426, 59,16425,16426, 59,16425,16426, 59,16425,16426, 59,16425,16426, 59,16425,16426,16433,16434, 8242, 8242, 8242, 8242, 8242, 8242, 8242, 8242, 8242, 8242, 52, 63, 46, 62, 46, 62, 46, 62, 46, 62, 45, 46, 62, 44, 44, 53, 66,16433,16434, 60, 39, 63, 23, 62,16416, 23, 62,16416, 23, 62,16416, 30, 8224, 8224, 29, 23, 62,16416, 8224, 8224, 8224, 27, 24, 23, 62,16416, 25, 28, 8224, 33, 58, 40, 66, 33, 33, 59,16425,16426, 33, 33, 33, 33, 33, 59,16425,16426,16425,16426, 33, 59,16425,16426, 59,16425,16426, 59,16425,16426, 59,16425,16426, 59, 16425,16426, 59,16425,16426, 59,16425,16426, 59,16425, 16426, 59,16425,16426, 59,16425,16426, 59,16425,16426, 59,16425,16426, 59,16425,16426, 59,16425,16426, 59, 16425,16426, 59,16425,16426, 59,16425,16426, 59,16425, 16426, 59,16425,16426, 59,16425,16426, 59,16425,16426, 59,16425,16426, 59,16425,16426, 59,16425,16426, 59, 16425,16426, 59,16425,16426, 59,16425,16426, 59,16425, 16426, 59,16425,16426, 59,16425,16426, 15, 8, 62, 62, 62, 58, 8234, 8234, 8233, 59,16425,16426, 59, 16425,16426, 59,16425,16426, 59,16425,16426, 59,16425, 16426, 59,16425,16426, 59,16425,16426, 59,16425,16426, 59,16425,16426, 59,16425,16426, 59,16425,16426, 59, 16425,16426, 59,16425,16426, 59,16425,16426, 2, 59, 16425,16426, 59,16425,16426, 59,16425,16426, 59,16425, 16426, 59,16425,16426, 59,16425,16426, 59,16425,16426, 59,16425,16426, 59,16425,16426, 59,16425,16426, 59, 16425,16426, 59,16425,16426, 59,16425,16426, 59,16425, 16426, 59,16425,16426, 59,16425,16426, 59,16425,16426, 8242, 8241, 8242, 8242, 8242, 8242, 8241, 8242, 8242, 8242, 8242, 8242, 8242, 8242, 8242, 8242, 8242, 8242, 8242, 8242, 8242, 8242, 8242, 43, 43, 46, 62, 46, 62, 46, 62, 44, 44, 44, 44, 27, 23, 62,16416, 23, 62,16416, 23, 62,16416, 33, 58, 59,16425,16426, 31, 8234, 31, 8234, 59,16425,16426, 59,16425,16426, 59,16425,16426, 59,16425,16426, 59,16425,16426, 59, 16425,16426, 59,16425,16426, 59,16425,16426, 59,16425, 16426, 59,16425,16426, 59,16425,16426, 59,16425,16426, 59,16425,16426, 2, 59,16425,16426, 59,16425,16426, 59,16425,16426, 59,16425,16426, 59,16425,16426, 59, 16425,16426, 59,16425,16426, 59,16425,16426, 59,16425, 16426, 59,16425,16426, 59,16425,16426, 59,16425,16426, 59,16425,16426, 59,16425,16426, 59,16425,16426, 59, 16425,16426, 59,16425,16426, 35, 15, 62, 62, 8234, 8234, 8234, 8234, 8234, 8234, 8233, 8233,16425,16426, 54, 59,16425,16426,16405,16406,16425,16426, 54,16405,16406, 59,16425,16426, 59,16425,16426, 59,16425,16426, 59, 16425,16426, 59,16425,16426, 59,16425,16426, 59,16425, 16426, 59,16425,16426, 59,16425,16426, 59,16425,16426, 59,16425,16426, 2, 59,16425,16426, 59,16425,16426, 59,16425,16426, 59,16425,16426, 59,16425,16426, 59, 16425,16426, 59,16425,16426, 59,16425,16426, 59,16425, 16426, 59,16425,16426, 59,16425,16426, 59,16425,16426, 59,16425,16426, 4, 59,16425,16426, 59,16425,16426, 8242, 8242, 8241, 8242, 8241, 8241, 8242, 8242, 8242, 8242, 8242, 8242, 8242, 8242, 8242, 8242, 8242, 8242, 8242, 8242, 8242, 46, 62, 43, 43, 43, 43, 46, 62, 44, 44, 44, 37, 23, 62,16416, 23, 27, 62,16416, 23, 62,16416,16425,16426, 33, 33, 54, 33, 33, 33, 33, 31, 8234, 31, 8234, 31, 31, 8234, 31, 8234, 59,16425,16426, 59,16425,16426, 59,16425,16426, 59,16425,16426, 59,16425,16426, 59,16425,16426, 59, 16425,16426, 59,16425,16426, 59,16425,16426, 59,16425, 16426, 59,16425,16426, 59,16425,16426, 59,16425,16426, 59,16425,16426, 59,16425,16426, 59,16425,16426, 59, 16425,16426, 59,16425,16426, 59,16425,16426, 59,16425, 16426, 59,16425,16426, 59,16425,16426, 59,16425,16426, 59,16425,16426, 59,16425,16426, 4, 59,16425,16426, 59,16425,16426,16405,16406,16405,16406, 1, 8234, 8234, 8234, 8234, 8234, 8234, 8234, 8233, 8233, 8234, 8234, 8233, 59,16425,16426, 8213, 8213, 8214,16405,16406, 59,16425, 16426, 59,16425,16426, 59,16425,16426, 59,16425,16426, 59,16425,16426, 59,16425,16426, 59,16425,16426, 59, 16425,16426, 59,16425,16426, 20, 59,16425,16426, 59, 16425,16426, 59,16425,16426, 59,16425,16426, 59,16425, 16426, 59,16425,16426, 59,16425,16426, 59,16425,16426, 16425,16426, 54, 59,16425,16426, 8242, 8242, 8242, 8242, 8242, 8242, 8242, 8242, 8242, 8242, 8242, 8242, 8242, 8241, 8242, 8242, 8242, 8242, 8242, 8242, 8242, 8242, 8242, 8242, 8242, 43, 43, 43, 44, 44, 26, 26, 26, 26, 26, 26, 8224, 23, 62,16416, 23, 62,16416, 8234, 8234, 8233, 31, 8234, 31, 8234, 31, 8234, 59,16425, 16426, 59,16425,16426, 59,16425,16426, 59,16425,16426, 59,16425,16426, 59,16425,16426, 59,16425,16426, 59, 16425,16426, 59,16425,16426, 59,16425,16426, 20, 59, 16425,16426, 59,16425,16426, 59,16425,16426, 59,16425, 16426, 59,16425,16426, 59,16425,16426, 59,16425,16426, 59,16425,16426, 59,16425,16426, 20, 8234, 8234, 8234, 8234, 8234, 8233, 8234, 8234, 8234, 8234, 8234, 8234, 8233, 8233, 59,16425,16426, 8213, 8213, 8213, 8213, 8214, 59, 16425,16426, 59,16425,16426, 59,16425,16426, 59,16425, 16426, 59,16425,16426, 20,16405,16406,16425,16426, 20, 54,16405,16406, 59,16425,16426, 3, 59,16425,16426, 59,16425,16426, 59,16425,16426, 59,16425,16426,16425, 16426, 54,16425,16426, 10, 54, 59,16425,16426, 8242, 8242, 8242, 8242, 8242, 8242, 8242, 43, 43, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 23, 62,16416, 8234, 8234, 8234, 8234, 8234, 8234, 8233, 8233, 31, 8234, 31, 8234, 59,16425,16426, 59,16425,16426, 59,16425,16426, 59, 16425,16426, 59,16425,16426, 59,16425,16426, 59,16425, 16426, 3, 59,16425,16426, 59,16425,16426, 59,16425, 16426, 59,16425,16426, 59,16425,16426, 20,16405,16406, 20,16405,16406, 8234, 8234, 8234, 8234, 8234, 8234, 8234, 8234, 8234, 8233, 59,16425,16426, 8213, 8213, 8213, 8214, 5, 59,16425,16426, 59,16425,16426, 59,16425,16426, 20,16405,16406, 59,16425,16426, 59,16425,16426, 59, 16425,16426,16425,16426, 12, 54, 8234, 8234, 8233, 10, 16425,16426, 54, 8242, 8242, 8242, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 8234, 8234, 8234, 8234, 8234, 8234, 8234, 8233, 59,16425,16426, 5, 59, 16425,16426, 59,16425,16426, 59,16425,16426, 59,16425, 16426, 59,16425,16426, 59,16425,16426, 8234, 8234, 8234, 8234, 8234, 59,16425,16426, 8213, 8213, 59,16425,16426, 8234, 8234, 8233, 12, 8234, 8234, 8234, 8234, 8234, 8234, 8233, 8233,16425,16426, 11, 54, 26, 26, 26, 26, 26, 26, 26, 26, 26, 8234, 8234, 8234, 8234, 8234, 59,16425,16426, 59,16425,16426, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 8234, 8234, 59,16425,16426, 8234, 8234, 8234, 8234, 8234, 8234, 8233, 8233, 8234, 8234, 8234, 8234, 8234, 8234, 8234, 8233, 10, 8233, 8234, 8234, 8233, 11, 26, 8234, 8234, 59, 16425,16426, 59,16425,16426, 8234, 8234, 8234, 8234, 8234, 8234, 8234, 8233, 12, 8233, 8234, 8234, 8234, 8234, 8234, 10, 8233, 10, 8234, 8234, 8234, 8234, 8234, 8234, 8233, 8233, 26, 59,16425,16426, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,16425,16426, 54, 8234, 8234, 8234, 8234, 8234, 12, 8233, 12, 8234, 8234, 10, 8234, 8234, 8234, 8234, 8234, 8234, 8234, 8233, 11, 8233,16425,16426, 13, 54, 8234, 8234, 12, 8234, 8234, 8234, 8234, 8234, 11, 8233, 11, 8234, 8234, 8233, 13, 8234, 8234, 11, 8234, 8234, 8234, 8234, 8234, 8234, 8233, 8233, 8234, 8234, 8234, 8234, 8234, 8234, 8234, 8233, 13, 8233, 8234, 8234, 8234, 8234, 8234, 13, 8233, 13, 8234, 8234, 13 } ; static yyconst short int yy_accept[1689] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 9, 9, 9, 9, 9, 10, 12, 15, 17, 19, 21, 24, 27, 30, 32, 35, 38, 41, 44, 46, 49, 52, 55, 58, 61, 64, 66, 71, 76, 81, 86, 91, 96, 101, 106, 111, 116, 121, 126, 131, 136, 141, 146, 149, 154, 156, 160, 164, 168, 172, 178, 180, 184, 188, 190, 196, 200, 205, 209, 211, 215, 219, 223, 227, 230, 233, 235, 239, 243, 247, 251, 255, 259, 261, 266, 271, 275, 279, 283, 287, 291, 293, 298, 303, 308, 313, 318, 323, 328, 333, 338, 343, 348, 353, 358, 363, 368, 373, 378, 380, 384, 385, 387, 389, 391, 393, 395, 397, 399, 401, 402, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 405, 406, 406, 406, 406, 406, 406, 407, 408, 408, 408, 409, 409, 410, 410, 411, 413, 414, 417, 417, 417, 420, 423, 426, 429, 432, 435, 438, 441, 444, 447, 450, 453, 456, 459, 462, 465, 468, 471, 474, 477, 480, 483, 486, 489, 492, 495, 498, 501, 504, 507, 509, 509, 509, 509, 509, 509, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 521, 521, 523, 525, 527, 527, 529, 530, 530, 530, 532, 532, 532, 532, 532, 533, 534, 538, 539, 539, 541, 541, 541, 541, 544, 547, 550, 550, 550, 551, 552, 553, 554, 557, 557, 558, 559, 560, 560, 561, 561, 561, 562, 565, 566, 567, 567, 568, 570, 570, 572, 572, 573, 574, 577, 578, 579, 580, 580, 581, 585, 587, 588, 591, 594, 597, 600, 603, 606, 609, 612, 615, 618, 621, 624, 627, 630, 633, 636, 639, 642, 645, 648, 651, 654, 657, 660, 663, 666, 669, 672, 675, 678, 678, 678, 678, 679, 679, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 681, 681, 682, 683, 683, 684, 684, 684, 684, 684, 685, 686, 686, 687, 687, 690, 693, 696, 699, 702, 705, 708, 711, 714, 717, 720, 723, 726, 729, 733, 736, 739, 742, 745, 748, 751, 754, 757, 760, 763, 766, 769, 772, 775, 778, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 782, 784, 784, 784, 785, 786, 787, 787, 787, 787, 787, 789, 790, 790, 791, 791, 792, 793, 794, 795, 796, 797, 798, 799, 800, 801, 802, 803, 804, 804, 804, 804, 804, 805, 806, 808, 808, 810, 812, 813, 814, 815, 815, 815, 816, 816, 816, 816, 816, 817, 817, 817, 817, 817, 817, 817, 820, 820, 820, 820, 820, 820, 823, 823, 823, 823, 823, 826, 826, 828, 828, 831, 831, 831, 831, 831, 833, 835, 838, 841, 844, 847, 850, 853, 856, 859, 862, 865, 868, 871, 874, 878, 881, 884, 887, 890, 893, 896, 899, 902, 905, 908, 911, 914, 917, 920, 923, 926, 926, 926, 927, 927, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 929, 930, 931, 932, 933, 933, 933, 934, 934, 934, 934, 935, 936, 937, 938, 938, 940, 941, 941, 944, 948, 951, 954, 957, 960, 963, 966, 969, 972, 975, 978, 981, 984, 985, 988, 991, 994, 997, 1000, 1003, 1006, 1009, 1012, 1015, 1018, 1021, 1024, 1028, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1032, 1032, 1032, 1032, 1032, 1032, 1033, 1033, 1035, 1036, 1037, 1037, 1037, 1037, 1037, 1037, 1038, 1038, 1039, 1040, 1041, 1042, 1043, 1044, 1045, 1046, 1047, 1048, 1049, 1050, 1051, 1052, 1052, 1054, 1055, 1056, 1057, 1057, 1057, 1058, 1058, 1060, 1060, 1061, 1061, 1062, 1063, 1063, 1063, 1064, 1064, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1071, 1074, 1076, 1076, 1077, 1078, 1079, 1080, 1081, 1082, 1083, 1085, 1087, 1088, 1090, 1090, 1090, 1092, 1092, 1095, 1098, 1101, 1104, 1107, 1110, 1113, 1116, 1119, 1122, 1125, 1128, 1131, 1134, 1137, 1140, 1143, 1146, 1149, 1152, 1155, 1158, 1161, 1164, 1167, 1171, 1174, 1174, 1176, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1180, 1180, 1181, 1182, 1183, 1184, 1185, 1185, 1185, 1186, 1186, 1187, 1187, 1187, 1188, 1188, 1188, 1188, 1188, 1189, 1190, 1190, 1191, 1194, 1194, 1194, 1195, 1196, 1197, 1199, 1202, 1205, 1208, 1211, 1214, 1217, 1220, 1223, 1226, 1230, 1233, 1236, 1239, 1242, 1245, 1248, 1251, 1253, 1254, 1257, 1258, 1259, 1260, 1261, 1262, 1263, 1264, 1265, 1266, 1267, 1268, 1269, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1271, 1271, 1272, 1273, 1274, 1275, 1276, 1277, 1278, 1279, 1280, 1281, 1282, 1282, 1283, 1283, 1284, 1285, 1285, 1286, 1287, 1287, 1287, 1287, 1287, 1288, 1289, 1289, 1289, 1289, 1289, 1290, 1291, 1291, 1291, 1291, 1291, 1292, 1293, 1293, 1293, 1294, 1297, 1300, 1300, 1300, 1300, 1300, 1300, 1301, 1302, 1302, 1303, 1303, 1305, 1305, 1307, 1309, 1312, 1315, 1318, 1321, 1324, 1327, 1330, 1333, 1336, 1339, 1343, 1346, 1349, 1352, 1355, 1358, 1361, 1364, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1369, 1370, 1370, 1371, 1371, 1372, 1373, 1373, 1374, 1375, 1376, 1377, 1377, 1377, 1378, 1378, 1378, 1378, 1379, 1380, 1381, 1382, 1385, 1386, 1387, 1388, 1388, 1388, 1389, 1389, 1390, 1390, 1393, 1396, 1399, 1402, 1405, 1410, 1414, 1417, 1421, 1424, 1427, 1430, 1432, 1433, 1433, 1435, 1436, 1437, 1437, 1437, 1437, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1441, 1442, 1443, 1444, 1445, 1446, 1447, 1447, 1448, 1449, 1449, 1450, 1451, 1452, 1453, 1453, 1453, 1454, 1455, 1455, 1455, 1456, 1457, 1458, 1459, 1459, 1459, 1460, 1460, 1460, 1461, 1462, 1463, 1464, 1464, 1464, 1465, 1466, 1466, 1466, 1466, 1466, 1469, 1470, 1471, 1472, 1472, 1472, 1473, 1473, 1473, 1473, 1474, 1475, 1476, 1477, 1477, 1479, 1481, 1484, 1487, 1490, 1493, 1496, 1499, 1502, 1506, 1509, 1512, 1515, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1521, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1525, 1526, 1526, 1527, 1527, 1528, 1529, 1530, 1531, 1532, 1532, 1532, 1533, 1533, 1534, 1537, 1537, 1538, 1538, 1539, 1540, 1540, 1541, 1545, 1548, 1551, 1554, 1557, 1560, 1563, 1563, 1565, 1566, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1568, 1569, 1569, 1570, 1571, 1573, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1575, 1576, 1577, 1577, 1578, 1578, 1579, 1580, 1580, 1581, 1581, 1582, 1583, 1583, 1584, 1584, 1585, 1586, 1586, 1586, 1587, 1588, 1588, 1589, 1589, 1590, 1591, 1592, 1593, 1594, 1594, 1594, 1595, 1595, 1596, 1599, 1603, 1606, 1609, 1612, 1615, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1619, 1620, 1620, 1621, 1621, 1622, 1623, 1626, 1626, 1627, 1628, 1631, 1631, 1631, 1631, 1631, 1632, 1633, 1633, 1634, 1635, 1636, 1637, 1638, 1638, 1638, 1639, 1639, 1639, 1639, 1640, 1641, 1642, 1643, 1643, 1643, 1645, 1646, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1648, 1649, 1649, 1650, 1651, 1651, 1652, 1653, 1654, 1655, 1656, 1656, 1656, 1657, 1658, 1658, 1659, 1659, 1660, 1661, 1664, 1667, 1668, 1669, 1670, 1671, 1672, 1673, 1674, 1675, 1676, 1677, 1678, 1679, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1681, 1682, 1685, 1686, 1687, 1688, 1688, 1688, 1689, 1689, 1689, 1689, 1690, 1691, 1692, 1693, 1693, 1693, 1694, 1694, 1695, 1696, 1697, 1698, 1699, 1699, 1699, 1700, 1700, 1701, 1701, 1701, 1702, 1702, 1703, 1703, 1703, 1703, 1703, 1704, 1705, 1705, 1706, 1707, 1708, 1708, 1709, 1710, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1716, 1716, 1717, 1717, 1718, 1719, 1720, 1721, 1722, 1722, 1722, 1723, 1723, 1724, 1724, 1724, 1725, 1725, 1726, 1726, 1727, 1728, 1728, 1729, 1729, 1730, 1731, 1731, 1732, 1732, 1733, 1734, 1735, 1736, 1737, 1737, 1737, 1738, 1738, 1738, 1738, 1739, 1740, 1741, 1742, 1742, 1743, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1747, 1748, 1749, 1750, 1751, 1752, 1753, 1754, 1755, 1756, 1757, 1758, 1759, 1760, 1761, 1762, 1763, 1764, 1765, 1766, 1767, 1768, 1769, 1770, 1771, 1772, 1772, 1772, 1772, 1772, 1772, 1774, 1775, 1775, 1776, 1777, 1777, 1778, 1778, 1779, 1780, 1780, 1781, 1781, 1782, 1783, 1783, 1784, 1785, 1786, 1786, 1787, 1787, 1788, 1789, 1790, 1791, 1792, 1792, 1792, 1793, 1793, 1794, 1794, 1794, 1795, 1795, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1798, 1799, 1800, 1800, 1800, 1800, 1800, 1801, 1802, 1803, 1803, 1804, 1805, 1805, 1806, 1806, 1807, 1808, 1808, 1809, 1809, 1810, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1812, 1813, 1813, 1814, 1815, 1815, 1816, 1817, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1819, 1820, 1821, 1821, 1821, 1822, 1822, 1822, 1822, 1823, 1824, 1825, 1826, 1826, 1826, 1826, 1826, 1827, 1827, 1828, 1829, 1830, 1831, 1832, 1832, 1832, 1833, 1833, 1834, 1834, 1834, 1835, 1835, 1836, 1836, 1836, 1836, 1837, 1838, 1838, 1839, 1839, 1840, 1841, 1841, 1842, 1842, 1843, 1844, 1844, 1844, 1844, 1845, 1846, 1847, 1847, 1847 } ; static yyconst int yy_ec[256] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 4, 5, 6, 1, 7, 8, 9, 10, 11, 7, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 20, 20, 20, 23, 24, 25, 26, 27, 28, 1, 29, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 56, 30, 31, 32, 7, 33, 1, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 56, 59, 60, 61, 62, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ; static yyconst int yy_meta[63] = { 0, 1, 2, 3, 4, 1, 1, 4, 4, 1, 5, 6, 7, 8, 9, 10, 11, 12, 12, 12, 12, 12, 12, 12, 13, 1, 4, 14, 4, 1, 15, 1, 1, 16, 17, 17, 17, 17, 18, 17, 16, 16, 16, 16, 16, 19, 20, 16, 16, 16, 16, 16, 21, 16, 16, 16, 16, 22, 16, 1, 4, 23, 24 } ; static yyconst short int yy_base[1846] = { 0, 0, 0, 60, 0, 79, 83, 122, 0, 184, 0, 237, 0, 66, 67, 7752,14226, 7745,14226, 68, 7741, 14226,14226, 7737, 7735, 215,14226, 281,14226, 288, 322, 64, 39, 7716, 73, 7712, 7693, 319, 323, 345, 354, 378, 385, 356, 380, 399, 409, 421, 430, 431, 440, 463, 472, 7552, 509, 541,14226, 7603,14226, 577, 0, 584, 606, 278, 662, 0, 82, 7579, 83, 7558, 7544, 595,14226,14226, 253,14226, 621,14226, 7593, 0, 259, 594,14226, 669, 691, 316,14226, 88, 7567, 231, 7559, 7540, 752, 813, 406, 449, 276, 430, 441, 331, 216, 391, 461, 371, 742, 315, 345, 536, 468, 780, 7526, 14226,14226,14226,14226,14226, 7543,14226,14226, 7523, 7564, 14226, 7518, 217, 63, 204, 7520, 7514, 470, 7501, 7547, 14226, 7532, 341, 479, 487, 605, 456, 606, 632, 691, 752, 7504, 0, 7496, 627, 7474, 7489, 7488, 788, 813, 310, 835,14226, 0, 7495, 7491,14226, 583,14226, 714, 874, 7473, 836, 720, 860, 872, 898, 903, 904, 908, 909, 910, 914, 941, 725, 943, 947, 956, 970, 979, 985, 980, 989, 1001, 1012, 1016, 1022, 1027, 1038, 1045, 1054, 1061, 0, 1051, 1101, 1110, 1087, 1159, 317, 7465, 7464, 359, 492, 355, 539, 226, 414, 873, 390,14226, 1117, 7450, 411, 699, 618, 826, 1220, 516, 1188, 641, 0, 0, 1208, 1227, 1236, 611, 0, 457, 1265,14226, 579, 1277, 1243, 7439, 637, 1297, 1036, 7446,14226,14226, 7455,14226, 7423, 1139, 510, 7433, 543, 555, 1140, 1333, 1181,14226, 1358,14226,14226, 0, 7399, 7428, 7425,14226, 7419,14226, 7435, 1419, 626, 1480, 718, 7409, 7377, 1506, 899, 1567, 7387, 7381, 7395, 7355, 7374, 7354, 7345, 7355, 7331, 7334, 7331, 7341, 7331, 736, 7323, 7314, 7310, 7320, 7318, 7286, 7284, 7260, 7275, 74, 7263, 7261, 7243, 7226, 7229, 7229, 1309, 704, 1358, 7234, 7230,14226, 7145, 7131, 7153, 7135, 7151, 7107, 7117, 7112, 7094, 7093, 7096, 689, 7084, 0, 609, 7098, 831, 783, 774, 948, 1004, 975, 933, 7075, 7060, 7062, 7042, 7038, 1394, 768, 1370, 1419, 7018, 7026, 7023, 7025, 1162, 1433, 1440, 1576, 810, 1622, 7014, 7009, 1186, 1466, 1513, 1515, 1331, 1517, 1519, 1395, 1529, 1590, 1605, 1621, 1599, 1628, 1548, 1647, 1652, 1550, 1658, 1659, 1665, 1670, 1681, 1691, 1692, 1702, 1704, 1713, 1714, 1725, 1726, 6990, 770, 829, 694, 6978, 6975, 1032, 6954, 1765, 1452, 1814, 912, 1875, 1936, 1997, 6971,14226, 6987, 985, 6954, 842, 6962, 852, 905, 1466, 1022, 0, 6928, 6957, 6954, 6819, 6814, 937, 267, 747, 308, 761, 417, 847, 786, 978, 1032, 918, 1120, 930, 1752, 2058, 1774, 1843, 2067, 941, 1319, 1887, 1949, 1145, 1265, 1904, 1959, 1075, 1971,14226, 0, 1997, 1467, 2010,14226, 2022, 1610, 1745, 2029, 2123, 6788, 2177, 1836, 2044, 2238, 6782, 2074, 2096, 1855, 2109, 2294, 6781, 2350, 6802, 6800, 6799, 2411, 2472, 2495, 2133, 2116, 2518, 1060, 2574, 2635, 1552, 6762, 1137, 666, 1758, 1145, 2000, 1707, 999, 1170, 613, 2162, 2156, 1845, 2147, 2157, 2161, 1040, 1089, 2190, 1221, 1215, 2210, 1161, 2196, 2215, 2211, 2220, 6754, 0,14226, 6782, 6781, 2221, 1210, 1561, 1392, 1603, 1422, 1796, 1608, 1807, 1528, 1809, 1668, 1654, 1203, 6779, 1336, 1707, 1277, 1899, 1814, 1838, 1898, 1700, 1871, 6764, 6768, 6749, 6747, 2259, 2268,14226, 2209, 2281, 2303, 1094, 2315,14226, 0, 2327, 2385, 2683, 1235, 6769, 6767, 6750, 2414, 6742, 2740, 2418, 2801, 2827, 2420, 2432, 2442, 2453, 2451, 2520, 2498, 2519, 2521, 2542, 2581, 1962, 2585, 2583, 2595, 2597, 2596, 2630, 2642, 2646, 2648, 2644, 2681, 2683, 2705, 2804, 2825, 6725, 6713, 6726, 6704, 6720, 6708, 6716, 6516, 6505, 6489, 6480, 1356, 6465, 2872, 2933, 6504, 6470, 1448, 2839, 2994, 0, 6446, 2901,14226, 6495, 6438, 2556, 2846, 2884, 3055, 6463, 6443, 6438, 6437, 818, 6438, 1479, 1242, 1523, 1341, 1718, 990, 1366, 1511, 1828, 667, 1574, 2945, 2955, 2679, 2965, 2994, 1488, 3016,14226, 0, 1340, 3028, 1648, 3084, 3091, 6391, 6367, 0,14226, 3101, 3121, 1800, 3182, 1915, 0, 2172, 3204, 2205, 0, 2246, 3226, 2307, 0, 3248, 3309, 2906, 1678, 6395, 1244, 6393, 1904, 3371, 1749, 1639, 3432, 3157, 6414, 3169, 1867, 3284, 6411, 0, 3488, 3549, 1901, 1768, 6366, 1538, 1958, 1398, 1295, 1324, 1963, 2061, 1976, 1900, 1614, 1990, 2430, 1992, 1778, 2054, 1874, 2063, 2065, 1574, 2261, 6349, 2008, 1053, 3610, 2160, 6346, 6352, 6266, 6273, 6260, 6270, 6263, 6265, 6245, 6257, 6258, 925, 1930, 6256, 3637, 2222, 2352, 2513,14226, 2387, 3155, 2796, 6248, 6246, 6232, 2236, 6234, 3345, 2051, 3133, 3192, 6235, 3216, 3309, 3418, 2103, 3445,14226, 0, 6232, 6224, 6223, 6220, 3699, 2295, 3461, 3321, 3747, 1500, 3804, 3866, 3058, 3488, 3502, 3914, 1949, 6213, 2373, 3537, 2997, 3542, 3544, 3556, 3568, 3583, 3928, 3761, 3587, 3937, 3938, 3943, 3952, 3959, 3974, 3770, 3771, 2665, 3975, 6186,14226, 6184, 6194, 6174, 6177, 6170, 6166, 6166, 6165, 6152, 6139, 6154, 3514, 4025, 3582, 3994, 4086, 4001, 4141,14226, 2669, 1709, 2074, 1809, 2146, 2130, 2172, 2206, 2143, 1014, 1128, 2428, 4042, 2105, 4027, 4049, 6141, 4056, 4115,14226, 2013, 4200, 4150, 4122, 4222, 4278, 2924, 4329, 4159, 4166, 4351, 4407, 3041, 4458, 4175, 4186, 4480, 4536, 3234, 4587, 4208, 4627, 6128, 4689, 0, 2466, 4231, 4285, 4737, 2210, 4794, 4856, 4264, 2486, 4292, 4316, 2388, 4917, 4978, 1376, 2256, 535, 2154, 2254, 2307, 2276, 2360, 2823, 2326, 2055, 2342, 1754, 1636, 1834, 2828, 2400, 6122, 6116, 6126, 6120, 6122, 6102, 6117, 6102, 2354, 5039, 5989, 2261, 5089, 2590, 2547, 2679, 2901, 2979, 2552, 5984, 2710, 3941, 3972, 5968, 4337, 4358,14226, 4393, 2418, 4414, 4421, 5964, 5975, 5973, 5137, 4488, 4544, 2705, 5183, 5970, 5199, 4598, 4744, 5224, 2374, 5281, 5343, 3998, 3277, 4445, 4522, 2439, 4573,14226, 0, 5966, 5939, 4028, 4444, 4520, 4570, 4089, 5404, 5430, 4924, 4245, 4459, 4928, 4930, 4263, 4126, 2628, 4392,14226, 4231, 5457, 2994, 4233, 4391, 5910, 5917, 5907, 5914, 5901, 5911, 5902, 5899, 5879, 5882, 5882, 4766, 5518, 5579, 1437, 2472, 2695, 2525, 2447, 2531, 2497, 4950, 4978,14226, 5854, 5640, 487, 2540, 2873, 2713, 4995, 2627,14226, 0, 2934, 5696, 3093, 2664, 3094, 2721, 5007, 2876, 0, 3196, 5752, 3257, 2894, 3318, 2787, 5038, 2937,14226, 0, 3467, 4490, 5808, 5830, 5878, 5047, 5145, 2853, 5924, 5882, 5940, 5532, 5167, 5965, 2775, 6022, 6084, 5190, 5253, 5911, 6145, 6206, 5842, 2760, 2459, 2189, 2939, 5839, 2537, 2953, 3000, 3571, 5830, 5842, 5831, 6267, 4914, 5830, 3031, 3085, 2945, 5831, 5828, 3507, 5813, 3292, 3485, 6317, 3221, 4522, 4071, 4352, 6378, 6400, 5802, 4657, 4488, 5405, 4546, 3155, 5206, 5231,14226, 6412, 3426, 5539, 5579, 6428, 6459, 5595, 5602, 3428, 6505, 5813, 6521, 6560, 5230, 5631, 3081, 5647, 5654, 5798, 5809, 5808, 5151, 5677, 5407, 0, 5693, 5679, 5700, 3537, 5563,14226, 4654, 6622, 5167, 5008, 6684, 3159, 6744, 6773, 6802, 3125, 6859, 6921, 3557, 5730, 5408, 5779, 5790, 5783, 5784, 5756, 5771, 5751, 3187, 3199, 2608, 5764, 3939, 5794, 5866, 4275, 5907, 4985, 5830, 5947, 4340, 5994, 5029, 5842, 6146, 4404, 6982, 6159, 7004, 3243, 7050, 3454, 5885, 5972, 7066, 7097, 6171, 6206, 3456, 7143, 5766, 7159, 7198, 7259, 7320, 5744, 5756, 5727, 5715, 5683, 5665, 5644, 5665, 5645, 5659, 5646, 5656, 5645, 5635, 5609, 5609, 2425, 5597, 4004, 7381, 4485, 7430, 3605, 5736, 5766, 5594, 5410, 5601, 5733, 5606, 6228, 6255, 5603, 7469, 3758, 6272, 6420, 5584, 5729, 6364, 6386,14226, 5678, 0, 3582, 7499, 7528, 7557, 3440, 7614, 7676, 4086, 5575, 7736, 7772, 5017, 7808, 4207, 7837, 7874, 7903, 7920, 7963, 8020, 0, 5545, 4649, 6482,14226, 5719, 8082, 5906, 5909, 5540, 5551, 5538, 6436, 6766, 3782, 6512, 6991, 3940, 6528, 7013, 3944, 5549, 6160, 6213, 0, 7058, 7074, 5510, 8133, 3769, 7104, 7126, 5486, 5477, 5408, 5401,14226, 5407, 5393, 5381, 5238, 5231, 5221, 5192, 5159, 5133, 5025, 5020, 0, 4257, 1868, 3745, 4355, 4593, 3249, 3313, 5596, 2877, 0, 4766, 2379, 4313, 4537, 4626, 3757, 3918, 5652, 2991, 2870, 4963, 6799, 4988, 6746, 6239, 7151, 7259, 4949, 5971, 4943, 8163, 8199, 6236, 8235, 5051, 8264, 8301, 8330, 8347, 8390, 8447, 0, 6283, 8507, 6469, 8536, 8565, 4894, 8582, 8637, 8673, 6825, 8709, 6232, 8724, 0, 6458, 6748, 4792, 7269, 6823, 0, 3624, 8761, 8790, 8819, 3952, 8876, 8938, 6468, 7014, 7285, 7320, 4749, 4672, 4625, 4596, 4581, 4566, 4535, 4533, 4448, 4357, 4311, 4284, 4254, 2562, 2972, 2910, 3410, 3130, 872, 3201, 2603, 3023, 3495, 3026, 4287, 3946, 4049, 3231, 3320, 3555, 3467, 2682, 3511, 3135, 4063, 4083, 3961, 4595, 3949, 3483, 5527, 7126, 5789, 7342, 7282, 4079, 5735, 8998, 7342, 9027, 9056, 4052, 9073, 9128, 9164, 7346, 9200, 6778, 9215, 0, 7015, 7326, 4051, 7367, 7371, 9252, 9281, 6805, 9310, 7404, 9339, 9368, 3989, 7408, 3931, 7420, 7424, 7468, 3768, 9397, 9433, 7479, 9469, 7026, 9498, 9535, 9564, 9581, 9624, 9681, 0, 7481, 7107, 4145, 3675, 3633, 3570, 3414, 3349, 3315, 3264, 4003, 3245, 4293, 3583, 4351, 4124, 4352, 3316, 4054, 3746, 4551, 2785, 4415, 4121, 3198, 4745, 4118, 4888, 4416, 4890, 4168, 4290, 4179, 4914, 4721, 4452, 3152, 3037, 3013, 2977, 4189, 7530, 7363, 9741, 9770, 7107, 9799, 7566, 9828, 9857, 2882, 7504, 2865, 7738, 7512, 7568, 9886, 9915, 7265, 7578, 9944, 7747, 9973,10002, 2838, 10019,10074,10110, 7781,10146, 7267,10161, 0, 7777, 7811, 2808, 7820, 7877, 2718, 2643, 2623, 4484, 4289, 4489, 4418, 4741, 4491, 4541, 4236, 4335, 4582, 4645, 4891, 4649, 4896, 4952, 4742, 5012, 5139, 4257, 4570, 5031, 5048, 2498, 2290, 2185, 2113, 7942, 7422, 7375, 7944,14226, 7565,10200, 7757, 7746,10260,10289, 7445, 7885,10318,10347, 7582,10376, 7945, 10405,10434, 2038, 7963, 1990, 8143, 7984, 7987, 4492, 4419, 5141, 5140, 3084, 5159, 2548, 4739, 5229, 5226, 5233, 4368, 5245, 4456, 1935, 1767, 1685, 1552, 8167, 7813, 0, 5436, 10463,10492,10521, 4988,10578,10640, 7748,10700,10729, 7793, 8175, 4910, 5489, 5040, 5491, 5536, 5535, 1466, 1225, 1285, 1273,10758,10794, 8208,10830, 7887,10859,10896,10925,10942, 10985,11042, 0, 8210, 1154, 4980,11102, 8245,11131,11160, 1024,11177,11232,11268, 8247,11304, 7926,11319, 0, 8243, 8304, 962, 8312, 8368, 789, 586,11356,11385, 7928,11414, 8355,11443,11472, 404, 8371, 390, 8391, 8411, 8414, 3527, 295,11501,11530, 7971, 8510, 5522,14226,11561,11585,11609, 11618,11632,11655,11671,11694,11707,11724, 5734,11748,11771, 11793,11809,11822,11845, 5776,11862,11873,11884, 5789,11888, 11912,11935,11959,11972,11984,12008,12017,12032,12056,12069, 12088,12106,12117,12141,12164, 5857,12180,12204,12217,12241, 12264,12274, 6183,12285,12307,12318,12329,12341,12365,12388, 12409, 6484,12433,12452,12476,12493,12508, 6493,12519,12532, 12556,12580,12603,12626, 6503,12648,12672,12685,12700, 6740, 12711, 6840, 6973, 7036, 7172,12730, 7297,12753,12766,12784, 12808,12827,12840,12850, 7308,12861,12885,12909,12933,12956, 12969,12993,13006,13019,13027,13049,13068,13087,13107,13130, 13148,13172,13189,13213,13226,13245,13269,13292,13307, 7369, 13318,13342,13365,13387,13400,13423, 7392,13443, 7460,13463, 7491,13484,13507,13531,13555,13574,13597,13619,13643,13667, 13690,13703,13722,13746,13759,13782,13802,13822,13843,13866, 13890,13914,13937,13961, 7546,13985,14009,14033,14057,14081, 14105,14129,14153,14177,14201 } ; static yyconst short int yy_def[1846] = { 0, 1687, 1, 1, 3, 1, 1, 1687, 7, 1687, 9, 9, 11, 1688, 1688, 1687, 1687, 1687, 1687, 1687, 1689, 1687, 1687, 1687, 1690, 1691, 1687, 1687, 1687, 1687, 1687, 30, 1687, 1687, 1687, 1692, 1687, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1687, 1687, 1687, 1687, 1687, 1687, 27, 54, 1687, 1687, 62, 1687, 54, 1687, 1687, 1687, 1687, 1687, 1691, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 71, 1687, 27, 1687, 1687, 1687, 84, 1687, 1687, 1687, 1687, 1694, 1687, 1695, 1695, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1696, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1689, 1687, 1690, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1687, 30, 31, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1698, 1692, 1699, 1687, 1687, 1687, 1693, 1700, 1701, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 54, 1687, 54, 1687, 1687, 1687, 198, 1702, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1687, 1687, 62, 62, 1704, 1687, 1704, 1687, 1687, 1687, 1687, 1705, 64, 1687, 1687, 1687, 225, 54, 1687, 1687, 1687, 1687, 1687, 1687, 84, 84, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 236, 1706, 1687, 1687, 1687, 1687, 1707, 1687, 1708, 1687, 1687, 1687, 1687, 1709, 1687, 1710, 1711, 1687, 1687, 1687, 1687, 1712, 1687, 1700, 1687, 1713, 1687, 1712, 1687, 266, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 1687, 1714, 1687, 1715, 1716, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1717, 1718, 1719, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1720, 1721, 1721, 266, 266, 1687, 1687, 1687, 348, 1722, 1723, 1724, 1724, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 394, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 397, 1687, 1687, 1687, 1687, 1687, 398, 1726, 1687, 1727, 1728, 1729, 1730, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1687, 1687, 1687, 1687, 1687, 433, 1687, 1687, 1687, 1731, 1732, 1687, 1687, 1687, 1687, 1687, 1733, 1687, 1734, 1687, 1687, 1687, 1735, 1736, 1687, 1687, 454, 1687, 1735, 1687, 1687, 459, 1687, 456, 1737, 1687, 1687, 465, 1687, 1738, 1738, 1739, 1739, 1740, 1740, 1687, 1687, 1687, 476, 1741, 1741, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 1687, 1742, 1687, 1743, 1743, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1744, 1745, 1745, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1747, 1687, 1687, 1687, 1687, 1687, 1748, 1687, 1687, 1687, 553, 1749, 1750, 1751, 1752, 1752, 1687, 1753, 1754, 1754, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1687, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 605, 1687, 1687, 1687, 1755, 1687, 1687, 1687, 1687, 1687, 610, 1687, 617, 1687, 1756, 1756, 1757, 1757, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1687, 1687, 1759, 1687, 1687, 1687, 1687, 1687, 1760, 1687, 1687, 1687, 1687, 1687, 1761, 1687, 1762, 1687, 1687, 1687, 1687, 1687, 1687, 1763, 1687, 1687, 1687, 1764, 1687, 1687, 1687, 1765, 1687, 1687, 1766, 1766, 1766, 1766, 1766, 1766, 1687, 1766, 1766, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1767, 1768, 1768, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 1769, 1754, 717, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1770, 1771, 1687, 1772, 1772, 1772, 1687, 1772, 1772, 1772, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1773, 1774, 1687, 1687, 1687, 1687, 1687, 1775, 1776, 1777, 1778, 1778, 1687, 762, 1779, 1779, 1779, 766, 1687, 1687, 1780, 1687, 1687, 1687, 773, 1781, 717, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1782, 1782, 1780, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 811, 1687, 1687, 811, 1687, 811, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1687, 1687, 1687, 1687, 1784, 1687, 1687, 1687, 1785, 1687, 1687, 1687, 1687, 1687, 1786, 1687, 1687, 1687, 1687, 1687, 1787, 1687, 1687, 1687, 1687, 1687, 1788, 1687, 1687, 1687, 859, 1687, 861, 861, 1789, 1789, 1789, 866, 1687, 1687, 1687, 1687, 1687, 1687, 1790, 1791, 1791, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1792, 1792, 1687, 1793, 1793, 1793, 1793, 1793, 1687, 1687, 1687, 1794, 1794, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1795, 1796, 1796, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 937, 1687, 1687, 1798, 1799, 1687, 1687, 1687, 1687, 1687, 1800, 1801, 1802, 1798, 1798, 1798, 1798, 1798, 1803, 1803, 1798, 1798, 1798, 1798, 1798, 1804, 1804, 1794, 1794, 1687, 1794, 1687, 1794, 1794, 1798, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1687, 1687, 1687, 1687, 1687, 1806, 1687, 1806, 1687, 1687, 1687, 1687, 1807, 1687, 1687, 1808, 1687, 1808, 1687, 1687, 1687, 1809, 1687, 1687, 1810, 1687, 1810, 1687, 1687, 1687, 1687, 1811, 1687, 1687, 1687, 1687, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1039, 1687, 1687, 1687, 1687, 1687, 1813, 1813, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1814, 1815, 1687, 1816, 1816, 1816, 1816, 1817, 1817, 1687, 1818, 1818, 1819, 1819, 1687, 1687, 1687, 1687, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1687, 1821, 1687, 1687, 1687, 1687, 1822, 1823, 1823, 1821, 1821, 1821, 1079, 1821, 1821, 1821, 1818, 1818, 1687, 1818, 1687, 1818, 1818, 1687, 1124, 1819, 1819, 1819, 1128, 1687, 1687, 1819, 1824, 1824, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1825, 1825, 1825, 1687, 1687, 1687, 1687, 1826, 1687, 1687, 1687, 1687, 1827, 1687, 1687, 1687, 1687, 1828, 1687, 1687, 1687, 1162, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1687, 1830, 1830, 1178, 1178, 1178, 1178, 1178, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1831, 1831, 1832, 1832, 1833, 1833, 1833, 1687, 1818, 1818, 1824, 1824, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1100, 1821, 1687, 1687, 1687, 1821, 1121, 1121, 1818, 1818, 1818, 1226, 1687, 1687, 1818, 1128, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1128, 1128, 1687, 1131, 1834, 1824, 1824, 1687, 1824, 1687, 1824, 1824, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1162, 1687, 1687, 1835, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1175, 1178, 1178, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1198, 1198, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1200, 1200, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1687, 1833, 1833, 1687, 1824, 1824, 1820, 1820, 1820, 1821, 1226, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1226, 1226, 1687, 1229, 1836, 1819, 1819, 1819, 1819, 1237, 1128, 1819, 1819, 1819, 1819, 1819, 1237, 1242, 1837, 1834, 1838, 1834, 1834, 1249, 1249, 1824, 1824, 1824, 1357, 1687, 1687, 1824, 1835, 1829, 1829, 1829, 1178, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1687, 1687, 1833, 1833, 1833, 1833, 1687, 1821, 1818, 1818, 1818, 1818, 1327, 1226, 1818, 1818, 1818, 1818, 1818, 1327, 1332, 1839, 1836, 1838, 1836, 1836, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1346, 1837, 1840, 1837, 1837, 1834, 1357, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1357, 1357, 1687, 1360, 1841, 1687, 1178, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1687, 1687, 1687, 1687, 1687, 1842, 1842, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1423, 1839, 1840, 1839, 1839, 1836, 1819, 1819, 1819, 1837, 1824, 1824, 1824, 1824, 1449, 1357, 1824, 1824, 1824, 1824, 1824, 1449, 1454, 1843, 1841, 1838, 1841, 1841, 1687, 1687, 1687, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1687, 1687, 1687, 1687, 1842, 1842, 1842, 1842, 1687, 1842, 1687, 1842, 1842, 1818, 1818, 1818, 1839, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1527, 1843, 1840, 1843, 1843, 1841, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1687, 1687, 1687, 1687, 1842, 1842, 1569, 1569, 1842, 1842, 1842, 1613, 1687, 1687, 1842, 1824, 1824, 1824, 1843, 1831, 1831, 1831, 1832, 1832, 1832, 1687, 1687, 1687, 1613, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1613, 1613, 1687, 1616, 1844, 1687, 1687, 1842, 1842, 1842, 1842, 1637, 1613, 1842, 1842, 1842, 1842, 1842, 1637, 1642, 1845, 1844, 1838, 1844, 1844, 1687, 1687, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1658, 1845, 1840, 1845, 1845, 1844, 1687, 1687, 1842, 1842, 1842, 1845, 1687, 0, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687 } ; static yyconst short int yy_nxt[14289] = { 0, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 27, 29, 22, 30, 31, 31, 31, 31, 31, 31, 16, 28, 32, 33, 34, 35, 16, 36, 16, 37, 38, 39, 40, 41, 42, 43, 44, 37, 45, 46, 37, 47, 37, 37, 37, 48, 49, 50, 37, 51, 37, 52, 37, 37, 37, 16, 53, 16, 22, 54, 55, 121, 121, 56, 57, 118, 118, 58, 59, 60, 59, 61, 56, 62, 63, 63, 63, 63, 63, 63, 64, 65, 66, 67, 68, 71, 72, 69, 73, 71, 72, 121, 73, 119, 119, 1687, 121, 121, 122, 123, 124, 312, 125, 126, 210, 210, 210, 210, 313, 127, 230, 230, 500, 128, 129, 501, 70, 1687, 56, 16, 74, 75, 76, 20, 21, 77, 78, 24, 79, 80, 81, 82, 81, 83, 77, 84, 85, 85, 85, 85, 85, 85, 16, 86, 87, 88, 89, 90, 16, 91, 16, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 100, 103, 100, 100, 100, 104, 105, 106, 100, 107, 100, 108, 100, 100, 100, 109, 110, 16, 77, 111, 111, 111, 111, 111, 111, 111, 111, 111, 112, 113, 111, 114, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 115, 111, 111, 111, 111, 111, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 111, 111, 111, 111, 111, 111, 314, 111, 134, 135, 315, 136, 228, 415, 137, 230, 230, 138, 231, 264, 264, 111, 310, 311, 139, 423, 140, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 141, 415, 142, 143, 143, 143, 143, 143, 143, 149, 149, 149, 149, 149, 149, 149, 229, 1687, 281, 122, 123, 124, 232, 125, 144, 158, 264, 264, 626, 158, 127, 338, 338, 159, 145, 129, 146, 159, 147, 1687, 148, 150, 415, 143, 143, 143, 143, 143, 143, 143, 161, 158, 1686, 162, 161, 1687, 1687, 162, 322, 159, 158, 151, 158, 628, 152, 264, 264, 165, 159, 287, 159, 153, 298, 163, 164, 324, 161, 1687, 1687, 162, 288, 264, 264, 154, 158, 161, 158, 161, 162, 415, 162, 158, 159, 415, 159, 264, 264, 166, 167, 159, 168, 419, 175, 299, 176, 158, 169, 170, 420, 161, 416, 161, 162, 159, 162, 158, 161, 292, 177, 162, 171, 264, 264, 159, 415, 172, 927, 158, 275, 178, 161, 289, 181, 162, 173, 159, 158, 158, 174, 179, 161, 290, 264, 162, 159, 159, 158, 428, 415, 180, 1687, 415, 161, 1684, 159, 162, 264, 264, 276, 277, 424, 161, 161, 228, 162, 162, 630, 182, 183, 158, 282, 161, 1687, 322, 162, 184, 185, 159, 158, 283, 264, 264, 186, 284, 291, 187, 159, 285, 188, 286, 324, 264, 264, 1000, 161, 278, 322, 162, 189, 264, 264, 279, 280, 161, 322, 190, 162, 328, 318, 191, 302, 264, 264, 324, 192, 193, 319, 194, 264, 264, 229, 324, 320, 195, 325, 196, 415, 196, 197, 1145, 198, 199, 199, 199, 199, 199, 199, 435, 435, 326, 240, 240, 200, 1005, 417, 418, 201, 202, 203, 204, 201, 205, 206, 201, 201, 201, 201, 201, 207, 201, 201, 201, 208, 209, 201, 201, 201, 201, 201, 201, 201, 201, 210, 415, 240, 240, 456, 456, 300, 122, 123, 124, 301, 125, 126, 231, 264, 264, 421, 158, 127, 1048, 422, 264, 128, 129, 211, 159, 212, 213, 213, 213, 213, 213, 213, 214, 214, 214, 214, 214, 214, 214, 215, 233, 161, 234, 235, 235, 235, 235, 235, 235, 322, 322, 215, 216, 322, 213, 213, 213, 213, 213, 213, 213, 217, 134, 135, 1681, 136, 324, 324, 137, 232, 324, 138, 218, 217, 215, 219, 322, 1687, 139, 230, 140, 327, 220, 262, 262, 329, 122, 123, 124, 700, 125, 126, 318, 324, 221, 222, 217, 127, 264, 1687, 319, 128, 129, 1687, 330, 223, 320, 223, 224, 333, 225, 226, 226, 226, 226, 226, 226, 236, 236, 236, 236, 236, 236, 236, 237, 1687, 238, 239, 415, 240, 241, 242, 215, 693, 240, 322, 240, 243, 240, 235, 235, 235, 235, 235, 235, 235, 244, 158, 245, 246, 247, 264, 324, 158, 217, 159, 828, 248, 158, 249, 250, 159, 523, 251, 252, 524, 159, 253, 429, 331, 596, 254, 161, 255, 597, 162, 262, 262, 161, 256, 508, 162, 257, 161, 240, 158, 162, 261, 491, 491, 262, 263, 509, 159, 366, 262, 510, 262, 355, 262, 149, 149, 149, 149, 149, 149, 149, 293, 415, 265, 266, 267, 627, 268, 294, 295, 338, 338, 322, 264, 264, 296, 415, 303, 297, 303, 629, 322, 304, 305, 305, 305, 305, 305, 305, 324, 149, 149, 149, 149, 149, 149, 149, 269, 324, 270, 271, 415, 261, 592, 593, 262, 263, 531, 159, 632, 262, 337, 262, 215, 262, 149, 149, 149, 149, 149, 149, 149, 530, 158, 265, 272, 267, 1680, 268, 322, 1687, 159, 339, 415, 339, 217, 152, 340, 340, 340, 340, 340, 340, 340, 273, 274, 324, 158, 161, 219, 529, 162, 1687, 400, 400, 159, 594, 819, 269, 158, 270, 344, 415, 595, 400, 400, 631, 159, 356, 345, 354, 346, 161, 346, 347, 162, 348, 349, 349, 349, 349, 349, 349, 350, 161, 158, 271, 162, 415, 905, 158, 158, 425, 159, 159, 158, 158, 158, 159, 159, 426, 158, 1471, 159, 159, 159, 427, 617, 617, 159, 161, 472, 902, 162, 357, 161, 161, 358, 162, 162, 161, 161, 161, 162, 162, 162, 161, 361, 158, 162, 158, 322, 1687, 415, 158, 360, 159, 903, 159, 359, 363, 626, 159, 158, 364, 415, 322, 362, 324, 367, 367, 159, 415, 161, 1687, 161, 162, 158, 162, 161, 365, 1687, 162, 324, 637, 159, 158, 158, 161, 625, 535, 162, 158, 322, 159, 159, 158, 368, 615, 761, 159, 402, 161, 1687, 159, 162, 532, 372, 158, 369, 324, 161, 161, 415, 162, 162, 159, 161, 371, 158, 162, 161, 322, 158, 162, 415, 370, 159, 534, 158, 633, 159, 373, 161, 158, 401, 162, 159, 402, 324, 825, 374, 159, 237, 161, 158, 698, 162, 161, 415, 616, 162, 158, 159, 161, 357, 533, 162, 264, 161, 159, 158, 162, 376, 375, 244, 377, 415, 158, 159, 161, 600, 626, 162, 1669, 378, 159, 161, 451, 601, 162, 379, 251, 705, 634, 602, 161, 411, 380, 162, 384, 385, 386, 161, 387, 388, 162, 649, 649, 264, 1687, 389, 383, 894, 382, 390, 391, 381, 1687, 397, 397, 397, 397, 397, 397, 397, 747, 747, 392, 510, 392, 393, 1687, 394, 395, 395, 395, 395, 395, 395, 197, 706, 396, 199, 199, 199, 199, 199, 199, 214, 214, 214, 214, 214, 214, 214, 452, 457, 264, 384, 385, 386, 215, 387, 388, 415, 453, 458, 453, 458, 389, 454, 459, 415, 390, 391, 398, 635, 399, 1687, 636, 400, 401, 993, 217, 402, 400, 1687, 400, 403, 400, 199, 199, 199, 199, 199, 199, 199, 463, 692, 404, 405, 406, 558, 1687, 647, 264, 695, 464, 407, 464, 559, 408, 465, 264, 436, 1665, 436, 711, 409, 437, 437, 437, 437, 437, 437, 437, 717, 560, 730, 264, 410, 699, 353, 411, 718, 400, 430, 224, 264, 439, 226, 226, 226, 226, 226, 226, 431, 732, 431, 432, 737, 433, 434, 434, 434, 434, 434, 434, 440, 440, 440, 440, 440, 440, 440, 441, 674, 226, 226, 226, 226, 226, 226, 226, 236, 236, 236, 236, 236, 236, 236, 1645, 708, 264, 1687, 442, 415, 709, 443, 264, 471, 303, 821, 303, 441, 444, 304, 305, 305, 305, 305, 305, 305, 446, 322, 446, 1687, 445, 447, 448, 448, 448, 448, 448, 448, 238, 239, 443, 240, 241, 242, 324, 1565, 240, 444, 240, 735, 240, 236, 236, 236, 236, 236, 236, 236, 215, 445, 245, 246, 247, 304, 305, 305, 305, 305, 305, 305, 562, 449, 450, 435, 435, 1646, 252, 264, 563, 215, 217, 882, 461, 254, 461, 255, 733, 462, 462, 462, 462, 462, 462, 462, 257, 161, 240, 237, 162, 238, 239, 217, 240, 241, 242, 528, 264, 240, 415, 240, 883, 240, 305, 305, 305, 305, 305, 305, 305, 244, 823, 245, 246, 247, 340, 340, 340, 340, 340, 340, 340, 717, 249, 415, 158, 807, 251, 252, 808, 718, 508, 626, 159, 541, 254, 541, 255, 481, 542, 542, 542, 542, 542, 542, 542, 257, 510, 240, 158, 161, 261, 717, 162, 262, 263, 721, 159, 264, 262, 718, 262, 881, 262, 340, 340, 340, 340, 340, 340, 340, 264, 568, 265, 266, 267, 347, 268, 544, 349, 349, 349, 349, 349, 349, 545, 545, 545, 545, 545, 545, 545, 723, 811, 811, 415, 158, 605, 605, 605, 605, 605, 605, 605, 159, 737, 618, 269, 618, 270, 344, 619, 619, 619, 619, 619, 619, 619, 345, 1142, 346, 161, 346, 347, 162, 348, 349, 349, 349, 349, 349, 349, 350, 831, 831, 262, 158, 415, 261, 561, 653, 262, 263, 562, 159, 158, 262, 562, 262, 562, 262, 563, 654, 159, 820, 563, 655, 563, 717, 562, 265, 266, 267, 352, 268, 565, 718, 563, 161, 415, 161, 162, 161, 162, 161, 162, 826, 162, 158, 575, 158, 415, 158, 567, 161, 352, 159, 162, 159, 575, 159, 717, 566, 726, 269, 564, 270, 473, 822, 718, 879, 575, 691, 161, 569, 161, 162, 474, 162, 474, 475, 264, 476, 477, 477, 477, 477, 477, 477, 546, 158, 349, 349, 349, 349, 349, 349, 349, 159, 562, 367, 1630, 415, 717, 264, 158, 720, 563, 717, 547, 457, 718, 548, 159, 829, 161, 718, 264, 162, 549, 458, 562, 458, 892, 161, 459, 570, 162, 562, 563, 161, 550, 551, 162, 551, 552, 563, 553, 554, 554, 554, 554, 554, 554, 573, 571, 161, 158, 722, 162, 491, 725, 158, 161, 717, 159, 162, 264, 158, 158, 159, 572, 718, 649, 649, 562, 159, 159, 717, 471, 562, 574, 161, 563, 579, 162, 718, 161, 563, 576, 162, 158, 1055, 161, 161, 577, 162, 162, 264, 159, 161, 562, 562, 162, 729, 161, 578, 674, 162, 563, 563, 580, 158, 674, 562, 581, 161, 158, 471, 162, 159, 322, 563, 158, 158, 159, 161, 161, 322, 162, 162, 159, 159, 1629, 728, 158, 158, 161, 324, 161, 162, 582, 162, 159, 159, 324, 583, 415, 161, 161, 740, 162, 162, 585, 586, 452, 415, 697, 584, 587, 161, 161, 987, 162, 162, 453, 734, 453, 158, 264, 454, 589, 638, 824, 638, 588, 159, 639, 639, 639, 639, 639, 639, 639, 674, 674, 737, 590, 393, 471, 604, 395, 395, 395, 395, 395, 395, 432, 1054, 640, 434, 434, 434, 434, 434, 434, 717, 384, 385, 386, 658, 387, 388, 877, 718, 694, 264, 717, 389, 717, 264, 264, 390, 391, 398, 718, 399, 718, 889, 400, 606, 264, 659, 737, 400, 322, 400, 607, 400, 395, 395, 395, 395, 395, 395, 395, 457, 415, 404, 405, 406, 724, 324, 514, 659, 158, 458, 608, 458, 322, 609, 459, 989, 159, 727, 463, 415, 610, 641, 641, 641, 641, 641, 641, 641, 464, 324, 464, 1056, 611, 465, 717, 612, 827, 400, 398, 738, 399, 702, 718, 400, 401, 871, 871, 402, 400, 264, 400, 403, 400, 199, 199, 199, 199, 199, 199, 199, 264, 905, 404, 405, 406, 437, 437, 437, 437, 437, 437, 437, 322, 322, 408, 890, 1378, 741, 658, 491, 264, 409, 440, 440, 440, 440, 440, 440, 440, 324, 324, 674, 674, 410, 736, 887, 411, 471, 400, 398, 659, 399, 730, 648, 400, 401, 264, 264, 402, 400, 739, 400, 215, 400, 397, 397, 397, 397, 397, 397, 397, 732, 659, 404, 405, 406, 575, 437, 437, 437, 437, 437, 437, 437, 217, 613, 575, 440, 440, 440, 440, 440, 440, 440, 650, 1687, 650, 1628, 575, 651, 651, 651, 651, 651, 651, 651, 880, 411, 443, 400, 398, 884, 399, 158, 264, 400, 606, 1687, 491, 264, 400, 159, 400, 886, 400, 447, 448, 448, 448, 448, 448, 448, 264, 927, 404, 405, 406, 481, 448, 448, 448, 448, 448, 448, 448, 656, 264, 656, 264, 696, 657, 657, 657, 657, 657, 657, 657, 454, 455, 455, 455, 455, 455, 455, 264, 264, 653, 893, 612, 997, 400, 430, 459, 460, 460, 460, 460, 460, 460, 747, 747, 431, 655, 431, 432, 655, 433, 434, 434, 434, 434, 434, 434, 642, 1620, 434, 434, 434, 434, 434, 434, 434, 462, 462, 462, 462, 462, 462, 462, 885, 264, 1053, 891, 643, 481, 415, 644, 264, 481, 264, 264, 264, 988, 645, 462, 462, 462, 462, 462, 462, 462, 922, 922, 831, 831, 646, 658, 465, 466, 466, 466, 466, 466, 466, 682, 682, 682, 682, 682, 682, 682, 455, 455, 455, 455, 455, 455, 455, 659, 475, 158, 681, 477, 477, 477, 477, 477, 477, 159, 158, 158, 415, 1606, 776, 158, 158, 575, 159, 159, 660, 659, 1687, 159, 159, 415, 662, 575, 415, 626, 704, 991, 661, 238, 239, 990, 240, 241, 242, 575, 481, 240, 701, 240, 158, 240, 456, 456, 663, 703, 158, 491, 159, 264, 415, 245, 246, 247, 159, 662, 264, 992, 264, 264, 158, 158, 449, 264, 264, 158, 663, 252, 159, 159, 158, 717, 546, 159, 254, 481, 255, 663, 159, 718, 1605, 737, 712, 322, 415, 257, 915, 240, 662, 264, 707, 626, 264, 470, 916, 548, 666, 714, 264, 663, 324, 710, 549, 460, 460, 460, 460, 460, 460, 460, 663, 794, 264, 264, 550, 470, 713, 264, 667, 795, 1071, 715, 264, 719, 542, 542, 542, 542, 542, 542, 542, 664, 663, 542, 542, 542, 542, 542, 542, 542, 667, 905, 481, 665, 666, 352, 545, 545, 545, 545, 545, 545, 545, 352, 264, 1049, 264, 666, 264, 466, 466, 466, 466, 466, 466, 466, 667, 746, 545, 545, 545, 545, 545, 545, 545, 748, 1051, 748, 264, 667, 749, 749, 749, 749, 749, 749, 749, 668, 667, 548, 552, 1604, 751, 554, 554, 554, 554, 554, 554, 669, 237, 667, 238, 239, 902, 240, 241, 242, 1050, 264, 240, 1687, 240, 322, 240, 467, 467, 467, 467, 467, 467, 467, 244, 776, 245, 246, 247, 1052, 264, 903, 324, 1687, 467, 467, 467, 670, 467, 467, 683, 251, 252, 491, 481, 671, 264, 907, 737, 254, 322, 255, 752, 752, 752, 752, 752, 752, 752, 352, 257, 528, 240, 672, 264, 673, 558, 324, 674, 675, 158, 676, 158, 674, 559, 674, 1391, 674, 159, 909, 159, 352, 562, 1045, 158, 922, 922, 677, 678, 679, 563, 560, 159, 471, 158, 161, 353, 161, 162, 367, 162, 1057, 159, 158, 264, 158, 1104, 1104, 415, 161, 770, 159, 162, 159, 888, 777, 626, 1288, 470, 161, 1289, 680, 162, 674, 473, 264, 470, 415, 161, 778, 161, 162, 345, 162, 474, 780, 474, 475, 683, 476, 477, 477, 477, 477, 477, 477, 350, 473, 779, 1143, 158, 1180, 415, 871, 871, 345, 626, 474, 159, 474, 475, 264, 476, 477, 477, 477, 477, 477, 477, 350, 683, 158, 158, 158, 1687, 161, 322, 415, 162, 159, 159, 159, 1603, 684, 782, 477, 477, 477, 477, 477, 477, 477, 1000, 324, 158, 1144, 161, 161, 161, 162, 162, 162, 159, 685, 1078, 415, 686, 781, 737, 626, 322, 415, 1079, 687, 401, 626, 908, 402, 783, 161, 784, 1182, 162, 617, 617, 688, 158, 324, 261, 785, 905, 262, 263, 158, 159, 158, 262, 158, 262, 264, 262, 159, 1005, 159, 905, 159, 1624, 158, 562, 158, 265, 266, 267, 322, 268, 159, 563, 159, 161, 1466, 161, 162, 161, 162, 367, 162, 411, 788, 786, 689, 324, 787, 161, 161, 161, 162, 162, 162, 1074, 1000, 789, 967, 158, 367, 269, 905, 270, 562, 415, 261, 159, 1473, 262, 263, 158, 563, 158, 262, 158, 262, 158, 262, 159, 967, 159, 626, 159, 161, 159, 970, 162, 265, 266, 267, 357, 268, 1010, 971, 967, 161, 1279, 161, 162, 161, 162, 161, 162, 401, 162, 1005, 402, 1279, 792, 158, 790, 158, 1687, 1687, 791, 690, 967, 159, 322, 159, 642, 269, 970, 270, 753, 357, 554, 554, 554, 554, 554, 554, 554, 794, 161, 324, 161, 162, 1081, 162, 528, 795, 1005, 644, 754, 357, 1082, 755, 1090, 1090, 645, 415, 1075, 1484, 756, 411, 1146, 1146, 161, 626, 793, 162, 646, 353, 1151, 1151, 757, 352, 762, 352, 352, 352, 352, 352, 352, 352, 763, 352, 764, 352, 764, 765, 352, 766, 767, 767, 767, 767, 767, 767, 768, 352, 352, 352, 352, 352, 1279, 352, 353, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 352, 352, 352, 352, 562, 1156, 1156, 158, 1687, 1179, 322, 470, 563, 264, 771, 159, 771, 772, 905, 773, 774, 774, 774, 774, 774, 774, 956, 324, 158, 161, 776, 963, 161, 470, 957, 162, 159, 911, 1687, 964, 771, 761, 771, 772, 1546, 773, 774, 774, 774, 774, 774, 774, 812, 161, 812, 1687, 162, 813, 813, 813, 813, 813, 813, 813, 619, 619, 619, 619, 619, 619, 619, 1165, 1165, 1311, 796, 398, 1000, 399, 264, 1010, 400, 606, 737, 264, 1578, 400, 471, 400, 607, 400, 395, 395, 395, 395, 395, 395, 395, 1019, 927, 404, 405, 406, 619, 619, 619, 619, 619, 619, 619, 672, 905, 609, 1003, 737, 815, 322, 815, 676, 610, 816, 816, 816, 816, 816, 816, 816, 1005, 658, 1574, 1005, 611, 1390, 324, 612, 861, 400, 398, 658, 399, 471, 1019, 400, 606, 905, 1076, 1468, 400, 1024, 400, 659, 400, 605, 605, 605, 605, 605, 605, 605, 215, 659, 404, 405, 406, 639, 639, 639, 639, 639, 639, 639, 1007, 659, 810, 639, 639, 639, 639, 639, 639, 639, 217, 659, 1181, 641, 641, 641, 641, 641, 641, 641, 1024, 1189, 264, 322, 612, 1190, 400, 398, 967, 399, 158, 481, 400, 606, 830, 905, 264, 400, 159, 400, 324, 400, 641, 641, 641, 641, 641, 641, 641, 1562, 967, 404, 405, 406, 528, 161, 970, 1077, 162, 832, 1467, 832, 357, 644, 833, 833, 833, 833, 833, 833, 833, 835, 1132, 835, 662, 1403, 836, 836, 836, 836, 836, 836, 836, 264, 1183, 612, 905, 400, 398, 905, 399, 158, 1561, 400, 401, 1467, 663, 402, 400, 159, 400, 1474, 400, 620, 620, 620, 620, 620, 620, 620, 1185, 1186, 404, 405, 406, 1560, 161, 1016, 663, 162, 620, 620, 620, 620, 620, 620, 1010, 1010, 941, 1104, 1104, 818, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 411, 905, 400, 657, 657, 657, 657, 657, 657, 657, 238, 239, 1187, 240, 241, 242, 1150, 1013, 240, 1188, 240, 1623, 240, 657, 657, 657, 657, 657, 657, 657, 1005, 1005, 245, 246, 247, 749, 749, 749, 749, 749, 749, 749, 1207, 449, 683, 965, 965, 905, 252, 1470, 1208, 1687, 528, 322, 965, 254, 683, 255, 1486, 682, 682, 682, 682, 682, 682, 682, 257, 965, 240, 839, 324, 682, 682, 682, 682, 682, 682, 682, 1559, 840, 870, 840, 841, 662, 842, 843, 843, 843, 843, 843, 843, 845, 686, 910, 749, 749, 749, 749, 749, 749, 749, 846, 415, 846, 847, 663, 848, 849, 849, 849, 849, 849, 849, 851, 415, 528, 753, 737, 905, 322, 1472, 666, 626, 852, 626, 852, 853, 663, 854, 855, 855, 855, 855, 855, 855, 857, 324, 238, 239, 755, 240, 241, 242, 667, 1019, 858, 756, 858, 528, 240, 859, 860, 860, 860, 860, 860, 860, 244, 757, 245, 246, 247, 905, 1687, 1026, 667, 905, 467, 467, 467, 670, 467, 467, 1480, 251, 252, 1385, 944, 671, 1197, 1155, 872, 254, 872, 255, 1687, 873, 873, 873, 873, 873, 873, 873, 257, 1024, 240, 237, 1536, 238, 239, 946, 240, 241, 242, 1198, 1019, 240, 947, 240, 905, 240, 752, 752, 752, 752, 752, 752, 752, 244, 948, 245, 246, 247, 929, 929, 929, 929, 929, 929, 929, 905, 249, 921, 905, 1279, 251, 252, 528, 353, 1481, 1386, 1022, 918, 254, 918, 255, 1543, 919, 919, 919, 919, 919, 919, 919, 257, 1024, 240, 470, 862, 470, 470, 470, 470, 470, 470, 470, 863, 470, 864, 470, 864, 865, 470, 866, 867, 867, 867, 867, 867, 867, 868, 470, 470, 674, 470, 470, 1535, 470, 471, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 470, 470, 470, 470, 683, 752, 752, 752, 752, 752, 752, 752, 905, 1090, 1090, 1213, 1213, 684, 1279, 477, 477, 477, 477, 477, 477, 477, 755, 923, 353, 923, 353, 1469, 924, 924, 924, 924, 924, 924, 924, 666, 686, 1165, 1165, 1272, 1272, 1117, 765, 687, 928, 767, 767, 767, 767, 767, 767, 1404, 471, 1199, 471, 688, 158, 667, 261, 353, 737, 262, 263, 1117, 159, 528, 262, 1483, 262, 772, 262, 942, 774, 774, 774, 774, 774, 774, 1200, 667, 265, 266, 267, 528, 268, 943, 943, 943, 943, 943, 943, 943, 984, 905, 984, 1311, 875, 985, 985, 985, 985, 985, 985, 985, 737, 158, 1119, 1193, 1475, 528, 158, 1485, 158, 159, 269, 1194, 270, 158, 159, 261, 159, 1195, 262, 263, 158, 159, 967, 262, 1119, 262, 161, 262, 159, 162, 1122, 161, 158, 161, 162, 1133, 162, 265, 266, 267, 159, 268, 357, 1134, 967, 161, 1117, 158, 162, 528, 970, 956, 357, 951, 1117, 159, 876, 161, 952, 957, 162, 813, 813, 813, 813, 813, 813, 813, 1482, 1311, 1279, 269, 161, 270, 717, 162, 161, 905, 737, 162, 322, 1539, 718, 953, 771, 264, 771, 772, 1245, 773, 774, 774, 774, 774, 774, 774, 1245, 324, 954, 1687, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 1279, 527, 528, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 527, 527, 527, 527, 352, 762, 352, 352, 352, 352, 352, 352, 352, 763, 352, 764, 352, 764, 765, 352, 766, 767, 767, 767, 767, 767, 767, 768, 352, 352, 352, 352, 352, 1534, 352, 353, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 352, 352, 352, 352, 930, 158, 767, 767, 767, 767, 767, 767, 767, 159, 963, 966, 967, 1213, 1213, 905, 905, 353, 964, 968, 931, 1544, 1000, 932, 1272, 1272, 161, 528, 353, 162, 933, 1379, 1380, 357, 967, 161, 969, 1398, 162, 471, 970, 1245, 934, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 935, 352, 935, 936, 352, 937, 938, 938, 938, 938, 938, 938, 352, 352, 352, 352, 352, 352, 1005, 352, 353, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 940, 940, 940, 940, 940, 940, 940, 352, 352, 352, 352, 352, 352, 557, 352, 353, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 352, 352, 352, 940, 944, 158, 774, 774, 774, 774, 774, 774, 774, 159, 158, 158, 1000, 1010, 1083, 967, 158, 1019, 159, 159, 945, 528, 1084, 946, 159, 158, 161, 1146, 1146, 162, 947, 1399, 158, 159, 927, 161, 161, 967, 162, 162, 159, 161, 948, 970, 162, 971, 967, 158, 158, 905, 161, 955, 528, 162, 959, 159, 159, 161, 1245, 960, 162, 958, 1005, 1005, 528, 367, 1478, 1024, 967, 1491, 1480, 158, 161, 161, 970, 162, 162, 1197, 961, 159, 1245, 962, 813, 813, 813, 813, 813, 813, 813, 816, 816, 816, 816, 816, 816, 816, 161, 972, 398, 162, 399, 158, 1198, 400, 606, 1514, 905, 905, 400, 159, 400, 1102, 400, 811, 811, 833, 833, 833, 833, 833, 833, 833, 404, 405, 406, 994, 161, 994, 1537, 162, 995, 995, 995, 995, 995, 995, 995, 833, 833, 833, 833, 833, 833, 833, 836, 836, 836, 836, 836, 836, 836, 357, 528, 1687, 761, 322, 612, 905, 400, 398, 1119, 399, 158, 1467, 400, 606, 528, 1479, 1501, 400, 159, 400, 324, 400, 814, 814, 814, 814, 814, 814, 814, 1487, 1119, 404, 405, 406, 528, 161, 1122, 1202, 162, 814, 814, 814, 814, 814, 814, 1496, 357, 1123, 1119, 1488, 986, 836, 836, 836, 836, 836, 836, 836, 999, 999, 999, 999, 999, 999, 999, 612, 1497, 400, 401, 528, 1119, 402, 528, 1550, 1498, 905, 1122, 816, 816, 816, 816, 816, 816, 816, 841, 1541, 998, 843, 843, 843, 843, 843, 843, 847, 1548, 1008, 849, 849, 849, 849, 849, 849, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 853, 1563, 1017, 855, 855, 855, 855, 855, 855, 1564, 528, 411, 839, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 967, 528, 840, 1554, 840, 841, 1555, 842, 843, 843, 843, 843, 843, 843, 1000, 459, 460, 460, 460, 460, 460, 460, 967, 971, 967, 971, 967, 1001, 970, 843, 843, 843, 843, 843, 843, 843, 865, 158, 1030, 867, 867, 867, 867, 867, 867, 159, 967, 1002, 967, 904, 1003, 904, 970, 471, 970, 1118, 1119, 1004, 905, 904, 1467, 904, 161, 1120, 1005, 162, 1043, 1000, 1043, 1006, 1000, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1119, 528, 1121, 1480, 1279, 1001, 1122, 843, 843, 843, 843, 843, 843, 843, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 873, 873, 873, 873, 873, 873, 873, 1003, 471, 683, 905, 1257, 905, 528, 1004, 1465, 905, 1590, 1005, 1480, 1476, 1005, 845, 1477, 873, 873, 873, 873, 873, 873, 873, 1538, 846, 1010, 846, 847, 528, 848, 849, 849, 849, 849, 849, 849, 1010, 919, 919, 919, 919, 919, 919, 919, 1392, 1393, 1687, 1279, 322, 1011, 905, 849, 849, 849, 849, 849, 849, 849, 919, 919, 919, 919, 919, 919, 919, 324, 905, 905, 1260, 1012, 905, 1467, 1013, 1203, 1279, 1005, 1133, 966, 967, 1014, 1381, 1540, 1542, 528, 1134, 968, 1005, 1382, 1086, 1019, 1086, 1015, 1010, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 967, 161, 969, 1626, 162, 1011, 970, 849, 849, 849, 849, 849, 849, 849, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 1013, 158, 905, 528, 1263, 905, 905, 1014, 1467, 159, 1592, 1024, 1547, 1552, 1005, 851, 158, 943, 943, 943, 943, 943, 943, 943, 159, 852, 161, 852, 853, 162, 854, 855, 855, 855, 855, 855, 855, 1019, 1103, 528, 1279, 161, 1199, 528, 162, 1123, 1119, 1027, 1115, 1558, 1020, 1110, 855, 855, 855, 855, 855, 855, 855, 1627, 929, 929, 929, 929, 929, 929, 929, 1200, 1119, 1028, 1021, 905, 528, 1022, 1122, 353, 905, 158, 905, 905, 1023, 1089, 451, 1594, 1589, 159, 251, 1024, 1687, 1591, 322, 663, 1025, 1019, 943, 943, 943, 943, 943, 943, 943, 1622, 161, 971, 967, 162, 1020, 324, 855, 855, 855, 855, 855, 855, 855, 946, 929, 929, 929, 929, 929, 929, 929, 1111, 528, 1464, 967, 158, 905, 1022, 1201, 353, 970, 1467, 1394, 159, 1023, 932, 905, 1463, 1105, 1395, 1105, 1024, 857, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 161, 1545, 458, 162, 458, 528, 1462, 459, 460, 460, 460, 460, 460, 460, 244, 1112, 936, 905, 1094, 938, 938, 938, 938, 938, 938, 1595, 1480, 451, 905, 1461, 528, 251, 1027, 353, 238, 239, 1460, 240, 241, 242, 1489, 1383, 240, 1490, 240, 1384, 240, 860, 860, 860, 860, 860, 860, 860, 1028, 1247, 245, 246, 247, 1123, 1119, 528, 1205, 1119, 467, 467, 467, 670, 467, 467, 1206, 251, 252, 1459, 1396, 1029, 663, 1247, 1397, 254, 905, 255, 1119, 1250, 528, 1119, 1467, 665, 1122, 1597, 257, 1122, 240, 470, 862, 470, 470, 470, 470, 470, 470, 470, 863, 470, 864, 470, 864, 865, 470, 866, 867, 867, 867, 867, 867, 867, 868, 470, 470, 470, 470, 470, 1458, 470, 471, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 470, 470, 470, 470, 1032, 528, 867, 867, 867, 867, 867, 867, 867, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 527, 471, 527, 528, 1033, 905, 528, 1034, 353, 528, 527, 1557, 527, 471, 1035, 985, 985, 985, 985, 985, 985, 985, 1593, 1600, 1549, 1625, 1036, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 1037, 470, 1037, 1038, 470, 1039, 1040, 1040, 1040, 1040, 1040, 1040, 470, 470, 470, 470, 470, 470, 761, 470, 471, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 470, 470, 470, 470, 470, 470, 557, 470, 471, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 470, 470, 470, 1042, 158, 528, 261, 528, 528, 262, 263, 158, 159, 528, 262, 158, 262, 158, 262, 159, 1551, 1596, 1553, 159, 1432, 159, 1598, 905, 265, 266, 267, 528, 268, 1063, 1064, 1065, 161, 1066, 1067, 162, 161, 1046, 161, 162, 1068, 162, 1556, 1467, 1069, 1070, 1404, 1114, 995, 995, 995, 995, 995, 995, 995, 737, 357, 322, 269, 1117, 270, 158, 353, 261, 1116, 528, 262, 263, 1010, 159, 1599, 262, 737, 262, 324, 262, 995, 995, 995, 995, 995, 995, 995, 1151, 1151, 265, 266, 267, 1147, 268, 1147, 1123, 1119, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1152, 967, 1152, 1666, 1565, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1019, 1047, 1119, 1336, 1336, 1410, 1005, 269, 1122, 270, 1061, 967, 1062, 528, 1565, 1156, 1156, 970, 1601, 1157, 1062, 1157, 1062, 1119, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1377, 528, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1602, 905, 1063, 1064, 1065, 1119, 1066, 1067, 471, 528, 1024, 1122, 1376, 1068, 1164, 1480, 1467, 1069, 1070, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 1072, 527, 527, 527, 527, 527, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 527, 527, 527, 527, 527, 527, 732, 527, 528, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 527, 527, 527, 1073, 930, 158, 767, 767, 767, 767, 767, 767, 767, 159, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 353, 1119, 528, 905, 905, 1467, 932, 1480, 471, 161, 1467, 1375, 162, 933, 1034, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 905, 1119, 1467, 934, 1091, 1374, 1091, 1122, 471, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1230, 353, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1279, 353, 158, 1093, 1093, 1093, 1093, 1093, 1093, 1096, 159, 938, 938, 938, 938, 938, 938, 938, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 683, 353, 161, 528, 1097, 162, 528, 1098, 1480, 1480, 528, 1373, 1480, 1217, 1099, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 528, 1372, 1480, 1371, 1100, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 352, 352, 352, 352, 352, 352, 759, 352, 353, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 352, 352, 352, 1101, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 940, 940, 940, 940, 940, 940, 940, 352, 352, 352, 352, 352, 352, 557, 352, 353, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 352, 352, 352, 940, 956, 1083, 967, 158, 1251, 1247, 1205, 1119, 957, 1084, 771, 159, 771, 772, 1206, 773, 774, 774, 774, 774, 774, 774, 1370, 1369, 967, 161, 1113, 1247, 161, 1119, 970, 162, 1565, 1250, 1687, 1122, 771, 367, 771, 772, 1565, 773, 774, 774, 774, 774, 774, 774, 1368, 1367, 1366, 1687, 965, 1124, 967, 965, 965, 965, 965, 965, 965, 1125, 965, 1126, 965, 1126, 1127, 965, 1128, 1129, 1129, 1129, 1129, 1129, 1129, 1130, 967, 965, 965, 965, 965, 965, 970, 965, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 965, 965, 965, 965, 398, 905, 399, 528, 1404, 400, 606, 1467, 491, 1405, 400, 1365, 400, 737, 400, 985, 985, 985, 985, 985, 985, 985, 471, 1480, 404, 405, 406, 1038, 1350, 1169, 1040, 1040, 1040, 1040, 1040, 1040, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1492, 471, 1118, 1119, 528, 528, 1493, 1350, 353, 1494, 1120, 1480, 965, 1351, 1352, 612, 1495, 400, 398, 1480, 399, 1687, 798, 400, 606, 1119, 798, 1121, 400, 798, 400, 1122, 400, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1123, 1119, 404, 405, 406, 1251, 1247, 965, 353, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1119, 353, 905, 1319, 1387, 1247, 1122, 1212, 353, 353, 1314, 1250, 1388, 612, 1098, 400, 1000, 1218, 1389, 1218, 1290, 1279, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1001, 1287, 843, 843, 843, 843, 843, 843, 843, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1003, 158, 158, 158, 1286, 1285, 528, 1004, 1400, 159, 159, 159, 1284, 1283, 1005, 1282, 1401, 158, 1281, 1006, 1010, 1280, 1402, 1279, 158, 159, 161, 161, 161, 162, 162, 162, 159, 1011, 1278, 849, 849, 849, 849, 849, 849, 849, 161, 1251, 1247, 162, 367, 1277, 1320, 161, 367, 367, 162, 158, 1246, 1247, 1013, 1315, 1247, 1497, 1687, 159, 1248, 1014, 1221, 1316, 1247, 1498, 341, 1687, 1005, 322, 1250, 341, 341, 1015, 1019, 1247, 161, 1249, 1247, 162, 491, 1250, 161, 491, 1250, 162, 324, 1020, 1687, 855, 855, 855, 855, 855, 855, 855, 1255, 1687, 1255, 322, 367, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 438, 1312, 1022, 1687, 491, 438, 438, 491, 324, 1023, 471, 1254, 1687, 467, 322, 1313, 1024, 798, 467, 467, 1253, 1025, 1160, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 798, 324, 1161, 798, 1161, 847, 798, 1162, 1163, 1163, 1163, 1163, 1163, 1163, 1027, 1252, 238, 239, 328, 240, 241, 242, 1109, 1109, 240, 1220, 240, 353, 240, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1028, 1204, 245, 246, 247, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1196, 249, 1000, 620, 1192, 251, 252, 1191, 620, 620, 663, 1184, 514, 254, 514, 255, 514, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 257, 264, 240, 1032, 1178, 867, 867, 867, 867, 867, 867, 867, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1247, 471, 1251, 1247, 683, 471, 655, 1034, 471, 1005, 1258, 798, 1258, 1141, 1035, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1247, 798, 798, 1247, 1036, 1166, 1250, 1166, 798, 1250, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1140, 1010, 1139, 1138, 1137, 1361, 1136, 1135, 471, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1109, 471, 158, 1168, 1168, 1168, 1168, 1168, 1168, 1171, 159, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 950, 471, 161, 1005, 1172, 162, 353, 1173, 471, 927, 1261, 927, 1261, 1088, 1174, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1411, 1085, 1080, 905, 1175, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 470, 470, 470, 470, 470, 470, 759, 470, 471, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 470, 470, 470, 1176, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 470, 470, 470, 470, 470, 470, 557, 470, 471, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 470, 470, 470, 1042, 158, 1019, 261, 1060, 514, 262, 263, 1059, 159, 514, 262, 514, 262, 514, 262, 1265, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1058, 265, 266, 267, 847, 268, 1264, 1163, 1163, 1163, 1163, 1163, 1163, 510, 659, 1687, 996, 1177, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 652, 983, 982, 1024, 981, 652, 652, 980, 471, 798, 269, 659, 270, 158, 1271, 261, 979, 1005, 262, 263, 1265, 159, 978, 262, 977, 262, 976, 262, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 975, 974, 265, 266, 267, 967, 268, 659, 471, 1119, 973, 1251, 1247, 950, 1173, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 761, 1413, 1413, 761, 927, 967, 481, 659, 353, 1119, 759, 970, 1247, 1005, 269, 1122, 270, 1061, 1250, 1062, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1062, 920, 1062, 917, 914, 913, 912, 1427, 353, 905, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 514, 901, 514, 514, 514, 1063, 1064, 1065, 353, 1066, 1067, 900, 1427, 899, 898, 897, 1068, 1117, 1428, 1429, 1069, 1070, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 1072, 527, 527, 527, 527, 527, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 527, 527, 527, 527, 527, 527, 732, 527, 528, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 527, 527, 527, 1073, 1078, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1079, 896, 771, 895, 771, 772, 264, 773, 774, 774, 774, 774, 774, 774, 1113, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1687, 878, 771, 683, 771, 772, 683, 773, 774, 774, 774, 774, 774, 774, 1209, 471, 1209, 471, 655, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 837, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 353, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 353, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 353, 1439, 1093, 1093, 1093, 1093, 1093, 1093, 415, 624, 624, 1247, 967, 1211, 1096, 622, 938, 938, 938, 938, 938, 938, 938, 1439, 1246, 1247, 1336, 1336, 965, 1440, 1441, 353, 1248, 1247, 967, 622, 716, 1098, 817, 1250, 970, 716, 716, 817, 1099, 750, 400, 1247, 609, 1249, 750, 750, 400, 1250, 809, 814, 1100, 1214, 798, 1214, 814, 814, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 806, 353, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 805, 353, 804, 1216, 1216, 1216, 1216, 1216, 1216, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 352, 352, 352, 352, 352, 352, 759, 352, 353, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 352, 352, 352, 1101, 1117, 1222, 1119, 1117, 1117, 1117, 1117, 1117, 1117, 1223, 1117, 1224, 1117, 1224, 1225, 1117, 1226, 1227, 1227, 1227, 1227, 1227, 1227, 1228, 1119, 1117, 1117, 1117, 1117, 1117, 1122, 1117, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1117, 1117, 1117, 1117, 965, 1124, 967, 965, 965, 965, 965, 965, 965, 1125, 965, 1126, 965, 1126, 1127, 965, 1128, 1129, 1129, 1129, 1129, 1129, 1129, 1130, 967, 965, 965, 965, 965, 965, 970, 965, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 965, 965, 965, 965, 967, 1315, 1247, 803, 1350, 834, 802, 801, 800, 1316, 834, 834, 1127, 799, 1231, 1129, 1129, 1129, 1129, 1129, 1129, 1000, 967, 798, 1247, 797, 1350, 353, 970, 967, 1250, 965, 1351, 1352, 1119, 761, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 557, 967, 759, 745, 1405, 744, 1119, 970, 967, 743, 742, 967, 1122, 1687, 528, 322, 512, 512, 510, 264, 1233, 1005, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1350, 967, 967, 324, 967, 471, 469, 970, 469, 1406, 970, 1234, 1687, 1687, 1235, 1407, 1434, 1434, 1408, 1687, 624, 1236, 1350, 415, 967, 1409, 838, 965, 1351, 1352, 970, 838, 838, 1237, 965, 965, 967, 965, 965, 965, 965, 965, 965, 965, 965, 1238, 965, 1238, 1239, 965, 1240, 1241, 1241, 1241, 1241, 1241, 1241, 965, 967, 965, 965, 965, 965, 965, 970, 965, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 965, 965, 965, 965, 965, 965, 967, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 965, 967, 965, 965, 965, 965, 1244, 970, 965, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 965, 965, 965, 1243, 1160, 844, 622, 413, 614, 400, 844, 844, 408, 1010, 1161, 614, 1161, 847, 400, 1162, 1163, 1163, 1163, 1163, 1163, 1163, 1265, 603, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1019, 1265, 599, 1508, 1011, 598, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 659, 1247, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 591, 659, 1012, 1508, 353, 1013, 1005, 557, 1117, 1509, 1510, 850, 1266, 659, 1247, 1687, 850, 850, 343, 1005, 1250, 343, 1457, 659, 1267, 1268, 543, 1268, 1024, 1005, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 540, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 471, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 471, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 471, 539, 1168, 1168, 1168, 1168, 1168, 1168, 471, 538, 537, 1265, 1119, 1270, 1171, 536, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1687, 471, 528, 659, 1119, 525, 514, 1173, 471, 1687, 1122, 322, 522, 521, 1174, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 520, 519, 518, 659, 1175, 1273, 324, 1273, 471, 1005, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 325, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 471, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 353, 856, 517, 516, 515, 514, 856, 856, 471, 513, 1275, 1275, 1275, 1275, 1275, 1275, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 470, 470, 470, 470, 470, 470, 759, 470, 471, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 470, 470, 470, 1176, 158, 512, 261, 307, 507, 262, 263, 967, 159, 1247, 262, 1350, 262, 506, 262, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 505, 1687, 265, 266, 267, 504, 268, 967, 353, 1247, 1687, 1350, 322, 970, 1276, 1250, 965, 1351, 1352, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 874, 503, 502, 324, 481, 874, 874, 1442, 471, 499, 269, 925, 270, 158, 330, 261, 925, 925, 262, 263, 1427, 159, 498, 262, 497, 262, 496, 262, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1687, 1119, 265, 266, 267, 1119, 268, 1427, 471, 1687, 495, 322, 1117, 1428, 1429, 1413, 1413, 494, 493, 1503, 1503, 1571, 1567, 1119, 492, 490, 1427, 1119, 324, 1122, 1427, 489, 488, 1122, 1567, 487, 269, 1107, 270, 1291, 486, 1292, 1107, 1107, 1567, 485, 329, 484, 1427, 1292, 1570, 1292, 1427, 1117, 1428, 1429, 1567, 1117, 1428, 1429, 1149, 483, 1570, 967, 482, 1149, 1149, 1439, 481, 905, 1511, 1293, 1294, 1295, 480, 1296, 1297, 1434, 1434, 1439, 1571, 1567, 1298, 1439, 479, 967, 1299, 1300, 1301, 1439, 1302, 970, 478, 262, 965, 1440, 1441, 471, 1302, 262, 1302, 1439, 262, 1567, 1119, 1439, 965, 1440, 1441, 1570, 965, 1440, 1441, 469, 259, 240, 240, 250, 528, 240, 1303, 1304, 1305, 1515, 1306, 1307, 1119, 1350, 1154, 240, 1687, 1308, 1122, 1154, 1154, 1309, 1310, 1317, 1247, 1317, 1531, 1687, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1350, 415, 413, 1517, 1517, 965, 1351, 1352, 353, 1119, 1159, 1247, 353, 1531, 1508, 1159, 1159, 1250, 1245, 1532, 1533, 1225, 1508, 1321, 1227, 1227, 1227, 1227, 1227, 1227, 343, 1119, 156, 336, 335, 334, 1508, 1122, 1119, 1566, 1567, 1117, 1509, 1510, 1508, 332, 1687, 1568, 131, 1117, 1509, 1510, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 131, 1119, 321, 1567, 317, 1569, 1362, 1122, 1119, 1570, 316, 1362, 1362, 309, 120, 1571, 1567, 1119, 308, 1427, 1323, 307, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1439, 1119, 1503, 1503, 1247, 230, 260, 1122, 259, 1567, 1119, 1324, 1427, 230, 1325, 1570, 1122, 1117, 1428, 1429, 230, 1326, 1439, 210, 227, 210, 1247, 965, 1440, 1441, 210, 121, 1250, 1327, 1117, 1117, 1119, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1328, 1117, 1328, 1329, 1117, 1330, 1331, 1331, 1331, 1331, 1331, 1331, 1117, 1119, 1117, 1117, 1117, 1117, 1117, 1122, 1117, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1117, 1117, 1117, 1117, 1117, 1117, 1119, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1117, 1119, 1117, 1117, 1117, 1117, 1334, 1122, 1117, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1117, 1117, 1117, 1333, 967, 157, 1508, 156, 121, 131, 121, 131, 120, 1571, 1567, 1247, 1567, 1687, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1567, 967, 1687, 1508, 1517, 1517, 1687, 970, 1117, 1509, 1510, 1567, 1247, 1567, 1335, 967, 1687, 1570, 1250, 1570, 1585, 1687, 1567, 1687, 1247, 1575, 1687, 1687, 1570, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1247, 967, 1580, 1580, 1687, 1687, 1585, 970, 1617, 1687, 1247, 1245, 1586, 1587, 1235, 967, 1250, 1687, 1531, 1571, 1567, 1687, 1247, 1687, 1337, 1687, 1337, 1531, 1250, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1687, 967, 1687, 1687, 1531, 1687, 1567, 970, 967, 1245, 1532, 1533, 1570, 1531, 1687, 1687, 1687, 1687, 1245, 1532, 1533, 1687, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1687, 967, 1687, 1687, 1687, 1687, 1588, 970, 1687, 1687, 1339, 1339, 1339, 1339, 1339, 1339, 967, 1687, 1687, 1531, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1508, 1239, 1567, 1340, 1241, 1241, 1241, 1241, 1241, 1241, 1687, 967, 1687, 1687, 1531, 1687, 1687, 970, 967, 1245, 1532, 1533, 1508, 1687, 1567, 1687, 1687, 1117, 1509, 1510, 1570, 1687, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1687, 967, 1567, 1687, 1567, 1687, 1687, 970, 1342, 1687, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1607, 1567, 1566, 1567, 1247, 1687, 1687, 1567, 1608, 1567, 1568, 1343, 1687, 1570, 1344, 1570, 1687, 1687, 1580, 1580, 1687, 1345, 1585, 1567, 1687, 1567, 1247, 1569, 1687, 1570, 1567, 1570, 1250, 1346, 1342, 1687, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1585, 1585, 1687, 1531, 1687, 1687, 1245, 1586, 1587, 1567, 1687, 965, 1687, 1687, 1344, 1570, 1687, 1687, 1687, 1687, 1687, 1345, 1585, 1687, 1687, 1531, 1687, 1245, 1586, 1587, 1245, 1532, 1533, 965, 965, 965, 967, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 965, 967, 965, 965, 965, 965, 1348, 970, 965, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 965, 965, 965, 1347, 1245, 1353, 1247, 1245, 1245, 1245, 1245, 1245, 1245, 1354, 1245, 1355, 1245, 1355, 1356, 1245, 1357, 1358, 1358, 1358, 1358, 1358, 1358, 1359, 1247, 1245, 1245, 1245, 1245, 1245, 1250, 1245, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1245, 1245, 1245, 1245, 1363, 1585, 1363, 1687, 1687, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 471, 1119, 1687, 1585, 1607, 1567, 1687, 1687, 1245, 1586, 1587, 1687, 1608, 1585, 1687, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1687, 1119, 1687, 1621, 1687, 1567, 1687, 1122, 1687, 1687, 1687, 1570, 1687, 1585, 1412, 1119, 1687, 1687, 1245, 1586, 1587, 1687, 1687, 1687, 1567, 1687, 1662, 1687, 1687, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1687, 1119, 1648, 1648, 1687, 1687, 1687, 1122, 1687, 1687, 1567, 1687, 1662, 1687, 1325, 1119, 1570, 1565, 1663, 1664, 1687, 1687, 1687, 1676, 1414, 1567, 1414, 1567, 1687, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1687, 1119, 1687, 1648, 1648, 1671, 1671, 1122, 1119, 1676, 1687, 1567, 1687, 1567, 1565, 1677, 1678, 1570, 1687, 1570, 1687, 1687, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1687, 1119, 1687, 1687, 1687, 1687, 1687, 1122, 1687, 1687, 1416, 1416, 1416, 1416, 1416, 1416, 1119, 1687, 1687, 1662, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1662, 1329, 1687, 1417, 1331, 1331, 1331, 1331, 1331, 1331, 1687, 1119, 1687, 1687, 1662, 1687, 1687, 1122, 1119, 1565, 1663, 1664, 1662, 1687, 1687, 1687, 1687, 1565, 1663, 1664, 1687, 1687, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1687, 1119, 1687, 1687, 1567, 1679, 1687, 1122, 1419, 1687, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1662, 1671, 1671, 1676, 1687, 1687, 1687, 1687, 1687, 1567, 1687, 1420, 1687, 1687, 1421, 1570, 1687, 1687, 1687, 1687, 1687, 1422, 1662, 1676, 1687, 1676, 1687, 1565, 1663, 1664, 1565, 1677, 1678, 1423, 1419, 1687, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1676, 1687, 1676, 1662, 1687, 1687, 1687, 1565, 1677, 1678, 1687, 1117, 1687, 1687, 1421, 1687, 1687, 1687, 1687, 1687, 1687, 1422, 1676, 1687, 1685, 1662, 1687, 1565, 1677, 1678, 1565, 1663, 1664, 1117, 1117, 1117, 1119, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1117, 1119, 1117, 1117, 1117, 1117, 1425, 1122, 1117, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1117, 1117, 1117, 1424, 967, 1687, 1687, 1676, 1687, 1687, 1687, 1687, 1687, 1430, 1687, 1430, 1687, 1687, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1687, 967, 1687, 1687, 1676, 1687, 1687, 970, 967, 1565, 1677, 1678, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1687, 967, 1687, 1687, 1687, 1687, 1687, 970, 967, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1687, 967, 1687, 1687, 1687, 1687, 1687, 970, 1342, 1687, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 965, 1687, 1687, 1344, 1687, 1687, 1687, 1687, 1687, 1687, 1345, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1346, 967, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1687, 967, 1687, 1687, 1687, 1687, 1687, 970, 1687, 1687, 1687, 1687, 1687, 1687, 1433, 967, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1687, 967, 1687, 1687, 1687, 1687, 1687, 970, 1687, 1687, 1687, 1687, 1687, 1687, 1344, 967, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1435, 1687, 1435, 1687, 1687, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1687, 967, 1687, 1687, 1687, 1687, 1687, 970, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1437, 1437, 1437, 1437, 1437, 1437, 1247, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1356, 1687, 1443, 1358, 1358, 1358, 1358, 1358, 1358, 1687, 1247, 1687, 1687, 1687, 1687, 1687, 1250, 1247, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1687, 1247, 1687, 1687, 1687, 1687, 1687, 1250, 1247, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1445, 1687, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1687, 1247, 1687, 1687, 1687, 1687, 1687, 1250, 1687, 1687, 1687, 1446, 1687, 1687, 1447, 1687, 1687, 1687, 1687, 1687, 1687, 1448, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1449, 1245, 1245, 1247, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1450, 1245, 1450, 1451, 1245, 1452, 1453, 1453, 1453, 1453, 1453, 1453, 1245, 1247, 1245, 1245, 1245, 1245, 1245, 1250, 1245, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1245, 1245, 1245, 1245, 1245, 1245, 1247, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1245, 1247, 1245, 1245, 1245, 1245, 1456, 1250, 1245, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1245, 1245, 1245, 1455, 1119, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1499, 1687, 1499, 1687, 1687, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1687, 1119, 1687, 1687, 1687, 1687, 1687, 1122, 1119, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1687, 1119, 1687, 1687, 1687, 1687, 1687, 1122, 1119, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1687, 1119, 1687, 1687, 1687, 1687, 1687, 1122, 1419, 1687, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1117, 1687, 1687, 1421, 1687, 1687, 1687, 1687, 1687, 1687, 1422, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1423, 1119, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1687, 1119, 1687, 1687, 1687, 1687, 1687, 1122, 1687, 1687, 1687, 1687, 1687, 1687, 1502, 1119, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1687, 1119, 1687, 1687, 1687, 1687, 1687, 1122, 1687, 1687, 1687, 1687, 1687, 1687, 1421, 1119, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1504, 1687, 1504, 1687, 1687, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1687, 1119, 1687, 1687, 1687, 1687, 1687, 1122, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1506, 1506, 1506, 1506, 1506, 1506, 967, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1687, 967, 1687, 1687, 1687, 1687, 1687, 970, 967, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1687, 967, 1687, 1687, 1687, 1687, 1687, 970, 967, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1512, 1687, 1512, 1687, 1687, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1687, 967, 1687, 1687, 1687, 1687, 1687, 970, 967, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1687, 967, 1687, 1687, 1687, 1687, 1687, 970, 967, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1687, 967, 1687, 1687, 1687, 1687, 1687, 970, 1247, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1687, 1247, 1687, 1687, 1687, 1687, 1687, 1250, 1687, 1687, 1687, 1687, 1687, 1687, 1516, 1247, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1687, 1247, 1687, 1687, 1687, 1687, 1687, 1250, 1687, 1687, 1687, 1687, 1687, 1687, 1447, 1247, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1518, 1687, 1518, 1687, 1687, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1687, 1247, 1687, 1687, 1687, 1687, 1687, 1250, 1247, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1687, 1247, 1687, 1687, 1687, 1687, 1687, 1250, 1687, 1687, 1520, 1520, 1520, 1520, 1520, 1520, 1247, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1451, 1687, 1521, 1453, 1453, 1453, 1453, 1453, 1453, 1687, 1247, 1687, 1687, 1687, 1687, 1687, 1250, 1247, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1687, 1247, 1687, 1687, 1687, 1687, 1687, 1250, 1523, 1687, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1524, 1687, 1687, 1525, 1687, 1687, 1687, 1687, 1687, 1687, 1526, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1527, 1523, 1687, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1245, 1687, 1687, 1525, 1687, 1687, 1687, 1687, 1687, 1687, 1526, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1245, 1245, 1245, 1247, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1245, 1247, 1245, 1245, 1245, 1245, 1529, 1250, 1245, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1245, 1245, 1245, 1528, 1119, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1687, 1119, 1687, 1687, 1687, 1687, 1687, 1122, 1119, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1687, 1119, 1687, 1687, 1687, 1687, 1687, 1122, 1119, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1572, 1687, 1572, 1687, 1687, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1687, 1119, 1687, 1687, 1687, 1687, 1687, 1122, 1119, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1687, 1119, 1687, 1687, 1687, 1687, 1687, 1122, 1119, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1687, 1119, 1687, 1687, 1687, 1687, 1687, 1122, 967, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1687, 967, 1687, 1687, 1687, 1687, 1687, 970, 967, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1687, 967, 1687, 1687, 1687, 1687, 1687, 970, 1247, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1576, 1687, 1576, 1687, 1687, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1687, 1247, 1687, 1687, 1687, 1687, 1687, 1250, 1247, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1687, 1247, 1687, 1687, 1687, 1687, 1687, 1250, 1247, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1687, 1247, 1687, 1687, 1687, 1687, 1687, 1250, 1523, 1687, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1245, 1687, 1687, 1525, 1687, 1687, 1687, 1687, 1687, 1687, 1526, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1527, 1247, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1687, 1247, 1687, 1687, 1687, 1687, 1687, 1250, 1687, 1687, 1687, 1687, 1687, 1687, 1579, 1247, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1687, 1247, 1687, 1687, 1687, 1687, 1687, 1250, 1687, 1687, 1687, 1687, 1687, 1687, 1525, 1247, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1581, 1687, 1581, 1687, 1687, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1687, 1247, 1687, 1687, 1687, 1687, 1687, 1250, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1583, 1583, 1583, 1583, 1583, 1583, 1565, 1609, 1567, 1565, 1565, 1565, 1565, 1565, 1565, 1610, 1565, 1611, 1565, 1611, 1612, 1565, 1613, 1614, 1614, 1614, 1614, 1614, 1614, 1615, 1567, 1565, 1565, 1565, 1565, 1565, 1570, 1565, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1565, 1565, 1565, 1565, 1119, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1687, 1119, 1687, 1687, 1687, 1687, 1687, 1122, 1119, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1687, 1119, 1687, 1687, 1687, 1687, 1687, 1122, 1247, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1687, 1247, 1687, 1687, 1687, 1687, 1687, 1250, 1247, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1687, 1247, 1687, 1687, 1687, 1687, 1687, 1250, 1247, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1618, 1687, 1618, 1687, 1687, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1687, 1247, 1687, 1687, 1687, 1687, 1687, 1250, 1247, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1687, 1247, 1687, 1687, 1687, 1687, 1687, 1250, 1247, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1687, 1247, 1687, 1687, 1687, 1687, 1687, 1250, 1567, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1612, 1687, 1631, 1614, 1614, 1614, 1614, 1614, 1614, 1687, 1567, 1687, 1687, 1687, 1687, 1687, 1570, 1567, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1687, 1567, 1687, 1687, 1687, 1687, 1687, 1570, 1567, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1633, 1687, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1687, 1567, 1687, 1687, 1687, 1687, 1687, 1570, 1687, 1687, 1687, 1634, 1687, 1687, 1635, 1687, 1687, 1687, 1687, 1687, 1687, 1636, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1637, 1565, 1565, 1567, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1638, 1565, 1638, 1639, 1565, 1640, 1641, 1641, 1641, 1641, 1641, 1641, 1565, 1567, 1565, 1565, 1565, 1565, 1565, 1570, 1565, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1565, 1565, 1565, 1565, 1565, 1565, 1567, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1565, 1567, 1565, 1565, 1565, 1565, 1644, 1570, 1565, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1565, 1565, 1565, 1643, 1247, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1687, 1247, 1687, 1687, 1687, 1687, 1687, 1250, 1247, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1687, 1247, 1687, 1687, 1687, 1687, 1687, 1250, 1567, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1687, 1567, 1687, 1687, 1687, 1687, 1687, 1570, 1687, 1687, 1687, 1687, 1687, 1687, 1647, 1567, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1687, 1567, 1687, 1687, 1687, 1687, 1687, 1570, 1687, 1687, 1687, 1687, 1687, 1687, 1635, 1567, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1649, 1687, 1649, 1687, 1687, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1687, 1567, 1687, 1687, 1687, 1687, 1687, 1570, 1567, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1687, 1567, 1687, 1687, 1687, 1687, 1687, 1570, 1687, 1687, 1651, 1651, 1651, 1651, 1651, 1651, 1567, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1639, 1687, 1652, 1641, 1641, 1641, 1641, 1641, 1641, 1687, 1567, 1687, 1687, 1687, 1687, 1687, 1570, 1567, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1687, 1567, 1687, 1687, 1687, 1687, 1687, 1570, 1654, 1687, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1655, 1687, 1687, 1656, 1687, 1687, 1687, 1687, 1687, 1687, 1657, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1658, 1654, 1687, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1565, 1687, 1687, 1656, 1687, 1687, 1687, 1687, 1687, 1687, 1657, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1565, 1565, 1565, 1567, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1565, 1567, 1565, 1565, 1565, 1565, 1660, 1570, 1565, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1565, 1565, 1565, 1659, 1567, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1667, 1687, 1667, 1687, 1687, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1687, 1567, 1687, 1687, 1687, 1687, 1687, 1570, 1567, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1687, 1567, 1687, 1687, 1687, 1687, 1687, 1570, 1567, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1687, 1567, 1687, 1687, 1687, 1687, 1687, 1570, 1654, 1687, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1565, 1687, 1687, 1656, 1687, 1687, 1687, 1687, 1687, 1687, 1657, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1658, 1567, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1687, 1567, 1687, 1687, 1687, 1687, 1687, 1570, 1687, 1687, 1687, 1687, 1687, 1687, 1670, 1567, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1687, 1567, 1687, 1687, 1687, 1687, 1687, 1570, 1687, 1687, 1687, 1687, 1687, 1687, 1656, 1567, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1672, 1687, 1672, 1687, 1687, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1687, 1567, 1687, 1687, 1687, 1687, 1687, 1570, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1674, 1674, 1674, 1674, 1674, 1674, 1567, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1687, 1567, 1687, 1687, 1687, 1687, 1687, 1570, 1567, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1687, 1567, 1687, 1687, 1687, 1687, 1687, 1570, 1567, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1682, 1687, 1682, 1687, 1687, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1687, 1567, 1687, 1687, 1687, 1687, 1687, 1570, 1567, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1687, 1567, 1687, 1687, 1687, 1687, 1687, 1570, 1567, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1687, 1567, 1687, 1687, 1687, 1687, 1687, 1570, 1567, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1687, 1567, 1687, 1687, 1687, 1687, 1687, 1570, 1567, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1687, 1567, 1687, 1687, 1687, 1687, 1687, 1570, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 133, 133, 133, 133, 133, 133, 133, 155, 155, 155, 155, 1687, 1687, 155, 155, 155, 155, 155, 155, 155, 155, 1687, 155, 160, 1687, 1687, 160, 1687, 1687, 1687, 1687, 1687, 1687, 160, 1687, 160, 160, 160, 160, 160, 160, 160, 160, 160, 1687, 160, 258, 258, 258, 258, 1687, 1687, 258, 258, 258, 258, 258, 258, 258, 258, 1687, 258, 264, 1687, 264, 264, 1687, 264, 1687, 264, 1687, 264, 264, 1687, 264, 264, 264, 264, 264, 264, 264, 264, 264, 1687, 264, 306, 1687, 1687, 306, 306, 306, 306, 306, 306, 306, 306, 1687, 306, 323, 1687, 1687, 1687, 323, 1687, 1687, 323, 323, 323, 323, 323, 323, 323, 323, 1687, 323, 342, 342, 1687, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 351, 1687, 1687, 351, 1687, 351, 1687, 351, 351, 1687, 351, 351, 1687, 1687, 351, 351, 351, 351, 351, 351, 351, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 1687, 352, 352, 352, 352, 352, 352, 352, 352, 352, 412, 412, 412, 412, 1687, 1687, 412, 412, 412, 412, 412, 412, 412, 412, 1687, 412, 414, 1687, 1687, 414, 414, 414, 414, 414, 414, 414, 414, 1687, 414, 214, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 214, 214, 1687, 1687, 1687, 1687, 214, 455, 1687, 1687, 1687, 1687, 455, 1687, 455, 1687, 1687, 455, 460, 1687, 1687, 1687, 1687, 460, 1687, 460, 1687, 1687, 460, 466, 1687, 1687, 1687, 1687, 466, 1687, 466, 1687, 1687, 466, 258, 258, 258, 258, 1687, 1687, 258, 258, 258, 258, 258, 258, 258, 258, 1687, 258, 468, 468, 1687, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 264, 1687, 264, 264, 1687, 264, 1687, 264, 1687, 264, 264, 1687, 264, 264, 264, 264, 264, 264, 264, 264, 264, 1687, 264, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 1687, 470, 470, 470, 470, 470, 470, 470, 470, 470, 305, 1687, 1687, 1687, 1687, 1687, 1687, 305, 1687, 1687, 305, 305, 306, 1687, 1687, 306, 306, 306, 306, 306, 306, 306, 306, 1687, 306, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 1687, 511, 511, 511, 511, 511, 511, 511, 511, 511, 526, 526, 526, 526, 526, 526, 526, 323, 1687, 1687, 1687, 323, 1687, 1687, 323, 323, 323, 323, 323, 323, 323, 323, 1687, 323, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 1687, 527, 527, 527, 527, 527, 527, 527, 527, 527, 341, 1687, 1687, 1687, 1687, 341, 341, 341, 342, 342, 1687, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 555, 1687, 555, 555, 1687, 555, 1687, 1687, 1687, 555, 555, 555, 555, 555, 555, 555, 556, 1687, 1687, 556, 556, 556, 556, 556, 556, 556, 556, 1687, 556, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 1687, 352, 352, 352, 352, 352, 352, 352, 352, 352, 160, 1687, 1687, 160, 1687, 1687, 1687, 1687, 1687, 1687, 160, 1687, 160, 160, 160, 160, 160, 160, 160, 160, 160, 1687, 160, 412, 412, 412, 412, 1687, 1687, 412, 412, 412, 412, 412, 412, 412, 412, 1687, 412, 621, 621, 1687, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 414, 1687, 1687, 414, 414, 414, 414, 414, 414, 414, 414, 1687, 414, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 1687, 623, 623, 623, 623, 623, 623, 623, 623, 623, 438, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 438, 438, 1687, 1687, 1687, 438, 438, 438, 226, 1687, 226, 1687, 1687, 1687, 1687, 1687, 226, 226, 1687, 1687, 226, 448, 1687, 1687, 1687, 1687, 1687, 1687, 448, 1687, 1687, 448, 448, 460, 1687, 1687, 1687, 1687, 460, 1687, 460, 1687, 1687, 460, 455, 1687, 1687, 1687, 1687, 455, 1687, 455, 1687, 1687, 455, 466, 1687, 1687, 1687, 1687, 466, 1687, 466, 1687, 1687, 466, 468, 468, 1687, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 1687, 470, 470, 470, 470, 470, 470, 470, 470, 470, 351, 1687, 1687, 351, 1687, 351, 1687, 351, 351, 1687, 351, 351, 1687, 1687, 351, 351, 351, 351, 351, 351, 351, 264, 1687, 264, 264, 1687, 264, 1687, 264, 1687, 264, 264, 1687, 264, 264, 264, 264, 264, 264, 264, 264, 264, 1687, 264, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 1687, 511, 511, 511, 511, 511, 511, 511, 511, 511, 731, 1687, 1687, 1687, 1687, 1687, 731, 1687, 1687, 731, 731, 731, 731, 731, 731, 731, 731, 1687, 731, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 1687, 527, 527, 527, 527, 527, 527, 527, 527, 527, 323, 1687, 1687, 1687, 323, 1687, 1687, 323, 323, 323, 323, 323, 323, 323, 323, 1687, 323, 349, 1687, 349, 1687, 1687, 1687, 1687, 1687, 349, 349, 1687, 1687, 349, 758, 1687, 1687, 758, 758, 758, 758, 758, 758, 758, 758, 1687, 758, 556, 1687, 1687, 556, 556, 556, 556, 556, 556, 556, 556, 1687, 556, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 1687, 760, 760, 760, 760, 760, 760, 760, 760, 760, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 1687, 352, 352, 352, 352, 352, 352, 352, 352, 352, 160, 1687, 1687, 160, 1687, 1687, 1687, 1687, 1687, 1687, 160, 1687, 160, 160, 160, 160, 160, 160, 160, 160, 160, 1687, 160, 775, 1687, 1687, 775, 1687, 775, 1687, 775, 775, 1687, 775, 1687, 775, 1687, 775, 775, 775, 775, 775, 775, 775, 621, 621, 1687, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 1687, 623, 623, 623, 623, 623, 623, 623, 623, 623, 414, 1687, 1687, 414, 414, 414, 414, 414, 414, 414, 414, 1687, 414, 434, 1687, 434, 1687, 1687, 1687, 1687, 1687, 434, 434, 1687, 1687, 434, 652, 1687, 1687, 1687, 1687, 652, 652, 652, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 1687, 470, 470, 470, 470, 470, 470, 470, 470, 470, 264, 1687, 264, 264, 1687, 264, 1687, 264, 1687, 264, 264, 1687, 264, 264, 264, 264, 264, 264, 264, 264, 264, 1687, 264, 716, 1687, 1687, 1687, 1687, 716, 716, 716, 1687, 1687, 1687, 716, 731, 1687, 1687, 1687, 1687, 1687, 731, 1687, 1687, 731, 731, 731, 731, 731, 731, 731, 731, 1687, 731, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 1687, 904, 904, 904, 904, 904, 904, 904, 904, 904, 323, 1687, 323, 1687, 1687, 1687, 323, 1687, 1687, 323, 323, 323, 323, 323, 323, 323, 323, 1687, 323, 750, 1687, 1687, 1687, 1687, 750, 750, 750, 554, 1687, 554, 1687, 1687, 1687, 1687, 1687, 554, 554, 1687, 1687, 554, 758, 1687, 1687, 758, 758, 758, 758, 758, 758, 758, 758, 1687, 758, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 1687, 926, 926, 926, 926, 926, 926, 926, 926, 926, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 1687, 760, 760, 760, 760, 760, 760, 760, 760, 760, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 1687, 352, 352, 352, 352, 352, 352, 352, 352, 352, 160, 1687, 1687, 160, 1687, 1687, 1687, 1687, 1687, 1687, 160, 1687, 160, 160, 160, 160, 160, 160, 160, 160, 160, 1687, 160, 949, 1687, 1687, 949, 949, 949, 949, 949, 949, 949, 949, 1687, 949, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 414, 1687, 1687, 414, 414, 414, 414, 414, 414, 414, 414, 1687, 414, 834, 1687, 1687, 1687, 1687, 834, 834, 834, 838, 1687, 1687, 1687, 1687, 838, 838, 838, 1687, 1687, 1687, 838, 844, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 844, 844, 1687, 1687, 1687, 844, 844, 844, 844, 850, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 850, 850, 1687, 1687, 1687, 850, 850, 850, 850, 856, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 856, 856, 1687, 1687, 1687, 856, 856, 856, 856, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 1687, 470, 470, 470, 470, 470, 470, 470, 470, 470, 874, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 874, 1687, 1687, 1687, 1687, 874, 874, 874, 264, 1687, 264, 264, 1687, 264, 1687, 264, 1687, 264, 264, 1687, 264, 264, 264, 264, 264, 264, 264, 264, 264, 1687, 264, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 1687, 904, 904, 904, 904, 904, 904, 904, 904, 904, 323, 1687, 1687, 1687, 323, 1687, 1687, 323, 323, 323, 323, 323, 323, 323, 323, 1687, 323, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 925, 1687, 1687, 1687, 1687, 925, 925, 925, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 1687, 926, 926, 926, 926, 926, 926, 926, 926, 926, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 1687, 352, 352, 352, 352, 352, 352, 352, 352, 352, 160, 1687, 1687, 160, 1687, 1687, 1687, 1687, 1687, 1687, 160, 1687, 160, 160, 160, 160, 160, 160, 160, 160, 160, 1687, 160, 774, 1687, 774, 1687, 1687, 1687, 1687, 1687, 774, 774, 1687, 1687, 774, 949, 1687, 1687, 949, 949, 949, 949, 949, 949, 949, 949, 1687, 949, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1687, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 775, 1687, 1687, 775, 1687, 775, 1687, 775, 775, 1687, 775, 1687, 775, 1687, 775, 775, 775, 775, 775, 775, 775, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 414, 1687, 1687, 414, 414, 414, 414, 414, 414, 414, 414, 1687, 414, 999, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 999, 1687, 1687, 1687, 1687, 1687, 999, 1687, 1687, 999, 1009, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1009, 1687, 1687, 1687, 1687, 1687, 1009, 1687, 1687, 1009, 1018, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1018, 1687, 1687, 1687, 1687, 1687, 1018, 1687, 1687, 1018, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 1687, 470, 470, 470, 470, 470, 470, 470, 470, 470, 264, 1687, 264, 264, 1687, 264, 1687, 264, 1687, 264, 264, 1687, 264, 264, 264, 264, 264, 264, 264, 264, 264, 1687, 264, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 1687, 904, 904, 904, 904, 904, 904, 904, 904, 904, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 1687, 527, 527, 527, 527, 527, 527, 527, 527, 527, 323, 1687, 323, 1687, 1687, 1687, 323, 1687, 1687, 323, 323, 323, 323, 323, 323, 323, 323, 1687, 323, 775, 1687, 1687, 775, 1687, 775, 1687, 775, 775, 1687, 775, 1687, 1687, 1687, 775, 775, 775, 775, 775, 775, 775, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 1687, 352, 352, 352, 352, 352, 352, 352, 352, 352, 160, 1687, 1687, 160, 1687, 1687, 1687, 1687, 1687, 1687, 160, 1687, 160, 160, 160, 160, 160, 160, 160, 160, 160, 1687, 160, 1107, 1687, 1687, 1687, 1687, 1107, 1107, 1107, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1687, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 414, 1687, 1687, 414, 414, 414, 414, 414, 414, 414, 414, 1687, 414, 1149, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1149, 1687, 1687, 1687, 1687, 1149, 1149, 1149, 1687, 1149, 1154, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1154, 1687, 1687, 1687, 1687, 1154, 1154, 1154, 1687, 1154, 1159, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1159, 1687, 1687, 1687, 1687, 1159, 1159, 1159, 1687, 1159, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 1687, 470, 470, 470, 470, 470, 470, 470, 470, 470, 264, 1687, 264, 264, 1687, 264, 1687, 264, 1687, 264, 264, 1687, 264, 264, 264, 264, 264, 264, 264, 264, 264, 1687, 264, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 1687, 904, 904, 904, 904, 904, 904, 904, 904, 904, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 1687, 527, 527, 527, 527, 527, 527, 527, 527, 527, 323, 1687, 1687, 1687, 323, 1687, 323, 1687, 1687, 1687, 323, 1687, 1687, 323, 323, 323, 323, 323, 323, 323, 323, 1687, 323, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 1687, 760, 760, 760, 760, 760, 760, 760, 760, 760, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 1687, 926, 926, 926, 926, 926, 926, 926, 926, 926, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 15, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687 } ; static yyconst short int yy_chk[14289] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 32, 32, 3, 3, 13, 14, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 5, 3, 5, 6, 6, 19, 6, 13, 14, 31, 34, 34, 19, 19, 19, 124, 19, 19, 66, 66, 68, 68, 124, 19, 87, 87, 296, 19, 19, 296, 3, 31, 3, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 11, 11, 125, 11, 25, 25, 125, 25, 74, 206, 25, 89, 89, 25, 80, 100, 100, 11, 123, 123, 25, 206, 25, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 27, 417, 27, 27, 27, 27, 27, 27, 27, 29, 29, 29, 29, 29, 29, 29, 74, 63, 96, 27, 27, 27, 80, 27, 27, 37, 96, 96, 417, 38, 27, 151, 151, 37, 27, 27, 27, 38, 27, 63, 27, 30, 419, 30, 30, 30, 30, 30, 30, 30, 37, 39, 1681, 37, 38, 85, 199, 38, 133, 39, 40, 30, 43, 419, 30, 105, 105, 39, 40, 99, 43, 30, 105, 38, 38, 133, 39, 85, 199, 39, 99, 99, 99, 30, 41, 40, 44, 43, 40, 204, 43, 42, 41, 202, 44, 106, 106, 39, 39, 42, 40, 204, 43, 106, 43, 45, 40, 40, 204, 41, 202, 44, 41, 45, 44, 46, 42, 103, 44, 42, 41, 103, 103, 46, 209, 42, 1676, 47, 94, 44, 45, 101, 46, 45, 42, 47, 48, 49, 42, 45, 46, 101, 101, 46, 48, 49, 50, 209, 207, 45, 213, 421, 47, 1674, 50, 47, 94, 94, 94, 94, 207, 48, 49, 228, 48, 49, 421, 47, 48, 51, 97, 50, 213, 137, 50, 48, 48, 51, 52, 97, 97, 97, 48, 97, 102, 48, 52, 98, 49, 98, 137, 98, 98, 999, 51, 95, 134, 51, 50, 95, 95, 95, 95, 52, 135, 51, 52, 137, 128, 51, 108, 102, 102, 134, 52, 54, 128, 54, 108, 108, 228, 135, 128, 54, 134, 54, 203, 54, 54, 999, 54, 54, 54, 54, 54, 54, 54, 218, 218, 135, 245, 245, 54, 999, 203, 203, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 55, 205, 247, 247, 248, 248, 107, 55, 55, 55, 107, 55, 55, 231, 107, 107, 205, 158, 55, 879, 205, 879, 55, 55, 59, 158, 59, 59, 59, 59, 59, 59, 59, 61, 61, 61, 61, 61, 61, 61, 62, 81, 158, 81, 81, 81, 81, 81, 81, 81, 136, 138, 215, 62, 323, 62, 62, 62, 62, 62, 62, 62, 62, 71, 71, 1666, 71, 136, 138, 71, 231, 323, 71, 62, 215, 220, 62, 139, 226, 71, 76, 71, 136, 62, 265, 265, 138, 76, 76, 76, 490, 76, 76, 145, 139, 62, 64, 220, 76, 490, 226, 145, 76, 76, 235, 139, 64, 145, 64, 64, 145, 64, 64, 64, 64, 64, 64, 64, 83, 83, 83, 83, 83, 83, 83, 84, 235, 84, 84, 636, 84, 84, 84, 214, 483, 84, 140, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 160, 84, 84, 84, 483, 140, 164, 214, 160, 636, 84, 175, 84, 84, 164, 320, 84, 84, 320, 175, 84, 214, 140, 387, 84, 160, 84, 387, 160, 267, 267, 164, 84, 304, 164, 84, 175, 84, 92, 175, 92, 286, 286, 92, 92, 304, 92, 175, 92, 304, 92, 164, 92, 141, 141, 141, 141, 141, 141, 141, 104, 418, 92, 92, 92, 418, 92, 104, 104, 338, 338, 327, 104, 104, 104, 420, 109, 104, 109, 420, 326, 109, 109, 109, 109, 109, 109, 109, 327, 149, 149, 149, 149, 149, 149, 149, 92, 326, 92, 93, 423, 93, 385, 385, 93, 93, 327, 93, 423, 93, 149, 93, 216, 93, 150, 150, 150, 150, 150, 150, 150, 326, 163, 93, 93, 93, 1665, 93, 325, 349, 163, 152, 625, 152, 216, 150, 152, 152, 152, 152, 152, 152, 152, 93, 93, 325, 165, 163, 216, 325, 163, 349, 404, 404, 165, 386, 625, 93, 166, 93, 161, 422, 386, 406, 406, 422, 166, 165, 161, 163, 161, 165, 161, 161, 165, 161, 161, 161, 161, 161, 161, 161, 161, 166, 167, 271, 166, 208, 1383, 168, 169, 208, 167, 271, 170, 171, 172, 168, 169, 208, 173, 1383, 170, 171, 172, 208, 407, 407, 173, 167, 271, 730, 167, 166, 168, 169, 167, 168, 169, 170, 171, 172, 170, 171, 172, 173, 170, 174, 173, 176, 331, 395, 426, 177, 169, 174, 730, 176, 168, 172, 426, 177, 178, 173, 428, 328, 171, 331, 176, 176, 178, 416, 174, 395, 176, 174, 179, 176, 177, 174, 434, 177, 328, 428, 179, 180, 182, 178, 416, 331, 178, 181, 330, 180, 182, 183, 177, 402, 1662, 181, 402, 179, 434, 183, 179, 328, 181, 184, 178, 330, 180, 182, 424, 180, 182, 184, 181, 180, 185, 181, 183, 329, 186, 183, 632, 179, 185, 330, 187, 424, 186, 182, 184, 188, 409, 184, 187, 409, 329, 632, 183, 188, 237, 185, 189, 488, 185, 186, 827, 402, 186, 190, 189, 187, 185, 329, 187, 488, 188, 190, 191, 188, 186, 184, 237, 186, 425, 192, 191, 189, 390, 827, 189, 1651, 187, 192, 190, 237, 390, 190, 188, 237, 497, 425, 390, 191, 409, 189, 191, 194, 194, 194, 192, 194, 194, 192, 442, 442, 497, 477, 194, 192, 716, 191, 194, 194, 190, 195, 197, 197, 197, 197, 197, 197, 197, 547, 547, 195, 716, 195, 195, 477, 195, 195, 195, 195, 195, 195, 195, 196, 498, 196, 196, 196, 196, 196, 196, 196, 211, 211, 211, 211, 211, 211, 211, 244, 249, 498, 196, 196, 196, 438, 196, 196, 427, 244, 249, 244, 249, 196, 244, 249, 828, 196, 196, 198, 427, 198, 345, 427, 198, 198, 828, 438, 198, 198, 345, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 251, 482, 198, 198, 198, 353, 345, 438, 482, 485, 251, 198, 251, 353, 198, 251, 485, 219, 1645, 219, 503, 198, 219, 219, 219, 219, 219, 219, 219, 514, 353, 526, 503, 198, 489, 353, 198, 514, 198, 217, 223, 489, 223, 223, 223, 223, 223, 223, 223, 217, 526, 217, 217, 1629, 217, 217, 217, 217, 217, 217, 217, 224, 224, 224, 224, 224, 224, 224, 225, 675, 225, 225, 225, 225, 225, 225, 225, 233, 233, 233, 233, 233, 233, 233, 1629, 500, 501, 554, 225, 628, 501, 225, 500, 675, 229, 628, 229, 439, 225, 229, 229, 229, 229, 229, 229, 229, 232, 530, 232, 554, 225, 232, 232, 232, 232, 232, 232, 232, 236, 236, 439, 236, 236, 236, 530, 1631, 236, 439, 236, 530, 236, 236, 236, 236, 236, 236, 236, 236, 435, 439, 236, 236, 236, 303, 303, 303, 303, 303, 303, 303, 357, 236, 236, 435, 435, 1630, 236, 697, 357, 647, 435, 697, 250, 236, 250, 236, 528, 250, 250, 250, 250, 250, 250, 250, 236, 357, 236, 253, 357, 253, 253, 647, 253, 253, 253, 528, 698, 253, 630, 253, 698, 253, 305, 305, 305, 305, 305, 305, 305, 253, 630, 253, 253, 253, 339, 339, 339, 339, 339, 339, 339, 516, 253, 633, 360, 602, 253, 253, 602, 516, 305, 633, 360, 337, 253, 337, 253, 877, 337, 337, 337, 337, 337, 337, 337, 253, 305, 253, 264, 360, 264, 518, 360, 264, 264, 516, 264, 877, 264, 518, 264, 696, 264, 340, 340, 340, 340, 340, 340, 340, 696, 360, 264, 264, 264, 346, 264, 346, 346, 346, 346, 346, 346, 346, 347, 347, 347, 347, 347, 347, 347, 518, 608, 608, 987, 354, 393, 393, 393, 393, 393, 393, 393, 354, 1628, 408, 264, 408, 264, 266, 408, 408, 408, 408, 408, 408, 408, 266, 987, 266, 354, 266, 266, 354, 266, 266, 266, 266, 266, 266, 266, 266, 643, 643, 266, 270, 627, 270, 354, 447, 270, 270, 355, 270, 356, 270, 358, 270, 359, 270, 355, 447, 356, 627, 358, 447, 359, 522, 361, 270, 270, 270, 767, 270, 356, 522, 361, 355, 634, 356, 355, 358, 356, 359, 358, 634, 359, 367, 367, 370, 629, 480, 359, 361, 767, 367, 361, 370, 367, 480, 515, 358, 522, 270, 355, 270, 272, 629, 515, 694, 367, 480, 367, 361, 370, 367, 272, 370, 272, 272, 694, 272, 272, 272, 272, 272, 272, 272, 348, 362, 348, 348, 348, 348, 348, 348, 348, 362, 365, 370, 1606, 637, 517, 480, 363, 515, 365, 520, 348, 451, 517, 348, 363, 637, 362, 520, 712, 362, 348, 451, 364, 451, 712, 365, 451, 362, 365, 366, 364, 363, 348, 350, 363, 350, 350, 366, 350, 350, 350, 350, 350, 350, 350, 365, 363, 364, 368, 517, 364, 703, 520, 369, 366, 525, 368, 366, 703, 371, 372, 369, 364, 525, 649, 649, 373, 371, 372, 524, 680, 374, 366, 368, 373, 372, 368, 524, 369, 374, 368, 369, 375, 890, 371, 372, 369, 371, 372, 890, 375, 373, 376, 377, 373, 525, 374, 371, 680, 374, 376, 377, 373, 378, 673, 379, 374, 375, 487, 673, 375, 378, 535, 379, 380, 381, 487, 376, 377, 529, 376, 377, 380, 381, 1605, 524, 382, 383, 378, 535, 379, 378, 375, 379, 382, 383, 529, 376, 819, 380, 381, 535, 380, 381, 378, 379, 452, 631, 487, 377, 380, 382, 383, 819, 382, 383, 452, 529, 452, 484, 487, 452, 382, 429, 631, 429, 381, 484, 429, 429, 429, 429, 429, 429, 429, 679, 679, 1604, 383, 392, 679, 392, 392, 392, 392, 392, 392, 392, 431, 889, 431, 431, 431, 431, 431, 431, 431, 519, 392, 392, 392, 658, 392, 392, 692, 519, 484, 889, 521, 392, 523, 484, 692, 392, 392, 394, 521, 394, 523, 707, 394, 394, 707, 658, 532, 394, 532, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 457, 821, 394, 394, 394, 519, 532, 521, 658, 493, 457, 394, 457, 533, 394, 457, 821, 493, 523, 463, 635, 394, 432, 432, 432, 432, 432, 432, 432, 463, 533, 463, 891, 394, 463, 536, 394, 635, 394, 396, 533, 396, 493, 536, 396, 396, 685, 685, 396, 396, 891, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 493, 1293, 396, 396, 396, 436, 436, 436, 436, 436, 436, 436, 534, 531, 396, 709, 1293, 536, 660, 691, 709, 396, 440, 440, 440, 440, 440, 440, 440, 534, 531, 677, 677, 396, 531, 702, 396, 677, 396, 397, 660, 397, 731, 440, 397, 397, 702, 691, 397, 397, 534, 397, 437, 397, 397, 397, 397, 397, 397, 397, 397, 731, 660, 397, 397, 397, 575, 437, 437, 437, 437, 437, 437, 437, 437, 397, 575, 441, 441, 441, 441, 441, 441, 441, 443, 774, 443, 1603, 575, 443, 443, 443, 443, 443, 443, 443, 695, 397, 441, 397, 398, 699, 398, 486, 695, 398, 398, 774, 704, 699, 398, 486, 398, 701, 398, 446, 446, 446, 446, 446, 446, 446, 701, 1585, 398, 398, 398, 706, 448, 448, 448, 448, 448, 448, 448, 450, 704, 450, 706, 486, 450, 450, 450, 450, 450, 450, 450, 453, 453, 453, 453, 453, 453, 453, 715, 486, 448, 715, 398, 838, 398, 430, 458, 458, 458, 458, 458, 458, 458, 747, 747, 430, 448, 430, 430, 838, 430, 430, 430, 430, 430, 430, 430, 433, 1583, 433, 433, 433, 433, 433, 433, 433, 461, 461, 461, 461, 461, 461, 461, 700, 708, 887, 710, 433, 711, 820, 433, 700, 708, 710, 887, 711, 820, 433, 462, 462, 462, 462, 462, 462, 462, 754, 754, 831, 831, 433, 454, 464, 464, 464, 464, 464, 464, 464, 475, 475, 475, 475, 475, 475, 475, 454, 454, 454, 454, 454, 454, 454, 454, 474, 494, 474, 474, 474, 474, 474, 474, 474, 494, 492, 495, 823, 1562, 718, 496, 491, 491, 492, 495, 454, 454, 718, 496, 491, 826, 662, 491, 822, 826, 496, 823, 454, 456, 456, 822, 456, 456, 456, 491, 880, 456, 492, 456, 499, 456, 456, 456, 662, 495, 504, 494, 499, 494, 824, 456, 456, 456, 504, 664, 880, 824, 492, 495, 502, 506, 456, 496, 491, 505, 662, 456, 502, 506, 507, 513, 544, 505, 456, 1051, 456, 664, 507, 513, 1561, 734, 504, 734, 825, 456, 744, 456, 459, 1051, 499, 825, 499, 867, 744, 544, 666, 506, 504, 664, 734, 502, 544, 459, 459, 459, 459, 459, 459, 459, 459, 713, 502, 506, 544, 867, 505, 505, 666, 713, 905, 507, 507, 513, 541, 541, 541, 541, 541, 541, 541, 459, 459, 542, 542, 542, 542, 542, 542, 542, 666, 905, 878, 459, 465, 763, 545, 545, 545, 545, 545, 545, 545, 763, 713, 881, 881, 668, 878, 465, 465, 465, 465, 465, 465, 465, 465, 545, 546, 546, 546, 546, 546, 546, 546, 548, 883, 548, 883, 668, 548, 548, 548, 548, 548, 548, 548, 465, 465, 546, 551, 1560, 551, 551, 551, 551, 551, 551, 551, 465, 467, 668, 467, 467, 902, 467, 467, 467, 882, 882, 467, 735, 467, 735, 467, 467, 467, 467, 467, 467, 467, 467, 467, 776, 467, 467, 467, 886, 886, 902, 735, 776, 467, 467, 467, 467, 467, 467, 874, 467, 467, 888, 884, 467, 888, 735, 738, 467, 738, 467, 552, 552, 552, 552, 552, 552, 552, 938, 467, 1303, 467, 471, 884, 471, 558, 738, 471, 471, 561, 471, 564, 471, 558, 471, 1303, 471, 561, 738, 564, 938, 705, 874, 565, 922, 922, 471, 471, 471, 705, 558, 565, 471, 566, 561, 558, 564, 561, 565, 564, 893, 566, 568, 893, 567, 945, 945, 829, 565, 561, 568, 565, 567, 705, 564, 829, 1195, 863, 566, 1195, 471, 566, 471, 472, 705, 863, 991, 568, 566, 567, 568, 472, 567, 472, 568, 472, 472, 871, 472, 472, 472, 472, 472, 472, 472, 472, 473, 567, 991, 570, 1050, 988, 871, 871, 473, 988, 473, 570, 473, 473, 1050, 473, 473, 473, 473, 473, 473, 473, 473, 476, 571, 569, 572, 736, 570, 736, 993, 570, 571, 569, 572, 1559, 476, 570, 476, 476, 476, 476, 476, 476, 476, 1000, 736, 573, 993, 571, 569, 572, 571, 569, 572, 573, 476, 912, 990, 476, 569, 908, 990, 908, 992, 912, 476, 617, 992, 736, 617, 571, 573, 572, 1054, 573, 617, 617, 476, 478, 908, 478, 573, 1595, 478, 478, 574, 478, 577, 478, 576, 478, 1054, 478, 574, 1000, 577, 1378, 576, 1595, 578, 580, 579, 478, 478, 478, 907, 478, 578, 580, 579, 574, 1378, 577, 574, 576, 577, 579, 576, 617, 577, 574, 478, 907, 576, 578, 580, 579, 578, 580, 579, 907, 1004, 580, 965, 581, 578, 478, 1385, 478, 479, 1144, 479, 581, 1385, 479, 479, 582, 479, 585, 479, 583, 479, 584, 479, 582, 965, 585, 1144, 583, 581, 584, 965, 581, 479, 479, 479, 581, 479, 1010, 795, 795, 582, 1536, 585, 582, 583, 585, 584, 583, 818, 584, 1004, 818, 1535, 585, 586, 582, 587, 818, 818, 584, 479, 795, 586, 909, 587, 640, 479, 795, 479, 553, 583, 553, 553, 553, 553, 553, 553, 553, 588, 586, 909, 587, 586, 914, 587, 1396, 588, 1010, 640, 553, 586, 914, 553, 931, 931, 640, 989, 909, 1396, 553, 818, 1002, 1002, 588, 989, 587, 588, 640, 931, 1012, 1012, 553, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 1534, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 562, 1021, 1021, 589, 740, 1049, 740, 1040, 562, 1049, 562, 589, 562, 562, 1477, 562, 562, 562, 562, 562, 562, 562, 885, 740, 590, 562, 563, 892, 589, 1040, 885, 589, 590, 740, 563, 892, 563, 1531, 563, 563, 1477, 563, 563, 563, 563, 563, 563, 563, 609, 590, 609, 563, 590, 609, 609, 609, 609, 609, 609, 609, 618, 618, 618, 618, 618, 618, 618, 1033, 1033, 1311, 590, 604, 1001, 604, 885, 1014, 604, 604, 1311, 892, 1520, 604, 1033, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 1019, 1508, 604, 604, 604, 619, 619, 619, 619, 619, 619, 619, 672, 1300, 604, 1001, 910, 613, 910, 613, 672, 604, 613, 613, 613, 613, 613, 613, 613, 1001, 844, 1506, 1014, 604, 1300, 910, 604, 672, 604, 605, 1007, 605, 672, 1023, 605, 605, 1380, 910, 1380, 605, 1019, 605, 844, 605, 605, 605, 605, 605, 605, 605, 605, 639, 1007, 605, 605, 605, 638, 638, 638, 638, 638, 638, 638, 844, 844, 605, 639, 639, 639, 639, 639, 639, 639, 639, 1007, 1052, 641, 641, 641, 641, 641, 641, 641, 1023, 1066, 1052, 911, 605, 1066, 605, 610, 970, 610, 778, 1055, 610, 610, 641, 1379, 1055, 610, 778, 610, 911, 610, 642, 642, 642, 642, 642, 642, 642, 1495, 970, 610, 610, 610, 1310, 778, 970, 911, 778, 644, 1379, 644, 778, 642, 644, 644, 644, 644, 644, 644, 644, 648, 970, 648, 850, 1310, 648, 648, 648, 648, 648, 648, 648, 1056, 1056, 610, 1386, 610, 620, 1388, 620, 770, 1494, 620, 620, 1388, 850, 620, 620, 770, 620, 1386, 620, 620, 620, 620, 620, 620, 620, 620, 1064, 1064, 620, 620, 620, 1493, 770, 850, 850, 770, 620, 620, 620, 620, 620, 620, 1009, 1011, 770, 1104, 1104, 620, 650, 650, 650, 650, 650, 650, 650, 651, 651, 651, 651, 651, 651, 651, 620, 1593, 620, 656, 656, 656, 656, 656, 656, 656, 657, 657, 1065, 657, 657, 657, 1009, 1011, 657, 1065, 657, 1593, 657, 657, 657, 657, 657, 657, 657, 657, 1009, 1011, 657, 657, 657, 748, 748, 748, 748, 748, 748, 748, 1085, 657, 682, 1129, 1125, 1382, 657, 1382, 1085, 739, 1398, 739, 1125, 657, 684, 657, 1398, 682, 682, 682, 682, 682, 682, 682, 657, 1129, 657, 659, 739, 684, 684, 684, 684, 684, 684, 684, 1492, 659, 682, 659, 659, 1016, 659, 659, 659, 659, 659, 659, 659, 663, 684, 739, 749, 749, 749, 749, 749, 749, 749, 663, 1142, 663, 663, 1016, 663, 663, 663, 663, 663, 663, 663, 667, 1143, 1480, 751, 1074, 1384, 1074, 1384, 856, 1143, 667, 1142, 667, 667, 1016, 667, 667, 667, 667, 667, 667, 667, 670, 1074, 670, 670, 751, 670, 670, 670, 856, 1018, 670, 751, 670, 1392, 670, 670, 670, 670, 670, 670, 670, 670, 670, 751, 670, 670, 670, 1467, 1163, 856, 856, 1297, 670, 670, 670, 670, 670, 670, 1392, 670, 670, 1297, 942, 670, 1071, 1018, 686, 670, 686, 670, 1163, 686, 686, 686, 686, 686, 686, 686, 670, 1018, 670, 671, 1465, 671, 671, 942, 671, 671, 671, 1071, 1020, 671, 942, 671, 1071, 671, 752, 752, 752, 752, 752, 752, 752, 671, 942, 671, 671, 671, 765, 765, 765, 765, 765, 765, 765, 1298, 671, 752, 1473, 1464, 671, 671, 1393, 765, 1393, 1298, 1020, 746, 671, 746, 671, 1473, 746, 746, 746, 746, 746, 746, 746, 671, 1020, 671, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 1463, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 681, 753, 753, 753, 753, 753, 753, 753, 1381, 1090, 1090, 1097, 1097, 681, 1462, 681, 681, 681, 681, 681, 681, 681, 753, 755, 1090, 755, 1097, 1381, 755, 755, 755, 755, 755, 755, 755, 1026, 681, 1165, 1165, 1172, 1172, 1227, 764, 681, 764, 764, 764, 764, 764, 764, 764, 1404, 1165, 1072, 1172, 681, 689, 1026, 689, 764, 1404, 689, 689, 1227, 689, 1395, 689, 1395, 689, 771, 689, 771, 771, 771, 771, 771, 771, 771, 1072, 1026, 689, 689, 689, 1072, 689, 772, 772, 772, 772, 772, 772, 772, 810, 1387, 810, 1680, 689, 810, 810, 810, 810, 810, 810, 810, 1680, 777, 1117, 1069, 1387, 1397, 779, 1397, 780, 777, 689, 1069, 689, 690, 779, 690, 780, 1069, 690, 690, 781, 690, 1132, 690, 1117, 690, 777, 690, 781, 777, 1117, 779, 782, 780, 779, 1057, 780, 690, 690, 690, 782, 690, 779, 1057, 1132, 781, 1223, 783, 781, 1394, 1132, 786, 781, 777, 1223, 783, 690, 782, 780, 786, 782, 812, 812, 812, 812, 812, 812, 812, 1394, 1201, 1461, 690, 783, 690, 717, 783, 786, 1469, 1201, 786, 1201, 1469, 717, 782, 717, 1057, 717, 717, 1354, 717, 717, 717, 717, 717, 717, 717, 1354, 1201, 783, 717, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 1460, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 1459, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 766, 785, 766, 766, 766, 766, 766, 766, 766, 785, 793, 794, 794, 1213, 1213, 1294, 1475, 766, 793, 794, 766, 1475, 1257, 766, 1272, 1272, 785, 1307, 1213, 785, 766, 1294, 1294, 785, 794, 793, 794, 1307, 793, 1272, 794, 1443, 766, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 1257, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 773, 784, 773, 773, 773, 773, 773, 773, 773, 784, 787, 788, 1146, 1260, 915, 915, 789, 1263, 787, 788, 773, 1308, 915, 773, 789, 790, 784, 1146, 1146, 784, 773, 1308, 791, 790, 1439, 787, 788, 915, 787, 788, 791, 789, 773, 915, 789, 916, 916, 792, 796, 1390, 790, 784, 1403, 790, 788, 792, 796, 791, 1358, 790, 791, 787, 1146, 1260, 1401, 789, 1390, 1263, 916, 1403, 1401, 941, 792, 796, 916, 792, 796, 1197, 791, 941, 1358, 792, 813, 813, 813, 813, 813, 813, 813, 815, 815, 815, 815, 815, 815, 815, 941, 796, 811, 941, 811, 951, 1197, 811, 811, 1437, 1466, 1197, 811, 951, 811, 941, 811, 811, 811, 832, 832, 832, 832, 832, 832, 832, 811, 811, 811, 830, 951, 830, 1466, 951, 830, 830, 830, 830, 830, 830, 830, 833, 833, 833, 833, 833, 833, 833, 835, 835, 835, 835, 835, 835, 835, 951, 1391, 1076, 1427, 1076, 811, 1474, 811, 814, 1230, 814, 955, 1474, 814, 814, 1399, 1391, 1416, 814, 955, 814, 1076, 814, 814, 814, 814, 814, 814, 814, 814, 1399, 1230, 814, 814, 814, 1400, 955, 1230, 1076, 955, 814, 814, 814, 814, 814, 814, 1410, 955, 964, 964, 1400, 814, 836, 836, 836, 836, 836, 836, 836, 841, 841, 841, 841, 841, 841, 841, 814, 1458, 814, 816, 1482, 964, 816, 1479, 1482, 1458, 1471, 964, 816, 816, 816, 816, 816, 816, 816, 840, 1471, 840, 840, 840, 840, 840, 840, 840, 846, 1479, 846, 846, 846, 846, 846, 846, 846, 847, 847, 847, 847, 847, 847, 847, 852, 1496, 852, 852, 852, 852, 852, 852, 852, 1496, 1486, 816, 839, 853, 853, 853, 853, 853, 853, 853, 1236, 1488, 839, 1486, 839, 839, 1488, 839, 839, 839, 839, 839, 839, 839, 842, 858, 858, 858, 858, 858, 858, 858, 1236, 968, 968, 971, 971, 842, 1236, 842, 842, 842, 842, 842, 842, 842, 864, 959, 864, 864, 864, 864, 864, 864, 864, 959, 968, 842, 971, 1292, 842, 1292, 968, 864, 971, 963, 963, 842, 1544, 1292, 1544, 1292, 959, 963, 842, 959, 870, 1149, 870, 842, 843, 870, 870, 870, 870, 870, 870, 870, 963, 1555, 963, 1555, 1377, 843, 963, 843, 843, 843, 843, 843, 843, 843, 865, 865, 865, 865, 865, 865, 865, 872, 872, 872, 872, 872, 872, 872, 843, 865, 873, 1389, 1149, 1538, 1487, 843, 1376, 1468, 1538, 1149, 1487, 1389, 843, 845, 1389, 873, 873, 873, 873, 873, 873, 873, 1468, 845, 1154, 845, 845, 1304, 845, 845, 845, 845, 845, 845, 845, 848, 918, 918, 918, 918, 918, 918, 918, 1304, 1304, 1077, 1375, 1077, 848, 1545, 848, 848, 848, 848, 848, 848, 848, 919, 919, 919, 919, 919, 919, 919, 1077, 1470, 1472, 1154, 848, 1295, 1545, 848, 1077, 1374, 1154, 972, 966, 966, 848, 1295, 1470, 1472, 1600, 972, 966, 848, 1295, 921, 1159, 921, 848, 849, 921, 921, 921, 921, 921, 921, 921, 966, 972, 966, 1600, 972, 849, 966, 849, 849, 849, 849, 849, 849, 849, 923, 923, 923, 923, 923, 923, 923, 924, 924, 924, 924, 924, 924, 924, 849, 952, 1478, 1484, 1159, 1540, 1590, 849, 1590, 952, 1540, 1159, 1478, 1484, 849, 851, 960, 943, 943, 943, 943, 943, 943, 943, 960, 851, 952, 851, 851, 952, 851, 851, 851, 851, 851, 851, 851, 854, 943, 1491, 1373, 960, 1199, 1602, 960, 1082, 1082, 1027, 960, 1491, 854, 952, 854, 854, 854, 854, 854, 854, 854, 1602, 929, 929, 929, 929, 929, 929, 929, 1199, 1082, 1027, 854, 1537, 1199, 854, 1082, 929, 1539, 953, 1542, 1589, 854, 929, 1027, 1542, 1537, 953, 1027, 854, 1075, 1539, 1075, 1027, 854, 855, 944, 944, 944, 944, 944, 944, 944, 1589, 953, 1084, 1084, 953, 855, 1075, 855, 855, 855, 855, 855, 855, 855, 944, 930, 930, 930, 930, 930, 930, 930, 953, 1305, 1372, 1084, 954, 1543, 855, 1075, 930, 1084, 1543, 1305, 954, 855, 930, 1476, 1371, 946, 1305, 946, 855, 857, 946, 946, 946, 946, 946, 946, 946, 954, 1476, 857, 954, 857, 1556, 1370, 857, 857, 857, 857, 857, 857, 857, 857, 954, 935, 1546, 935, 935, 935, 935, 935, 935, 935, 1546, 1556, 857, 1296, 1369, 1402, 857, 859, 935, 859, 859, 1368, 859, 859, 859, 1402, 1296, 859, 1402, 859, 1296, 859, 859, 859, 859, 859, 859, 859, 859, 859, 1245, 859, 859, 859, 1120, 1120, 1306, 1081, 1081, 859, 859, 859, 859, 859, 859, 1081, 859, 859, 1367, 1306, 859, 859, 1245, 1306, 859, 1547, 859, 1120, 1245, 1549, 1081, 1547, 859, 1120, 1549, 859, 1081, 859, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 1366, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 866, 1490, 866, 866, 866, 866, 866, 866, 866, 936, 936, 936, 936, 936, 936, 936, 1302, 866, 1302, 1596, 866, 1541, 1552, 866, 936, 1481, 1302, 1490, 1302, 1365, 866, 984, 984, 984, 984, 984, 984, 984, 1541, 1552, 1481, 1596, 866, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 1350, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 875, 1483, 875, 1485, 1548, 875, 875, 958, 875, 1550, 875, 961, 875, 962, 875, 958, 1483, 1548, 1485, 961, 1339, 962, 1550, 1622, 875, 875, 875, 1489, 875, 1062, 1062, 1062, 958, 1062, 1062, 958, 961, 875, 962, 961, 1062, 962, 1489, 1622, 1062, 1062, 1312, 958, 994, 994, 994, 994, 994, 994, 994, 1312, 961, 1312, 875, 1321, 875, 876, 1319, 876, 962, 1551, 876, 876, 1151, 876, 1551, 876, 1646, 876, 1312, 876, 995, 995, 995, 995, 995, 995, 995, 1151, 1151, 876, 876, 876, 1003, 876, 1003, 1123, 1123, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1013, 1234, 1013, 1646, 1614, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1156, 876, 1123, 1234, 1234, 1314, 1151, 876, 1123, 876, 903, 1234, 903, 1553, 1614, 1156, 1156, 1234, 1553, 1022, 903, 1022, 903, 1326, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1290, 1557, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1557, 1624, 903, 903, 903, 1326, 903, 903, 1031, 1558, 1156, 1326, 1289, 903, 1031, 1558, 1624, 903, 903, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 928, 1110, 928, 928, 928, 928, 928, 928, 928, 1110, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 928, 1122, 1554, 1592, 1591, 1592, 928, 1554, 1032, 1110, 1591, 1288, 1110, 928, 1032, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1594, 1122, 1594, 928, 932, 1287, 932, 1122, 1038, 932, 932, 932, 932, 932, 932, 932, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1122, 932, 934, 934, 934, 934, 934, 934, 934, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1286, 934, 1102, 934, 934, 934, 934, 934, 934, 937, 1102, 937, 937, 937, 937, 937, 937, 937, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1044, 937, 1102, 1598, 937, 1102, 1597, 937, 1597, 1598, 1599, 1285, 1599, 1102, 937, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1601, 1284, 1601, 1283, 937, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 956, 1083, 1083, 1112, 1134, 1134, 1205, 1205, 956, 1083, 956, 1112, 956, 956, 1205, 956, 956, 956, 956, 956, 956, 956, 1282, 1281, 1083, 956, 957, 1134, 1112, 1205, 1083, 1112, 1610, 1134, 957, 1205, 957, 1112, 957, 957, 1610, 957, 957, 957, 957, 957, 957, 957, 1280, 1278, 1277, 957, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 985, 1623, 985, 1625, 1686, 985, 985, 1623, 1276, 1405, 985, 1275, 985, 1686, 985, 985, 985, 985, 985, 985, 985, 985, 1270, 1625, 985, 985, 985, 1037, 1244, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1405, 1037, 1118, 1118, 1627, 1626, 1405, 1244, 1091, 1405, 1118, 1626, 1244, 1244, 1244, 985, 1405, 985, 986, 1627, 986, 1264, 1254, 986, 986, 1118, 1253, 1118, 986, 1252, 986, 1118, 986, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1206, 1206, 986, 986, 986, 1208, 1208, 1231, 1092, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1206, 1095, 1299, 1216, 1299, 1208, 1206, 1095, 1096, 1211, 1204, 1208, 1299, 986, 1096, 986, 998, 1103, 1299, 1103, 1196, 1194, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 998, 1193, 998, 998, 998, 998, 998, 998, 998, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 998, 1111, 1221, 1115, 1192, 1191, 1309, 998, 1309, 1111, 1221, 1115, 1190, 1189, 998, 1188, 1309, 1114, 1187, 998, 1008, 1186, 1309, 1185, 1116, 1114, 1111, 1221, 1115, 1111, 1221, 1115, 1116, 1008, 1184, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1114, 1248, 1248, 1114, 1115, 1183, 1221, 1116, 1111, 1114, 1116, 1217, 1133, 1133, 1008, 1207, 1207, 1411, 1202, 1217, 1133, 1008, 1116, 1207, 1248, 1411, 1698, 1202, 1008, 1202, 1248, 1698, 1698, 1008, 1017, 1133, 1217, 1133, 1207, 1217, 1182, 1133, 1411, 1181, 1207, 1411, 1202, 1017, 1203, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1145, 1203, 1145, 1203, 1217, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1705, 1202, 1017, 1407, 1180, 1705, 1705, 1179, 1203, 1017, 1174, 1141, 1407, 1709, 1407, 1203, 1017, 1140, 1709, 1709, 1139, 1017, 1028, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1138, 1407, 1028, 1137, 1028, 1028, 1136, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1029, 1135, 1029, 1029, 1407, 1029, 1029, 1029, 1109, 1108, 1029, 1107, 1029, 1099, 1029, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1029, 1080, 1029, 1029, 1029, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1070, 1029, 1148, 1726, 1068, 1029, 1029, 1067, 1726, 1726, 1029, 1063, 1060, 1029, 1059, 1029, 1058, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1029, 1053, 1029, 1030, 1048, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1250, 1030, 1251, 1251, 1045, 1035, 997, 1030, 1166, 1148, 1150, 983, 1150, 982, 1030, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1250, 981, 980, 1251, 1030, 1034, 1250, 1034, 979, 1251, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 978, 1153, 977, 976, 975, 1250, 974, 973, 1034, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 950, 1036, 1320, 1036, 1036, 1036, 1036, 1036, 1036, 1039, 1320, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 949, 1039, 1320, 1153, 1039, 1320, 933, 1039, 1167, 927, 1155, 926, 1155, 925, 1039, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1320, 917, 913, 904, 1039, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1046, 1158, 1046, 901, 900, 1046, 1046, 899, 1046, 898, 1046, 897, 1046, 896, 1046, 1265, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 895, 1046, 1046, 1046, 1161, 1046, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 894, 1265, 860, 834, 1046, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1733, 809, 808, 1158, 807, 1733, 1733, 806, 1170, 805, 1046, 1265, 1046, 1047, 1170, 1047, 804, 1265, 1047, 1047, 1266, 1047, 803, 1047, 802, 1047, 801, 1047, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 800, 799, 1047, 1047, 1047, 1345, 1047, 1266, 1171, 1324, 797, 1316, 1316, 775, 1171, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 761, 1324, 1324, 760, 759, 1345, 1047, 1266, 1209, 1324, 758, 1345, 1316, 1266, 1047, 1324, 1047, 1061, 1316, 1061, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1061, 750, 1061, 745, 743, 742, 741, 1334, 1210, 732, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 729, 728, 727, 726, 725, 1061, 1061, 1061, 1214, 1061, 1061, 724, 1334, 723, 722, 721, 1061, 1334, 1334, 1334, 1061, 1061, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1078, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1078, 720, 1078, 719, 1078, 1078, 714, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1079, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1079, 693, 1079, 687, 1079, 1079, 683, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1089, 676, 1089, 674, 653, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 652, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1089, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1215, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1093, 1348, 1093, 1093, 1093, 1093, 1093, 1093, 626, 624, 623, 1361, 1336, 1093, 1094, 622, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1348, 1246, 1246, 1336, 1336, 1348, 1348, 1348, 1094, 1246, 1361, 1336, 621, 1742, 1094, 616, 1361, 1336, 1742, 1742, 615, 1094, 1748, 612, 1246, 607, 1246, 1748, 1748, 606, 1246, 603, 1755, 1094, 1098, 601, 1098, 1755, 1755, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 600, 1098, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 599, 1100, 598, 1100, 1100, 1100, 1100, 1100, 1100, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1126, 1315, 1315, 597, 1349, 1760, 596, 595, 594, 1315, 1760, 1760, 1126, 593, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1256, 1126, 592, 1315, 591, 1349, 559, 1126, 1127, 1315, 1349, 1349, 1349, 1422, 557, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 556, 1127, 555, 540, 1313, 539, 1422, 1127, 1128, 538, 537, 1432, 1422, 1313, 527, 1313, 512, 511, 508, 481, 1128, 1256, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1352, 1128, 1343, 1313, 1432, 470, 469, 1128, 468, 1313, 1432, 1128, 466, 460, 1128, 1313, 1343, 1343, 1313, 455, 415, 1128, 1352, 414, 1343, 1313, 1762, 1352, 1352, 1352, 1343, 1762, 1762, 1128, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1160, 1763, 413, 412, 411, 405, 1763, 1763, 403, 1259, 1160, 401, 1160, 1160, 399, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1162, 391, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1262, 1362, 389, 1425, 1162, 388, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1448, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 384, 1362, 1162, 1425, 352, 1162, 1259, 351, 1425, 1425, 1425, 1764, 1162, 1162, 1448, 344, 1764, 1764, 343, 1162, 1448, 342, 1362, 1362, 1162, 1164, 341, 1164, 1262, 1362, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 336, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1164, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1268, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1168, 335, 1168, 1168, 1168, 1168, 1168, 1168, 1269, 334, 333, 1457, 1501, 1168, 1169, 332, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1406, 1169, 324, 1457, 1501, 321, 319, 1169, 1273, 1406, 1501, 1406, 318, 317, 1169, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 316, 315, 314, 1457, 1169, 1173, 1406, 1173, 1274, 1457, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1406, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1173, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1317, 1765, 313, 312, 311, 310, 1765, 1765, 1175, 309, 1175, 1175, 1175, 1175, 1175, 1175, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1177, 307, 1177, 306, 302, 1177, 1177, 1514, 1177, 1526, 1177, 1351, 1177, 301, 1177, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 300, 1409, 1177, 1177, 1177, 299, 1177, 1514, 1318, 1526, 1409, 1351, 1409, 1514, 1177, 1526, 1351, 1351, 1351, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1767, 298, 297, 1409, 295, 1767, 1767, 1351, 1363, 294, 1177, 1775, 1177, 1178, 1409, 1178, 1775, 1775, 1178, 1178, 1426, 1178, 293, 1178, 292, 1178, 291, 1178, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1408, 1413, 1178, 1178, 1178, 1420, 1178, 1426, 1364, 1408, 290, 1408, 1426, 1426, 1426, 1413, 1413, 289, 288, 1420, 1420, 1498, 1498, 1413, 287, 285, 1428, 1420, 1408, 1413, 1429, 284, 283, 1420, 1565, 282, 1178, 1800, 1178, 1198, 281, 1198, 1800, 1800, 1498, 280, 1408, 279, 1428, 1198, 1498, 1198, 1429, 1428, 1428, 1428, 1565, 1429, 1429, 1429, 1807, 278, 1565, 1434, 277, 1807, 1807, 1438, 276, 1198, 1428, 1198, 1198, 1198, 275, 1198, 1198, 1434, 1434, 1440, 1564, 1564, 1198, 1441, 274, 1434, 1198, 1198, 1200, 1438, 1200, 1434, 273, 269, 1438, 1438, 1438, 268, 1200, 263, 1200, 1440, 261, 1564, 1574, 1441, 1440, 1440, 1440, 1564, 1441, 1441, 1441, 259, 258, 257, 246, 243, 1200, 241, 1200, 1200, 1200, 1440, 1200, 1200, 1574, 1442, 1809, 238, 234, 1200, 1574, 1809, 1809, 1200, 1200, 1212, 1446, 1212, 1456, 212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1442, 201, 200, 1446, 1446, 1442, 1442, 1442, 1212, 1224, 1811, 1446, 162, 1456, 1507, 1811, 1811, 1446, 1456, 1456, 1456, 1224, 1510, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 156, 1224, 155, 148, 147, 146, 1507, 1224, 1225, 1497, 1497, 1507, 1507, 1507, 1510, 144, 142, 1497, 132, 1510, 1510, 1510, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 130, 1225, 129, 1497, 127, 1497, 1835, 1225, 1226, 1497, 126, 1835, 1835, 122, 120, 1568, 1568, 1503, 119, 1511, 1226, 116, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1515, 1226, 1503, 1503, 1578, 110, 91, 1226, 90, 1568, 1503, 1226, 1511, 88, 1226, 1568, 1503, 1511, 1511, 1511, 78, 1226, 1515, 70, 69, 67, 1578, 1515, 1515, 1515, 57, 53, 1578, 1226, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1232, 36, 1509, 35, 33, 24, 23, 20, 17, 1571, 1571, 1517, 1617, 15, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1570, 1232, 0, 1509, 1517, 1517, 0, 1232, 1509, 1509, 1509, 1571, 1517, 1617, 1232, 1233, 0, 1571, 1517, 1617, 1529, 0, 1570, 0, 1524, 1509, 0, 0, 1570, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1620, 1233, 1524, 1524, 0, 0, 1529, 1233, 1570, 0, 1524, 1529, 1529, 1529, 1233, 1235, 1524, 0, 1530, 1608, 1608, 0, 1620, 0, 1235, 0, 1235, 1532, 1620, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 0, 1235, 0, 0, 1530, 0, 1608, 1235, 1237, 1530, 1530, 1530, 1608, 1532, 0, 0, 0, 0, 1532, 1532, 1532, 0, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 0, 1237, 0, 0, 0, 0, 1532, 1237, 0, 0, 1237, 1237, 1237, 1237, 1237, 1237, 1238, 0, 0, 1533, 0, 0, 0, 0, 0, 0, 0, 1575, 1238, 1636, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 0, 1238, 0, 0, 1533, 0, 0, 1238, 1239, 1533, 1533, 1533, 1575, 0, 1636, 0, 0, 1575, 1575, 1575, 1636, 0, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 0, 1239, 1657, 0, 1669, 0, 0, 1239, 1240, 0, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1563, 1563, 1566, 1566, 1580, 0, 0, 1657, 1563, 1669, 1566, 1240, 0, 1657, 1240, 1669, 0, 0, 1580, 1580, 0, 1240, 1584, 1563, 0, 1566, 1580, 1566, 0, 1563, 1684, 1566, 1580, 1240, 1241, 0, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1587, 1584, 0, 1588, 0, 0, 1584, 1584, 1584, 1684, 0, 1241, 0, 0, 1241, 1684, 0, 0, 0, 0, 0, 1241, 1587, 0, 0, 1588, 0, 1587, 1587, 1587, 1588, 1588, 1588, 1241, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1271, 1586, 1271, 0, 0, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 0, 0, 0, 0, 0, 0, 0, 0, 1271, 1322, 0, 1586, 1607, 1607, 0, 0, 1586, 1586, 1586, 0, 1607, 1621, 0, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 0, 1322, 0, 1586, 0, 1607, 0, 1322, 0, 0, 0, 1607, 0, 1621, 1322, 1323, 0, 0, 1621, 1621, 1621, 0, 0, 0, 1634, 0, 1644, 0, 0, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 0, 1323, 1634, 1634, 0, 0, 0, 1323, 0, 0, 1634, 0, 1644, 0, 1323, 1325, 1634, 1644, 1644, 1644, 0, 0, 0, 1660, 1325, 1648, 1325, 1655, 0, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 0, 1325, 0, 1648, 1648, 1655, 1655, 1325, 1327, 1660, 0, 1648, 0, 1655, 1660, 1660, 1660, 1648, 0, 1655, 0, 0, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 0, 1327, 0, 0, 0, 0, 0, 1327, 0, 0, 1327, 1327, 1327, 1327, 1327, 1327, 1328, 0, 0, 1661, 0, 0, 0, 0, 0, 0, 0, 1663, 1328, 0, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 0, 1328, 0, 0, 1661, 0, 0, 1328, 1329, 1661, 1661, 1661, 1663, 0, 0, 0, 0, 1663, 1663, 1663, 0, 0, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 0, 1329, 0, 0, 1671, 1663, 0, 1329, 1330, 0, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1664, 1671, 1671, 1675, 0, 0, 0, 0, 0, 1671, 0, 1330, 0, 0, 1330, 1671, 0, 0, 0, 0, 0, 1330, 1664, 1677, 0, 1675, 0, 1664, 1664, 1664, 1675, 1675, 1675, 1330, 1331, 0, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1678, 0, 1677, 1679, 0, 0, 0, 1677, 1677, 1677, 0, 1331, 0, 0, 1331, 0, 0, 0, 0, 0, 0, 1331, 1678, 0, 1677, 1679, 0, 1678, 1678, 1678, 1679, 1679, 1679, 1331, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1335, 0, 0, 1685, 0, 0, 0, 0, 0, 1335, 0, 1335, 0, 0, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 0, 1335, 0, 0, 1685, 0, 0, 1335, 1337, 1685, 1685, 1685, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 0, 1337, 0, 0, 0, 0, 0, 1337, 1338, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 0, 1338, 0, 0, 0, 0, 0, 1338, 1340, 0, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1340, 0, 0, 1340, 0, 0, 0, 0, 0, 0, 1340, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1340, 1341, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 0, 1341, 0, 0, 0, 0, 0, 1341, 0, 0, 0, 0, 0, 0, 1341, 1342, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 0, 1342, 0, 0, 0, 0, 0, 1342, 0, 0, 0, 0, 0, 0, 1342, 1344, 0, 0, 0, 0, 0, 0, 0, 0, 1344, 0, 1344, 0, 0, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 0, 1344, 0, 0, 0, 0, 0, 1344, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1346, 1346, 1346, 1346, 1346, 1346, 1355, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1355, 0, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 0, 1355, 0, 0, 0, 0, 0, 1355, 1356, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 0, 1356, 0, 0, 0, 0, 0, 1356, 1357, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1357, 0, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 0, 1357, 0, 0, 0, 0, 0, 1357, 0, 0, 0, 1357, 0, 0, 1357, 0, 0, 0, 0, 0, 0, 1357, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1357, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1412, 0, 0, 0, 0, 0, 0, 0, 0, 1412, 0, 1412, 0, 0, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 0, 1412, 0, 0, 0, 0, 0, 1412, 1414, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 0, 1414, 0, 0, 0, 0, 0, 1414, 1415, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 0, 1415, 0, 0, 0, 0, 0, 1415, 1417, 0, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1417, 0, 0, 1417, 0, 0, 0, 0, 0, 0, 1417, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1417, 1418, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 0, 1418, 0, 0, 0, 0, 0, 1418, 0, 0, 0, 0, 0, 0, 1418, 1419, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 0, 1419, 0, 0, 0, 0, 0, 1419, 0, 0, 0, 0, 0, 0, 1419, 1421, 0, 0, 0, 0, 0, 0, 0, 0, 1421, 0, 1421, 0, 0, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 0, 1421, 0, 0, 0, 0, 0, 1421, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1423, 1423, 1423, 1423, 1423, 1423, 1430, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 0, 1430, 0, 0, 0, 0, 0, 1430, 1431, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 0, 1431, 0, 0, 0, 0, 0, 1431, 1433, 0, 0, 0, 0, 0, 0, 0, 0, 1433, 0, 1433, 0, 0, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 0, 1433, 0, 0, 0, 0, 0, 1433, 1435, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 0, 1435, 0, 0, 0, 0, 0, 1435, 1436, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 0, 1436, 0, 0, 0, 0, 0, 1436, 1444, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 0, 1444, 0, 0, 0, 0, 0, 1444, 0, 0, 0, 0, 0, 0, 1444, 1445, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 0, 1445, 0, 0, 0, 0, 0, 1445, 0, 0, 0, 0, 0, 0, 1445, 1447, 0, 0, 0, 0, 0, 0, 0, 0, 1447, 0, 1447, 0, 0, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 0, 1447, 0, 0, 0, 0, 0, 1447, 1449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 0, 1449, 0, 0, 0, 0, 0, 1449, 0, 0, 1449, 1449, 1449, 1449, 1449, 1449, 1450, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1450, 0, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 0, 1450, 0, 0, 0, 0, 0, 1450, 1451, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 0, 1451, 0, 0, 0, 0, 0, 1451, 1452, 0, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1452, 0, 0, 1452, 0, 0, 0, 0, 0, 0, 1452, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1452, 1453, 0, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1453, 0, 0, 1453, 0, 0, 0, 0, 0, 0, 1453, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1453, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1499, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 0, 1499, 0, 0, 0, 0, 0, 1499, 1500, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 0, 1500, 0, 0, 0, 0, 0, 1500, 1502, 0, 0, 0, 0, 0, 0, 0, 0, 1502, 0, 1502, 0, 0, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 0, 1502, 0, 0, 0, 0, 0, 1502, 1504, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 0, 1504, 0, 0, 0, 0, 0, 1504, 1505, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 0, 1505, 0, 0, 0, 0, 0, 1505, 1512, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 0, 1512, 0, 0, 0, 0, 0, 1512, 1513, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 0, 1513, 0, 0, 0, 0, 0, 1513, 1516, 0, 0, 0, 0, 0, 0, 0, 0, 1516, 0, 1516, 0, 0, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 0, 1516, 0, 0, 0, 0, 0, 1516, 1518, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 0, 1518, 0, 0, 0, 0, 0, 1518, 1519, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 0, 1519, 0, 0, 0, 0, 0, 1519, 1521, 0, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1521, 0, 0, 1521, 0, 0, 0, 0, 0, 0, 1521, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1521, 1522, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 0, 1522, 0, 0, 0, 0, 0, 1522, 0, 0, 0, 0, 0, 0, 1522, 1523, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 0, 1523, 0, 0, 0, 0, 0, 1523, 0, 0, 0, 0, 0, 0, 1523, 1525, 0, 0, 0, 0, 0, 0, 0, 0, 1525, 0, 1525, 0, 0, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 0, 1525, 0, 0, 0, 0, 0, 1525, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1527, 1527, 1527, 1527, 1527, 1527, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1572, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 0, 1572, 0, 0, 0, 0, 0, 1572, 1573, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 0, 1573, 0, 0, 0, 0, 0, 1573, 1576, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 0, 1576, 0, 0, 0, 0, 0, 1576, 1577, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 0, 1577, 0, 0, 0, 0, 0, 1577, 1579, 0, 0, 0, 0, 0, 0, 0, 0, 1579, 0, 1579, 0, 0, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 0, 1579, 0, 0, 0, 0, 0, 1579, 1581, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 0, 1581, 0, 0, 0, 0, 0, 1581, 1582, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 0, 1582, 0, 0, 0, 0, 0, 1582, 1611, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1611, 0, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 0, 1611, 0, 0, 0, 0, 0, 1611, 1612, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 0, 1612, 0, 0, 0, 0, 0, 1612, 1613, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1613, 0, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 0, 1613, 0, 0, 0, 0, 0, 1613, 0, 0, 0, 1613, 0, 0, 1613, 0, 0, 0, 0, 0, 0, 1613, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1613, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1618, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 0, 1618, 0, 0, 0, 0, 0, 1618, 1619, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 0, 1619, 0, 0, 0, 0, 0, 1619, 1632, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 0, 1632, 0, 0, 0, 0, 0, 1632, 0, 0, 0, 0, 0, 0, 1632, 1633, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 0, 1633, 0, 0, 0, 0, 0, 1633, 0, 0, 0, 0, 0, 0, 1633, 1635, 0, 0, 0, 0, 0, 0, 0, 0, 1635, 0, 1635, 0, 0, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 0, 1635, 0, 0, 0, 0, 0, 1635, 1637, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 0, 1637, 0, 0, 0, 0, 0, 1637, 0, 0, 1637, 1637, 1637, 1637, 1637, 1637, 1638, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1638, 0, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 0, 1638, 0, 0, 0, 0, 0, 1638, 1639, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 0, 1639, 0, 0, 0, 0, 0, 1639, 1640, 0, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1640, 0, 0, 1640, 0, 0, 0, 0, 0, 0, 1640, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1640, 1641, 0, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1641, 0, 0, 1641, 0, 0, 0, 0, 0, 0, 1641, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1641, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1647, 0, 0, 0, 0, 0, 0, 0, 0, 1647, 0, 1647, 0, 0, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 0, 1647, 0, 0, 0, 0, 0, 1647, 1649, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 0, 1649, 0, 0, 0, 0, 0, 1649, 1650, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 0, 1650, 0, 0, 0, 0, 0, 1650, 1652, 0, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1652, 0, 0, 1652, 0, 0, 0, 0, 0, 0, 1652, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1652, 1653, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 0, 1653, 0, 0, 0, 0, 0, 1653, 0, 0, 0, 0, 0, 0, 1653, 1654, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 0, 1654, 0, 0, 0, 0, 0, 1654, 0, 0, 0, 0, 0, 0, 1654, 1656, 0, 0, 0, 0, 0, 0, 0, 0, 1656, 0, 1656, 0, 0, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 0, 1656, 0, 0, 0, 0, 0, 1656, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1658, 1658, 1658, 1658, 1658, 1658, 1667, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 0, 1667, 0, 0, 0, 0, 0, 1667, 1668, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 0, 1668, 0, 0, 0, 0, 0, 1668, 1670, 0, 0, 0, 0, 0, 0, 0, 0, 1670, 0, 1670, 0, 0, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 0, 1670, 0, 0, 0, 0, 0, 1670, 1672, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 0, 1672, 0, 0, 0, 0, 0, 1672, 1673, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 0, 1673, 0, 0, 0, 0, 0, 1673, 1682, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 0, 1682, 0, 0, 0, 0, 0, 1682, 1683, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 0, 1683, 0, 0, 0, 0, 0, 1683, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1692, 1692, 1692, 1692, 0, 0, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 0, 1692, 1693, 0, 0, 1693, 0, 0, 0, 0, 0, 0, 1693, 0, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 0, 1693, 1694, 1694, 1694, 1694, 0, 0, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 0, 1694, 1695, 0, 1695, 1695, 0, 1695, 0, 1695, 0, 1695, 1695, 0, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 0, 1695, 1696, 0, 0, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 0, 1696, 1697, 0, 0, 0, 1697, 0, 0, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 0, 1697, 1699, 1699, 0, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1700, 0, 0, 1700, 0, 1700, 0, 1700, 1700, 0, 1700, 1700, 0, 0, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 0, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1702, 1702, 1702, 1702, 0, 0, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 0, 1702, 1703, 0, 0, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 0, 1703, 1704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1704, 1704, 0, 0, 0, 0, 1704, 1706, 0, 0, 0, 0, 1706, 0, 1706, 0, 0, 1706, 1707, 0, 0, 0, 0, 1707, 0, 1707, 0, 0, 1707, 1708, 0, 0, 0, 0, 1708, 0, 1708, 0, 0, 1708, 1710, 1710, 1710, 1710, 0, 0, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 0, 1710, 1711, 1711, 0, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1712, 0, 1712, 1712, 0, 1712, 0, 1712, 0, 1712, 1712, 0, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 0, 1712, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 0, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1714, 0, 0, 0, 0, 0, 0, 1714, 0, 0, 1714, 1714, 1715, 0, 0, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 0, 1715, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 0, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1718, 0, 0, 0, 1718, 0, 0, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 0, 1718, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 0, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1720, 0, 0, 0, 0, 1720, 1720, 1720, 1721, 1721, 0, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1722, 0, 1722, 1722, 0, 1722, 0, 0, 0, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1723, 0, 0, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 0, 1723, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 0, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1725, 0, 0, 1725, 0, 0, 0, 0, 0, 0, 1725, 0, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 0, 1725, 1727, 1727, 1727, 1727, 0, 0, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 0, 1727, 1728, 1728, 0, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1729, 0, 0, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 0, 1729, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 0, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1731, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1731, 1731, 0, 0, 0, 1731, 1731, 1731, 1732, 0, 1732, 0, 0, 0, 0, 0, 1732, 1732, 0, 0, 1732, 1734, 0, 0, 0, 0, 0, 0, 1734, 0, 0, 1734, 1734, 1735, 0, 0, 0, 0, 1735, 0, 1735, 0, 0, 1735, 1736, 0, 0, 0, 0, 1736, 0, 1736, 0, 0, 1736, 1737, 0, 0, 0, 0, 1737, 0, 1737, 0, 0, 1737, 1738, 1738, 0, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 0, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1740, 0, 0, 1740, 0, 1740, 0, 1740, 1740, 0, 1740, 1740, 0, 0, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1741, 0, 1741, 1741, 0, 1741, 0, 1741, 0, 1741, 1741, 0, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 0, 1741, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 0, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1744, 0, 0, 0, 0, 0, 1744, 0, 0, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 0, 1744, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 0, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1746, 0, 0, 0, 1746, 0, 0, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 0, 1746, 1747, 0, 1747, 0, 0, 0, 0, 0, 1747, 1747, 0, 0, 1747, 1749, 0, 0, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 0, 1749, 1750, 0, 0, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 0, 1750, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 0, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 0, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1753, 0, 0, 1753, 0, 0, 0, 0, 0, 0, 1753, 0, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 0, 1753, 1754, 0, 0, 1754, 0, 1754, 0, 1754, 1754, 0, 1754, 0, 1754, 0, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1756, 1756, 0, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 0, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1758, 0, 0, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 0, 1758, 1759, 0, 1759, 0, 0, 0, 0, 0, 1759, 1759, 0, 0, 1759, 1761, 0, 0, 0, 0, 1761, 1761, 1761, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 0, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1768, 0, 1768, 1768, 0, 1768, 0, 1768, 0, 1768, 1768, 0, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 0, 1768, 1769, 0, 0, 0, 0, 1769, 1769, 1769, 0, 0, 0, 1769, 1770, 0, 0, 0, 0, 0, 1770, 0, 0, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 0, 1770, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 0, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1772, 0, 1772, 0, 0, 0, 1772, 0, 0, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 0, 1772, 1773, 0, 0, 0, 0, 1773, 1773, 1773, 1774, 0, 1774, 0, 0, 0, 0, 0, 1774, 1774, 0, 0, 1774, 1776, 0, 0, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 0, 1776, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 0, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 0, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 0, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1780, 0, 0, 1780, 0, 0, 0, 0, 0, 0, 1780, 0, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 0, 1780, 1781, 0, 0, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 0, 1781, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1783, 0, 0, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 0, 1783, 1784, 0, 0, 0, 0, 1784, 1784, 1784, 1785, 0, 0, 0, 0, 1785, 1785, 1785, 0, 0, 0, 1785, 1786, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1786, 1786, 0, 0, 0, 1786, 1786, 1786, 1786, 1787, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1787, 1787, 0, 0, 0, 1787, 1787, 1787, 1787, 1788, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1788, 1788, 0, 0, 0, 1788, 1788, 1788, 1788, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 0, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1790, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1790, 0, 0, 0, 0, 1790, 1790, 1790, 1791, 0, 1791, 1791, 0, 1791, 0, 1791, 0, 1791, 1791, 0, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 0, 1791, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 0, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1793, 0, 0, 0, 1793, 0, 0, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 0, 1793, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1795, 0, 0, 0, 0, 1795, 1795, 1795, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 0, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 0, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1798, 0, 0, 1798, 0, 0, 0, 0, 0, 0, 1798, 0, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 0, 1798, 1799, 0, 1799, 0, 0, 0, 0, 0, 1799, 1799, 0, 0, 1799, 1801, 0, 0, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 0, 1801, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 0, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1803, 0, 0, 1803, 0, 1803, 0, 1803, 1803, 0, 1803, 0, 1803, 0, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1805, 0, 0, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 0, 1805, 1806, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1806, 0, 0, 0, 0, 0, 1806, 0, 0, 1806, 1808, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1808, 0, 0, 0, 0, 0, 1808, 0, 0, 1808, 1810, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1810, 0, 0, 0, 0, 0, 1810, 0, 0, 1810, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 0, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1813, 0, 1813, 1813, 0, 1813, 0, 1813, 0, 1813, 1813, 0, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 0, 1813, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 0, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 0, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1816, 0, 1816, 0, 0, 0, 1816, 0, 0, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 0, 1816, 1817, 0, 0, 1817, 0, 1817, 0, 1817, 1817, 0, 1817, 0, 0, 0, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 0, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1821, 0, 0, 1821, 0, 0, 0, 0, 0, 0, 1821, 0, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 0, 1821, 1822, 0, 0, 0, 0, 1822, 1822, 1822, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 0, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1825, 0, 0, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 0, 1825, 1826, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1826, 0, 0, 0, 0, 1826, 1826, 1826, 0, 1826, 1827, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1827, 0, 0, 0, 0, 1827, 1827, 1827, 0, 1827, 1828, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1828, 0, 0, 0, 0, 1828, 1828, 1828, 0, 1828, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 0, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1830, 0, 1830, 1830, 0, 1830, 0, 1830, 0, 1830, 1830, 0, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 0, 1830, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 0, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 0, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1833, 0, 0, 0, 1833, 0, 1833, 0, 0, 0, 1833, 0, 0, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 0, 1833, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 0, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 0, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687 } ; static yy_state_type yy_state_buf[YY_BUF_SIZE + 2], *yy_state_ptr; static char *yy_full_match; static int yy_lp; static int yy_looking_for_trail_begin = 0; static int yy_full_lp; static int *yy_full_state; #define YY_TRAILING_MASK 0x2000 #define YY_TRAILING_HEAD_MASK 0x4000 #define REJECT \ { \ *yy_cp = yy_hold_char; /* undo effects of setting up yytext */ \ yy_cp = yy_full_match; /* restore poss. backed-over text */ \ yy_lp = yy_full_lp; /* restore orig. accepting pos. */ \ yy_state_ptr = yy_full_state; /* restore orig. state */ \ yy_current_state = *yy_state_ptr; /* restore curr. state */ \ ++yy_lp; \ goto find_rule; \ } #define yymore() yymore_used_but_not_detected #define YY_MORE_ADJ 0 #define YY_RESTORE_YY_MORE_OFFSET #ifndef YYLMAX #define YYLMAX 8192 #endif char yytext[YYLMAX]; char *filttext_ptr; #line 1 "filt.l" #define INITIAL 0 #line 5 "filt.l" #include #ifdef HAVE_MALLOC_H #include #endif #ifdef HAVE_STDLIB_H #include #endif #include #include #include #include #define MAX_INCLUDE_DEPTH 100 #define SEGINC 1024 #define MASKINC 1024 #define LARGE_NUMBER 65536 /* must match regions.h */ #define PSTOP -142857.142857 /* stolen from fitsy/xos.h */ #define X__PI 3.14159265358979323846 #define X_2PI ( 2 * X__PI ) #define X_R2D (X_2PI / 360.0) #define X_R2H (X_2PI / 24.0) #define X_H2D (360.0 / 24.0) #define r2h(r) ( (r) / X_R2H ) #define h2r(d) ( (d) * X_R2H ) #define r2d(r) ( (r) / X_R2D ) #define d2r(d) ( (d) * X_R2D ) #define h2d(r) ( (r) * X_H2D ) #define d2h(d) ( (d) / X_H2D ) /* region types */ #define TY_ANNULUS 1 #define TY_BOX 2 #define TY_CIRCLE 3 #define TY_ELLIPSE 4 #define TY_FIELD 5 #define TY_LINE 6 #define TY_PANDA 7 #define TY_BPANDA 8 #define TY_CPANDA 9 #define TY_EPANDA 10 #define TY_PIE 11 #define TY_QTPIE 11 #define TY_POINT 12 #define TY_POLYGON 13 #define TY_IMAGEMASK 14 /* oft-used checks on argument and coord types */ #define XARG ((narg % 2) == 1) #define YARG ((narg % 2) == 0) #define POSARG ((regid == TY_POLYGON) || (regid == TY_LINE) || (narg<=2)) #define ANGARG (((regid == TY_PANDA) && (narg==3)) || \ ((regid == TY_PANDA) && (narg==4)) || \ ((regid == TY_BPANDA) && (narg==3)) || \ ((regid == TY_BPANDA) && (narg==4)) || \ ((regid == TY_CPANDA) && (narg==3)) || \ ((regid == TY_CPANDA) && (narg==4)) || \ ((regid == TY_EPANDA) && (narg==3)) || \ ((regid == TY_EPANDA) && (narg==4)) || \ ((regid == TY_PIE) && (narg>=3)) ) #define NUMARG (((regid == TY_PANDA) && (narg==5)) || \ ((regid == TY_PANDA) && (narg==8)) || \ ((regid == TY_BPANDA) && (narg==5)) || \ ((regid == TY_BPANDA) && (narg==10)) || \ ((regid == TY_CPANDA) && (narg==5)) || \ ((regid == TY_CPANDA) && (narg==8)) || \ ((regid == TY_EPANDA) && (narg==5)) || \ ((regid == TY_EPANDA) && (narg==10)) ) #define SAVEANG ((regid == TY_BOX) || (regid == TY_ELLIPSE)) #define USEPHYS (filt->fhd->table && \ (filt->type == TYPE_EVENTS) && !filt->evsect) #define USEWCS (gcoordsys && \ strcmp(gcoordsys, "image") && strcmp(gcoordsys, "physical")) #define IMFLIP (USEWCS && wcs->imflip) #define WCSSIZE (iswcs(wcs) && (cdelt1!=0) && (cdelt2!=0)) /* format statements */ #define DFMT1 ",%f" #define DFMT2 ",%f,%f" #define DFMT4 ",%f,%f,%f,%f" #define SFMT1 ",%s" #define IFMT1 ",%d" /* flex is not thread-safe, so we did not put any effort into avoiding globals, i.e. by putting read-write variables below into a struct */ static YY_BUFFER_STATE include_stack[MAX_INCLUDE_DEPTH]; static int include_stack_ptr = 0; static int parse_error = 0; static int colargs; static int filtlen; static int radanglen; static int initbindefs; static int regtype; static int regid; static int laststart; static int maxfiltseg; static int setargs; static int inexpr; static int macropass; static int narg; static int nparen; static int nsparen; static int nrparen; static int nfiltseg; static int nrange; static int nroutine; static int nshape; static int nregion; static int nmask; static int got; static int offscl; static int xtype, ytype; static int tltyp[2]; static double lastd1; static double lastd2; static double xpos, ypos; static double xpix, ypix; static double cdelt1, cdelt2, crot; static double dval, dval2; static double tlmin[2]; static double tlmax[2]; static double binsiz[2]; static char lastarg[SZ_LINE]; static char regname[SZ_LINE]; static char colnames[2][SZ_LINE]; static char wcsnames[2][SZ_LINE]; static char macrobuf[SZ_LINE]; static char rangename[SZ_LINE]; static char sbuf[SZ_LINE]; static char saveang[SZ_LINE]; static char *fcoordsys=NULL; static char *gcoordsys=NULL; static char *filter=NULL; static char *radang=NULL; static struct WorldCoor *wcs=NULL; static FiltSeg *filtseg=NULL; static Filter filt=NULL; /* these are read-only */ static char *rnames[] = {"annulus", "box", "circle", "ellipse", "line", "panda", "pie", "qtpie", "point", "polygon", "field", "bpanda", "cpanda", "epanda", "imagemask", NULL}; static int rargs[] = {4, 5, 3, 5, 4, 8, 4, 4, 2, 6, 0, 11, 8, 11, 0, 0}; static int vargs[] = {'y', 'o', 'y', 'o', 'n', 'n', 'y', 'n', 'e', 'e', 'n', 'n', 'n', 'n', 'n', '\0'}; static int _FiltLexTypeCmp(const void *s1, const void *s2); static int _FiltLexTypeMatch(int ftype, int ttype); static int _FiltLexAccel _PRx((int n)); static int _FiltLexRegionPanda _PRx((void)); static int _FiltLexLcx _PRx((void)); static int _FiltLexArgCheck _PRx((char *name, int args)); static int _FiltLexNeedOp _PRx((int i, char *s)); static void _FiltLexOp _PRx((char *s)); static void _FiltLexTypeSet _PRx((int type)); static void _FiltLexNew _PRx((void)); static void _FiltLexParen _PRx((char *s)); static void _FiltLexCat _PRx((char *s)); static void _FiltLexRegionStart _PRx((int docols)); static void _FiltLexRegionVal _PRx((char *s)); static void _FiltLexRegionEnd _PRx((void)); static void _FiltLexRangeAdd _PRx((char *xname, char *str, int type, int n, int maxlen)); static void _FiltLexArgSave _PRx((double dval)); static void _FiltLexSetWcs _PRx((char *s)); static void _FiltLexWcsCols _PRx((FITSHead header, char *name1, char *name2)); static void _FiltLexNum _PRx((int lcx)); static void _FiltLexEnd _PRx((void)); static void _FiltLexMake _PRx((void)); static char *_FiltLexGetWcs _PRx((void)); static int _FiltIncMask(FilterMask masks, int maxmask, int nmask); static int _FiltFitsMask(char *filename, FilterMask *rmasks, FITSHead *rhead, int *nreg); static void bin2num(char *d, char *s, int maxlen); int _filterror _PRx((char *msg)); #define RLIST 1 #define RTINE 2 #define REG 3 #define AREG 4 #define INCLUDE 5 #define COMM 6 #line 4563 "lex.filt.c" /* Macros after this point can all be overridden by user definitions in * section 1. */ #ifndef YY_SKIP_YYWRAP #ifdef __cplusplus extern "C" int yywrap YY_PROTO(( void )); #else extern int yywrap YY_PROTO(( void )); #endif #endif #ifndef YY_NO_UNPUT static void yyunput YY_PROTO(( int c, char *buf_ptr )); #endif #ifndef filttext_ptr static void yy_flex_strncpy YY_PROTO(( char *, yyconst char *, int )); #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen YY_PROTO(( yyconst char * )); #endif #ifndef YY_NO_INPUT #ifdef __cplusplus static int yyinput YY_PROTO(( void )); #else static int input YY_PROTO(( void )); #endif #endif #if YY_STACK_USED static int yy_start_stack_ptr = 0; static int yy_start_stack_depth = 0; static int *yy_start_stack = 0; #ifndef YY_NO_PUSH_STATE static void yy_push_state YY_PROTO(( int new_state )); #endif #ifndef YY_NO_POP_STATE static void yy_pop_state YY_PROTO(( void )); #endif #ifndef YY_NO_TOP_STATE static int yy_top_state YY_PROTO(( void )); #endif #else #define YY_NO_PUSH_STATE 1 #define YY_NO_POP_STATE 1 #define YY_NO_TOP_STATE 1 #endif #ifdef YY_MALLOC_DECL YY_MALLOC_DECL #else #if __STDC__ #ifndef __cplusplus #include #endif #else /* Just try to get by without declaring the routines. This will fail * miserably on non-ANSI systems for which sizeof(size_t) != sizeof(int) * or sizeof(void*) != sizeof(int). */ #endif #endif /* Amount of stuff to slurp up with each read. */ #ifndef YY_READ_BUF_SIZE #define YY_READ_BUF_SIZE 8192 #endif /* Copy whatever the last rule matched to the standard output. */ #ifndef ECHO /* This used to be an fputs(), but since the string might contain NUL's, * we now use fwrite(). */ #define ECHO (void) fwrite( yytext, yyleng, 1, yyout ) #endif /* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, * is returned in "result". */ #ifndef YY_INPUT #define YY_INPUT(buf,result,max_size) \ if ( yy_current_buffer->yy_is_interactive ) \ { \ int c = '*', n; \ for ( n = 0; n < max_size && \ (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ buf[n] = (char) c; \ if ( c == '\n' ) \ buf[n++] = (char) c; \ if ( c == EOF && ferror( yyin ) ) \ YY_FATAL_ERROR( "input in flex scanner failed" ); \ result = n; \ } \ else if ( ((result = fread( buf, 1, max_size, yyin )) == 0) \ && ferror( yyin ) ) \ YY_FATAL_ERROR( "input in flex scanner failed" ); #endif /* No semi-colon after return; correct usage is to write "yyterminate();" - * we don't want an extra ';' after the "return" because that will cause * some compilers to complain about unreachable statements. */ #ifndef yyterminate #define yyterminate() return YY_NULL #endif /* Number of entries by which start-condition stack grows. */ #ifndef YY_START_STACK_INCR #define YY_START_STACK_INCR 25 #endif /* Report a fatal error. */ #ifndef YY_FATAL_ERROR #define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) #endif /* Default declaration of generated scanner - a define so the user can * easily add parameters. */ #ifndef YY_DECL #define YY_DECL int yylex YY_PROTO(( void )) #endif /* Code executed at the beginning of each rule, after yytext and yyleng * have been set up. */ #ifndef YY_USER_ACTION #define YY_USER_ACTION #endif /* Code executed at the end of each rule. */ #ifndef YY_BREAK #define YY_BREAK break; #endif #define YY_RULE_SETUP \ YY_USER_ACTION YY_DECL { register yy_state_type yy_current_state; register char *yy_cp = NULL, *yy_bp = NULL; register int yy_act; #line 247 "filt.l" #line 4717 "lex.filt.c" if ( yy_init ) { yy_init = 0; #ifdef YY_USER_INIT YY_USER_INIT; #endif if ( ! yy_start ) yy_start = 1; /* first start state */ if ( ! yyin ) yyin = stdin; if ( ! yyout ) yyout = stdout; if ( ! yy_current_buffer ) yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); yy_load_buffer_state(); } while ( 1 ) /* loops until end-of-file is reached */ { yy_cp = yy_c_buf_p; /* Support of yytext. */ *yy_cp = yy_hold_char; /* yy_bp points to the position in yy_ch_buf of the start of * the current run. */ yy_bp = yy_cp; yy_current_state = yy_start; yy_state_ptr = yy_state_buf; *yy_state_ptr++ = yy_current_state; yy_match: do { register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 1688 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; *yy_state_ptr++ = yy_current_state; ++yy_cp; } while ( yy_base[yy_current_state] != 14226 ); yy_find_action: yy_current_state = *--yy_state_ptr; yy_lp = yy_accept[yy_current_state]; find_rule: /* we branch to this label when backing up */ for ( ; ; ) /* until we find what rule we matched */ { if ( yy_lp && yy_lp < yy_accept[yy_current_state + 1] ) { yy_act = yy_acclist[yy_lp]; if ( yy_act & YY_TRAILING_HEAD_MASK || yy_looking_for_trail_begin ) { if ( yy_act == yy_looking_for_trail_begin ) { yy_looking_for_trail_begin = 0; yy_act &= ~YY_TRAILING_HEAD_MASK; break; } } else if ( yy_act & YY_TRAILING_MASK ) { yy_looking_for_trail_begin = yy_act & ~YY_TRAILING_MASK; yy_looking_for_trail_begin |= YY_TRAILING_HEAD_MASK; } else { yy_full_match = yy_cp; yy_full_state = yy_state_ptr; yy_full_lp = yy_lp; break; } ++yy_lp; goto find_rule; } --yy_cp; yy_current_state = *--yy_state_ptr; yy_lp = yy_accept[yy_current_state]; } YY_DO_BEFORE_ACTION; do_action: /* This label is used only to access EOF actions. */ switch ( yy_act ) { /* beginning of action switch */ case 1: YY_RULE_SETUP #line 249 "filt.l" { _FiltLexCat(yytext); } YY_BREAK case 2: YY_RULE_SETUP #line 251 "filt.l" { _FiltLexSetWcs(yytext); } YY_BREAK case 3: YY_RULE_SETUP #line 253 "filt.l" { BEGIN COMM; } YY_BREAK case 4: YY_RULE_SETUP #line 254 "filt.l" { BEGIN COMM; } YY_BREAK case 5: YY_RULE_SETUP #line 255 "filt.l" { BEGIN COMM; } YY_BREAK case 6: YY_RULE_SETUP #line 256 "filt.l" { /* comment acts like EOL */ if( YY_START == REG ){ _FiltLexRegionEnd(); _FiltLexNew(); } else if( YY_START == RLIST ){ _FiltLexParen(")"); _FiltLexNew(); } else{ _FiltLexNew(); } BEGIN COMM; } YY_BREAK case 7: YY_RULE_SETUP #line 271 "filt.l" { BEGIN INITIAL; } YY_BREAK case 8: YY_RULE_SETUP #line 272 "filt.l" { BEGIN INITIAL; } YY_BREAK case 9: YY_RULE_SETUP #line 273 "filt.l" { /* ignore comments up to eol */ ; } YY_BREAK case 10: YY_RULE_SETUP #line 275 "filt.l" { ; /* ignore */ } YY_BREAK case 11: YY_RULE_SETUP #line 276 "filt.l" { ; /* ignore */ } YY_BREAK case 12: YY_RULE_SETUP #line 277 "filt.l" { ; /* ignore */ } YY_BREAK case 13: YY_RULE_SETUP #line 278 "filt.l" { ; /* ignore */ } YY_BREAK case 14: *yy_cp = yy_hold_char; /* undo effects of setting up yytext */ yy_c_buf_p = yy_cp = yy_bp + 1; YY_DO_BEFORE_ACTION; /* set up yytext again */ YY_RULE_SETUP #line 280 "filt.l" { if( YY_START == REG ){ _FiltLexRegionEnd(); _FiltLexNew(); } /* Found an asc-style region */ colargs = 0; laststart = YY_START; BEGIN AREG; } YY_BREAK case 15: YY_RULE_SETUP #line 290 "filt.l" { if( colargs > 2 ) _filterror("illegal Chandra region (too many column args)"); if( !FilterSymbolEnter(filt, yytext, &got) ){ switch(got){ case -1: _filterror("missing column or header parameter"); break; case -2: _filterror("column is not an array"); break; case -3: _filterror("internal error while processing column"); break; } } strcpy(colnames[colargs],yytext); colargs++; } YY_BREAK case 16: YY_RULE_SETUP #line 309 "filt.l" { ; } YY_BREAK case 17: YY_RULE_SETUP #line 310 "filt.l" { ; } YY_BREAK case 18: YY_RULE_SETUP #line 311 "filt.l" { ; } YY_BREAK case 19: YY_RULE_SETUP #line 312 "filt.l" { /* end of asc part of region */ if( colargs != 2 ) _filterror("illegal Chandra region (wrong number of cols)"); BEGIN INITIAL; } YY_BREAK case 20: #line 320 "filt.l" case 21: YY_RULE_SETUP #line 320 "filt.l" { /* finish off previous */ if( YY_START == REG ){ _FiltLexRegionEnd(); _FiltLexNew(); } /* Found a region */ BEGIN REG; if( filt->type == TYPE_EVENTS ){ /* if asc-style, re-do wcs for specified columns */ if( colargs == 2 ){ _FiltLexRegionStart(2); _FiltLexWcsCols(filt->fhd, colnames[0], colnames[1]); } /* set up default columns */ else{ _FiltLexRegionStart(1); } } /* its an image */ else{ _FiltLexRegionStart(0); } } YY_BREAK case 22: YY_RULE_SETUP #line 344 "filt.l" { /* can't happen */ _filterror("invalid characters following the region name"); } YY_BREAK case 23: YY_RULE_SETUP #line 348 "filt.l" { narg++; /* process this pure number in the current coord system */ _FiltLexNum(_FiltLexLcx()); } YY_BREAK case 24: YY_RULE_SETUP #line 353 "filt.l" { narg++; /* remove trailing unit character */ yytext[strlen(yytext)-1] = '\0'; /* process this as a pure number in image coord sys */ _FiltLexNum(LCX_IMAGE); } YY_BREAK case 25: YY_RULE_SETUP #line 360 "filt.l" { narg++; /* remove trailing unit character */ yytext[strlen(yytext)-1] = '\0'; /* process this as a pure number in physical coord sys */ _FiltLexNum(LCX_PHYS); } YY_BREAK case 26: YY_RULE_SETUP #line 367 "filt.l" { char *coordsys; if( nowcs(wcs) ) _filterror("no WCS information in file"); narg++; /* save x value for processing with y next time */ if( XARG ){ xpos = SAOstrtod(yytext,NULL); xtype = SAOdtype; if( (xtype !=0) && (xtype != '.') && (xtype != 'd') ){ coordsys = _FiltLexGetWcs(); /* arg1 coords are hms, but ecliptic, galactic are deg */ if( !coordsys || (strncasecmp(coordsys, "ecl", 3) && strncasecmp(coordsys, "gal", 3)) ){ xpos = h2d(xpos); } } } else{ ypos = SAOstrtod(yytext,NULL); ytype = SAOdtype; /* convert wcs to image pixels */ wcsc2pix(wcs, xpos,ypos, _FiltLexGetWcs(), &xpix,&ypix, &offscl); /* convert to physical for single event filtering */ if( USEPHYS ){ xpix = tli2p(xpix, tlmin[0], binsiz[0], tltyp[0]); ypix = tli2p(ypix, tlmin[1], binsiz[1], tltyp[1]); } snprintf(sbuf, SZ_LINE, DFMT2, xpix, ypix); _FiltLexCat(sbuf); } } YY_BREAK case 27: YY_RULE_SETUP #line 401 "filt.l" { narg++; /* handle position arguments */ if( POSARG ){ if( nowcs(wcs) ) _filterror("no WCS information in file"); /* save x value for processing with y next time */ if( XARG ){ xpos = strtod(yytext,NULL); } else{ ypos = strtod(yytext,NULL); /* convert wcs to image pixels */ wcsc2pix(wcs, xpos, ypos, _FiltLexGetWcs(), &xpix, &ypix, &offscl); /* convert to physical for single event filtering */ if( USEPHYS ){ xpix = tli2p(xpix, tlmin[0], binsiz[0], tltyp[0]); ypix = tli2p(ypix, tlmin[1], binsiz[1], tltyp[1]); } snprintf(sbuf, SZ_LINE, DFMT2, xpix, ypix); _FiltLexCat(sbuf); } } /* angle arguments are just passed along, with updated crot */ else if( ANGARG ){ dval = strtod(yytext,NULL); if( USEWCS ) dval += crot; if( IMFLIP ) dval = -dval; snprintf(sbuf, SZ_LINE, DFMT1, dval); _FiltLexCat(sbuf); } /* panda numeric args are just passed along */ else if( NUMARG ){ dval = strtod(yytext,NULL); snprintf(sbuf, SZ_LINE, DFMT1, dval); _FiltLexCat(sbuf); } /* handle size arguments */ else{ if( !WCSSIZE ) _filterror("no WCS (or CDELT) information in file"); if( SAVEANG ){ dval = strtod(yytext,NULL); if( USEWCS ) dval += crot; if( IMFLIP ) dval = -dval; snprintf(saveang, SZ_LINE, DFMT1, dval); } /* arg 1 is ra, arg2 is dec */ if( XARG ) dval = ABS(strtod(yytext,NULL)/cdelt1); else dval = ABS(strtod(yytext,NULL)/cdelt2); snprintf(sbuf, SZ_LINE, DFMT1, dval); _FiltLexCat(sbuf); _FiltLexArgSave(dval); } } YY_BREAK case 28: YY_RULE_SETUP #line 459 "filt.l" { narg++; /* handle position arguments */ if( POSARG ){ if( nowcs(wcs) ) _filterror("no WCS information in file"); /* save x value for processing with y next time */ if( XARG ){ xpos = r2d(strtod(yytext,NULL)); } else{ ypos = r2d(strtod(yytext,NULL)); /* convert wcs to image pixels */ wcsc2pix(wcs, xpos, ypos, _FiltLexGetWcs(), &xpix, &ypix, &offscl); /* convert to physical for single event filtering */ if( USEPHYS ){ xpix = tli2p(xpix, tlmin[0], binsiz[0], tltyp[0]); ypix = tli2p(ypix, tlmin[1], binsiz[1], tltyp[1]); } snprintf(sbuf, SZ_LINE, DFMT2, xpix, ypix); _FiltLexCat(sbuf); } } /* angle arguments are just passed along, with updated crot */ else if( ANGARG ){ dval = r2d(strtod(yytext,NULL)); if( USEWCS ) dval += crot; if( IMFLIP ) dval = -dval; snprintf(sbuf, SZ_LINE, DFMT1, dval); _FiltLexCat(sbuf); } /* panda numeric args are just passed along */ else if( NUMARG ){ dval = strtod(yytext,NULL); snprintf(sbuf, SZ_LINE, DFMT1, dval); _FiltLexCat(sbuf); } /* handle size arguments */ else{ if( !WCSSIZE ) _filterror("no WCS (or CDELT) information in file"); if( SAVEANG ){ dval = r2d(strtod(yytext,NULL)); if( USEWCS ) dval += crot; if( IMFLIP ) dval = -dval; snprintf(saveang, SZ_LINE, DFMT1, dval); } /* arg 1 is ra, arg2 is dec */ if( XARG ) dval = r2d(ABS(strtod(yytext,NULL)/cdelt1)); else dval = r2d(ABS(strtod(yytext,NULL)/cdelt2)); snprintf(sbuf, SZ_LINE, DFMT1, dval); _FiltLexCat(sbuf); _FiltLexArgSave(dval); } } YY_BREAK case 29: YY_RULE_SETUP #line 517 "filt.l" { if( !WCSSIZE ) _filterror("no WCS (or CDELT) information in file"); narg++; /* arg 1 is ra, arg2 is dec */ if( XARG ) dval = ABS(strtod(yytext,NULL)/(cdelt1*60.0)); else dval = ABS(strtod(yytext,NULL)/(cdelt2*60.0)); snprintf(sbuf, SZ_LINE, DFMT1, dval); _FiltLexCat(sbuf); _FiltLexArgSave(dval); } YY_BREAK case 30: YY_RULE_SETUP #line 530 "filt.l" { if( !WCSSIZE ) _filterror("no WCS (or CDELT) information in file"); narg++; /* arg 1 is ra, arg2 is dec */ if( XARG ) dval = ABS(strtod(yytext,NULL)/(cdelt1*3600.0)); else dval = ABS(strtod(yytext,NULL)/(cdelt2*3600.0)); snprintf(sbuf, SZ_LINE, DFMT1, dval); _FiltLexCat(sbuf); _FiltLexArgSave(dval); } YY_BREAK case 31: YY_RULE_SETUP #line 543 "filt.l" { int n; n = strtol(strchr(yytext, '=')+1, NULL, 10); if( n <=0 ){ _filterror("invalid region accelerator"); } else{ if( !_FiltLexAccel(n) ){ _filterror("invalid region accelerator"); } } } YY_BREAK case 32: YY_RULE_SETUP #line 555 "filt.l" { if( _FiltLexArgCheck(regname, narg) == 0 ){ /* new expression without an expression separator ... sigh */ _FiltLexRegionEnd(); _FiltLexNew(); BEGIN INITIAL; yyless(0); } else { narg++; /* process this pure number in the current coord system */ _FiltLexNum(_FiltLexLcx()); } } YY_BREAK case 33: YY_RULE_SETUP #line 568 "filt.l" { /* new expression without an expression separator ... sigh */ _FiltLexRegionEnd(); _FiltLexNew(); BEGIN INITIAL; yyless(0); } YY_BREAK case 34: YY_RULE_SETUP #line 575 "filt.l" { /* explicit rule avoids the _FiltLexNew of general rule */ ; } YY_BREAK case 35: YY_RULE_SETUP #line 579 "filt.l" { _FiltLexRegionVal(yytext); if( !nsparen ){ _FiltLexRegionEnd(); BEGIN INITIAL; } } YY_BREAK case 36: YY_RULE_SETUP #line 586 "filt.l" { nsparen++; } YY_BREAK case 37: YY_RULE_SETUP #line 589 "filt.l" { _FiltLexRegionVal(yytext+1); if( nsparen ){ nsparen--; if( !nsparen ){ _FiltLexRegionEnd(); BEGIN INITIAL; } } else { _FiltLexRegionEnd(); BEGIN INITIAL; /* REJECT; */ /* explicit execution of general rule instead of REJECT */ nparen--; _FiltLexNew(); _FiltLexCat(")"); _FiltLexNew(); } } YY_BREAK case 38: YY_RULE_SETUP #line 608 "filt.l" { if( nsparen ){ nsparen--; if( !nsparen ){ _FiltLexRegionEnd(); BEGIN INITIAL; } } else { _FiltLexRegionEnd(); BEGIN INITIAL; /* REJECT; */ /* explicit execution of general rule instead of REJECT */ nparen--; _FiltLexNew(); _FiltLexCat(")"); _FiltLexNew(); } } YY_BREAK case 39: YY_RULE_SETUP #line 626 "filt.l" { _FiltLexRegionEnd(); _FiltLexOp(yytext); BEGIN INITIAL; } YY_BREAK case 40: YY_RULE_SETUP #line 631 "filt.l" { _FiltLexRegionEnd(); _FiltLexNew(); BEGIN INITIAL; } YY_BREAK case 41: YY_RULE_SETUP #line 637 "filt.l" { _filterror("you must use == to compare two columns,"); } YY_BREAK case 42: YY_RULE_SETUP #line 641 "filt.l" { if( YY_START == REG ){ _FiltLexRegionEnd(); } _FiltLexParen("("); BEGIN RLIST; narg = 0; _FiltLexTypeSet(TOK_RLIST); nrange = 0; if( !FilterSymbolEnter(filt, yytext, &got) ){ switch(got){ case -1: _filterror("missing column or header parameter"); break; case -2: _filterror("column is not an array"); break; case -3: _filterror("internal error while processing column"); break; } } strncpy(rangename, yytext, SZ_LINE-1); } YY_BREAK case 43: YY_RULE_SETUP #line 665 "filt.l" { _FiltLexRangeAdd(rangename, yytext, 3, nrange++, SZ_LINE); } YY_BREAK case 44: YY_RULE_SETUP #line 668 "filt.l" { _FiltLexRangeAdd(rangename, yytext, 1, nrange++, SZ_LINE); } YY_BREAK case 45: YY_RULE_SETUP #line 671 "filt.l" { _FiltLexRangeAdd(rangename, yytext, 4, nrange++, SZ_LINE); } YY_BREAK case 46: YY_RULE_SETUP #line 674 "filt.l" { _FiltLexRangeAdd(rangename, yytext, 2, nrange++, SZ_LINE); } YY_BREAK case 47: YY_RULE_SETUP #line 677 "filt.l" { ; } YY_BREAK case 48: YY_RULE_SETUP #line 678 "filt.l" { ; } YY_BREAK case 49: YY_RULE_SETUP #line 679 "filt.l" { ; } YY_BREAK case 50: YY_RULE_SETUP #line 680 "filt.l" { _FiltLexParen(")"); _FiltLexNew(); BEGIN INITIAL; } YY_BREAK case 51: YY_RULE_SETUP #line 685 "filt.l" { _FiltLexParen(")"); _FiltLexNew(); _FiltLexParen(")"); _FiltLexNew(); BEGIN INITIAL; } YY_BREAK case 52: YY_RULE_SETUP #line 692 "filt.l" { _FiltLexParen(")"); _FiltLexOp(yytext); BEGIN INITIAL; } YY_BREAK case 53: YY_RULE_SETUP #line 697 "filt.l" { _FiltLexParen(")"); _FiltLexNew(); BEGIN INITIAL; } YY_BREAK case 54: *yy_cp = yy_hold_char; /* undo effects of setting up yytext */ yy_c_buf_p = yy_cp -= 1; YY_DO_BEFORE_ACTION; /* set up yytext again */ YY_RULE_SETUP #line 703 "filt.l" { /* Found a routine */ laststart = YY_START; BEGIN RTINE; narg = 0; nrparen = 0; _FiltLexTypeSet(TOK_RTINE); _FiltLexCat(FilterLexRoutine1(filt, yytext)); nroutine++; } YY_BREAK case 55: YY_RULE_SETUP #line 713 "filt.l" { /* explicit rule avoids the _FiltLexNew of general rule */ _FiltLexCat(","); } YY_BREAK case 56: YY_RULE_SETUP #line 717 "filt.l" { nrparen++; _FiltLexCat("("); } YY_BREAK case 57: YY_RULE_SETUP #line 721 "filt.l" { nrparen--; if( nrparen ){ _FiltLexCat(")"); } else{ /* end of routine */ BEGIN laststart; _FiltLexCat(FilterLexRoutine2(filt, ")")); } } YY_BREAK case 58: YY_RULE_SETUP #line 733 "filt.l" { /* Found an include file */ char *s, *t; if( YY_START == REG ){ _FiltLexRegionEnd(); _FiltLexNew(); } /* handle FITS mask file specially */ filt->nmask = _FiltFitsMask(yytext+1, &(filt->masks), &(filt->maskhd), &(filt->nmaskreg)); /* filt->nmask == -1 => its not a FITS file */ if( filt->nmask != -1 ){ switch(filt->nmask){ case -2: _filterror("FITS image mask must be image data -"); break; case -3: _filterror("Invalid dimensions for FITS image mask -"); break; case -4: _filterror("FITS image mask cannot contain negative values -"); break; default: if( (filt->type != TYPE_IMAGE) && !filt->evsect ){ _filterror("FITS image mask is valid for image filtering only -"); } else{ if( nmask ) _filterror("only one FITS image mask allowed at a time -"); else nmask++; } break; } } else{ if ( include_stack_ptr >= MAX_INCLUDE_DEPTH ) { _filterror("include files are nested too deeply"); } if( (s = (char *)FileContents(yytext+1, 0, NULL)) == NULL ){ _filterror("can't access include file"); } /* ignore empty include file */ else if( *s == '\0' ){ ; } else { t = FilterClip(s); xfree(s); if( t && *t ){ include_stack[include_stack_ptr++] = YY_CURRENT_BUFFER; _FiltLexNew(); _FiltLexParen("("); FiltScanString(t); xfree(t); } } } } YY_BREAK case 59: YY_RULE_SETUP #line 795 "filt.l" { if( !FilterSymbolEnter(filt, yytext, &got) ){ switch(got){ case -1: _filterror("missing column or header parameter"); break; case -2: _filterror("column is not an array"); break; case -3: _filterror("internal error while processing column"); break; } } else{ narg++; /* add if initial condition (not region, routine, etc.) */ if( YY_START == INITIAL ) _FiltLexTypeSet(TOK_NAME); _FiltLexCat(FilterLexName(filt,yytext)); } } YY_BREAK case 60: YY_RULE_SETUP #line 817 "filt.l" { ; /* ignore white space */ } YY_BREAK case 61: YY_RULE_SETUP #line 819 "filt.l" { narg++; _FiltLexCat(yytext); } YY_BREAK case 62: YY_RULE_SETUP #line 821 "filt.l" { char tbuf[SZ_LINE]; bin2num(tbuf, yytext, SZ_LINE-1); narg++; _FiltLexCat(tbuf); } YY_BREAK case 63: YY_RULE_SETUP #line 828 "filt.l" { _FiltLexOp(yytext); if( YY_START != RTINE ) BEGIN INITIAL; } YY_BREAK case 64: YY_RULE_SETUP #line 833 "filt.l" { nparen++; _FiltLexNew(); _FiltLexCat(yytext); _FiltLexNew(); } YY_BREAK case 65: YY_RULE_SETUP #line 839 "filt.l" { nparen--; _FiltLexNew(); _FiltLexCat(yytext); _FiltLexNew(); } YY_BREAK case 66: YY_RULE_SETUP #line 845 "filt.l" { _FiltLexNew(); BEGIN INITIAL; } YY_BREAK case 67: YY_RULE_SETUP #line 850 "filt.l" { _FiltLexCat(yytext); } YY_BREAK case YY_STATE_EOF(INITIAL): case YY_STATE_EOF(RLIST): case YY_STATE_EOF(RTINE): case YY_STATE_EOF(REG): case YY_STATE_EOF(AREG): case YY_STATE_EOF(INCLUDE): case YY_STATE_EOF(COMM): #line 852 "filt.l" { if ( --include_stack_ptr < 0 ){ _FiltLexMake(); yy_delete_buffer( YY_CURRENT_BUFFER ); yyterminate(); } else { _FiltLexParen(")"); _FiltLexNew(); yy_delete_buffer( YY_CURRENT_BUFFER ); yy_switch_to_buffer(include_stack[include_stack_ptr] ); } } YY_BREAK case 68: YY_RULE_SETUP #line 865 "filt.l" ECHO; YY_BREAK #line 5704 "lex.filt.c" case YY_END_OF_BUFFER: { /* Amount of text matched not including the EOB char. */ int yy_amount_of_matched_text = (int) (yy_cp - filttext_ptr) - 1; /* Undo the effects of YY_DO_BEFORE_ACTION. */ *yy_cp = yy_hold_char; YY_RESTORE_YY_MORE_OFFSET if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_NEW ) { /* We're scanning a new file or input source. It's * possible that this happened because the user * just pointed yyin at a new source and called * yylex(). If so, then we have to assure * consistency between yy_current_buffer and our * globals. Here is the right place to do so, because * this is the first action (other than possibly a * back-up) that will match for the new input source. */ yy_n_chars = yy_current_buffer->yy_n_chars; yy_current_buffer->yy_input_file = yyin; yy_current_buffer->yy_buffer_status = YY_BUFFER_NORMAL; } /* Note that here we test for yy_c_buf_p "<=" to the position * of the first EOB in the buffer, since yy_c_buf_p will * already have been incremented past the NUL character * (since all states make transitions on EOB to the * end-of-buffer state). Contrast this with the test * in input(). */ if ( yy_c_buf_p <= &yy_current_buffer->yy_ch_buf[yy_n_chars] ) { /* This was really a NUL. */ yy_state_type yy_next_state; yy_c_buf_p = filttext_ptr + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state(); /* Okay, we're now positioned to make the NUL * transition. We couldn't have * yy_get_previous_state() go ahead and do it * for us because it doesn't know how to deal * with the possibility of jamming (and we don't * want to build jamming into it because then it * will run more slowly). */ yy_next_state = yy_try_NUL_trans( yy_current_state ); yy_bp = filttext_ptr + YY_MORE_ADJ; if ( yy_next_state ) { /* Consume the NUL. */ yy_cp = ++yy_c_buf_p; yy_current_state = yy_next_state; goto yy_match; } else { yy_cp = yy_c_buf_p; goto yy_find_action; } } else switch ( yy_get_next_buffer() ) { case EOB_ACT_END_OF_FILE: { yy_did_buffer_switch_on_eof = 0; if ( yywrap() ) { /* Note: because we've taken care in * yy_get_next_buffer() to have set up * yytext, we can now set up * yy_c_buf_p so that if some total * hoser (like flex itself) wants to * call the scanner after we return the * YY_NULL, it'll still work - another * YY_NULL will get returned. */ yy_c_buf_p = filttext_ptr + YY_MORE_ADJ; yy_act = YY_STATE_EOF(YY_START); goto do_action; } else { if ( ! yy_did_buffer_switch_on_eof ) YY_NEW_FILE; } break; } case EOB_ACT_CONTINUE_SCAN: yy_c_buf_p = filttext_ptr + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state(); yy_cp = yy_c_buf_p; yy_bp = filttext_ptr + YY_MORE_ADJ; goto yy_match; case EOB_ACT_LAST_MATCH: yy_c_buf_p = &yy_current_buffer->yy_ch_buf[yy_n_chars]; yy_current_state = yy_get_previous_state(); yy_cp = yy_c_buf_p; yy_bp = filttext_ptr + YY_MORE_ADJ; goto yy_find_action; } break; } default: YY_FATAL_ERROR( "fatal flex scanner internal error--no action found" ); } /* end of action switch */ } /* end of scanning one token */ } /* end of yylex */ /* yy_get_next_buffer - try to read in a new buffer * * Returns a code representing an action: * EOB_ACT_LAST_MATCH - * EOB_ACT_CONTINUE_SCAN - continue scanning from current position * EOB_ACT_END_OF_FILE - end of file */ static int yy_get_next_buffer() { register char *dest = yy_current_buffer->yy_ch_buf; register char *source = filttext_ptr; register int number_to_move, i; int ret_val; if ( yy_c_buf_p > &yy_current_buffer->yy_ch_buf[yy_n_chars + 1] ) YY_FATAL_ERROR( "fatal flex scanner internal error--end of buffer missed" ); if ( yy_current_buffer->yy_fill_buffer == 0 ) { /* Don't try to fill the buffer, so this is an EOF. */ if ( yy_c_buf_p - filttext_ptr - YY_MORE_ADJ == 1 ) { /* We matched a single character, the EOB, so * treat this as a final EOF. */ return EOB_ACT_END_OF_FILE; } else { /* We matched some text prior to the EOB, first * process it. */ return EOB_ACT_LAST_MATCH; } } /* Try to read more data. */ /* First move last chars to start of buffer. */ number_to_move = (int) (yy_c_buf_p - filttext_ptr) - 1; for ( i = 0; i < number_to_move; ++i ) *(dest++) = *(source++); if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_EOF_PENDING ) /* don't do the read, it's not guaranteed to return an EOF, * just force an EOF */ yy_current_buffer->yy_n_chars = yy_n_chars = 0; else { int num_to_read = yy_current_buffer->yy_buf_size - number_to_move - 1; while ( num_to_read <= 0 ) { /* Not enough room in the buffer - grow it. */ #ifdef YY_USES_REJECT YY_FATAL_ERROR( "input buffer overflow, can't enlarge buffer because scanner uses REJECT" ); #else /* just a shorter name for the current buffer */ YY_BUFFER_STATE b = yy_current_buffer; int yy_c_buf_p_offset = (int) (yy_c_buf_p - b->yy_ch_buf); if ( b->yy_is_our_buffer ) { int new_size = b->yy_buf_size * 2; if ( new_size <= 0 ) b->yy_buf_size += b->yy_buf_size / 8; else b->yy_buf_size *= 2; b->yy_ch_buf = (char *) /* Include room in for 2 EOB chars. */ yy_flex_realloc( (void *) b->yy_ch_buf, b->yy_buf_size + 2 ); } else /* Can't grow it, we don't own it. */ b->yy_ch_buf = 0; if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "fatal error - scanner input buffer overflow" ); yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset]; num_to_read = yy_current_buffer->yy_buf_size - number_to_move - 1; #endif } if ( num_to_read > YY_READ_BUF_SIZE ) num_to_read = YY_READ_BUF_SIZE; /* Read in more data. */ YY_INPUT( (&yy_current_buffer->yy_ch_buf[number_to_move]), yy_n_chars, num_to_read ); yy_current_buffer->yy_n_chars = yy_n_chars; } if ( yy_n_chars == 0 ) { if ( number_to_move == YY_MORE_ADJ ) { ret_val = EOB_ACT_END_OF_FILE; yyrestart( yyin ); } else { ret_val = EOB_ACT_LAST_MATCH; yy_current_buffer->yy_buffer_status = YY_BUFFER_EOF_PENDING; } } else ret_val = EOB_ACT_CONTINUE_SCAN; yy_n_chars += number_to_move; yy_current_buffer->yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR; yy_current_buffer->yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR; filttext_ptr = &yy_current_buffer->yy_ch_buf[0]; return ret_val; } /* yy_get_previous_state - get the state just before the EOB char was reached */ static yy_state_type yy_get_previous_state() { register yy_state_type yy_current_state; register char *yy_cp; yy_current_state = yy_start; yy_state_ptr = yy_state_buf; *yy_state_ptr++ = yy_current_state; for ( yy_cp = filttext_ptr + YY_MORE_ADJ; yy_cp < yy_c_buf_p; ++yy_cp ) { register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 1688 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; *yy_state_ptr++ = yy_current_state; } return yy_current_state; } /* yy_try_NUL_trans - try to make a transition on the NUL character * * synopsis * next_state = yy_try_NUL_trans( current_state ); */ #ifdef YY_USE_PROTOS static yy_state_type yy_try_NUL_trans( yy_state_type yy_current_state ) #else static yy_state_type yy_try_NUL_trans( yy_current_state ) yy_state_type yy_current_state; #endif { register int yy_is_jam; register YY_CHAR yy_c = 1; while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 1688 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; yy_is_jam = (yy_current_state == 1687); if ( ! yy_is_jam ) *yy_state_ptr++ = yy_current_state; return yy_is_jam ? 0 : yy_current_state; } #ifndef YY_NO_UNPUT #ifdef YY_USE_PROTOS static void yyunput( int c, register char *yy_bp ) #else static void yyunput( c, yy_bp ) int c; register char *yy_bp; #endif { register char *yy_cp = yy_c_buf_p; /* undo effects of setting up yytext */ *yy_cp = yy_hold_char; if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) { /* need to shift things up to make room */ /* +2 for EOB chars. */ register int number_to_move = yy_n_chars + 2; register char *dest = &yy_current_buffer->yy_ch_buf[ yy_current_buffer->yy_buf_size + 2]; register char *source = &yy_current_buffer->yy_ch_buf[number_to_move]; while ( source > yy_current_buffer->yy_ch_buf ) *--dest = *--source; yy_cp += (int) (dest - source); yy_bp += (int) (dest - source); yy_current_buffer->yy_n_chars = yy_n_chars = yy_current_buffer->yy_buf_size; if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) YY_FATAL_ERROR( "flex scanner push-back overflow" ); } *--yy_cp = (char) c; filttext_ptr = yy_bp; yy_hold_char = *yy_cp; yy_c_buf_p = yy_cp; } #endif /* ifndef YY_NO_UNPUT */ #ifndef YY_NO_INPUT #ifdef __cplusplus static int yyinput() #else static int input() #endif { int c; *yy_c_buf_p = yy_hold_char; if ( *yy_c_buf_p == YY_END_OF_BUFFER_CHAR ) { /* yy_c_buf_p now points to the character we want to return. * If this occurs *before* the EOB characters, then it's a * valid NUL; if not, then we've hit the end of the buffer. */ if ( yy_c_buf_p < &yy_current_buffer->yy_ch_buf[yy_n_chars] ) /* This was really a NUL. */ *yy_c_buf_p = '\0'; else { /* need more input */ int offset = yy_c_buf_p - filttext_ptr; ++yy_c_buf_p; switch ( yy_get_next_buffer() ) { case EOB_ACT_LAST_MATCH: /* This happens because yy_g_n_b() * sees that we've accumulated a * token and flags that we need to * try matching the token before * proceeding. But for input(), * there's no matching to consider. * So convert the EOB_ACT_LAST_MATCH * to EOB_ACT_END_OF_FILE. */ /* Reset buffer status. */ yyrestart( yyin ); /* fall through */ case EOB_ACT_END_OF_FILE: { if ( yywrap() ) return EOF; if ( ! yy_did_buffer_switch_on_eof ) YY_NEW_FILE; #ifdef __cplusplus return yyinput(); #else return input(); #endif } case EOB_ACT_CONTINUE_SCAN: yy_c_buf_p = filttext_ptr + offset; break; } } } c = *(unsigned char *) yy_c_buf_p; /* cast for 8-bit char's */ *yy_c_buf_p = '\0'; /* preserve yytext */ yy_hold_char = *++yy_c_buf_p; return c; } #endif /* YY_NO_INPUT */ #ifdef YY_USE_PROTOS void yyrestart( FILE *input_file ) #else void yyrestart( input_file ) FILE *input_file; #endif { if ( ! yy_current_buffer ) yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); yy_init_buffer( yy_current_buffer, input_file ); yy_load_buffer_state(); } #ifdef YY_USE_PROTOS void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer ) #else void yy_switch_to_buffer( new_buffer ) YY_BUFFER_STATE new_buffer; #endif { if ( yy_current_buffer == new_buffer ) return; if ( yy_current_buffer ) { /* Flush out information for old buffer. */ *yy_c_buf_p = yy_hold_char; yy_current_buffer->yy_buf_pos = yy_c_buf_p; yy_current_buffer->yy_n_chars = yy_n_chars; } yy_current_buffer = new_buffer; yy_load_buffer_state(); /* We don't actually know whether we did this switch during * EOF (yywrap()) processing, but the only time this flag * is looked at is after yywrap() is called, so it's safe * to go ahead and always set it. */ yy_did_buffer_switch_on_eof = 1; } #ifdef YY_USE_PROTOS void yy_load_buffer_state( void ) #else void yy_load_buffer_state() #endif { yy_n_chars = yy_current_buffer->yy_n_chars; filttext_ptr = yy_c_buf_p = yy_current_buffer->yy_buf_pos; yyin = yy_current_buffer->yy_input_file; yy_hold_char = *yy_c_buf_p; } #ifdef YY_USE_PROTOS YY_BUFFER_STATE yy_create_buffer( FILE *file, int size ) #else YY_BUFFER_STATE yy_create_buffer( file, size ) FILE *file; int size; #endif { YY_BUFFER_STATE b; b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_buf_size = size; /* yy_ch_buf has to be 2 characters longer than the size given because * we need to put in 2 end-of-buffer characters. */ b->yy_ch_buf = (char *) yy_flex_alloc( b->yy_buf_size + 2 ); if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_is_our_buffer = 1; yy_init_buffer( b, file ); return b; } #ifdef YY_USE_PROTOS void yy_delete_buffer( YY_BUFFER_STATE b ) #else void yy_delete_buffer( b ) YY_BUFFER_STATE b; #endif { if ( ! b ) return; if ( b == yy_current_buffer ) yy_current_buffer = (YY_BUFFER_STATE) 0; if ( b->yy_is_our_buffer ) yy_flex_free( (void *) b->yy_ch_buf ); yy_flex_free( (void *) b ); } #ifdef YY_USE_PROTOS void yy_init_buffer( YY_BUFFER_STATE b, FILE *file ) #else void yy_init_buffer( b, file ) YY_BUFFER_STATE b; FILE *file; #endif { yy_flush_buffer( b ); b->yy_input_file = file; b->yy_fill_buffer = 1; #if YY_ALWAYS_INTERACTIVE b->yy_is_interactive = 1; #else #if YY_NEVER_INTERACTIVE b->yy_is_interactive = 0; #else b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; #endif #endif } #ifdef YY_USE_PROTOS void yy_flush_buffer( YY_BUFFER_STATE b ) #else void yy_flush_buffer( b ) YY_BUFFER_STATE b; #endif { if ( ! b ) return; b->yy_n_chars = 0; /* We always need two end-of-buffer characters. The first causes * a transition to the end-of-buffer state. The second causes * a jam in that state. */ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; b->yy_buf_pos = &b->yy_ch_buf[0]; b->yy_at_bol = 1; b->yy_buffer_status = YY_BUFFER_NEW; if ( b == yy_current_buffer ) yy_load_buffer_state(); } #ifndef YY_NO_SCAN_BUFFER #ifdef YY_USE_PROTOS YY_BUFFER_STATE yy_scan_buffer( char *base, yy_size_t size ) #else YY_BUFFER_STATE yy_scan_buffer( base, size ) char *base; yy_size_t size; #endif { YY_BUFFER_STATE b; if ( size < 2 || base[size-2] != YY_END_OF_BUFFER_CHAR || base[size-1] != YY_END_OF_BUFFER_CHAR ) /* They forgot to leave room for the EOB's. */ return 0; b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ b->yy_buf_pos = b->yy_ch_buf = base; b->yy_is_our_buffer = 0; b->yy_input_file = 0; b->yy_n_chars = b->yy_buf_size; b->yy_is_interactive = 0; b->yy_at_bol = 1; b->yy_fill_buffer = 0; b->yy_buffer_status = YY_BUFFER_NEW; yy_switch_to_buffer( b ); return b; } #endif #ifndef YY_NO_SCAN_STRING #ifdef YY_USE_PROTOS YY_BUFFER_STATE yy_scan_string( yyconst char *yy_str ) #else YY_BUFFER_STATE yy_scan_string( yy_str ) yyconst char *yy_str; #endif { int len; for ( len = 0; yy_str[len]; ++len ) ; return yy_scan_bytes( yy_str, len ); } #endif #ifndef YY_NO_SCAN_BYTES #ifdef YY_USE_PROTOS YY_BUFFER_STATE yy_scan_bytes( yyconst char *bytes, int len ) #else YY_BUFFER_STATE yy_scan_bytes( bytes, len ) yyconst char *bytes; int len; #endif { YY_BUFFER_STATE b; char *buf; yy_size_t n; int i; /* Get memory for full buffer, including space for trailing EOB's. */ n = len + 2; buf = (char *) yy_flex_alloc( n ); if ( ! buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); for ( i = 0; i < len; ++i ) buf[i] = bytes[i]; buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR; b = yy_scan_buffer( buf, n ); if ( ! b ) YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); /* It's okay to grow etc. this buffer, and we should throw it * away when we're done. */ b->yy_is_our_buffer = 1; return b; } #endif #ifndef YY_NO_PUSH_STATE #ifdef YY_USE_PROTOS static void yy_push_state( int new_state ) #else static void yy_push_state( new_state ) int new_state; #endif { if ( yy_start_stack_ptr >= yy_start_stack_depth ) { yy_size_t new_size; yy_start_stack_depth += YY_START_STACK_INCR; new_size = yy_start_stack_depth * sizeof( int ); if ( ! yy_start_stack ) yy_start_stack = (int *) yy_flex_alloc( new_size ); else yy_start_stack = (int *) yy_flex_realloc( (void *) yy_start_stack, new_size ); if ( ! yy_start_stack ) YY_FATAL_ERROR( "out of memory expanding start-condition stack" ); } yy_start_stack[yy_start_stack_ptr++] = YY_START; BEGIN(new_state); } #endif #ifndef YY_NO_POP_STATE static void yy_pop_state() { if ( --yy_start_stack_ptr < 0 ) YY_FATAL_ERROR( "start-condition stack underflow" ); BEGIN(yy_start_stack[yy_start_stack_ptr]); } #endif #ifndef YY_NO_TOP_STATE static int yy_top_state() { return yy_start_stack[yy_start_stack_ptr - 1]; } #endif #ifndef YY_EXIT_FAILURE #define YY_EXIT_FAILURE 2 #endif #ifdef YY_USE_PROTOS static void yy_fatal_error( yyconst char msg[] ) #else static void yy_fatal_error( msg ) char msg[]; #endif { (void) fprintf( stderr, "%s\n", msg ); exit( YY_EXIT_FAILURE ); } /* Redefine yyless() so it works in section 3 code. */ #undef yyless #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ yytext[yyleng] = yy_hold_char; \ yy_c_buf_p = yytext + n; \ yy_hold_char = *yy_c_buf_p; \ *yy_c_buf_p = '\0'; \ yyleng = n; \ } \ while ( 0 ) /* Internal utility routines. */ #ifndef filttext_ptr #ifdef YY_USE_PROTOS static void yy_flex_strncpy( char *s1, yyconst char *s2, int n ) #else static void yy_flex_strncpy( s1, s2, n ) char *s1; yyconst char *s2; int n; #endif { register int i; for ( i = 0; i < n; ++i ) s1[i] = s2[i]; } #endif #ifdef YY_NEED_STRLEN #ifdef YY_USE_PROTOS static int yy_flex_strlen( yyconst char *s ) #else static int yy_flex_strlen( s ) yyconst char *s; #endif { register int n; for ( n = 0; s[n]; ++n ) ; return n; } #endif #ifdef YY_USE_PROTOS static void *yy_flex_alloc( yy_size_t size ) #else static void *yy_flex_alloc( size ) yy_size_t size; #endif { return (void *) malloc( size ); } #ifdef YY_USE_PROTOS static void *yy_flex_realloc( void *ptr, yy_size_t size ) #else static void *yy_flex_realloc( ptr, size ) void *ptr; yy_size_t size; #endif { /* The cast to (char *) in the following accommodates both * implementations that use char* generic pointers, and those * that use void* generic pointers. It works with the latter * because both ANSI C and C++ allow castless assignment from * any pointer type to void*, and deal with argument conversions * as though doing an assignment. */ return (void *) realloc( (char *) ptr, size ); } #ifdef YY_USE_PROTOS static void yy_flex_free( void *ptr ) #else static void yy_flex_free( ptr ) void *ptr; #endif { free( ptr ); } #if YY_MAIN int main() { yylex(); return 0; } #endif #line 865 "filt.l" /* * * Private Routines * * */ #ifdef YY_USE_PROTOS static void floatprefix(void) #else static void floatprefix() #endif { if( filt->method == METHOD_C ) _FiltLexCat("(double)"); } #ifdef YY_USE_PROTOS static void floatsuffix(void) #else static void floatsuffix() #endif { return; } #ifdef YY_USE_PROTOS static void bin2num(char *d, char *s, int maxlen) #else static void bin2num(d, s, maxlen) char *d; char *s; int maxlen; #endif { unsigned long bits; char *p=NULL; if( strlen(s) < 2 ){ if( d != s ) strncpy(d, s, maxlen-1); } else{ if( (*s=='0') && (*(s+1)=='b') ){ bits = strtoul(s+2, &p, 2); if( *p != '\0' ) _filterror("invalid binary value"); snprintf(d, maxlen, "%lx", bits); if( (strlen(d) <2) || (*d!='0') || ((*(d+1)!='x')&&((*(d+1)!='X'))) ){ snprintf(d, maxlen, "0x%lx", bits); } } else{ if( d != s ) strncpy(d, s, maxlen-1); } } } /* * * _FiltLexNew -- finish last start and set up new filter segment * */ #ifdef YY_USE_PROTOS static void _FiltLexNew(void) #else static void _FiltLexNew() #endif { int i; int last; if( nfiltseg >= maxfiltseg ){ last = maxfiltseg; if( maxfiltseg == 0 ){ maxfiltseg = SEGINC; filtseg = (FiltSeg *)xmalloc(maxfiltseg * sizeof(FiltSeg)); } else{ maxfiltseg += SEGINC; filtseg = (FiltSeg *)xrealloc(filtseg, maxfiltseg * sizeof(FiltSeg)); } /* clear the unused records */ for(i=last; is) ){ filtseg[nfiltseg] = (FiltSeg)xcalloc(1, sizeof(FiltSegRec)); nfiltseg++; } filtseg[nfiltseg-1]->n = nfiltseg-1; filtseg[nfiltseg-1]->nregion = 0; } /* * * _FiltLexParen -- add a paren to the filter string buffer * */ #ifdef YY_USE_PROTOS static void _FiltLexParen(char *str) #else static void _FiltLexParen(str) char *str; #endif { /* _FiltLexNew(); */ _FiltLexCat(str); /* _FiltLexNew(); */ } /* * * __FiltLexCat -- add a string to the filter string buffer * */ #ifdef YY_USE_PROTOS static void __FiltLexCat(char *str, char **ostr, int *olen) #else static void __FiltLexCat(str, ostr, olen) char *str; char **ostr; int *olen; #endif { int blen; int slen; if( (str == NULL) || (*str == '\0') ) return; else slen = strlen(str) + 1; if( (*ostr == NULL) || (**ostr == '\0') ) blen = 0; else blen = strlen(*ostr); while( (blen + slen) >= *olen ){ *olen += SEGINC; } if( blen == 0 ) *ostr = (char *)xcalloc(*olen, sizeof(char)); else *ostr = (char *)xrealloc(*ostr, *olen); strcat(*ostr, str); } /* * * _FiltLexCat -- add a string to the filter string buffer * */ #ifdef YY_USE_PROTOS static void _FiltLexCat(char *str) #else static void _FiltLexCat(str) char *str; #endif { char *s; if( !str || !*str ) return; if( nfiltseg ==0 ) _FiltLexNew(); s = xmalloc(strlen(str)+1); nowhite(str, s); __FiltLexCat(s, &(filtseg[nfiltseg-1]->s), &(filtseg[nfiltseg-1]->len)); if( s ) xfree(s); } /* * * _FiltLexArgSave -- save a radius or angle value to the temp string: * this is a special hack for funcnts * */ #ifdef YY_USE_PROTOS static void _FiltLexArgSave(double dval) #else static void _FiltLexArgSave(dval) double dval; #endif { char tbuf[SZ_LINE]; if( narg < 3 ) return; snprintf(tbuf, SZ_LINE, DFMT1, dval); if( narg == 3 ){ *lastarg = '\0'; lastd1 = 0.0; lastd2 = 0.0; if( filtseg[nfiltseg-1]->radang ){ xfree(filtseg[nfiltseg-1]->radang); filtseg[nfiltseg-1]->radang = NULL; filtseg[nfiltseg-1]->ralen = 0; } } switch(regid){ case TY_ANNULUS: case TY_CIRCLE: if( *lastarg ){ __FiltLexCat(lastarg, &(filtseg[nfiltseg-1]->radang), &(filtseg[nfiltseg-1]->ralen)); } __FiltLexCat(tbuf, &(filtseg[nfiltseg-1]->radang), &(filtseg[nfiltseg-1]->ralen)); if( narg > 3 ){ __FiltLexCat(",NA,NA\n", &(filtseg[nfiltseg-1]->radang), &(filtseg[nfiltseg-1]->ralen)); strcpy(lastarg, tbuf); } lastd1 = lastd2; lastd2 = dval; break; case TY_BOX: case TY_ELLIPSE: if( (narg%2) == 1 ){ if( *lastarg ){ __FiltLexCat(lastarg, &(filtseg[nfiltseg-1]->radang), &(filtseg[nfiltseg-1]->ralen)); } __FiltLexCat(tbuf, &(filtseg[nfiltseg-1]->radang), &(filtseg[nfiltseg-1]->ralen)); if( narg > 3 ){ __FiltLexCat(",NA,NA\n", &(filtseg[nfiltseg-1]->radang), &(filtseg[nfiltseg-1]->ralen)); strcpy(lastarg, tbuf); } lastd1 = lastd2; lastd2 = dval; } break; case TY_PIE: if( narg == 3 ){ __FiltLexCat("NA,NA", &(filtseg[nfiltseg-1]->radang), &(filtseg[nfiltseg-1]->ralen)); } else if( *lastarg ){ __FiltLexCat("NA,NA,", &(filtseg[nfiltseg-1]->radang), &(filtseg[nfiltseg-1]->ralen)); __FiltLexCat(lastarg, &(filtseg[nfiltseg-1]->radang), &(filtseg[nfiltseg-1]->ralen)); } __FiltLexCat(tbuf, &(filtseg[nfiltseg-1]->radang), &(filtseg[nfiltseg-1]->ralen)); if( narg > 3 ){ __FiltLexCat("\n", &(filtseg[nfiltseg-1]->radang), &(filtseg[nfiltseg-1]->ralen)); strcpy(lastarg, tbuf); } lastd1 = lastd2; lastd2 = dval; break; case TY_POINT: /* we have to process this here if its is a varargs */ /* so, for the 3rd arg, we add a line for initial x, y pair */ if( narg == 3 ){ __FiltLexCat("NA,NA,NA,NA\n", &(filtseg[nfiltseg-1]->radang), &(filtseg[nfiltseg-1]->ralen)); } /* and for every even arg, add a line for the preceeding x,y pair */ else if( (narg % 2) == 0 ){ __FiltLexCat("NA,NA,NA,NA\n", &(filtseg[nfiltseg-1]->radang), &(filtseg[nfiltseg-1]->ralen)); } break; default: return; } } /* * * _FiltLexAccel -- appply acceleration to a segment * */ #ifdef YY_USE_PROTOS static int _FiltLexAccel(int n) #else static int _FiltLexAccel(n) int n; #endif { int i; char tbuf[SZ_LINE]; char *s; double dinc; /* check region type */ switch(regid){ case TY_ANNULUS: break; case TY_BOX: narg -= 2; break; case TY_CIRCLE: narg -= 1; break; case TY_ELLIPSE: narg -= 2; break; case TY_PIE: break; default: _filterror("annulus, box, circle, ellipse, pie accelerators only - "); break; } /* add the argument */ snprintf(tbuf, SZ_LINE, IFMT1, n); _FiltLexCat(tbuf); /* change the name of the routine we will call */ if( filtseg[nfiltseg-1]->s0 ){ if( (s = xstrdup(&filtseg[nfiltseg-1]->s[filtseg[nfiltseg-1]->s0])) ){ filtseg[nfiltseg-1]->s[filtseg[nfiltseg-1]->s0] = '\0'; _FiltLexCat("n"); _FiltLexCat(s); snprintf(tbuf, SZ_LINE, "%d ", n); __FiltLexCat(tbuf, &(filtseg[nfiltseg-1]->regions), &(filtseg[nfiltseg-1]->nr)); __FiltLexCat(tbuf, &(filtseg[nfiltseg-1]->shapes), &(filtseg[nfiltseg-1]->ns)); setargs = 1; free (s); } if( filtseg[nfiltseg-1]->radang ){ xfree(filtseg[nfiltseg-1]->radang); filtseg[nfiltseg-1]->radang = NULL; filtseg[nfiltseg-1]->ralen = 0; } switch(regid){ case TY_ANNULUS: case TY_BOX: case TY_CIRCLE: case TY_ELLIPSE: dinc = (lastd2 - lastd1)/n; for(i=1; i<=n; i++){ snprintf(tbuf, SZ_LINE, DFMT2, lastd1+((i-1)*dinc), lastd1+(i*dinc)); __FiltLexCat(tbuf, &(filtseg[nfiltseg-1]->radang), &(filtseg[nfiltseg-1]->ralen)); __FiltLexCat(",NA,NA", &(filtseg[nfiltseg-1]->radang), &(filtseg[nfiltseg-1]->ralen)); __FiltLexCat("\n", &(filtseg[nfiltseg-1]->radang), &(filtseg[nfiltseg-1]->ralen)); } break; case TY_PIE: dinc = (lastd2 - lastd1)/n; for(i=1; i<=n; i++){ snprintf(tbuf, SZ_LINE, DFMT2, lastd1+((i-1)*dinc), lastd1+(i*dinc)); __FiltLexCat("NA,NA", &(filtseg[nfiltseg-1]->radang), &(filtseg[nfiltseg-1]->ralen)); __FiltLexCat(tbuf, &(filtseg[nfiltseg-1]->radang), &(filtseg[nfiltseg-1]->ralen)); __FiltLexCat("\n", &(filtseg[nfiltseg-1]->radang), &(filtseg[nfiltseg-1]->ralen)); } break; default: _filterror("annulus, box, circle, ellipse, pie accelerators only - "); break; } _FiltLexTypeSet(TOK_ACCEL); } else{ _filterror("misplaced accelerator"); } return(n); } /* * * _FiltLexTypeSet -- add type info to the filter segment record * */ #ifdef YY_USE_PROTOS static void _FiltLexTypeSet(int type) #else static void _FiltLexTypeSet(type) int type; #endif { if( nfiltseg ==0 ) _FiltLexNew(); filtseg[nfiltseg-1]->type |= type; } /* * * _FiltLexOp -- add an operator to the filter segment record * */ #ifdef YY_USE_PROTOS static void _FiltLexOp(char *op) #else static void _FiltLexOp(op) char *op; #endif { _FiltLexCat(op); filtseg[nfiltseg-1]->ops += 1; } #ifdef YY_USE_PROTOS static void _FiltLexRegionStart(int docols) #else static void _FiltLexRegionStart(docols) int docols; #endif { char *s, *t; char tbuf[SZ_LINE]; /* sanity check -- 1D images do not support regions */ if( (filt->type == TYPE_IMAGE) && (ft_naxes(filt->fhd)==1) ){ _filterror("2D region filters invalid for 1D images"); } narg = 0; setargs=0; s = xmalloc(strlen(yytext)+1); nowhite(yytext, s); if( *s == '+' ){ regtype = TOK_IREG; strcpy(regname, s+1); } else if( *s == '-' ){ regtype = TOK_EREG; strcpy(regname, s+1); } else if( *s == '!' ){ regtype = TOK_NREG; strcpy(regname, s+1); } else{ regtype = TOK_IREG; strcpy(regname, s); } _FiltLexTypeSet(regtype); if( !(t=strchr(regname, '(')) ){ nsparen=0; } /* remove the paren from the regname string -- we will explicitly add it */ else{ *t = '\0'; nsparen=1; } /* convert to lower case, remove white space */ culc(regname); nowhite(regname, s); strcpy(regname, s); /* convert abbrev to region */ if( !strncmp(regname, "ann", 3) ){ strcpy(regname, "annulus"); regid = TY_ANNULUS; } else if( !strncmp(regname, "box", 3) ){ strcpy(regname, "box"); regid = TY_BOX; } else if( !strncmp(regname, "cir", 3) ){ strcpy(regname, "circle"); regid = TY_CIRCLE; } else if( !strncmp(regname, "ell", 3) ){ strcpy(regname, "ellipse"); regid = TY_ELLIPSE; } else if( !strncmp(regname, "fie", 3) ){ strcpy(regname, "field"); regid = TY_FIELD; } else if( !strncmp(regname, "lin", 3) ){ strcpy(regname, "line"); regid = TY_LINE; } else if( !strncmp(regname, "pan", 3) ){ strcpy(regname, "panda"); regid = TY_PANDA; } else if( !strncmp(regname, "bpa", 3) ){ strcpy(regname, "bpanda"); regid = TY_BPANDA; } else if( !strncmp(regname, "cpa", 3) ){ strcpy(regname, "cpanda"); regid = TY_CPANDA; } else if( !strncmp(regname, "epa", 3) ){ strcpy(regname, "epanda"); regid = TY_EPANDA; } else if( !strncmp(regname, "pie", 3) ){ strcpy(regname, "pie"); regid = TY_PIE; } else if( !strncmp(regname, "qtp", 3) ){ strcpy(regname, "qtpie"); regid = TY_PIE; } else if( !strncmp(regname, "poi", 3) ){ strcpy(regname, "point"); regid = TY_POINT; } else if( !strncmp(regname, "pol", 3) ){ strcpy(regname, "polygon"); regid = TY_POLYGON; } else if( !strcmp(regname, "imagemask") ){ regid = TY_IMAGEMASK; } /* append filter-type prefix */ switch( filt->type ){ case TYPE_EVENTS: /* normally, we filter rows analytically using evregions.o */ if( !filt->evsect ) _FiltLexCat("ev"); /* if evsect=xxx is specified, we filter by image pixels */ else _FiltLexCat("im"); break; case TYPE_IMAGE: /* image are filtered by image pixels */ _FiltLexCat("im"); break; } /* no region value to start */ filtseg[nfiltseg-1]->regval = 0; /* save size of current string so we can get back to the region string */ filtseg[nfiltseg-1]->s0 = strlen(filtseg[nfiltseg-1]->s); /* append region */ _FiltLexCat(FilterLexRegion1(filt,regname)); /* append standard args */ _FiltLexCat("(g,$RS,"); /* add include/exclude and whether we mark y lines for this region (we don't mark y on excludes as an optimization) */ switch(regtype){ case TOK_IREG: snprintf(tbuf, SZ_LINE, "1,%d", TOK_IREG); _FiltLexCat(tbuf); break; case TOK_NREG: snprintf(tbuf, SZ_LINE, "0,%d", TOK_NREG); _FiltLexCat(tbuf); break; case TOK_EREG: snprintf(tbuf, SZ_LINE, "0,%d", TOK_EREG); _FiltLexCat(tbuf); break; } switch(docols){ case 0: /* initialize default columns for tables -- but don't enter symbols yet */ FilterSymbolDefaults(filt, 0); /* initialize wcs for default image case */ _FiltLexWcsCols(filt->fhd, filt->xbin, filt->ybin); _FiltLexCat(","); floatprefix(); _FiltLexCat("x"); floatsuffix(); _FiltLexCat(","); floatprefix(); _FiltLexCat("y"); floatsuffix(); break; case 1: if( !initbindefs ){ /* initialize default columns for tables and enter symbols */ FilterSymbolDefaults(filt, 1); /* initialize wcs for default table case */ _FiltLexWcsCols(filt->fhd, filt->xbin, filt->ybin); initbindefs++; } if( !filt->xbin || !filt->ybin ){ _filterror("two binning columns are required for regions"); } _FiltLexCat(","); floatprefix(); _FiltLexCat(filt->xbin); floatsuffix(); _FiltLexCat(","); floatprefix(); _FiltLexCat(filt->ybin); floatsuffix(); break; case 2: _FiltLexCat(","); floatprefix(); _FiltLexCat(colnames[0]); floatsuffix(); _FiltLexCat(","); floatprefix(); _FiltLexCat(colnames[1]); floatsuffix(); break; } if( s ) xfree(s); } #ifdef YY_USE_PROTOS static void _FiltLexRegionVal(char *s) #else static void _FiltLexRegionVal(s) char *s; #endif { char *t=NULL; if( (t=strchr(s, '{')) ){ t++; } else{ t = s; } filtseg[nfiltseg-1]->regval = atoi(t); } #ifdef YY_USE_PROTOS static void _FiltLexRegionEnd(void) #else static void _FiltLexRegionEnd() #endif { int n; char *s; char ebuf[SZ_LINE]; char tbuf[SZ_LINE]; /* add final arguments as required */ switch( regid ){ case TY_BOX: if( (narg%2) == 0 ){ _FiltLexCat(",0.0"); narg++; } else{ /* if we saved an angle arg, we need to replace the last position arg */ if( *saveang ){ if( (s=strrchr(filtseg[nfiltseg-1]->s, ',')) ){ *s = '\0'; _FiltLexCat(saveang); } } } break; case TY_ELLIPSE: if( (narg%2) == 0 ){ _FiltLexCat(",0.0"); narg++; } else{ /* if we saved an angle arg, we need to replace the last position arg */ if( *saveang ){ if( (s=strrchr(filtseg[nfiltseg-1]->s, ',')) ){ *s = '\0'; _FiltLexCat(saveang); } } } break; case TY_BPANDA: case TY_EPANDA: if( (narg%2) == 0 ){ _FiltLexCat(",0.0"); narg++; } /* drop through here to process panda */ case TY_PANDA: case TY_CPANDA: _FiltLexRegionPanda(); setargs = 1; break; default: break; } /* argument check */ if( (n=_FiltLexArgCheck(regname, narg)) > 0 ){ /* don't bother printing where we are in region */ *yytext = '\0'; switch( vargs[n-1] ){ case 'n': snprintf(ebuf, SZ_LINE, "'%s' requires %d args (%d found)", rnames[n-1], rargs[n-1], narg); break; case 'e': snprintf(ebuf, SZ_LINE, "'%s' requires at least %d (even) args (%d found)", rnames[n-1], rargs[n-1], narg); break; case 'o': snprintf(ebuf, SZ_LINE, "'%s' requires at least %d (odd) args (%d found)", rnames[n-1], rargs[n-1], narg); break; case 'y': default: snprintf(ebuf, SZ_LINE, "'%s' requires %d args (%d found)", rnames[n-1], rargs[n-1], narg); break; } _filterror(ebuf); } /* process varargs */ if( (n < 0) || (regid == TY_POLYGON) ){ if( filtseg[nfiltseg-1]->type & TOK_ACCEL ){ _filterror("n= and variable arglist cannot be combined -"); } /* if its a varargs, we need to end with PSTOP values */ snprintf(sbuf, SZ_LINE, DFMT2, PSTOP, PSTOP); _FiltLexCat(sbuf); /* change the name of the routine we will call */ if( regid != TY_POLYGON ){ if( filtseg[nfiltseg-1]->s0 ){ if((s = xstrdup(&filtseg[nfiltseg-1]->s[filtseg[nfiltseg-1]->s0]))){ filtseg[nfiltseg-1]->s[filtseg[nfiltseg-1]->s0] = '\0'; _FiltLexCat("v"); _FiltLexCat(s); switch(regid){ case TY_ANNULUS: n = narg - 3; break; case TY_BOX: n = (narg - 5)/2; break; case TY_CIRCLE: n = narg - 3; break; case TY_ELLIPSE: n = (narg - 5)/2; break; case TY_PIE: n = narg - 3; break; case TY_POINT: n = narg/2; break; default: _filterror("varargs: annulus, box, circle, ellipse, pie, point;"); break; } snprintf(tbuf, SZ_LINE, "%d ", n); __FiltLexCat(tbuf, &(filtseg[nfiltseg-1]->regions), &(filtseg[nfiltseg-1]->nr)); __FiltLexCat(tbuf, &(filtseg[nfiltseg-1]->shapes), &(filtseg[nfiltseg-1]->ns)); setargs = 1; free (s); } _FiltLexTypeSet(TOK_VARARGS); } else{ _filterror("invalid varargs"); } } } /* set number of regions and shapes, if not already done */ if( !setargs ){ snprintf(tbuf, SZ_LINE, "%d ", 1); __FiltLexCat(tbuf, &(filtseg[nfiltseg-1]->regions), &(filtseg[nfiltseg-1]->nr)); __FiltLexCat(tbuf, &(filtseg[nfiltseg-1]->shapes), &(filtseg[nfiltseg-1]->ns)); } /* finish off region string */ _FiltLexCat(FilterLexRegion2(filt,")")); /* no column arguments */ colargs = 0; /* arguments are not set */ setargs = 0; /* save angle not set */ *saveang = 0; } #ifdef YY_USE_PROTOS static int _FiltLexRegionPanda(void) #else static int _FiltLexRegionPanda() #endif { int i; int n=0; int got=0; int a, r; int ahi=0, rhi=0; int hi=0; double d[11]; double ainc=0.0, rinc=0.0; char tbuf[SZ_LINE]; char *s=NULL; char *t, *u; switch(regid){ case TY_PANDA: case TY_CPANDA: hi = 7; break; case TY_BPANDA: case TY_EPANDA: hi = 10; break; default: _filterror("unknown panda type -- contact saord@cfa.harvard.edu"); break; } s = xstrdup(filtseg[nfiltseg-1]->s); for(i=hi; i>=0; i--){ /* look for last comma */ t = strrchr(s, ','); if( !t ) goto done; /* null it out from base string */ *t = '\0'; /* point past comma and get double value */ t++; d[i] = strtod(t, &u); if( t == u ) goto done; } switch(regid){ case TY_PANDA: case TY_CPANDA: ainc = (d[3] - d[2])/d[4]; ahi = (int)d[4]; rinc = (d[6] - d[5])/d[7]; rhi = (int)d[7]; break; case TY_BPANDA: case TY_EPANDA: ainc = (d[3] - d[2])/d[4]; ahi = (int)d[4]; rinc = (d[7] - d[5])/d[9]; rhi = (int)d[9]; break; default: _filterror("unknown panda type -- contact saord@cfa.harvard.edu"); break; } /* process limits arguments */ for(a=1; a<=ahi; a++){ for(r=1; r<=rhi; r++){ snprintf(tbuf, SZ_LINE, DFMT4, d[5]+((r-1)*rinc), d[5]+(r*rinc), d[2]+((a-1)*ainc), d[2]+(a*ainc)); __FiltLexCat(tbuf, &(filtseg[nfiltseg-1]->radang), &(filtseg[nfiltseg-1]->ralen)); __FiltLexCat("\n", &(filtseg[nfiltseg-1]->radang), &(filtseg[nfiltseg-1]->ralen)); n++; } } /* adjust region and shape count */ snprintf(tbuf, SZ_LINE, "%d ", n); __FiltLexCat(tbuf, &(filtseg[nfiltseg-1]->regions), &(filtseg[nfiltseg-1]->nr)); snprintf(tbuf, SZ_LINE, "%d ", 2*n); __FiltLexCat(tbuf, &(filtseg[nfiltseg-1]->shapes), &(filtseg[nfiltseg-1]->ns)); _FiltLexTypeSet(TOK_ACCEL); /* success */ got = 1; done: if( s ) xfree(s); return got; } /* * * _FiltLexRangeAdd -- add a rangelist string to the filter string buffer * */ #ifdef YY_USE_PROTOS static void _FiltLexRangeAdd(char *xname, char *str, int type, int n, int maxlen) #else static void _FiltLexRangeAdd(xname, str, type, n, maxlen) char *xname; char *str; int type; int n; int maxlen; #endif { char tbuf[SZ_LINE]; char tbuf2[SZ_LINE]; char *s; char *t; char *t2; char *name; /* get "in-expression" name for current technique */ name = FilterLexName(filt, xname); /* initialize pointers */ s = str; t = tbuf; /* clear working buffer */ memset(t, 0, SZ_LINE); /* if this is not the beginning, we first need to OR with prev */ if( n != 0 ) strncat(t, "||", maxlen-1); /* put in parens for safety */ strncat(t, "(", maxlen-1); /* add the name */ strncat(t, name, maxlen-1); /* add the rangelist */ switch(type){ case 1: strncat(t, "<=", maxlen-1); /* skip past : */ s++; /* append value */ t2 = tbuf2; while( *s ){ *t2++ = *s++; } *t2 = '\0'; bin2num(tbuf2, tbuf2, maxlen-1); strncat(t, tbuf2, maxlen-1); break; case 2: strncat(t, "==", maxlen-1); /* append upper value */ t2 = tbuf2; while( *s ){ *t2++ = *s++; } *t2 = '\0'; bin2num(tbuf2, tbuf2, maxlen-1); strncat(t, tbuf2, maxlen-1); break; case 3: strncat(t, ">=", maxlen-1); /* append lower value */ t2 = tbuf2; while( *s && (*s != ':') ){ *t2++ = *s++; } *t2 = '\0'; bin2num(tbuf2, tbuf2, maxlen-1); strncat(t, tbuf2, maxlen-1); /* skip past : */ s++; strncat(t, "&&", maxlen-1); strncat(t, name, maxlen-1); strncat(t, "<=", maxlen-1); /* append upper value */ t2 = tbuf2; while( *s ){ *t2++ = *s++; } *t2 = '\0'; bin2num(tbuf2, tbuf2, maxlen-1); strncat(t, tbuf2, maxlen-1); break; case 4: strncat(t, ">=", maxlen-1); /* append lower value */ t2 = tbuf2; while( *s && (*s != ':') ){ *t2++ = *s++; } *t2 = '\0'; bin2num(tbuf2, tbuf2, maxlen-1); strncat(t, tbuf2, maxlen-1); break; } strncat(t, ")", maxlen-1); _FiltLexCat(tbuf); } /* * * _FiltLexTypeCmp -- compare routine for qsort * */ #ifdef YY_USE_PROTOS static int _FiltLexTypeCmp(const void *s1, const void *s2) #else static int _FiltLexTypeCmp(s1, s2) const void *s1; const void *s2; #endif { FiltSeg *f1 = (FiltSeg *)s1; FiltSeg *f2 = (FiltSeg *)s2; /* check for broken qsort */ if( !*f1 || !*f2 ){ _filterror("qsort is broken -- contact saord@cfa.harvard.edu"); /* will not happen */ return 0; } /* make sure null string is at the end */ if( !(*f1)->s && !(*f2)->s ) return 0; else if( !(*f1)->s ) return 1; else if( !(*f2)->s ) return -1; /* paint: reverse order and make excludes local */ if( filt->paint ){ /* if both are regions, reverse order */ if( ((*f1)->type & TOK_REG) && ((*f2)->type & TOK_REG) ){ if( (*f1)->n < (*f2)->n ) return 1; else if( (*f1)->n > (*f2)->n ) return -1; else return 0; } /* keep same order */ else{ if( (*f1)->n < (*f2)->n ) return -1; else if( (*f1)->n > (*f2)->n ) return 1; else return 0; } } else{ /* if both or neither are eregions, keep them in the same order */ if( ((*f1)->type & TOK_EREG) == ((*f2)->type & TOK_EREG) ){ if( (*f1)->n < (*f2)->n ) return -1; else if( (*f1)->n > (*f2)->n ) return 1; else return 0; } /* exactly one is an eregion -- and we want eregions last */ else{ if( (*f1)->type & TOK_EREG ) return 1; else if( (*f2)->type & TOK_EREG ) return -1; /* should not happen */ else return 0; } } } /* * * _FiltLexTypeMatch -- see if the type of filtering we are doing * matches the type of token we have * */ #ifdef YY_USE_PROTOS int _FiltLexTypeMatch(int ftype, int ttype) #else int _FiltLexTypeMatch(ftype, ttype) int ftype; int ttype; #endif { switch(ftype){ case TYPE_IMAGE: /* we don't allow range list and col names in image filters */ if( (ttype & TOK_RLIST) || (ttype & TOK_NAME) ) return 0; /* everything else is fine */ else return 1; case TYPE_EVENTS: return 1; default: return 1; } } #ifdef YY_USE_PROTOS static int _FiltLexArgCheck(char *name, int args) #else static int _FiltLexArgCheck(name, args) char *name; int args; #endif { int i; for(i=0; rnames[i]; i++){ if( !strcmp(name, rnames[i]) ){ if( args == rargs[i] ){ return(0); } else{ /* less than required min */ if( args < rargs[i] ) return(i+1); /* more than min args -- could be varargs */ else{ /* check args allowed in varargs */ switch(vargs[i]){ case 'e': if( (args%2) == 0 ) return(-1); else return(i+1); case 'o': if( (args%2) == 1 ) return(-1); else return(i+1); case 'y': return(-1); default: return(i+1); } } } } } return(0); } #ifdef YY_USE_PROTOS static void _FiltLexSetWcs(char *s) #else static void _FiltLexSetWcs(s) char *s; #endif { char name[SZ_LINE]; int ip=0; newdtable(",=;"); /* get name of global coordsys */ if( word(s, name, &ip) ){ if( gcoordsys ) xfree(gcoordsys); gcoordsys = xstrdup(name); culc(gcoordsys); } /* restore old delim table */ freedtable(); } #ifdef YY_USE_PROTOS static char * _FiltLexCB(char *name, void *client_data) #else static char *_FiltLexCB(name, client_data) char *name; void *client_data; #endif { FiltSeg f=(FiltSeg)client_data; int ip=0; int nr=0; int ns=0; char *s; char tbuf[SZ_LINE]; if( !strcmp(name, "RS") ){ /* exclude regions get no region value first time around */ if( (macropass==0) && (f->type & TOK_EREG) ){ return NULL; } /* get next region value and remove from string */ if( word(f->regions, tbuf, &ip) ){ nr = atoi(tbuf); s = xstrdup(&(f->regions[ip])); xfree(f->regions); f->regions = s; } else{ _filterror("internal error: no region string specified"); return(NULL); } if( !inexpr || (f->type & (TOK_ACCEL|TOK_VARARGS)) ){ if( f->regval ){ snprintf(macrobuf, SZ_LINE, "%d,", f->regval); } else{ snprintf(macrobuf, SZ_LINE, "%d,", nregion+1); } nregion += nr; f->nregion += nr; inexpr = 1; } else{ if( f->regval ){ snprintf(macrobuf, SZ_LINE, "%d,", f->regval); } else{ snprintf(macrobuf, SZ_LINE, "%d,", nregion); } } /* get next shape value and remove from string */ ip = 0; if( word(f->shapes, tbuf, &ip) ){ ns = atoi(tbuf); s = xstrdup(&(f->shapes[ip])); xfree(f->shapes); f->shapes = s; } else{ _filterror("internal error: no shape string specified"); return(NULL); } /* concat shape value */ nshape++; snprintf(tbuf, SZ_LINE, "%d", nshape); strcat(macrobuf, tbuf); /* set new shape value */ nshape += (ns-1); /* return macro value */ return(macrobuf); } else{ return NULL; } } /* * * _FiltLexNeedOp -- determine if we add a connecting operator for this segment * */ #ifdef YY_USE_PROTOS static int _FiltLexNeedOp(int i, char *s) #else static int _FiltLexNeedOp(i, s) int i; char *s; #endif { int c; /* check for operator in current string */ if( s && *s ){ c = *s; switch(c){ case '&': case '|': case '=': case '!': case '<': case '>': return 0; default: break; } } /* not in this string check for operator in previous */ for(i=i-1; i>=0; i--){ if( !filtseg[i] || !filtseg[i]->s ) continue; if( strcmp(filtseg[i]->s, "(") && strcmp(filtseg[i]->s, ")") ) break; } if( i >= 0 ){ c = filtseg[i]->s[strlen(filtseg[i]->s)-1]; switch(c){ case '&': case '|': case '=': case '!': case '<': case '>': return 0; default: return 1; } } else{ return 0; } } /* * * _FiltLexMake -- generate filter from filter segments * */ #ifdef YY_USE_PROTOS static void _FiltLexMake(void) #else static void _FiltLexMake() #endif { int i, j, k, l; int x, xtot; int type=0; int ltype=0; int opar=0; char *s; /* debugging */ if( filt->debug ){ for(i=0; is ) fprintf(stderr, "unsorted #%d %s\n", filtseg[i]->n, filtseg[i]->s); else fprintf(stderr, "unsorted #%d %d is empty\n", i, filtseg[i]->n); } } /* look for bad region expressions and determine how many regions we have */ for(i=0, j=0, k=0, l=0; is ) continue; type = filtseg[i]->type; /* make sure we want the type being offered */ if( !_FiltLexTypeMatch(filt->type, type) ){ _filterror("column filters not permitted in an image filter expression"); } /* look for bad combinations */ if( (type & TOK_NREG) && !(type & TOK_IREG) ) _filterror("!region must be combined with another region (e.g., field()&&!region)"); if( (type & TOK_EREG) && (type & TOK_IREG) ) _filterror("-region must not be combined with another region (use !region instead)"); if( (type & TOK_EREG) && (type & TOK_NAME) ) _filterror("-region must not be combined with filters (use !region instead)"); if( (type & TOK_EREG) && (type & TOK_RLIST) ) _filterror("-region must not be combined with range lists (use !region instead)"); if( (type & TOK_EREG) && (type & TOK_RTINE) ) _filterror("-region must not be combined with routines (use !region instead)"); /* count region types */ if( filtseg[i]->type & TOK_IREG ) j++; if( filtseg[i]->type & TOK_NREG ) k++; if( filtseg[i]->type & TOK_EREG ) l++; } /* check for fits image mask and process specially */ if( filt->masks ){ /* can't have fits mask and ascii regions */ if( j || k || l ){ _filterror("FITS image masks cannot be combined with ASCII regions"); } /* image filtering of events uses a imagemask special routine */ if( (filt->type == TYPE_EVENTS) && filt->evsect ){ strcpy(yytext, "imagemask"); _FiltLexRegionStart(1); _FiltLexRegionEnd(); } else{ __FiltLexCat("imagemask", &filter, &filtlen); nregion = filt->nmaskreg; return; } } /* if we have only exclude regions, add field */ if( !j && !k && l ){ strcpy(yytext, "field"); if( filt->type == TYPE_EVENTS ) _FiltLexRegionStart(1); else _FiltLexRegionStart(0); _FiltLexRegionEnd(); } /* reset region and shape counts */ nregion=0; nshape=0; /* expand macro before reordering, to maintain region numbers in sequence */ for(i=0; is ){ if( _FiltLexNeedOp(i, NULL) ) inexpr=0; macropass=0; s = ExpandMacro(filtseg[i]->s, NULL, NULL, 0, _FiltLexCB, filtseg[i]); xfree(filtseg[i]->s); filtseg[i]->s = s; } } /* we want descending order so that eregions are last in the expression */ qsort(filtseg, nfiltseg, sizeof(FiltSeg), _FiltLexTypeCmp); if( filt->debug ){ for(i=0; is ) fprintf(stderr, "sorted #%d %s\n", filtseg[i]->n, filtseg[i]->s); else fprintf(stderr, "sorted #%d %d is empty\n", i, filtseg[i]->n); } } /* add open paren and mark that we did it */ __FiltLexCat("(", &filter, &filtlen); opar = 1; /* run through segments, inserting proper boolean connectors */ ltype = 0; for(i=0; is ){ /* no type probably means its a paren, so just add it and jump out */ if( !filtseg[i]->type ){ __FiltLexCat(filtseg[i]->s, &filter, &filtlen); /* remove empty parens, if we just make them */ x = strlen(filter); if( (filter[x-2] == '(') && (filter[x-1] == ')') ) filter[x-2] = '\0'; i++; continue; } type = filtseg[i]->type; if( _FiltLexNeedOp(i, NULL) ) inexpr=0; macropass=1; s = ExpandMacro(filtseg[i]->s, NULL, NULL, 0, _FiltLexCB, filtseg[i]); if( _FiltLexNeedOp(i, s) ){ /* remove trailing open parens from prev. segment (add back later) */ for(xtot=0, x=strlen(filter)-1; x>=0; x--){ if( filter[x] != '(' ) break; filter[x] = '\0'; xtot++; } if( (ltype & TOK_IREG) && (type & TOK_IREG) ){ __FiltLexCat("||", &filter, &filtlen); } else if( (ltype & TOK_IREG) && (type & TOK_EREG) ){ if( opar > 0 ){ __FiltLexCat(")", &filter, &filtlen); opar--; } if( filt->paint ){ if( opar > 0 ){ __FiltLexCat(")", &filter, &filtlen); opar --; } __FiltLexCat("||", &filter, &filtlen); } else{ __FiltLexCat("&&", &filter, &filtlen); } __FiltLexCat("(", &filter, &filtlen); opar++; } else if( (ltype & TOK_EREG) && (type & TOK_EREG) ){ __FiltLexCat("&&", &filter, &filtlen); } else if( (ltype & TOK_EREG) && (type & TOK_IREG) ){ if( filt->paint && (opar > 0) ){ __FiltLexCat(")", &filter, &filtlen); opar --; } __FiltLexCat("&&", &filter, &filtlen); __FiltLexCat("(", &filter, &filtlen); opar ++; if( filt->paint ){ __FiltLexCat("(", &filter, &filtlen); opar++; } } /* otherwise implied operator is AND */ else{ __FiltLexCat("&&", &filter, &filtlen); } /* add back parens */ for(x=0; xpaint && (i==0) ){ __FiltLexCat("((", &filter, &filtlen); opar +=2; } } __FiltLexCat(s, &filter, &filtlen); if( s ) xfree(s); if( filtseg[i]->radang ){ if( *filtseg[i]->radang == ',' ) __FiltLexCat(filtseg[i]->radang+1, &radang, &radanglen); else __FiltLexCat(filtseg[i]->radang, &radang, &radanglen); } else{ __FiltLexCat("NA,NA,NA,NA\n", &radang, &radanglen); } i++; for(; (itype==type); ){ if( _FiltLexNeedOp(i, NULL) ) inexpr=0; s = ExpandMacro(filtseg[i]->s, NULL, NULL, 0, _FiltLexCB, filtseg[i]); if( _FiltLexNeedOp(i, s) ){ for(xtot=0, x=strlen(filter)-1; x>=0; x--){ if( filter[x] != '(' ) break; filter[x] = '\0'; xtot++; } /* if lhs and rhs are regions, implied operator is OR */ if( type & TOK_IREG ) __FiltLexCat("||", &filter, &filtlen); /* otherwise implied operator is AND */ else __FiltLexCat("&&", &filter, &filtlen); for(x=0; xradang ){ if( *filtseg[i]->radang == ',' ) __FiltLexCat(filtseg[i]->radang+1, &radang, &radanglen); else __FiltLexCat(filtseg[i]->radang, &radang, &radanglen); } else{ __FiltLexCat("NA,NA,NA,NA\n", &radang, &radanglen); } i++; } } /* ignore invalid arguments */ else{ i++; } /* save last type */ ltype = type; } /* if last segment was an exclude and we are in paint mode, ignore it */ if( filt->paint && (ltype & TOK_EREG) ){ __FiltLexCat("&&0", &filter, &filtlen); } /* close off open parens (lots could be needed in paint mode) */ while( opar-- ){ __FiltLexCat(")", &filter, &filtlen); } /* check for even number of parens */ l = strlen(filter); for(i=0, j=0; idebug ) fprintf(stderr, "paren error %d: %s\n", j, filter); _filterror("unbalanced parentheses"); } if( filt->debug ) fprintf(stderr, "filter: %s\n", filter); } /* * * _FiltLexEnd -- cleanup from parsing regions * */ #ifdef YY_USE_PROTOS static void _FiltLexEnd(void) #else static void _FiltLexEnd() #endif { int i; /* reset state variables */ colargs = 0; initbindefs = 0; include_stack_ptr = 0; nroutine = 0; nshape = 0; nmask = 0; nparen = 0; parse_error = 0; filtlen = 0; radanglen = 0; regid = 0; regtype = 0; inexpr = 0; *regname = '\0'; *saveang = 0; *(wcsnames[0]) = '\0'; *(wcsnames[1]) = '\0'; binsiz[0] = 1; binsiz[1] = 1; /* free up previous filter */ if( filter ){ xfree(filter); filter = NULL; } /* free up previous radang string */ if( radang ){ xfree(radang); radang = NULL; } /* free up wcs */ if( wcs ){ wcsfree (wcs); wcs = NULL; } /* no segments */ if( filtseg ){ for(i=0; is ) xfree(filtseg[i]->s); if( filtseg[i]->regions ) xfree(filtseg[i]->regions); if( filtseg[i]->shapes ) xfree(filtseg[i]->shapes); if( filtseg[i]->radang ) xfree(filtseg[i]->radang); xfree(filtseg[i]); } } xfree(filtseg); filtseg = NULL; } maxfiltseg = 0; nfiltseg = 0; if( gcoordsys ){ xfree(gcoordsys); gcoordsys = NULL; } if( fcoordsys ){ xfree(fcoordsys); fcoordsys = NULL; } cdelt1 = 0.0; cdelt2 = 0.0; crot = 0.0; } /* * * _FiltLexGetWcs -- determine the WCS coord system to use for wcsc translation * */ #ifdef YY_USE_PROTOS static char * _FiltLexGetWcs(void) #else static char *_FiltLexGetWcs() #endif { if( gcoordsys && strcmp(gcoordsys, "image") && strcmp(gcoordsys, "physical") ) return gcoordsys; if( fcoordsys && strcmp(fcoordsys, "image") && strcmp(fcoordsys, "physical") ) return fcoordsys; return NULL; } /* * * _FiltLexWcsCols -- reset WCS for these columns * */ #ifdef YY_USE_PROTOS static void _FiltLexWcsCols(FITSHead iheader, char *name0, char *name1) #else static void _FiltLexWcsCols(iheader, name0, name1) FITSHead iheader; char *name0; char *name1; #endif { int i, which, ival; int simple=1; double dval, dval2; char *s; FITSHead oheader; FITSCard card; /* make sure we have something to process */ if( !iheader ) return; if( filt->fhd->image ){ /* free up old wcs */ if( wcs ) wcsfree (wcs); /* init new wcs */ hlength(ft_cards(filt->fhd),0); wcs = wcsinit(ft_cards(filt->fhd)); tltyp[0] = 0; tltyp[1] = 0; } /* for tables, we can init wcs only the specified columns */ else if( name0 && *name0 && name1 && *name1 ){ /* see if these are the same as the last set of columns */ if( (*(wcsnames[0]) && !strcasecmp(name0,wcsnames[0])) && (*(wcsnames[1]) && !strcasecmp(name1,wcsnames[1])) && wcs ){ return; } /* gather up important tl info about the binning columns */ for(i=1; i<=iheader->table->tfields; i++){ /* determine which bincol we are processing */ if( !strcasecmp(iheader->table->col[i-1].name, name0) ) which = 0; else if( !strcasecmp(iheader->table->col[i-1].name, name1) ) which = 1; else continue; /* set tlinfo values for this column */ tlmin[which] = ft_headgetr(iheader, "TLMIN", i, 1.0, &card); tlmax[which] = ft_headgetr(iheader, "TLMAX", i, 1.0, &card); binsiz[which] = ft_headgetr(iheader, "TDBIN", i, 1.0, &card); tltyp[which] = iheader->table->col[i-1].type; } /* free up old wcs */ if( wcs ) wcsfree (wcs); /* make a copy of the header */ oheader = ft_headcopy(iheader); /* make sure this is a primary FITS file */ ft_cardfmt((FITSCard)oheader->cards, "SIMPLE", 0, FT_LOGICAL, &simple, 0, "Standard FITS"); /* set dimension info, used by wcs code */ ft_headseti(oheader, "NAXIS", 0, 2, "number of axes", 1); /* set dimension info */ for(i=0; i<=1; i++){ ival = (int)tldim(tlmin[i], tlmax[i], binsiz[i], tltyp[i]); ft_headseti(oheader, "NAXIS", i+1, ival, "axis dimension", 1); } /* set bitpix */ ft_headseti(oheader, "BITPIX", 0, 32, "bits/pixel", 1); /* synchronize the header and the cards after any changes */ ft_syncdata(oheader); /* transform WCS cards for the specified columns, if we have such */ for(i=1; i<=iheader->table->tfields; i++){ /* determine which bincol we are processing */ if( !strcasecmp(iheader->table->col[i-1].name, name0) ) which = 0; else if( !strcasecmp(iheader->table->col[i-1].name, name1) ) which = 1; else continue; /* convert event wcs header info image wcs info */ if( (s=ft_headgets(iheader, "TCTYP", i, NULL, &card)) && card ){ ft_headapps(oheader, "CTYPE", which+1, s, NULL); xfree(s); } if( (s=ft_headgets(iheader, "TCRVL", i, NULL, &card)) && card ){ ft_headappv(oheader, "CRVAL", which+1, s, NULL); xfree(s); } if( (s=ft_headgets(iheader, "TCDLT", i, NULL, &card)) && card ){ ft_headappv(oheader, "CDELT", which+1, s, NULL); xfree(s); } if( (s=ft_headgets(iheader, "TCROT", i, NULL, &card)) && card ){ ft_headappv(oheader, "CROTA", which+1, s, NULL); xfree(s); } /* this value gets converted from physical to image */ if( (dval=ft_headgetr(iheader, "TCRPX", i, 0.0, &card)) && card ){ dval2 = tlp2i(dval, tlmin[which], binsiz[which], tltyp[which]); ft_headsetr(oheader, "CRPIX", which+1, dval2, 7, NULL, 1); } } /* init new wcs */ hlength(ft_cards(oheader),0); wcs = wcsinit(ft_cards(oheader)); ft_headfree(oheader, 1); /* save names for next time */ strcpy(wcsnames[0], name0); strcpy(wcsnames[1], name1); } /* set some extra wcs parameters */ if( wcs && iswcs(wcs) ){ if( fcoordsys ) xfree(fcoordsys); fcoordsys = xstrdup(wcs->radecin); culc(fcoordsys); if( !wcs->coorflip ){ cdelt1 = wcs->cdelt[0]; cdelt2 = wcs->cdelt[1]; } else{ cdelt1 = wcs->cdelt[1]; cdelt2 = wcs->cdelt[0]; } if ( wcs->imflip ) { crot = -wcs->rot; } else { crot = wcs->rot; } } else{ cdelt1 = 0.0; cdelt2 = 0.0; crot = 0.0; } /* set global coord system first time through */ if( !gcoordsys ){ if( (gcoordsys=xstrdup(getenv("COORDSYS"))) == NULL ) gcoordsys = xstrdup(DEFAULT_COORDSYS); } } /* * * _FiltLexLcx -- determine if we have a linear-type WCS * */ #ifdef YY_USE_PROTOS static int _FiltLexLcx(void) #else static int _FiltLexLcx() #endif { char *coordsys; coordsys = gcoordsys; if( !coordsys || !*coordsys ) return 0; if( !strcasecmp(coordsys, "image") ) return LCX_IMAGE; if( !strcasecmp(coordsys, "physical") ) return LCX_PHYS; if( !strcasecmp(coordsys, "amplifier") ) return LCX_AMP; if( !strcasecmp(coordsys, "detector") ) return LCX_DET; return 0; } #ifdef YY_USE_PROTOS static void _FiltLexNum(int lcx) #else static void _FiltLexNum(lcx) int lcx; #endif { char tbuf[SZ_LINE]; /* process binary number, if necessary */ bin2num(tbuf, yytext, SZ_LINE); /* for linear coordinate systems (physical, amps, etc.), we have to convert to image coords or physical coords, depending on the type of data and type of filtering */ if( lcx ){ /* data is in a table: we can use image or physical coords */ if( filt->fhd->table ){ /* if we want to use physical coordinates ... */ if( USEPHYS ){ /* convert image positions to physical coords */ if( lcx == LCX_IMAGE ){ if( POSARG ){ dval = tli2p(strtod(tbuf,NULL), tlmin[(narg+1)%2], binsiz[(narg+1)%2], tltyp[(narg+1)%2]); snprintf(sbuf, SZ_LINE, DFMT1, dval); _FiltLexCat(sbuf); _FiltLexArgSave(dval); } /* angle arguments are just passed along */ else if( ANGARG ){ dval = strtod(tbuf,NULL); snprintf(sbuf, SZ_LINE, DFMT1, dval); _FiltLexCat(sbuf); _FiltLexArgSave(dval); } /* panda numeric args are just passed along */ else if( NUMARG ){ dval = strtod(tbuf,NULL); snprintf(sbuf, SZ_LINE, DFMT1, dval); _FiltLexCat(sbuf); } /* size arguments have to be converted using the binsize */ else{ if( SAVEANG ){ dval = strtod(tbuf,NULL); snprintf(saveang, SZ_LINE, DFMT1, dval); } dval = strtod(tbuf,NULL) * binsiz[(narg+1)%2]; snprintf(sbuf, SZ_LINE, DFMT1, dval); _FiltLexCat(sbuf); _FiltLexArgSave(dval); } } /* already in physical -- just pass along args */ else{ dval = strtod(tbuf,NULL); snprintf(sbuf, SZ_LINE, DFMT1, dval); _FiltLexCat(sbuf); _FiltLexArgSave(dval); } } /* we are using image coords (image-style filtering) */ else{ /* convert non-image positions to image coords */ if( lcx != LCX_IMAGE ){ if( POSARG ){ dval = tlp2i(strtod(tbuf,NULL), tlmin[(narg+1)%2], binsiz[(narg+1)%2], tltyp[(narg+1)%2]); snprintf(sbuf, SZ_LINE, DFMT1, dval); _FiltLexCat(sbuf); _FiltLexArgSave(dval); } /* angle arguments are just passed along */ else if( ANGARG ){ dval = strtod(tbuf,NULL); snprintf(sbuf, SZ_LINE, DFMT1, dval); _FiltLexCat(sbuf); _FiltLexArgSave(dval); } /* panda numeric args are just passed along */ else if( NUMARG ){ dval = strtod(tbuf,NULL); snprintf(sbuf, SZ_LINE, DFMT1, dval); _FiltLexCat(sbuf); } /* size arguments have to be converted using the binsize */ else{ if( SAVEANG ){ dval = strtod(tbuf,NULL); snprintf(saveang, SZ_LINE, DFMT1, dval); } dval = strtod(tbuf,NULL) / binsiz[(narg+1)%2]; snprintf(sbuf, SZ_LINE, DFMT1, dval); _FiltLexCat(sbuf); _FiltLexArgSave(dval); } } /* already in image -- just pass along args */ else{ dval = strtod(tbuf,NULL); snprintf(sbuf, SZ_LINE, DFMT1, dval); _FiltLexCat(sbuf); _FiltLexArgSave(dval); } } } /* data is in an image: we use image coords */ else{ /* convert positional arguments to image */ if( POSARG ){ /* save x value for processing with y next time */ if( XARG ){ xpos = SAOstrtod(tbuf,NULL); } else{ ypos = SAOstrtod(tbuf,NULL); switch(lcx){ case LCX_IMAGE: xpix = xpos; ypix = ypos; break; case LCX_PHYS: ft_phy2img(filt->fhd, xpos, ypos, &xpix, &ypix); break; case LCX_AMP: ft_amp2phy(filt->fhd, xpos, ypos, &dval, &dval2); ft_phy2img(filt->fhd, dval, dval2, &xpix, &ypix); break; case LCX_DET: ft_det2phy(filt->fhd, xpos, ypos, &dval, &dval2); ft_phy2img(filt->fhd, dval, dval2, &xpix, &ypix); break; } snprintf(sbuf, SZ_LINE, DFMT2, xpix, ypix); _FiltLexCat(sbuf); } } /* angle arguments are just passed along, with updated crot */ else if( ANGARG ){ dval = strtod(tbuf,NULL); if( USEWCS ) dval += crot; if( IMFLIP ) dval = -dval; snprintf(sbuf, SZ_LINE, DFMT1, dval); _FiltLexCat(sbuf); } /* panda numeric args are just passed along */ else if( NUMARG ){ dval = strtod(tbuf,NULL); snprintf(sbuf, SZ_LINE, DFMT1, dval); _FiltLexCat(sbuf); } /* convert size args, which may or may not be in pairs */ else{ if( SAVEANG ){ dval = strtod(tbuf,NULL); if( USEWCS ) dval += crot; if( IMFLIP ) dval = -dval; snprintf(saveang, SZ_LINE, DFMT1, dval); } /* arg 1 is associated with ra, arg2 with dec */ if( XARG ){ xpos = ABS(strtod(tbuf,NULL)); ypos = 0.0; switch(lcx){ case LCX_IMAGE: xpix = xpos; break; case LCX_PHYS: ft_phy2img_size(filt->fhd, xpos, ypos, &xpix, &ypix); break; case LCX_AMP: ft_amp2phy_size(filt->fhd, xpos,ypos, &dval,&dval2); ft_phy2img_size(filt->fhd, dval,dval2, &xpix,&ypix); break; case LCX_DET: ft_det2phy_size(filt->fhd, xpos,ypos, &dval,&dval2); ft_phy2img_size(filt->fhd, dval,dval2, &xpix,&ypix); break; } snprintf(sbuf, SZ_LINE, DFMT1, xpix); _FiltLexArgSave(xpix); } else{ xpos = 0.0; ypos = ABS(strtod(tbuf,NULL)); switch(lcx){ case LCX_IMAGE: ypix = ypos; break; case LCX_PHYS: ft_phy2img_size(filt->fhd, xpos, ypos, &xpix, &ypix); break; case LCX_AMP: ft_amp2phy_size(filt->fhd, xpos,ypos, &dval,&dval2); ft_phy2img_size(filt->fhd, dval,dval2, &xpix,&ypix); break; case LCX_DET: ft_det2phy_size(filt->fhd, xpos,ypos, &dval,&dval2); ft_phy2img_size(filt->fhd, dval,dval2, &xpix,&ypix); break; } snprintf(sbuf, SZ_LINE, DFMT1, ypix); _FiltLexArgSave(ypix); } _FiltLexCat(sbuf); } } } /* not lcx -- angle arguments are just passed along with updated crot */ else if( ANGARG ){ dval = strtod(tbuf,NULL); if( USEWCS ) dval += crot; if( IMFLIP ) dval = -dval; snprintf(sbuf, SZ_LINE, DFMT1, dval); _FiltLexCat(sbuf); } /* panda numeric args are just passed along */ else if( NUMARG ){ dval = strtod(tbuf,NULL); snprintf(sbuf, SZ_LINE, DFMT1, dval); _FiltLexCat(sbuf); } /* not lcx -- everything else is assumed to be in units of "degrees" in the default system. add 'd' and put back for reparsing */ else{ int i; char *yycopy = xstrdup(tbuf); unput('d'); for(i=yyleng-1; i>=0; --i) unput(yycopy[i]); xfree(yycopy); narg--; } } #ifdef YY_USE_PROTOS static int _FiltIncMask(FilterMask masks, int maxmask, int nmask) #else static int _FiltIncMask(masks, maxmask, nmask) FilterMask masks; int maxmask; int nmask; #endif { int omax; nmask++; if( nmask >= maxmask ){ omax = maxmask; maxmask += MASKINC; masks = (FilterMask)xrealloc(masks, maxmask*sizeof(FilterMaskRec)); memset(masks+omax, 0, (maxmask-omax)*sizeof(FilterMaskRec)); } return nmask; } #ifdef YY_USE_PROTOS static int _FiltFitsMask(char *filename, FilterMask *rmasks, FITSHead *rhead, int *nreg) #else static int _FiltFitsMask(filename, rmasks, rhead, nreg) char *filename; FilterMask *rmasks; FITSHead *rhead; int *nreg; #endif { short *dptr; short *data=NULL; int x, y; int maxreg=-1; int maxmask; /* max masks allocated thus far */ int nmask=0; /* number of mask segments */ FilterMask masks=NULL; /* array valid region masks for one row */ FITSHead head=NULL; /* read fits image */ if( !ft_simpleimageread(filename, &head, (void *)&data, NULL, 16) ){ return(-1); } if( !head->image ){ if( data ) xfree(data); if( head ) ft_headfree(head, 1); return(-2); } if( !ft_naxes(head) || !ft_naxis(head, 1) || !ft_naxis(head, 2) ){ if( data ) xfree(data); if( head ) ft_headfree(head, 1); return(-3); } /* allocate an array of masks, which will be returned to caller */ maxmask = MASKINC; masks = (FilterMask)xcalloc(maxmask, sizeof(FilterMaskRec)); /* seed the first region mask value */ masks[nmask].region = 0; /* loop through y rows */ for(y=1; y<=ft_naxis(head, 2); y++){ dptr = data + ((y-1) * ft_naxis(head, 1)); /* to start this line, we make a seed mask with no region */ if( masks[nmask].region ){ nmask = _FiltIncMask(masks, maxmask, nmask); masks[nmask].region = 0; } /* process each pixel in the row */ for(x=1; x<=ft_naxis(head, 1); x++, dptr++){ /* we do not allow negative values */ if( *dptr < 0 ){ if( data ) xfree(data); if( head ) ft_headfree(head, 1); if( masks ) xfree(masks); return(-4); } /* set max region as needed */ if( *dptr > maxreg ) maxreg = *dptr; /* look for a change in the mask */ if( *dptr != masks[nmask].region ){ /* if previous was non-zero region, finish it and bump to next */ if( masks[nmask].region ){ masks[nmask].xstop = x - 1; nmask = _FiltIncMask(masks, maxmask, nmask); } masks[nmask].y = y; masks[nmask].region = *dptr; masks[nmask].xstart = x; } } /* finish last non-zero segment, inc number of mask segs */ if( masks[nmask].region ){ masks[nmask].xstop = x; nmask = _FiltIncMask(masks, maxmask, nmask); } } /* free up data space */ if( data ) xfree(data); /* allocate just enough mask space */ masks = (FilterMask)xrealloc(masks, nmask*sizeof(FilterMaskRec)); if( rmasks ) *rmasks = masks; else xfree(masks); if( rhead ) *rhead = head; else ft_headfree(head, 1); if( nreg ) *nreg = maxreg; return(nmask); } /* * * Semi-public Routines * * */ /* * * _FilterString -- return output filter from lexer * */ #ifdef YY_USE_PROTOS char * _FilterString(void) #else char *_FilterString() #endif { if( filtlen <= 0 ) _FiltLexMake(); return(filter); } #ifdef YY_USE_PROTOS int FilterRoutineCount(void) #else int FilterRoutineCount() #endif { return(nroutine); } #ifdef YY_USE_PROTOS int FilterShapeCount(void) #else int FilterShapeCount() #endif { return(nshape); } #ifdef YY_USE_PROTOS int FilterRegionCount(int type) #else int FilterRegionCount(type) int type; #endif { int i, j; /* handle fits image masks specially */ if( nmask ){ if( type & TOK_IREG ) return(nregion); else return(0); } /* normal regions */ for(i=0, j=0; itype & type ){ j += filtseg[i]->nregion; } } return(j); } #ifdef YY_USE_PROTOS char * FilterRadAng(void) #else char *FilterRadAng() #endif { return(radang); } #ifdef YY_USE_PROTOS int FilterParseError(void) #else int FilterParseError() #endif { return(parse_error); } #ifdef YY_USE_PROTOS int FilterTlInfo(double *tlmins, double *binsizs, int *tltyps) #else int FilterTlInfo(tlmins, binsizs, tltyps) double *tlmins; double *binsizs; int *tltyps; #endif { tlmins[0] = tlmin[0]; tlmins[1] = tlmin[1]; binsizs[0] = binsiz[0]; binsizs[1] = binsiz[1]; tltyps[0] = tltyp[0]; tltyps[1] = tltyp[1]; return 1; } #ifdef YY_USE_PROTOS void FiltInitParser(void) #else void FiltInitParser() #endif { static int parser = 0; /* make sure we free'd up all space from last time */ _FiltLexEnd(); /* set up some convenience variables */ filt = FilterDefault(); /* if( parser ) yyrestart(NULL); */ BEGIN INITIAL; parser++; laststart=INITIAL; } #ifdef YY_USE_PROTOS void FiltScanString(char *s) #else void FiltScanString(s) char *s; #endif { int i; char *t; /* make sure there is an explicit delim at end so we are done before lex finds EOF -- otherwise panda shapes don't get processed */ i = strlen(s); t = xmalloc(i+2); strcpy(t, s); if( (t[i-1] != ';') && (t[i-1] != '\n') ) strcat(t, "\n"); yy_scan_string(t); if( t ) xfree(t); } /* yyerror -- renamed to _filterror because flex -P does not change this */ #ifdef YY_USE_PROTOS int _filterror(char *msg) #else int _filterror(msg) char *msg; #endif { if( *yytext ) gerror(stderr, "%s while parsing filter at: %s\n", msg ? msg : "filterr", yytext); else gerror(stderr, "%s\n", msg ? msg : "filterr"); YY_FLUSH_BUFFER; parse_error = 1; yyterminate(); } #ifdef YY_USE_PROTOS int yywrap(void) #else int yywrap() #endif { return 1; } funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/filter/lex.idx.c000066400000000000000000002663131256243640000235150ustar00rootroot00000000000000#define yy_create_buffer idx_create_buffer #define yy_delete_buffer idx_delete_buffer #define yy_scan_buffer idx_scan_buffer #define yy_scan_string idx_scan_string #define yy_scan_bytes idx_scan_bytes #define yy_flex_debug idx_flex_debug #define yy_init_buffer idx_init_buffer #define yy_flush_buffer idx_flush_buffer #define yy_load_buffer_state idx_load_buffer_state #define yy_switch_to_buffer idx_switch_to_buffer #define yyin idxin #define yyleng idxleng #define yylex idxlex #define yyout idxout #define yyrestart idxrestart #define yytext idxtext #define yywrap idxwrap /* A lexical scanner generated by flex */ /* Scanner skeleton version: * $Header: /home/daffy/u0/vern/flex/RCS/flex.skl,v 2.91 96/09/10 16:58:48 vern Exp $ */ #define FLEX_SCANNER #define YY_FLEX_MAJOR_VERSION 2 #define YY_FLEX_MINOR_VERSION 5 #include /* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */ #ifdef c_plusplus #ifndef __cplusplus #define __cplusplus #endif #endif #ifdef __cplusplus #include #include /* Use prototypes in function declarations. */ #define YY_USE_PROTOS /* The "const" storage-class-modifier is valid. */ #define YY_USE_CONST #else /* ! __cplusplus */ #if __STDC__ #define YY_USE_PROTOS #define YY_USE_CONST #endif /* __STDC__ */ #endif /* ! __cplusplus */ #ifdef __TURBOC__ #pragma warn -rch #pragma warn -use #include #include #define YY_USE_CONST #define YY_USE_PROTOS #endif #ifdef YY_USE_CONST #define yyconst const #else #define yyconst #endif #ifdef YY_USE_PROTOS #define YY_PROTO(proto) proto #else #define YY_PROTO(proto) () #endif /* Returned upon end-of-file. */ #define YY_NULL 0 /* Promotes a possibly negative, possibly signed char to an unsigned * integer for use as an array index. If the signed char is negative, * we want to instead treat it as an 8-bit unsigned char, hence the * double cast. */ #define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) /* Enter a start condition. This macro really ought to take a parameter, * but we do it the disgusting crufty way forced on us by the ()-less * definition of BEGIN. */ #define BEGIN yy_start = 1 + 2 * /* Translate the current start state into a value that can be later handed * to BEGIN to return to the state. The YYSTATE alias is for lex * compatibility. */ #define YY_START ((yy_start - 1) / 2) #define YYSTATE YY_START /* Action number for EOF rule of a given start state. */ #define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) /* Special action meaning "start processing a new file". */ #define YY_NEW_FILE yyrestart( yyin ) #define YY_END_OF_BUFFER_CHAR 0 /* Size of default input buffer. */ #define YY_BUF_SIZE 16384 typedef struct yy_buffer_state *YY_BUFFER_STATE; extern int yyleng; extern FILE *yyin, *yyout; #define EOB_ACT_CONTINUE_SCAN 0 #define EOB_ACT_END_OF_FILE 1 #define EOB_ACT_LAST_MATCH 2 /* The funky do-while in the following #define is used to turn the definition * int a single C statement (which needs a semi-colon terminator). This * avoids problems with code like: * * if ( condition_holds ) * yyless( 5 ); * else * do_something_else(); * * Prior to using the do-while the compiler would get upset at the * "else" because it interpreted the "if" statement as being all * done when it reached the ';' after the yyless() call. */ /* Return all but the first 'n' matched characters back to the input stream. */ #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ *yy_cp = yy_hold_char; \ YY_RESTORE_YY_MORE_OFFSET \ yy_c_buf_p = yy_cp = yy_bp + n - YY_MORE_ADJ; \ YY_DO_BEFORE_ACTION; /* set up yytext again */ \ } \ while ( 0 ) #define unput(c) yyunput( c, idxtext_ptr ) /* The following is because we cannot portably get our hands on size_t * (without autoconf's help, which isn't available because we want * flex-generated scanners to compile on their own). */ typedef unsigned int yy_size_t; struct yy_buffer_state { FILE *yy_input_file; char *yy_ch_buf; /* input buffer */ char *yy_buf_pos; /* current position in input buffer */ /* Size of input buffer in bytes, not including room for EOB * characters. */ yy_size_t yy_buf_size; /* Number of characters read into yy_ch_buf, not including EOB * characters. */ int yy_n_chars; /* Whether we "own" the buffer - i.e., we know we created it, * and can realloc() it to grow it, and should free() it to * delete it. */ int yy_is_our_buffer; /* Whether this is an "interactive" input source; if so, and * if we're using stdio for input, then we want to use getc() * instead of fread(), to make sure we stop fetching input after * each newline. */ int yy_is_interactive; /* Whether we're considered to be at the beginning of a line. * If so, '^' rules will be active on the next match, otherwise * not. */ int yy_at_bol; /* Whether to try to fill the input buffer when we reach the * end of it. */ int yy_fill_buffer; int yy_buffer_status; #define YY_BUFFER_NEW 0 #define YY_BUFFER_NORMAL 1 /* When an EOF's been seen but there's still some text to process * then we mark the buffer as YY_EOF_PENDING, to indicate that we * shouldn't try reading from the input source any more. We might * still have a bunch of tokens to match, though, because of * possible backing-up. * * When we actually see the EOF, we change the status to "new" * (via yyrestart()), so that the user can continue scanning by * just pointing yyin at a new input file. */ #define YY_BUFFER_EOF_PENDING 2 }; static YY_BUFFER_STATE yy_current_buffer = 0; /* We provide macros for accessing buffer states in case in the * future we want to put the buffer states in a more general * "scanner state". */ #define YY_CURRENT_BUFFER yy_current_buffer /* yy_hold_char holds the character lost when yytext is formed. */ static char yy_hold_char; static int yy_n_chars; /* number of characters read into yy_ch_buf */ int yyleng; /* Points to current character in buffer. */ static char *yy_c_buf_p = (char *) 0; static int yy_init = 1; /* whether we need to initialize */ static int yy_start = 0; /* start state number */ /* Flag which is used to allow yywrap()'s to do buffer switches * instead of setting up a fresh yyin. A bit of a hack ... */ static int yy_did_buffer_switch_on_eof; void yyrestart YY_PROTO(( FILE *input_file )); void yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer )); void yy_load_buffer_state YY_PROTO(( void )); YY_BUFFER_STATE yy_create_buffer YY_PROTO(( FILE *file, int size )); void yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b )); void yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file )); void yy_flush_buffer YY_PROTO(( YY_BUFFER_STATE b )); #define YY_FLUSH_BUFFER yy_flush_buffer( yy_current_buffer ) YY_BUFFER_STATE yy_scan_buffer YY_PROTO(( char *base, yy_size_t size )); YY_BUFFER_STATE yy_scan_string YY_PROTO(( yyconst char *yy_str )); YY_BUFFER_STATE yy_scan_bytes YY_PROTO(( yyconst char *bytes, int len )); static void *yy_flex_alloc YY_PROTO(( yy_size_t )); static void *yy_flex_realloc YY_PROTO(( void *, yy_size_t )); static void yy_flex_free YY_PROTO(( void * )); #define yy_new_buffer yy_create_buffer #define yy_set_interactive(is_interactive) \ { \ if ( ! yy_current_buffer ) \ yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \ yy_current_buffer->yy_is_interactive = is_interactive; \ } #define yy_set_bol(at_bol) \ { \ if ( ! yy_current_buffer ) \ yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \ yy_current_buffer->yy_at_bol = at_bol; \ } #define YY_AT_BOL() (yy_current_buffer->yy_at_bol) typedef unsigned char YY_CHAR; FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; typedef int yy_state_type; extern char yytext[]; static yy_state_type yy_get_previous_state YY_PROTO(( void )); static yy_state_type yy_try_NUL_trans YY_PROTO(( yy_state_type current_state )); static int yy_get_next_buffer YY_PROTO(( void )); static void yy_fatal_error YY_PROTO(( yyconst char msg[] )); /* Done after the current pattern has been matched and before the * corresponding action - sets up yytext. */ #define YY_DO_BEFORE_ACTION \ idxtext_ptr = yy_bp; \ yyleng = (int) (yy_cp - yy_bp); \ yy_hold_char = *yy_cp; \ *yy_cp = '\0'; \ if ( yyleng >= YYLMAX ) \ YY_FATAL_ERROR( "token too large, exceeds YYLMAX" ); \ yy_flex_strncpy( yytext, idxtext_ptr, yyleng + 1 ); \ yy_c_buf_p = yy_cp; #define YY_NUM_RULES 15 #define YY_END_OF_BUFFER 16 static yyconst short int yy_accept[570] = { 0, 0, 0, 16, 14, 13, 15, 14, 14, 14, 14, 1, 1, 14, 14, 14, 6, 6, 6, 14, 10, 8, 0, 2, 2, 1, 0, 1, 0, 11, 9, 12, 0, 6, 0, 6, 6, 7, 0, 0, 0, 2, 1, 0, 0, 5, 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 0, 0, 2, 1, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 0, 0, 0, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 0, 0, 0, 6, 0, 6, 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 0, 0, 5, 0, 6, 6, 0, 6, 6, 6, 6, 6, 6, 6, 0, 5, 6, 0, 6, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 4, 0, 0, 3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } ; static yyconst int yy_ec[256] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 4, 1, 1, 1, 1, 5, 1, 6, 7, 1, 8, 9, 10, 11, 1, 12, 13, 14, 15, 16, 17, 15, 18, 19, 15, 1, 1, 20, 21, 22, 1, 1, 26, 27, 28, 29, 30, 31, 32, 25, 33, 25, 25, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 25, 45, 46, 25, 23, 1, 24, 1, 25, 1, 26, 27, 28, 29, 30, 31, 32, 25, 33, 25, 25, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 25, 45, 46, 25, 1, 47, 1, 48, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ; static yyconst int yy_meta[49] = { 0, 1, 1, 2, 1, 1, 3, 4, 5, 6, 5, 7, 8, 8, 8, 8, 8, 8, 8, 8, 1, 1, 1, 9, 1, 10, 11, 11, 11, 11, 12, 11, 10, 10, 13, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 13, 10, 1, 14 } ; static yyconst short int yy_base[607] = { 0, 0, 0, 2154, 2377, 2377, 2377, 2132, 2119, 2056, 0, 38, 39, 2040, 2015, 2014, 47, 48, 51, 1979, 2377, 2377, 2009, 1994, 1993, 0, 48, 2377, 0, 2377, 2377, 2377, 45, 53, 1995, 87, 1987, 2377, 2003, 52, 53, 0, 1979, 58, 2005, 2377, 1987, 61, 71, 74, 96, 82, 73, 75, 51, 116, 118, 121, 1991, 81, 0, 2377, 2002, 93, 139, 129, 124, 132, 127, 145, 150, 151, 153, 155, 158, 166, 164, 169, 176, 1991, 179, 194, 1983, 198, 187, 189, 202, 203, 205, 209, 210, 213, 214, 228, 217, 229, 233, 237, 1988, 255, 243, 257, 262, 242, 252, 264, 249, 267, 268, 271, 276, 286, 291, 292, 295, 297, 0, 304, 310, 97, 315, 307, 334, 323, 325, 330, 296, 336, 329, 338, 1992, 130, 341, 377, 348, 366, 345, 1987, 354, 367, 351, 1983, 390, 404, 402, 422, 1977, 433, 1922, 179, 470, 1915, 1942, 504, 416, 512, 447, 532, 451, 540, 1939, 563, 1910, 220, 600, 1899, 298, 2377, 634, 455, 642, 459, 662, 463, 670, 467, 693, 1898, 336, 730, 1896, 378, 173, 484, 764, 488, 784, 492, 792, 496, 448, 462, 815, 1895, 466, 360, 500, 282, 504, 849, 526, 420, 452, 503, 48, 527, 554, 94, 437, 102, 358, 1926, 555, 567, 136, 377, 1925, 1924, 575, 1904, 579, 1858, 1862, 299, 578, 1847, 221, 1864, 579, 1836, 1815, 345, 1828, 1829, 581, 1813, 559, 1799, 586, 1795, 400, 1784, 570, 1790, 353, 1785, 567, 1796, 190, 1758, 579, 0, 484, 1760, 596, 584, 604, 1781, 597, 616, 616, 1752, 857, 0, 576, 622, 1762, 0, 633, 1750, 694, 903, 706, 697, 1748, 1744, 684, 2377, 1717, 627, 943, 960, 984, 2377, 710, 1722, 1008, 1729, 1723, 628, 654, 658, 682, 712, 1043, 743, 716, 722, 1056, 758, 1699, 748, 1080, 1708, 1699, 726, 749, 746, 828, 1121, 1682, 1652, 1144, 747, 843, 1162, 1645, 1637, 1185, 1631, 1202, 1630, 1219, 1243, 1622, 1622, 124, 908, 1283, 753, 777, 707, 922, 1295, 804, 833, 805, 861, 1303, 933, 837, 956, 1316, 989, 1609, 1590, 802, 1086, 838, 938, 925, 1099, 847, 973, 988, 1262, 1334, 1581, 1551, 1357, 989, 1352, 1376, 1556, 1548, 1399, 1534, 1417, 990, 1114, 991, 1251, 801, 1430, 1453, 862, 1013, 904, 1443, 1466, 927, 1017, 0, 1528, 1527, 1104, 998, 1500, 1133, 1075, 1276, 1096, 1479, 1052, 1484, 1008, 1140, 1118, 1491, 1055, 1157, 1495, 1480, 1461, 1442, 1164, 1519, 1165, 1547, 1166, 1565, 1172, 1576, 1432, 1429, 1413, 1411, 1184, 1102, 1160, 1390, 1140, 1581, 1215, 1389, 1252, 1181, 1198, 1342, 1142, 1589, 1395, 1325, 1265, 1497, 1320, 1537, 1258, 1238, 1237, 1222, 1095, 1509, 1224, 1370, 1264, 1605, 1082, 1389, 1318, 1633, 1321, 1661, 1061, 1047, 1013, 1012, 1342, 1623, 1003, 1615, 1396, 1651, 989, 1679, 1301, 1432, 1435, 952, 1193, 1687, 1544, 921, 1398, 1451, 1499, 908, 1212, 1694, 1594, 843, 771, 756, 744, 723, 1255, 1701, 709, 1706, 1505, 1719, 697, 1725, 1585, 1732, 679, 1743, 1604, 1747, 678, 1757, 1070, 0, 0, 0, 1425, 1761, 649, 1772, 1438, 1776, 624, 1787, 1555, 1791, 615, 1800, 1603, 1808, 581, 1816, 1586, 1824, 547, 1837, 1819, 1841, 518, 1854, 1619, 1858, 473, 1866, 1647, 1871, 407, 1884, 1712, 1888, 0, 1897, 1804, 1901, 0, 1906, 1666, 1912, 287, 1917, 1675, 1928, 278, 1939, 1865, 1943, 172, 1956, 1944, 1968, 72, 1962, 1832, 1974, 0, 1980, 1893, 1984, 0, 1992, 2377, 70, 2008, 2019, 732, 2026, 2038, 2052, 1318, 2066, 2080, 2094, 2108, 2122, 2136, 2148, 2156, 2170, 2182, 2190, 2204, 2209, 2217, 2227, 2235, 2240, 58, 2253, 2264, 1349, 2278, 1379, 2292, 2306, 2320, 2334, 2348, 2362 } ; static yyconst short int yy_def[607] = { 0, 569, 1, 569, 569, 569, 569, 569, 569, 569, 570, 571, 571, 569, 569, 569, 572, 572, 572, 569, 569, 569, 569, 570, 570, 12, 573, 569, 574, 569, 569, 569, 575, 572, 576, 572, 35, 569, 569, 577, 573, 40, 574, 575, 578, 569, 576, 576, 572, 572, 572, 572, 572, 572, 35, 572, 572, 572, 569, 577, 59, 569, 578, 569, 579, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 569, 579, 580, 576, 579, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 569, 580, 576, 580, 581, 572, 575, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 582, 581, 576, 583, 581, 572, 575, 572, 572, 572, 572, 572, 572, 572, 569, 569, 572, 575, 572, 575, 572, 569, 133, 133, 575, 569, 133, 575, 133, 133, 569, 133, 147, 144, 147, 150, 569, 133, 575, 133, 575, 133, 575, 133, 569, 133, 161, 155, 161, 164, 159, 569, 133, 575, 133, 575, 133, 575, 133, 575, 133, 176, 170, 176, 179, 174, 575, 575, 174, 575, 133, 575, 133, 575, 578, 184, 133, 192, 188, 578, 575, 575, 575, 188, 575, 578, 578, 199, 578, 578, 575, 578, 578, 578, 578, 578, 578, 584, 578, 585, 578, 569, 585, 586, 587, 569, 586, 586, 588, 569, 586, 569, 588, 589, 569, 586, 569, 589, 589, 569, 586, 569, 589, 569, 586, 569, 589, 569, 586, 569, 589, 569, 586, 569, 589, 590, 586, 569, 589, 591, 586, 569, 589, 592, 591, 593, 586, 594, 589, 592, 265, 595, 265, 593, 593, 596, 597, 589, 569, 268, 595, 569, 276, 598, 593, 586, 596, 569, 597, 599, 589, 569, 268, 600, 598, 290, 280, 280, 593, 280, 281, 281, 586, 281, 599, 599, 601, 569, 268, 600, 305, 593, 280, 593, 593, 309, 593, 586, 281, 586, 586, 315, 586, 599, 599, 589, 589, 601, 569, 268, 593, 280, 312, 312, 312, 586, 281, 318, 318, 318, 320, 320, 599, 320, 322, 322, 589, 322, 569, 268, 593, 280, 328, 328, 586, 281, 333, 333, 599, 320, 599, 599, 356, 599, 589, 322, 589, 589, 362, 589, 569, 602, 593, 280, 586, 281, 599, 320, 359, 359, 359, 589, 322, 365, 365, 365, 602, 569, 569, 265, 276, 268, 290, 593, 280, 586, 281, 599, 320, 374, 374, 589, 322, 379, 379, 569, 268, 276, 291, 593, 603, 586, 604, 599, 320, 589, 322, 569, 268, 276, 291, 603, 593, 593, 280, 309, 280, 593, 312, 604, 586, 586, 281, 315, 281, 586, 318, 599, 320, 589, 322, 569, 268, 276, 291, 593, 280, 309, 312, 586, 281, 315, 318, 599, 605, 589, 606, 569, 268, 276, 291, 593, 280, 309, 312, 586, 281, 315, 318, 605, 599, 599, 320, 356, 320, 599, 359, 606, 589, 589, 322, 362, 322, 589, 365, 569, 268, 276, 291, 593, 280, 309, 312, 586, 281, 315, 318, 599, 320, 356, 359, 589, 322, 362, 365, 569, 268, 276, 291, 593, 280, 309, 312, 586, 281, 315, 318, 599, 320, 356, 359, 589, 322, 362, 365, 593, 280, 309, 312, 586, 281, 315, 318, 599, 320, 356, 359, 589, 322, 362, 365, 593, 280, 309, 312, 586, 281, 315, 318, 599, 320, 356, 359, 589, 322, 362, 365, 599, 320, 356, 359, 589, 322, 362, 365, 599, 320, 356, 359, 589, 322, 362, 365, 0, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569 } ; static yyconst short int yy_nxt[2426] = { 0, 4, 5, 6, 7, 8, 4, 4, 4, 4, 9, 10, 11, 12, 12, 12, 12, 12, 12, 12, 13, 14, 15, 4, 4, 16, 16, 16, 16, 16, 17, 16, 16, 18, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 19, 4, 24, 24, 44, 45, 32, 32, 63, 40, 32, 40, 32, 59, 569, 59, 569, 44, 45, 276, 64, 26, 26, 34, 34, 27, 27, 34, 207, 34, 32, 23, 32, 32, 32, 57, 28, 569, 47, 36, 33, 32, 569, 567, 569, 35, 32, 34, 33, 34, 34, 34, 44, 45, 63, 32, 44, 131, 34, 72, 65, 73, 63, 34, 66, 67, 48, 49, 50, 70, 51, 52, 34, 71, 53, 32, 54, 32, 55, 56, 32, 209, 68, 32, 54, 211, 32, 69, 32, 44, 45, 32, 34, 346, 34, 74, 63, 34, 81, 82, 34, 270, 75, 34, 32, 34, 76, 78, 34, 32, 32, 86, 32, 77, 32, 43, 83, 32, 84, 216, 87, 34, 85, 32, 88, 32, 34, 34, 32, 34, 90, 34, 190, 45, 34, 32, 91, 89, 81, 82, 34, 142, 34, 563, 92, 34, 32, 93, 104, 85, 94, 95, 34, 46, 100, 43, 83, 102, 82, 97, 96, 32, 32, 34, 32, 34, 156, 223, 32, 32, 62, 101, 32, 32, 43, 83, 32, 252, 34, 34, 231, 34, 153, 103, 106, 34, 34, 32, 32, 34, 34, 105, 32, 34, 107, 108, 32, 85, 223, 109, 110, 32, 81, 82, 34, 34, 112, 171, 32, 34, 111, 44, 45, 34, 46, 100, 64, 100, 34, 114, 47, 81, 118, 32, 115, 34, 32, 32, 113, 121, 32, 62, 101, 62, 101, 32, 124, 122, 119, 120, 34, 202, 45, 34, 34, 32, 123, 34, 559, 125, 32, 32, 34, 127, 32, 32, 32, 555, 128, 126, 157, 226, 34, 81, 118, 85, 32, 34, 34, 81, 82, 34, 34, 34, 102, 118, 223, 129, 85, 85, 119, 120, 32, 34, 32, 175, 85, 47, 135, 32, 134, 119, 120, 44, 45, 32, 133, 32, 168, 34, 32, 34, 85, 132, 32, 34, 34, 32, 85, 85, 44, 45, 34, 145, 34, 85, 142, 34, 63, 139, 63, 34, 223, 185, 34, 44, 45, 236, 136, 142, 223, 85, 139, 248, 85, 85, 44, 45, 212, 217, 172, 143, 138, 139, 139, 139, 139, 139, 139, 139, 201, 140, 144, 219, 143, 147, 148, 148, 148, 148, 148, 148, 148, 44, 45, 189, 142, 149, 149, 149, 149, 149, 149, 149, 149, 44, 45, 223, 153, 551, 63, 149, 149, 149, 149, 149, 149, 150, 151, 151, 151, 151, 151, 151, 151, 153, 244, 63, 148, 148, 148, 148, 148, 148, 148, 148, 44, 45, 63, 142, 44, 45, 63, 157, 44, 45, 204, 168, 44, 45, 154, 153, 44, 45, 182, 172, 44, 45, 186, 157, 195, 155, 157, 210, 205, 151, 151, 151, 151, 151, 151, 151, 151, 44, 45, 547, 182, 44, 45, 196, 168, 44, 45, 200, 186, 44, 45, 158, 172, 44, 45, 223, 182, 44, 45, 197, 197, 256, 159, 161, 162, 162, 162, 162, 162, 162, 162, 163, 163, 163, 163, 163, 163, 163, 163, 44, 45, 63, 186, 543, 206, 163, 163, 163, 163, 163, 163, 164, 165, 165, 165, 165, 165, 165, 165, 166, 166, 166, 166, 166, 166, 166, 166, 44, 45, 63, 197, 208, 539, 166, 166, 166, 166, 166, 166, 168, 44, 45, 162, 162, 162, 162, 162, 162, 162, 162, 223, 217, 44, 45, 227, 227, 214, 238, 234, 242, 259, 234, 535, 240, 169, 219, 246, 234, 229, 229, 234, 250, 234, 273, 261, 170, 172, 234, 262, 165, 165, 165, 165, 165, 165, 165, 165, 234, 234, 254, 258, 265, 259, 266, 267, 223, 531, 569, 264, 274, 267, 173, 290, 305, 290, 305, 261, 277, 527, 259, 569, 278, 174, 176, 177, 177, 177, 177, 177, 177, 177, 178, 178, 178, 178, 178, 178, 178, 178, 569, 279, 569, 277, 523, 259, 178, 178, 178, 178, 178, 178, 179, 180, 180, 180, 180, 180, 180, 180, 181, 181, 181, 181, 181, 181, 181, 181, 269, 277, 307, 259, 519, 515, 181, 181, 181, 181, 181, 181, 182, 280, 286, 177, 177, 177, 177, 177, 177, 177, 177, 283, 289, 259, 511, 283, 270, 259, 269, 234, 307, 350, 222, 308, 313, 183, 507, 285, 222, 223, 313, 285, 569, 314, 569, 41, 184, 186, 41, 504, 180, 180, 180, 180, 180, 180, 180, 180, 310, 269, 280, 269, 311, 319, 277, 320, 259, 326, 331, 269, 503, 269, 187, 316, 222, 281, 222, 317, 270, 223, 301, 312, 502, 188, 191, 191, 191, 191, 191, 191, 191, 191, 310, 269, 280, 269, 318, 501, 191, 191, 191, 191, 191, 191, 192, 193, 193, 193, 193, 193, 193, 193, 194, 194, 194, 194, 194, 194, 194, 194, 222, 300, 222, 354, 368, 393, 194, 194, 194, 194, 194, 194, 197, 301, 270, 193, 193, 193, 193, 193, 193, 193, 193, 310, 269, 280, 269, 311, 316, 222, 281, 222, 327, 233, 269, 360, 269, 198, 316, 222, 281, 222, 317, 222, 500, 222, 312, 332, 199, 203, 203, 203, 203, 203, 203, 203, 203, 300, 300, 354, 300, 318, 355, 203, 203, 203, 203, 203, 203, 223, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 222, 222, 222, 222, 222, 222, 222, 222, 281, 222, 222, 310, 269, 280, 269, 311, 397, 498, 347, 222, 222, 222, 261, 223, 234, 316, 222, 281, 222, 317, 496, 233, 351, 233, 312, 370, 357, 300, 320, 300, 358, 310, 269, 280, 269, 223, 222, 292, 318, 293, 294, 295, 295, 295, 295, 295, 295, 295, 295, 359, 233, 494, 360, 270, 296, 361, 297, 298, 299, 299, 299, 299, 299, 299, 299, 299, 316, 222, 281, 222, 223, 222, 222, 222, 222, 222, 222, 222, 222, 281, 222, 222, 363, 233, 322, 233, 364, 372, 377, 491, 222, 222, 222, 261, 223, 389, 391, 403, 301, 234, 270, 223, 300, 487, 300, 365, 357, 300, 320, 300, 363, 233, 322, 233, 279, 484, 483, 222, 234, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 309, 309, 309, 309, 309, 309, 309, 309, 233, 482, 233, 409, 270, 315, 315, 315, 315, 315, 315, 315, 315, 301, 277, 481, 259, 223, 233, 233, 233, 233, 233, 233, 321, 233, 322, 233, 233, 405, 310, 269, 280, 269, 311, 463, 270, 233, 233, 233, 285, 234, 369, 316, 222, 281, 222, 317, 457, 265, 407, 266, 441, 312, 402, 371, 270, 223, 310, 269, 280, 269, 311, 270, 233, 310, 318, 280, 390, 411, 309, 309, 309, 309, 309, 309, 309, 309, 290, 234, 290, 312, 270, 404, 357, 300, 320, 300, 328, 329, 443, 329, 447, 330, 330, 330, 330, 330, 330, 330, 330, 363, 233, 322, 233, 270, 316, 312, 281, 318, 441, 315, 315, 315, 315, 315, 315, 315, 315, 417, 425, 270, 433, 223, 269, 270, 223, 301, 435, 333, 334, 445, 334, 234, 335, 335, 335, 335, 335, 335, 335, 335, 223, 495, 383, 423, 223, 336, 445, 337, 338, 339, 339, 339, 339, 339, 339, 339, 339, 223, 359, 280, 499, 301, 340, 441, 341, 342, 343, 343, 343, 343, 343, 343, 343, 343, 270, 459, 456, 365, 234, 233, 233, 233, 233, 233, 233, 321, 233, 322, 233, 233, 222, 455, 454, 316, 222, 281, 222, 317, 233, 233, 233, 285, 234, 392, 357, 300, 320, 300, 358, 505, 383, 431, 453, 373, 270, 461, 318, 449, 310, 269, 280, 269, 311, 223, 301, 233, 348, 359, 348, 406, 349, 349, 349, 349, 349, 349, 349, 349, 352, 300, 352, 312, 353, 353, 353, 353, 353, 353, 353, 353, 356, 356, 356, 356, 356, 356, 356, 356, 60, 383, 471, 60, 301, 362, 362, 362, 362, 362, 362, 362, 362, 465, 451, 448, 473, 234, 357, 301, 320, 234, 234, 356, 356, 356, 356, 356, 356, 356, 356, 291, 446, 485, 291, 301, 363, 233, 322, 233, 364, 374, 375, 270, 375, 378, 376, 376, 376, 376, 376, 376, 376, 376, 310, 269, 280, 269, 301, 365, 363, 306, 322, 460, 306, 362, 362, 362, 362, 362, 362, 362, 362, 316, 222, 281, 222, 234, 233, 444, 442, 226, 464, 379, 380, 445, 380, 489, 381, 381, 381, 381, 381, 381, 381, 381, 223, 223, 383, 479, 234, 384, 440, 385, 439, 386, 387, 387, 387, 387, 387, 387, 387, 387, 357, 300, 320, 300, 358, 521, 438, 394, 493, 437, 388, 493, 270, 363, 233, 322, 233, 364, 525, 301, 398, 416, 301, 359, 395, 223, 395, 497, 396, 396, 396, 396, 396, 396, 396, 396, 365, 399, 234, 399, 415, 400, 400, 400, 400, 400, 400, 400, 400, 316, 222, 281, 222, 317, 357, 300, 320, 300, 358, 414, 408, 363, 233, 322, 233, 364, 410, 357, 300, 320, 300, 358, 318, 412, 413, 497, 402, 359, 450, 310, 269, 280, 269, 311, 365, 269, 234, 509, 458, 419, 359, 420, 223, 421, 422, 422, 422, 422, 422, 422, 422, 422, 312, 401, 401, 383, 423, 363, 233, 322, 233, 364, 424, 222, 319, 382, 320, 427, 452, 428, 493, 429, 430, 430, 430, 430, 430, 430, 430, 430, 365, 301, 529, 383, 431, 357, 300, 320, 300, 358, 432, 365, 301, 234, 359, 434, 363, 233, 322, 233, 364, 310, 269, 280, 269, 311, 436, 442, 359, 316, 222, 281, 222, 317, 513, 446, 238, 537, 301, 365, 497, 367, 301, 270, 312, 316, 222, 281, 222, 317, 533, 234, 318, 517, 462, 310, 269, 280, 269, 366, 234, 234, 488, 310, 269, 280, 269, 311, 318, 300, 486, 545, 345, 467, 344, 468, 301, 469, 470, 470, 470, 470, 470, 470, 470, 470, 312, 234, 301, 383, 471, 316, 222, 281, 222, 317, 472, 233, 490, 549, 318, 475, 223, 476, 234, 477, 478, 478, 478, 478, 478, 478, 478, 478, 318, 312, 553, 383, 479, 316, 222, 281, 222, 301, 480, 557, 492, 357, 300, 320, 300, 358, 234, 494, 363, 233, 322, 233, 364, 270, 498, 310, 269, 280, 269, 311, 310, 269, 280, 269, 359, 325, 310, 506, 280, 324, 301, 365, 508, 316, 222, 281, 222, 317, 312, 316, 222, 281, 222, 270, 304, 510, 357, 300, 320, 300, 358, 512, 303, 301, 279, 514, 318, 357, 300, 320, 300, 363, 233, 322, 233, 364, 516, 288, 287, 359, 518, 363, 233, 322, 233, 310, 269, 280, 269, 311, 520, 270, 275, 270, 365, 522, 310, 269, 280, 269, 316, 222, 281, 222, 317, 263, 524, 257, 312, 253, 526, 316, 222, 281, 222, 357, 300, 320, 300, 358, 251, 528, 530, 318, 357, 300, 320, 300, 316, 249, 281, 532, 363, 233, 322, 233, 364, 247, 359, 534, 363, 233, 322, 233, 245, 223, 243, 536, 310, 269, 280, 269, 311, 241, 541, 365, 357, 239, 320, 538, 223, 310, 269, 280, 269, 316, 222, 281, 222, 317, 234, 312, 540, 301, 237, 235, 542, 234, 316, 222, 281, 222, 357, 300, 320, 300, 358, 232, 318, 544, 357, 300, 320, 300, 546, 363, 233, 322, 233, 364, 561, 230, 548, 223, 225, 359, 301, 550, 363, 233, 322, 233, 310, 269, 280, 269, 311, 363, 365, 322, 552, 310, 269, 280, 269, 316, 222, 281, 222, 317, 316, 222, 281, 222, 234, 312, 357, 300, 320, 300, 358, 357, 300, 320, 300, 223, 554, 221, 318, 220, 213, 556, 363, 233, 322, 233, 364, 43, 43, 359, 43, 43, 558, 363, 233, 322, 233, 357, 300, 320, 300, 358, 43, 560, 167, 365, 160, 43, 562, 565, 357, 300, 320, 300, 43, 234, 363, 233, 322, 233, 359, 564, 363, 233, 322, 233, 364, 568, 357, 300, 320, 300, 358, 566, 357, 300, 320, 300, 363, 233, 322, 233, 364, 152, 146, 365, 363, 233, 322, 233, 141, 359, 137, 116, 47, 98, 63, 79, 47, 63, 61, 365, 25, 25, 58, 57, 47, 25, 25, 33, 26, 39, 38, 37, 33, 33, 33, 33, 33, 33, 33, 42, 31, 30, 42, 42, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 46, 46, 46, 46, 46, 46, 46, 46, 29, 46, 46, 46, 46, 46, 62, 62, 22, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 130, 21, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 215, 215, 20, 569, 569, 569, 569, 215, 215, 215, 215, 218, 569, 218, 218, 218, 218, 218, 218, 218, 222, 222, 222, 222, 222, 222, 222, 222, 569, 222, 222, 222, 222, 222, 224, 224, 569, 569, 569, 569, 569, 224, 224, 224, 224, 228, 569, 228, 228, 228, 228, 228, 228, 228, 233, 233, 233, 233, 233, 233, 233, 233, 569, 233, 233, 233, 233, 233, 255, 255, 255, 255, 260, 569, 260, 260, 260, 260, 260, 260, 260, 268, 569, 268, 268, 269, 269, 269, 269, 269, 269, 269, 269, 569, 269, 269, 269, 269, 269, 272, 272, 272, 272, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 284, 569, 284, 569, 284, 284, 284, 284, 284, 284, 284, 300, 300, 300, 300, 300, 300, 300, 300, 569, 300, 300, 300, 300, 300, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 383, 569, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 3, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569 } ; static yyconst short int yy_chk[2426] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 11, 12, 32, 32, 16, 17, 204, 26, 18, 26, 33, 39, 40, 39, 40, 43, 43, 595, 47, 11, 12, 16, 17, 11, 12, 18, 204, 33, 48, 570, 52, 49, 53, 54, 11, 12, 47, 18, 54, 51, 59, 559, 59, 17, 35, 48, 54, 52, 49, 53, 63, 63, 207, 50, 119, 119, 51, 52, 48, 53, 209, 35, 49, 49, 35, 35, 35, 51, 35, 35, 50, 51, 35, 55, 35, 56, 35, 35, 57, 207, 50, 66, 35, 209, 68, 50, 65, 131, 131, 67, 55, 326, 56, 55, 214, 57, 64, 64, 66, 326, 55, 68, 69, 65, 55, 57, 67, 70, 71, 67, 72, 56, 73, 64, 64, 74, 65, 214, 68, 69, 66, 76, 69, 75, 70, 71, 77, 72, 71, 73, 182, 182, 74, 78, 72, 70, 80, 80, 76, 149, 75, 555, 73, 77, 84, 74, 85, 75, 76, 76, 78, 81, 81, 80, 80, 83, 83, 78, 77, 86, 87, 84, 88, 85, 149, 248, 89, 90, 81, 81, 91, 92, 83, 83, 94, 248, 86, 87, 226, 88, 163, 84, 87, 89, 90, 93, 95, 91, 92, 86, 96, 94, 88, 89, 97, 92, 226, 90, 91, 103, 100, 100, 93, 95, 94, 163, 106, 96, 93, 104, 104, 97, 99, 99, 101, 101, 103, 96, 100, 102, 102, 105, 97, 106, 107, 108, 95, 103, 109, 99, 99, 101, 101, 110, 106, 104, 102, 102, 105, 197, 197, 107, 108, 111, 105, 109, 551, 107, 112, 113, 110, 109, 114, 126, 115, 547, 110, 108, 166, 223, 111, 117, 117, 111, 121, 112, 113, 118, 118, 114, 126, 115, 120, 120, 223, 113, 114, 115, 117, 117, 123, 121, 124, 166, 112, 118, 128, 125, 126, 120, 120, 122, 122, 127, 122, 129, 178, 123, 132, 124, 123, 121, 136, 128, 125, 134, 124, 125, 140, 140, 127, 140, 129, 127, 138, 132, 210, 138, 195, 136, 231, 178, 134, 135, 135, 231, 129, 139, 244, 134, 139, 244, 136, 132, 133, 133, 210, 215, 181, 138, 133, 133, 133, 133, 133, 133, 133, 133, 195, 135, 138, 215, 139, 142, 142, 142, 142, 142, 142, 142, 142, 143, 143, 181, 143, 144, 144, 144, 144, 144, 144, 144, 144, 154, 154, 240, 154, 535, 201, 144, 144, 144, 144, 144, 144, 145, 145, 145, 145, 145, 145, 145, 145, 147, 240, 208, 147, 147, 147, 147, 147, 147, 147, 147, 156, 156, 190, 156, 158, 158, 202, 158, 169, 169, 201, 169, 171, 171, 147, 171, 173, 173, 191, 173, 175, 175, 194, 175, 190, 147, 150, 208, 202, 150, 150, 150, 150, 150, 150, 150, 150, 183, 183, 531, 183, 185, 185, 191, 185, 187, 187, 194, 187, 189, 189, 150, 189, 196, 196, 252, 196, 198, 198, 203, 198, 252, 150, 153, 153, 153, 153, 153, 153, 153, 153, 155, 155, 155, 155, 155, 155, 155, 155, 200, 200, 205, 200, 527, 203, 155, 155, 155, 155, 155, 155, 157, 157, 157, 157, 157, 157, 157, 157, 159, 159, 159, 159, 159, 159, 159, 159, 206, 206, 212, 206, 205, 523, 159, 159, 159, 159, 159, 159, 161, 213, 213, 161, 161, 161, 161, 161, 161, 161, 161, 236, 218, 220, 220, 224, 228, 212, 234, 246, 238, 255, 242, 519, 236, 161, 218, 242, 264, 224, 228, 250, 246, 234, 264, 255, 161, 164, 238, 256, 164, 164, 164, 164, 164, 164, 164, 164, 254, 258, 250, 254, 259, 260, 259, 259, 256, 515, 265, 258, 265, 265, 164, 279, 289, 279, 289, 260, 268, 511, 268, 268, 268, 164, 168, 168, 168, 168, 168, 168, 168, 168, 170, 170, 170, 170, 170, 170, 170, 170, 290, 268, 290, 291, 507, 291, 170, 170, 170, 170, 170, 170, 172, 172, 172, 172, 172, 172, 172, 172, 174, 174, 174, 174, 174, 174, 174, 174, 292, 276, 292, 276, 499, 495, 174, 174, 174, 174, 174, 174, 176, 270, 273, 176, 176, 176, 176, 176, 176, 176, 176, 272, 276, 272, 491, 284, 270, 284, 293, 273, 293, 331, 296, 293, 296, 176, 487, 272, 297, 331, 297, 284, 305, 297, 305, 573, 176, 179, 573, 484, 179, 179, 179, 179, 179, 179, 179, 179, 295, 295, 295, 295, 295, 301, 306, 301, 306, 307, 313, 329, 483, 329, 179, 299, 299, 299, 299, 299, 307, 313, 301, 295, 482, 179, 184, 184, 184, 184, 184, 184, 184, 184, 330, 330, 330, 330, 299, 481, 184, 184, 184, 184, 184, 184, 186, 186, 186, 186, 186, 186, 186, 186, 188, 188, 188, 188, 188, 188, 188, 188, 334, 336, 334, 336, 346, 372, 188, 188, 188, 188, 188, 188, 192, 372, 346, 192, 192, 192, 192, 192, 192, 192, 192, 308, 308, 308, 308, 308, 335, 335, 335, 335, 308, 340, 348, 340, 348, 192, 314, 314, 314, 314, 314, 352, 480, 352, 308, 314, 192, 199, 199, 199, 199, 199, 199, 199, 199, 337, 375, 337, 375, 314, 337, 199, 199, 199, 199, 199, 199, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 327, 327, 327, 327, 327, 377, 476, 327, 271, 271, 271, 271, 271, 377, 332, 332, 332, 332, 332, 472, 380, 332, 380, 327, 350, 339, 339, 339, 339, 339, 349, 349, 349, 349, 350, 271, 280, 332, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 339, 341, 468, 341, 280, 281, 341, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 353, 353, 353, 353, 281, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 343, 343, 343, 343, 343, 354, 360, 463, 282, 282, 282, 282, 282, 368, 370, 386, 354, 360, 368, 370, 395, 459, 395, 343, 376, 376, 376, 376, 381, 381, 381, 381, 386, 456, 455, 282, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 294, 294, 294, 294, 294, 294, 294, 294, 399, 454, 399, 393, 294, 298, 298, 298, 298, 298, 298, 298, 298, 393, 501, 453, 501, 298, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 389, 347, 347, 347, 347, 347, 447, 389, 302, 302, 302, 302, 302, 347, 351, 351, 351, 351, 351, 441, 385, 391, 385, 418, 347, 385, 351, 441, 391, 369, 369, 369, 369, 369, 418, 302, 309, 351, 309, 369, 397, 309, 309, 309, 309, 309, 309, 309, 309, 388, 397, 388, 369, 309, 388, 396, 396, 396, 396, 309, 312, 421, 312, 429, 312, 312, 312, 312, 312, 312, 312, 312, 400, 400, 400, 400, 312, 315, 421, 315, 429, 419, 315, 315, 315, 315, 315, 315, 315, 315, 405, 407, 419, 409, 315, 417, 405, 407, 409, 411, 315, 318, 426, 318, 411, 318, 318, 318, 318, 318, 318, 318, 318, 426, 469, 417, 417, 318, 320, 427, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 427, 469, 423, 477, 320, 322, 423, 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, 423, 443, 440, 477, 322, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 425, 439, 438, 371, 371, 371, 371, 371, 323, 323, 323, 323, 323, 371, 355, 355, 355, 355, 355, 485, 425, 425, 437, 355, 485, 445, 371, 433, 390, 390, 390, 390, 390, 445, 433, 323, 328, 355, 328, 390, 328, 328, 328, 328, 328, 328, 328, 328, 333, 465, 333, 390, 333, 333, 333, 333, 333, 333, 333, 333, 338, 338, 338, 338, 338, 338, 338, 338, 577, 465, 465, 577, 338, 342, 342, 342, 342, 342, 342, 342, 342, 449, 435, 432, 451, 342, 356, 449, 356, 435, 451, 356, 356, 356, 356, 356, 356, 356, 356, 598, 428, 457, 598, 356, 361, 361, 361, 361, 361, 356, 359, 457, 359, 361, 359, 359, 359, 359, 359, 359, 359, 359, 444, 444, 444, 444, 359, 361, 362, 600, 362, 444, 600, 362, 362, 362, 362, 362, 362, 362, 362, 448, 448, 448, 448, 362, 473, 424, 420, 431, 448, 362, 365, 431, 365, 461, 365, 365, 365, 365, 365, 365, 365, 365, 431, 461, 473, 473, 365, 367, 416, 367, 415, 367, 367, 367, 367, 367, 367, 367, 367, 367, 373, 373, 373, 373, 373, 505, 414, 373, 466, 413, 367, 467, 505, 378, 378, 378, 378, 378, 509, 466, 378, 404, 467, 373, 374, 509, 374, 474, 374, 374, 374, 374, 374, 374, 374, 374, 378, 379, 474, 379, 403, 379, 379, 379, 379, 379, 379, 379, 379, 392, 392, 392, 392, 392, 394, 394, 394, 394, 394, 402, 392, 398, 398, 398, 398, 398, 394, 434, 434, 434, 434, 434, 392, 398, 401, 475, 387, 394, 434, 442, 442, 442, 442, 442, 398, 406, 475, 489, 442, 406, 434, 406, 489, 406, 406, 406, 406, 406, 406, 406, 406, 406, 442, 384, 383, 406, 406, 436, 436, 436, 436, 436, 406, 408, 471, 366, 471, 408, 436, 408, 471, 408, 408, 408, 408, 408, 408, 408, 408, 408, 436, 471, 513, 408, 408, 410, 410, 410, 410, 410, 408, 364, 513, 363, 358, 410, 412, 412, 412, 412, 412, 422, 422, 422, 422, 422, 412, 422, 410, 430, 430, 430, 430, 430, 493, 430, 479, 521, 357, 412, 479, 345, 493, 521, 422, 446, 446, 446, 446, 446, 517, 479, 430, 497, 446, 460, 460, 460, 460, 344, 517, 497, 460, 458, 458, 458, 458, 458, 446, 450, 458, 529, 325, 450, 324, 450, 529, 450, 450, 450, 450, 450, 450, 450, 450, 450, 458, 321, 319, 450, 450, 462, 462, 462, 462, 462, 450, 452, 462, 533, 317, 452, 316, 452, 533, 452, 452, 452, 452, 452, 452, 452, 452, 452, 462, 311, 545, 452, 452, 464, 464, 464, 464, 545, 452, 549, 464, 470, 470, 470, 470, 470, 549, 470, 478, 478, 478, 478, 478, 310, 478, 486, 486, 486, 486, 486, 488, 488, 488, 488, 470, 304, 537, 486, 537, 303, 300, 478, 488, 490, 490, 490, 490, 490, 486, 492, 492, 492, 492, 537, 288, 490, 494, 494, 494, 494, 494, 492, 287, 285, 278, 494, 490, 496, 496, 496, 496, 498, 498, 498, 498, 498, 496, 275, 274, 494, 498, 500, 500, 500, 500, 506, 506, 506, 506, 506, 500, 269, 266, 261, 498, 506, 508, 508, 508, 508, 510, 510, 510, 510, 510, 257, 508, 253, 506, 249, 510, 512, 512, 512, 512, 514, 514, 514, 514, 514, 247, 512, 514, 510, 516, 516, 516, 516, 541, 245, 541, 516, 518, 518, 518, 518, 518, 243, 514, 518, 520, 520, 520, 520, 241, 541, 239, 520, 522, 522, 522, 522, 522, 237, 525, 518, 561, 235, 561, 522, 525, 524, 524, 524, 524, 526, 526, 526, 526, 526, 233, 522, 524, 561, 232, 230, 526, 229, 528, 528, 528, 528, 530, 530, 530, 530, 530, 227, 526, 528, 532, 532, 532, 532, 530, 534, 534, 534, 534, 534, 553, 225, 532, 222, 221, 530, 553, 534, 536, 536, 536, 536, 538, 538, 538, 538, 538, 565, 534, 565, 536, 540, 540, 540, 540, 542, 542, 542, 542, 542, 544, 544, 544, 544, 565, 538, 546, 546, 546, 546, 546, 548, 548, 548, 548, 219, 546, 217, 542, 216, 211, 548, 550, 550, 550, 550, 550, 193, 180, 546, 177, 165, 550, 552, 552, 552, 552, 554, 554, 554, 554, 554, 162, 552, 160, 550, 152, 151, 554, 557, 556, 556, 556, 556, 148, 557, 560, 560, 560, 560, 554, 556, 558, 558, 558, 558, 558, 560, 562, 562, 562, 562, 562, 558, 564, 564, 564, 564, 566, 566, 566, 566, 566, 146, 141, 558, 568, 568, 568, 568, 137, 562, 130, 98, 82, 79, 62, 58, 46, 44, 42, 566, 571, 571, 38, 36, 34, 571, 571, 572, 24, 23, 22, 19, 572, 572, 572, 572, 572, 572, 572, 574, 15, 14, 574, 574, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 576, 576, 576, 576, 576, 576, 576, 576, 13, 576, 576, 576, 576, 576, 578, 578, 9, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 582, 8, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 584, 584, 7, 3, 0, 0, 0, 584, 584, 584, 584, 585, 0, 585, 585, 585, 585, 585, 585, 585, 586, 586, 586, 586, 586, 586, 586, 586, 0, 586, 586, 586, 586, 586, 587, 587, 0, 0, 0, 0, 0, 587, 587, 587, 587, 588, 0, 588, 588, 588, 588, 588, 588, 588, 589, 589, 589, 589, 589, 589, 589, 589, 0, 589, 589, 589, 589, 589, 590, 590, 590, 590, 591, 0, 591, 591, 591, 591, 591, 591, 591, 592, 0, 592, 592, 593, 593, 593, 593, 593, 593, 593, 593, 0, 593, 593, 593, 593, 593, 594, 594, 594, 594, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 597, 0, 597, 0, 597, 597, 597, 597, 597, 597, 597, 599, 599, 599, 599, 599, 599, 599, 599, 0, 599, 599, 599, 599, 599, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 602, 0, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569 } ; static yy_state_type yy_last_accepting_state; static char *yy_last_accepting_cpos; /* The intent behind this definition is that it'll catch * any uses of REJECT which flex missed. */ #define REJECT reject_used_but_not_detected #define yymore() yymore_used_but_not_detected #define YY_MORE_ADJ 0 #define YY_RESTORE_YY_MORE_OFFSET #ifndef YYLMAX #define YYLMAX 8192 #endif char yytext[YYLMAX]; char *idxtext_ptr; #line 1 "idx.l" #define INITIAL 0 #line 5 "idx.l" #include #include #include #include extern int idx_debug; static int _valint(char *s, idxvalrec **v); static int _valfloat(char *s, idxvalrec **v); static int _valname(char *s, idxvalrec **v); static int _valreg(char *s, idxvalrec **v); static int _valfunc(char *s, idxvalrec **v); /* note that negative numbers are not defined here, but in the grammar */ /* must match regions in filt.l */ #line 1133 "lex.idx.c" /* Macros after this point can all be overridden by user definitions in * section 1. */ #ifndef YY_SKIP_YYWRAP #ifdef __cplusplus extern "C" int yywrap YY_PROTO(( void )); #else extern int yywrap YY_PROTO(( void )); #endif #endif #ifndef YY_NO_UNPUT static void yyunput YY_PROTO(( int c, char *buf_ptr )); #endif #ifndef idxtext_ptr static void yy_flex_strncpy YY_PROTO(( char *, yyconst char *, int )); #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen YY_PROTO(( yyconst char * )); #endif #ifndef YY_NO_INPUT #ifdef __cplusplus static int yyinput YY_PROTO(( void )); #else static int input YY_PROTO(( void )); #endif #endif #if YY_STACK_USED static int yy_start_stack_ptr = 0; static int yy_start_stack_depth = 0; static int *yy_start_stack = 0; #ifndef YY_NO_PUSH_STATE static void yy_push_state YY_PROTO(( int new_state )); #endif #ifndef YY_NO_POP_STATE static void yy_pop_state YY_PROTO(( void )); #endif #ifndef YY_NO_TOP_STATE static int yy_top_state YY_PROTO(( void )); #endif #else #define YY_NO_PUSH_STATE 1 #define YY_NO_POP_STATE 1 #define YY_NO_TOP_STATE 1 #endif #ifdef YY_MALLOC_DECL YY_MALLOC_DECL #else #if __STDC__ #ifndef __cplusplus #include #endif #else /* Just try to get by without declaring the routines. This will fail * miserably on non-ANSI systems for which sizeof(size_t) != sizeof(int) * or sizeof(void*) != sizeof(int). */ #endif #endif /* Amount of stuff to slurp up with each read. */ #ifndef YY_READ_BUF_SIZE #define YY_READ_BUF_SIZE 8192 #endif /* Copy whatever the last rule matched to the standard output. */ #ifndef ECHO /* This used to be an fputs(), but since the string might contain NUL's, * we now use fwrite(). */ #define ECHO (void) fwrite( yytext, yyleng, 1, yyout ) #endif /* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, * is returned in "result". */ #ifndef YY_INPUT #define YY_INPUT(buf,result,max_size) \ if ( yy_current_buffer->yy_is_interactive ) \ { \ int c = '*', n; \ for ( n = 0; n < max_size && \ (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ buf[n] = (char) c; \ if ( c == '\n' ) \ buf[n++] = (char) c; \ if ( c == EOF && ferror( yyin ) ) \ YY_FATAL_ERROR( "input in flex scanner failed" ); \ result = n; \ } \ else if ( ((result = fread( buf, 1, max_size, yyin )) == 0) \ && ferror( yyin ) ) \ YY_FATAL_ERROR( "input in flex scanner failed" ); #endif /* No semi-colon after return; correct usage is to write "yyterminate();" - * we don't want an extra ';' after the "return" because that will cause * some compilers to complain about unreachable statements. */ #ifndef yyterminate #define yyterminate() return YY_NULL #endif /* Number of entries by which start-condition stack grows. */ #ifndef YY_START_STACK_INCR #define YY_START_STACK_INCR 25 #endif /* Report a fatal error. */ #ifndef YY_FATAL_ERROR #define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) #endif /* Default declaration of generated scanner - a define so the user can * easily add parameters. */ #ifndef YY_DECL #define YY_DECL int yylex YY_PROTO(( void )) #endif /* Code executed at the beginning of each rule, after yytext and yyleng * have been set up. */ #ifndef YY_USER_ACTION #define YY_USER_ACTION #endif /* Code executed at the end of each rule. */ #ifndef YY_BREAK #define YY_BREAK break; #endif #define YY_RULE_SETUP \ YY_USER_ACTION YY_DECL { register yy_state_type yy_current_state; register char *yy_cp, *yy_bp; register int yy_act; #line 35 "idx.l" #line 1287 "lex.idx.c" if ( yy_init ) { yy_init = 0; #ifdef YY_USER_INIT YY_USER_INIT; #endif if ( ! yy_start ) yy_start = 1; /* first start state */ if ( ! yyin ) yyin = stdin; if ( ! yyout ) yyout = stdout; if ( ! yy_current_buffer ) yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); yy_load_buffer_state(); } while ( 1 ) /* loops until end-of-file is reached */ { yy_cp = yy_c_buf_p; /* Support of yytext. */ *yy_cp = yy_hold_char; /* yy_bp points to the position in yy_ch_buf of the start of * the current run. */ yy_bp = yy_cp; yy_current_state = yy_start; yy_match: do { register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; if ( yy_accept[yy_current_state] ) { yy_last_accepting_state = yy_current_state; yy_last_accepting_cpos = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 570 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; ++yy_cp; } while ( yy_base[yy_current_state] != 2377 ); yy_find_action: yy_act = yy_accept[yy_current_state]; if ( yy_act == 0 ) { /* have to back up */ yy_cp = yy_last_accepting_cpos; yy_current_state = yy_last_accepting_state; yy_act = yy_accept[yy_current_state]; } YY_DO_BEFORE_ACTION; do_action: /* This label is used only to access EOF actions. */ switch ( yy_act ) { /* beginning of action switch */ case 0: /* must back up */ /* undo the effects of YY_DO_BEFORE_ACTION */ *yy_cp = yy_hold_char; yy_cp = yy_last_accepting_cpos; yy_current_state = yy_last_accepting_state; goto yy_find_action; case 1: YY_RULE_SETUP #line 37 "idx.l" {return _valint(yytext, &(idxlval.val));} YY_BREAK case 2: YY_RULE_SETUP #line 39 "idx.l" {return _valfloat(yytext, &(idxlval.val));} YY_BREAK case 3: YY_RULE_SETUP #line 42 "idx.l" { return _valreg(yytext, &(idxlval.val)); } YY_BREAK case 4: YY_RULE_SETUP #line 46 "idx.l" { return _valreg(yytext, &(idxlval.val)); } YY_BREAK case 5: YY_RULE_SETUP #line 50 "idx.l" { /* support functions with one level of nested parens */ return _valfunc(yytext, &(idxlval.val)); } YY_BREAK case 6: YY_RULE_SETUP #line 55 "idx.l" {return _valname(yytext, &(idxlval.val));} YY_BREAK case 7: YY_RULE_SETUP #line 57 "idx.l" {return OR;} YY_BREAK case 8: YY_RULE_SETUP #line 58 "idx.l" {return AND;} YY_BREAK case 9: YY_RULE_SETUP #line 59 "idx.l" {return EQ;} YY_BREAK case 10: YY_RULE_SETUP #line 60 "idx.l" {return NE;} YY_BREAK case 11: YY_RULE_SETUP #line 61 "idx.l" {return LE;} YY_BREAK case 12: YY_RULE_SETUP #line 62 "idx.l" {return GE;} YY_BREAK case 13: YY_RULE_SETUP #line 64 "idx.l" {;} YY_BREAK case YY_STATE_EOF(INITIAL): #line 66 "idx.l" { yy_delete_buffer( YY_CURRENT_BUFFER ); yyterminate(); } YY_BREAK case 14: YY_RULE_SETUP #line 71 "idx.l" {return yytext[0];} YY_BREAK case 15: YY_RULE_SETUP #line 73 "idx.l" ECHO; YY_BREAK #line 1459 "lex.idx.c" case YY_END_OF_BUFFER: { /* Amount of text matched not including the EOB char. */ int yy_amount_of_matched_text = (int) (yy_cp - idxtext_ptr) - 1; /* Undo the effects of YY_DO_BEFORE_ACTION. */ *yy_cp = yy_hold_char; YY_RESTORE_YY_MORE_OFFSET if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_NEW ) { /* We're scanning a new file or input source. It's * possible that this happened because the user * just pointed yyin at a new source and called * yylex(). If so, then we have to assure * consistency between yy_current_buffer and our * globals. Here is the right place to do so, because * this is the first action (other than possibly a * back-up) that will match for the new input source. */ yy_n_chars = yy_current_buffer->yy_n_chars; yy_current_buffer->yy_input_file = yyin; yy_current_buffer->yy_buffer_status = YY_BUFFER_NORMAL; } /* Note that here we test for yy_c_buf_p "<=" to the position * of the first EOB in the buffer, since yy_c_buf_p will * already have been incremented past the NUL character * (since all states make transitions on EOB to the * end-of-buffer state). Contrast this with the test * in input(). */ if ( yy_c_buf_p <= &yy_current_buffer->yy_ch_buf[yy_n_chars] ) { /* This was really a NUL. */ yy_state_type yy_next_state; yy_c_buf_p = idxtext_ptr + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state(); /* Okay, we're now positioned to make the NUL * transition. We couldn't have * yy_get_previous_state() go ahead and do it * for us because it doesn't know how to deal * with the possibility of jamming (and we don't * want to build jamming into it because then it * will run more slowly). */ yy_next_state = yy_try_NUL_trans( yy_current_state ); yy_bp = idxtext_ptr + YY_MORE_ADJ; if ( yy_next_state ) { /* Consume the NUL. */ yy_cp = ++yy_c_buf_p; yy_current_state = yy_next_state; goto yy_match; } else { yy_cp = yy_c_buf_p; goto yy_find_action; } } else switch ( yy_get_next_buffer() ) { case EOB_ACT_END_OF_FILE: { yy_did_buffer_switch_on_eof = 0; if ( yywrap() ) { /* Note: because we've taken care in * yy_get_next_buffer() to have set up * yytext, we can now set up * yy_c_buf_p so that if some total * hoser (like flex itself) wants to * call the scanner after we return the * YY_NULL, it'll still work - another * YY_NULL will get returned. */ yy_c_buf_p = idxtext_ptr + YY_MORE_ADJ; yy_act = YY_STATE_EOF(YY_START); goto do_action; } else { if ( ! yy_did_buffer_switch_on_eof ) YY_NEW_FILE; } break; } case EOB_ACT_CONTINUE_SCAN: yy_c_buf_p = idxtext_ptr + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state(); yy_cp = yy_c_buf_p; yy_bp = idxtext_ptr + YY_MORE_ADJ; goto yy_match; case EOB_ACT_LAST_MATCH: yy_c_buf_p = &yy_current_buffer->yy_ch_buf[yy_n_chars]; yy_current_state = yy_get_previous_state(); yy_cp = yy_c_buf_p; yy_bp = idxtext_ptr + YY_MORE_ADJ; goto yy_find_action; } break; } default: YY_FATAL_ERROR( "fatal flex scanner internal error--no action found" ); } /* end of action switch */ } /* end of scanning one token */ } /* end of yylex */ /* yy_get_next_buffer - try to read in a new buffer * * Returns a code representing an action: * EOB_ACT_LAST_MATCH - * EOB_ACT_CONTINUE_SCAN - continue scanning from current position * EOB_ACT_END_OF_FILE - end of file */ static int yy_get_next_buffer() { register char *dest = yy_current_buffer->yy_ch_buf; register char *source = idxtext_ptr; register int number_to_move, i; int ret_val; if ( yy_c_buf_p > &yy_current_buffer->yy_ch_buf[yy_n_chars + 1] ) YY_FATAL_ERROR( "fatal flex scanner internal error--end of buffer missed" ); if ( yy_current_buffer->yy_fill_buffer == 0 ) { /* Don't try to fill the buffer, so this is an EOF. */ if ( yy_c_buf_p - idxtext_ptr - YY_MORE_ADJ == 1 ) { /* We matched a single character, the EOB, so * treat this as a final EOF. */ return EOB_ACT_END_OF_FILE; } else { /* We matched some text prior to the EOB, first * process it. */ return EOB_ACT_LAST_MATCH; } } /* Try to read more data. */ /* First move last chars to start of buffer. */ number_to_move = (int) (yy_c_buf_p - idxtext_ptr) - 1; for ( i = 0; i < number_to_move; ++i ) *(dest++) = *(source++); if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_EOF_PENDING ) /* don't do the read, it's not guaranteed to return an EOF, * just force an EOF */ yy_current_buffer->yy_n_chars = yy_n_chars = 0; else { int num_to_read = yy_current_buffer->yy_buf_size - number_to_move - 1; while ( num_to_read <= 0 ) { /* Not enough room in the buffer - grow it. */ #ifdef YY_USES_REJECT YY_FATAL_ERROR( "input buffer overflow, can't enlarge buffer because scanner uses REJECT" ); #else /* just a shorter name for the current buffer */ YY_BUFFER_STATE b = yy_current_buffer; int yy_c_buf_p_offset = (int) (yy_c_buf_p - b->yy_ch_buf); if ( b->yy_is_our_buffer ) { int new_size = b->yy_buf_size * 2; if ( new_size <= 0 ) b->yy_buf_size += b->yy_buf_size / 8; else b->yy_buf_size *= 2; b->yy_ch_buf = (char *) /* Include room in for 2 EOB chars. */ yy_flex_realloc( (void *) b->yy_ch_buf, b->yy_buf_size + 2 ); } else /* Can't grow it, we don't own it. */ b->yy_ch_buf = 0; if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "fatal error - scanner input buffer overflow" ); yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset]; num_to_read = yy_current_buffer->yy_buf_size - number_to_move - 1; #endif } if ( num_to_read > YY_READ_BUF_SIZE ) num_to_read = YY_READ_BUF_SIZE; /* Read in more data. */ YY_INPUT( (&yy_current_buffer->yy_ch_buf[number_to_move]), yy_n_chars, num_to_read ); yy_current_buffer->yy_n_chars = yy_n_chars; } if ( yy_n_chars == 0 ) { if ( number_to_move == YY_MORE_ADJ ) { ret_val = EOB_ACT_END_OF_FILE; yyrestart( yyin ); } else { ret_val = EOB_ACT_LAST_MATCH; yy_current_buffer->yy_buffer_status = YY_BUFFER_EOF_PENDING; } } else ret_val = EOB_ACT_CONTINUE_SCAN; yy_n_chars += number_to_move; yy_current_buffer->yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR; yy_current_buffer->yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR; idxtext_ptr = &yy_current_buffer->yy_ch_buf[0]; return ret_val; } /* yy_get_previous_state - get the state just before the EOB char was reached */ static yy_state_type yy_get_previous_state() { register yy_state_type yy_current_state; register char *yy_cp; yy_current_state = yy_start; for ( yy_cp = idxtext_ptr + YY_MORE_ADJ; yy_cp < yy_c_buf_p; ++yy_cp ) { register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); if ( yy_accept[yy_current_state] ) { yy_last_accepting_state = yy_current_state; yy_last_accepting_cpos = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 570 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; } return yy_current_state; } /* yy_try_NUL_trans - try to make a transition on the NUL character * * synopsis * next_state = yy_try_NUL_trans( current_state ); */ #ifdef YY_USE_PROTOS static yy_state_type yy_try_NUL_trans( yy_state_type yy_current_state ) #else static yy_state_type yy_try_NUL_trans( yy_current_state ) yy_state_type yy_current_state; #endif { register int yy_is_jam; register char *yy_cp = yy_c_buf_p; register YY_CHAR yy_c = 1; if ( yy_accept[yy_current_state] ) { yy_last_accepting_state = yy_current_state; yy_last_accepting_cpos = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 570 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; yy_is_jam = (yy_current_state == 569); return yy_is_jam ? 0 : yy_current_state; } #ifndef YY_NO_UNPUT #ifdef YY_USE_PROTOS static void yyunput( int c, register char *yy_bp ) #else static void yyunput( c, yy_bp ) int c; register char *yy_bp; #endif { register char *yy_cp = yy_c_buf_p; /* undo effects of setting up yytext */ *yy_cp = yy_hold_char; if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) { /* need to shift things up to make room */ /* +2 for EOB chars. */ register int number_to_move = yy_n_chars + 2; register char *dest = &yy_current_buffer->yy_ch_buf[ yy_current_buffer->yy_buf_size + 2]; register char *source = &yy_current_buffer->yy_ch_buf[number_to_move]; while ( source > yy_current_buffer->yy_ch_buf ) *--dest = *--source; yy_cp += (int) (dest - source); yy_bp += (int) (dest - source); yy_current_buffer->yy_n_chars = yy_n_chars = yy_current_buffer->yy_buf_size; if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) YY_FATAL_ERROR( "flex scanner push-back overflow" ); } *--yy_cp = (char) c; idxtext_ptr = yy_bp; yy_hold_char = *yy_cp; yy_c_buf_p = yy_cp; } #endif /* ifndef YY_NO_UNPUT */ #ifdef __cplusplus static int yyinput() #else static int input() #endif { int c; *yy_c_buf_p = yy_hold_char; if ( *yy_c_buf_p == YY_END_OF_BUFFER_CHAR ) { /* yy_c_buf_p now points to the character we want to return. * If this occurs *before* the EOB characters, then it's a * valid NUL; if not, then we've hit the end of the buffer. */ if ( yy_c_buf_p < &yy_current_buffer->yy_ch_buf[yy_n_chars] ) /* This was really a NUL. */ *yy_c_buf_p = '\0'; else { /* need more input */ int offset = yy_c_buf_p - idxtext_ptr; ++yy_c_buf_p; switch ( yy_get_next_buffer() ) { case EOB_ACT_LAST_MATCH: /* This happens because yy_g_n_b() * sees that we've accumulated a * token and flags that we need to * try matching the token before * proceeding. But for input(), * there's no matching to consider. * So convert the EOB_ACT_LAST_MATCH * to EOB_ACT_END_OF_FILE. */ /* Reset buffer status. */ yyrestart( yyin ); /* fall through */ case EOB_ACT_END_OF_FILE: { if ( yywrap() ) return EOF; if ( ! yy_did_buffer_switch_on_eof ) YY_NEW_FILE; #ifdef __cplusplus return yyinput(); #else return input(); #endif } case EOB_ACT_CONTINUE_SCAN: yy_c_buf_p = idxtext_ptr + offset; break; } } } c = *(unsigned char *) yy_c_buf_p; /* cast for 8-bit char's */ *yy_c_buf_p = '\0'; /* preserve yytext */ yy_hold_char = *++yy_c_buf_p; return c; } #ifdef YY_USE_PROTOS void yyrestart( FILE *input_file ) #else void yyrestart( input_file ) FILE *input_file; #endif { if ( ! yy_current_buffer ) yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); yy_init_buffer( yy_current_buffer, input_file ); yy_load_buffer_state(); } #ifdef YY_USE_PROTOS void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer ) #else void yy_switch_to_buffer( new_buffer ) YY_BUFFER_STATE new_buffer; #endif { if ( yy_current_buffer == new_buffer ) return; if ( yy_current_buffer ) { /* Flush out information for old buffer. */ *yy_c_buf_p = yy_hold_char; yy_current_buffer->yy_buf_pos = yy_c_buf_p; yy_current_buffer->yy_n_chars = yy_n_chars; } yy_current_buffer = new_buffer; yy_load_buffer_state(); /* We don't actually know whether we did this switch during * EOF (yywrap()) processing, but the only time this flag * is looked at is after yywrap() is called, so it's safe * to go ahead and always set it. */ yy_did_buffer_switch_on_eof = 1; } #ifdef YY_USE_PROTOS void yy_load_buffer_state( void ) #else void yy_load_buffer_state() #endif { yy_n_chars = yy_current_buffer->yy_n_chars; idxtext_ptr = yy_c_buf_p = yy_current_buffer->yy_buf_pos; yyin = yy_current_buffer->yy_input_file; yy_hold_char = *yy_c_buf_p; } #ifdef YY_USE_PROTOS YY_BUFFER_STATE yy_create_buffer( FILE *file, int size ) #else YY_BUFFER_STATE yy_create_buffer( file, size ) FILE *file; int size; #endif { YY_BUFFER_STATE b; b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_buf_size = size; /* yy_ch_buf has to be 2 characters longer than the size given because * we need to put in 2 end-of-buffer characters. */ b->yy_ch_buf = (char *) yy_flex_alloc( b->yy_buf_size + 2 ); if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_is_our_buffer = 1; yy_init_buffer( b, file ); return b; } #ifdef YY_USE_PROTOS void yy_delete_buffer( YY_BUFFER_STATE b ) #else void yy_delete_buffer( b ) YY_BUFFER_STATE b; #endif { if ( ! b ) return; if ( b == yy_current_buffer ) yy_current_buffer = (YY_BUFFER_STATE) 0; if ( b->yy_is_our_buffer ) yy_flex_free( (void *) b->yy_ch_buf ); yy_flex_free( (void *) b ); } #ifndef YY_ALWAYS_INTERACTIVE #ifndef YY_NEVER_INTERACTIVE extern int isatty YY_PROTO(( int )); #endif #endif #ifdef YY_USE_PROTOS void yy_init_buffer( YY_BUFFER_STATE b, FILE *file ) #else void yy_init_buffer( b, file ) YY_BUFFER_STATE b; FILE *file; #endif { yy_flush_buffer( b ); b->yy_input_file = file; b->yy_fill_buffer = 1; #if YY_ALWAYS_INTERACTIVE b->yy_is_interactive = 1; #else #if YY_NEVER_INTERACTIVE b->yy_is_interactive = 0; #else b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; #endif #endif } #ifdef YY_USE_PROTOS void yy_flush_buffer( YY_BUFFER_STATE b ) #else void yy_flush_buffer( b ) YY_BUFFER_STATE b; #endif { if ( ! b ) return; b->yy_n_chars = 0; /* We always need two end-of-buffer characters. The first causes * a transition to the end-of-buffer state. The second causes * a jam in that state. */ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; b->yy_buf_pos = &b->yy_ch_buf[0]; b->yy_at_bol = 1; b->yy_buffer_status = YY_BUFFER_NEW; if ( b == yy_current_buffer ) yy_load_buffer_state(); } #ifndef YY_NO_SCAN_BUFFER #ifdef YY_USE_PROTOS YY_BUFFER_STATE yy_scan_buffer( char *base, yy_size_t size ) #else YY_BUFFER_STATE yy_scan_buffer( base, size ) char *base; yy_size_t size; #endif { YY_BUFFER_STATE b; if ( size < 2 || base[size-2] != YY_END_OF_BUFFER_CHAR || base[size-1] != YY_END_OF_BUFFER_CHAR ) /* They forgot to leave room for the EOB's. */ return 0; b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ b->yy_buf_pos = b->yy_ch_buf = base; b->yy_is_our_buffer = 0; b->yy_input_file = 0; b->yy_n_chars = b->yy_buf_size; b->yy_is_interactive = 0; b->yy_at_bol = 1; b->yy_fill_buffer = 0; b->yy_buffer_status = YY_BUFFER_NEW; yy_switch_to_buffer( b ); return b; } #endif #ifndef YY_NO_SCAN_STRING #ifdef YY_USE_PROTOS YY_BUFFER_STATE yy_scan_string( yyconst char *yy_str ) #else YY_BUFFER_STATE yy_scan_string( yy_str ) yyconst char *yy_str; #endif { int len; for ( len = 0; yy_str[len]; ++len ) ; return yy_scan_bytes( yy_str, len ); } #endif #ifndef YY_NO_SCAN_BYTES #ifdef YY_USE_PROTOS YY_BUFFER_STATE yy_scan_bytes( yyconst char *bytes, int len ) #else YY_BUFFER_STATE yy_scan_bytes( bytes, len ) yyconst char *bytes; int len; #endif { YY_BUFFER_STATE b; char *buf; yy_size_t n; int i; /* Get memory for full buffer, including space for trailing EOB's. */ n = len + 2; buf = (char *) yy_flex_alloc( n ); if ( ! buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); for ( i = 0; i < len; ++i ) buf[i] = bytes[i]; buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR; b = yy_scan_buffer( buf, n ); if ( ! b ) YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); /* It's okay to grow etc. this buffer, and we should throw it * away when we're done. */ b->yy_is_our_buffer = 1; return b; } #endif #ifndef YY_NO_PUSH_STATE #ifdef YY_USE_PROTOS static void yy_push_state( int new_state ) #else static void yy_push_state( new_state ) int new_state; #endif { if ( yy_start_stack_ptr >= yy_start_stack_depth ) { yy_size_t new_size; yy_start_stack_depth += YY_START_STACK_INCR; new_size = yy_start_stack_depth * sizeof( int ); if ( ! yy_start_stack ) yy_start_stack = (int *) yy_flex_alloc( new_size ); else yy_start_stack = (int *) yy_flex_realloc( (void *) yy_start_stack, new_size ); if ( ! yy_start_stack ) YY_FATAL_ERROR( "out of memory expanding start-condition stack" ); } yy_start_stack[yy_start_stack_ptr++] = YY_START; BEGIN(new_state); } #endif #ifndef YY_NO_POP_STATE static void yy_pop_state() { if ( --yy_start_stack_ptr < 0 ) YY_FATAL_ERROR( "start-condition stack underflow" ); BEGIN(yy_start_stack[yy_start_stack_ptr]); } #endif #ifndef YY_NO_TOP_STATE static int yy_top_state() { return yy_start_stack[yy_start_stack_ptr - 1]; } #endif #ifndef YY_EXIT_FAILURE #define YY_EXIT_FAILURE 2 #endif #ifdef YY_USE_PROTOS static void yy_fatal_error( yyconst char msg[] ) #else static void yy_fatal_error( msg ) char msg[]; #endif { (void) fprintf( stderr, "%s\n", msg ); exit( YY_EXIT_FAILURE ); } /* Redefine yyless() so it works in section 3 code. */ #undef yyless #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ yytext[yyleng] = yy_hold_char; \ yy_c_buf_p = yytext + n; \ yy_hold_char = *yy_c_buf_p; \ *yy_c_buf_p = '\0'; \ yyleng = n; \ } \ while ( 0 ) /* Internal utility routines. */ #ifndef idxtext_ptr #ifdef YY_USE_PROTOS static void yy_flex_strncpy( char *s1, yyconst char *s2, int n ) #else static void yy_flex_strncpy( s1, s2, n ) char *s1; yyconst char *s2; int n; #endif { register int i; for ( i = 0; i < n; ++i ) s1[i] = s2[i]; } #endif #ifdef YY_NEED_STRLEN #ifdef YY_USE_PROTOS static int yy_flex_strlen( yyconst char *s ) #else static int yy_flex_strlen( s ) yyconst char *s; #endif { register int n; for ( n = 0; s[n]; ++n ) ; return n; } #endif #ifdef YY_USE_PROTOS static void *yy_flex_alloc( yy_size_t size ) #else static void *yy_flex_alloc( size ) yy_size_t size; #endif { return (void *) malloc( size ); } #ifdef YY_USE_PROTOS static void *yy_flex_realloc( void *ptr, yy_size_t size ) #else static void *yy_flex_realloc( ptr, size ) void *ptr; yy_size_t size; #endif { /* The cast to (char *) in the following accommodates both * implementations that use char* generic pointers, and those * that use void* generic pointers. It works with the latter * because both ANSI C and C++ allow castless assignment from * any pointer type to void*, and deal with argument conversions * as though doing an assignment. */ return (void *) realloc( (char *) ptr, size ); } #ifdef YY_USE_PROTOS static void yy_flex_free( void *ptr ) #else static void yy_flex_free( ptr ) void *ptr; #endif { free( ptr ); } #if YY_MAIN int main() { yylex(); return 0; } #endif #line 73 "idx.l" #ifdef YY_USE_PROTOS static int _valint(char *s, idxvalrec **v) #else static int _valint(s, v) char *s; idxvalrec **v; #endif { char *t; *v = idxvalnew(s); (*v)->ival = strtoll(s, &t, 0); if( *t ) idxerror("bad integer value"); (*v)->type = NUM; (*v)->ntype = PARSE_INTEGER; (*v)->dval = (double)(*v)->ival; return NUM; } #ifdef YY_USE_PROTOS static int _valfloat(char *s, idxvalrec **v) #else static int _valfloat(s, v) char *s; idxvalrec **v; #endif { char *t; *v = idxvalnew(s); (*v)->dval = strtod(s, &t); if( *t ) idxerror("bad float value"); (*v)->type = NUM; (*v)->ntype = PARSE_FLOAT; return NUM; } #ifdef YY_USE_PROTOS static int _valname(char *s, idxvalrec **v) #else static int _valname(s, v) char *s; idxvalrec **v; #endif { int i; int got; int oflag; int isize=0; char *iname; char *colname; char tail[SZ_LINE]; FilterSymbols sp=NULL; idxvalrec *vv; *v = idxvalnew(s); /* lookup the string */ if( !(sp=FilterSymbolLookup(FilterDefault(), s)) ){ idxerror("column name not found in data file"); (*v)->type = INDEF; return INDEF; } colname = idxinfo(IDX_COLNAME); /* see what sort of symbol it is */ switch(sp->type){ case SYM_COL: if( !(iname=idxindexfilename(s, &isize)) ){ (*v)->type = INDEF; return INDEF; } /* if we already have opened this index, just use the existing handle */ if( (vv=idxlookupfilename(iname)) ){ (*v)->igio = vv->igio; (*v)->ifits = vv->ifits; } /* open index for first time and mark iname */ else{ oflag = setgerror(0); (*v)->igio = ft_fitsheadopen(iname, &((*v)->ifits), tail, SZ_LINE, "r"); setgerror(oflag); if( !((*v)->igio) ){ idxerror("existing index file can't be opened"); (*v)->type = INDEF; return INDEF; } else{ (*v)->iname = xstrdup(iname); } } xfree(iname); if( (*v)->ifits ){ for(got=0, i=0; i<(*v)->ifits->table->tfields; i++){ if( !strcasecmp(s, (*v)->ifits->table->col[i].name) ){ (*v)->vtype = (*v)->ifits->table->col[i].type; (*v)->voffset = (*v)->ifits->table->col[i].offset; (*v)->vn = (*v)->ifits->table->col[i].n; got++; } if( !strcasecmp(colname, (*v)->ifits->table->col[i].name) ){ (*v)->itype = (*v)->ifits->table->col[i].type; (*v)->ioffset = (*v)->ifits->table->col[i].offset; (*v)->in = (*v)->ifits->table->col[i].n; got++; } } if( got == 2 ){ #ifdef HAVE_SYS_MMAN_H if( !(*v)->igio->gz ){ if(!((*v)->idata = mmap(NULL, isize, PROT_READ, MAP_PRIVATE, fileno((*v)->igio->fp), 0)) ){ idxerror("index file can't be mmap'ed"); (*v)->type = INDEF; return INDEF; } (*v)->ilen = isize; } #endif (*v)->nrow = ft_naxis((*v)->ifits,2); (*v)->type = COL; return COL; } else{ idxerror("column name and/or index not found in index file"); } } else{ (*v)->type = INDEF; return INDEF; } case SYM_PAR: (*v)->ntype=ParseDataType(sp->value, &(*v)->dval, &(*v)->ival); (*v)->type = NUM; switch((*v)->ntype){ case PARSE_INTEGER: case PARSE_HEXINT: (*v)->dval = (double)(*v)->ival; return NUM; case PARSE_FLOAT: return NUM; default: idxerror("invalid parameter type in index"); return 0; } default: idxerror("unknown symbol type in index"); return 0; } } #ifdef YY_USE_PROTOS static int _valreglims(idxvalrec *v, char *s) #else static int _valreglims(v, s) idxvalrec *v; char *s; #endif { int i; int ip=0; int nd=0, maxd=0; double xcen, ycen; double dval; double *dvals; double pts[8]; char tbuf[SZ_LINE]; char tbuf2[SZ_LINE]; double angle; double xwidth, yheight; double angl; /* l: Cartesian angle in radians */ double half_width, half_height;/* l: radii (1/2 width and height) */ double cosangl, sinangl; /* l: sine, cosine of the Cartesian angle */ double hw_cos, hw_sin; /* l: products of half_width with sin, cos */ double hh_cos, hh_sin; /* l: products of half_height with sin, cos */ if( !strcmp(v->s, "circle") || !strcmp(v->s, "ncircle") || !strcmp(v->s, "annulus") || !strcmp(v->s, "nannulus") ){ if( !word(s, tbuf, &ip)||!word(s, tbuf2, &ip) ) return 0; xcen = atof(tbuf); ycen = atof(tbuf2); dval = -1; if( *v->s == 'n' ){ if( !word(s, tbuf, &ip) || !word(s, tbuf, &ip) ) return 0; dval = MAX(atof(tbuf),dval); } else{ while( word(s, tbuf, &ip) && strcmp(tbuf, "-142857.142857") ){ dval = MAX(atof(tbuf),dval); } } v->rlo[0] = xcen - dval - 1; v->rhi[0] = xcen + dval + 1; v->rlo[1] = ycen - dval - 1; v->rhi[1] = ycen + dval + 1; return 1; } else if( !strcmp(v->s, "box") || !strcmp(v->s, "nbox") || !strcmp(v->s, "ellipse") || !strcmp(v->s, "nellipse") ){ if( !word(s, tbuf, &ip)||!word(s, tbuf2, &ip) ) return 0; xcen = atof(tbuf); ycen = atof(tbuf2); maxd = SZ_LINE; if( !(dvals=(double *)malloc(maxd*sizeof(double))) ) return 0; if( *v->s == 'n' ){ if( !word(s, tbuf, &ip) || !word(s, tbuf, &ip) ) return 0; if( !word(s, tbuf, &ip) || !word(s, tbuf2, &ip) ) return 0; dvals[nd++] = atof(tbuf); dvals[nd++] = atof(tbuf2); if( word(s, tbuf, &ip) && word(s, tbuf, &ip) ) dvals[nd++] = atof(tbuf); } else{ while( word(s, tbuf, &ip) && strcmp(tbuf, "-142857.142857") ){ dvals[nd++] = atof(tbuf); if( nd == maxd ){ maxd += SZ_LINE; if( !(dvals=(double *)realloc(dvals, maxd*sizeof(double))) ) return 0; } } } ellcom: if( nd == 2 ){ angle = 0.0; xwidth = dvals[0]; yheight = dvals[1]; } else{ angle = dvals[nd-1]; xwidth = dvals[nd-3]; yheight = dvals[nd-2]; } if( dvals ) xfree(dvals); /* Why is this done in evfilter.c??? Doesn't seem necessary */ /* angl = angle + 90.0; */ angl = angle; while (angl >= 360.0) angl = angl - 360.0; /* convert to radians */ angl = (angl / 180.0) * M_PI; sinangl = sin (angl); cosangl = cos (angl); /* Why is this done in evfilter.c??? Doesn't seem necessary */ /* since we rotate by 90.0 degrees to get from astro angle to cartesian, */ /* we also need to switch the width and height. we do this secretly so */ /* that the display will turn out right, by doing it in the half terms */ if( !strcmp(v->s, "box") ){ /* half_width = yheight / 2.0; half_height = xwidth / 2.0; */ half_width = xwidth / 2.0; half_height = yheight / 2.0; } else{ /* half_width = yheight; half_height = xwidth; */ half_width = xwidth; half_height = yheight; } hw_cos = half_width * cosangl; hw_sin = half_width * sinangl; hh_cos = half_height * cosangl; hh_sin = half_height * sinangl; pts[0] = xcen - hw_cos - hh_sin; pts[1] = ycen - hw_sin + hh_cos; pts[2] = xcen + hw_cos - hh_sin; pts[3] = ycen + hw_sin + hh_cos; pts[4] = xcen + hw_cos + hh_sin; pts[5] = ycen + hw_sin - hh_cos; pts[6] = xcen - hw_cos + hh_sin; pts[7] = ycen - hw_sin - hh_cos; v->rlo[0] = pts[0]; v->rhi[0] = pts[0]; v->rlo[1] = pts[1]; v->rhi[1] = pts[1]; for(i=2; i<8; i+=2){ v->rlo[0] = MIN(pts[i],v->rlo[0]); v->rhi[0] = MAX(pts[i],v->rhi[0]); v->rlo[1] = MIN(pts[i+1],v->rlo[1]); v->rhi[1] = MAX(pts[i+1],v->rhi[1]); } return 1; } else if( !strcmp(v->s, "line") ){ for(i=0; i<4; i++){ if( word(s, tbuf, &ip) ){ pts[i] = atof(tbuf); } } v->rlo[0] = MIN(pts[0],pts[2]); v->rhi[0] = MAX(pts[0],pts[2]); v->rlo[1] = MIN(pts[1],pts[3]); v->rhi[1] = MAX(pts[1],pts[3]); return 1; } else if( !strcmp(v->s, "point") || !strcmp(v->s, "polygon") ){ if( !word(s, tbuf, &ip)||!word(s, tbuf2, &ip) ) return 0; xcen = atof(tbuf); ycen = atof(tbuf2); v->rlo[0] = xcen-1; v->rhi[0] = xcen+1; v->rlo[1] = ycen-1; v->rhi[1] = ycen+1; while( word(s, tbuf, &ip) && strcmp(tbuf, "-142857.142857") && word(s, tbuf2, &ip) ){ dval = atof(tbuf); v->rlo[0] = MIN(dval-1,v->rlo[0]); v->rhi[0] = MAX(dval+1,v->rhi[0]); dval = atof(tbuf2); v->rlo[1] = MIN(dval-1,v->rlo[1]); v->rhi[1] = MAX(dval+1,v->rhi[1]); } return 1; } else if( !strcmp(v->s, "pie") || !strcmp(v->s, "qtpie") ){ return 0; } else if( !strcmp(v->s, "panda") || !strcmp(v->s, "cpanda") ){ maxd = SZ_LINE; if( !(dvals=(double *)malloc(maxd*sizeof(double))) ) return 0; while( word(s, tbuf, &ip) && strcmp(tbuf, "-142857.142857") ){ dvals[nd++] = atof(tbuf); if( nd == maxd ){ maxd += SZ_LINE; if( !(dvals=(double *)realloc(dvals, maxd*sizeof(double))) ) return 0; } } v->rlo[0] = dvals[0] - dvals[6] - 1; v->rhi[0] = dvals[0] + dvals[6] + 1; v->rlo[1] = dvals[1] - dvals[6] - 1; v->rhi[1] = dvals[1] + dvals[6] + 1; if( dvals ) xfree(dvals); return 1; } else if( !strcmp(v->s, "bpanda") || !strcmp(v->s, "epanda") ){ maxd = 3; if( !(dvals=(double *)malloc(maxd*sizeof(double))) ) return 0; /* grab: xcen ycen */ if( !word(s, tbuf, &ip)||!word(s, tbuf2, &ip) ) return 0; xcen = atof(tbuf); ycen = atof(tbuf2); /* skip: ang1 ang2 nang xwlo yhlo */ for(i=0; i<5; i++){ if( !word(s, tbuf, &ip) ) return 0; } /* grab: xwhi yhhi */ for(i=0; i<2; i++){ if( !word(s, tbuf, &ip) ) return 0; dvals[nd++] = atof(tbuf); } /* skip: nrad */ if( !word(s, tbuf, &ip) ) return 0; /* grab: ang */ if( !word(s, tbuf, &ip) ) return 0; dvals[nd++] = atof(tbuf); /* we can now handle this with box/ellipse code */ goto ellcom; } else if( !strcmp(v->s, "field") ){ return 0; } else{ return 0; } } #ifdef YY_USE_PROTOS static int _valreg(char *s, idxvalrec **v) #else static int _valreg(s, v) char *s; idxvalrec **v; #endif { int ip=0; char *t; char tbuf[SZ_LINE]; *v = idxvalnew(NULL); newdtable("(),"); while( *s == '(' ) s++; if( !word(s, tbuf, &ip) ){ (*v)->type = INDEF; return REG; } if( strstr(tbuf, "field") ){ (*v)->type = INDEF; return REG; } t = tbuf+2; if( *t == 'v' ) t++; (*v)->s = xstrdup(t); if( !word(s, tbuf, &ip) || !word(s, tbuf, &ip) || !word(s, tbuf, &ip) || !word(s, tbuf, &ip) ){ (*v)->type = INDEF; return REG; } /* include/exclude */ if( !atoi(tbuf) ){ (*v)->type = INDEF; return REG; } if( !word(s, tbuf, &ip) || !word(s, tbuf, &ip) || !word(s, tbuf, &ip) ){ (*v)->type = INDEF; return REG; } culc(tbuf); _valname(tbuf, &(*v)->rv[0]); if( !word(s, tbuf, &ip) || !word(s, tbuf, &ip) ){ (*v)->type = INDEF; return REG; } culc(tbuf); _valname(tbuf, &(*v)->rv[1]); if( !_valreglims(*v, &s[ip]) ){ (*v)->type = INDEF; return REG; } freedtable(); (*v)->type = REG; return REG; } #ifdef YY_USE_PROTOS static int _valfunc(char *s, idxvalrec **v) #else static int _valfunc(s, v) char *s; idxvalrec **v; #endif { *v = idxvalnew(s); (*v)->type = FUNC; return FUNC; } #ifdef YY_USE_PROTOS void idxstring(char *s) #else void idxstring(s) char *s; #endif { idx_scan_string(s); } #ifdef YY_USE_PROTOS int idxerror(char *msg) #else int idxerror(msg) char *msg; #endif { Filter filter; YY_FLUSH_BUFFER; /* turn indexing off */ if( (filter=FilterDefault()) ){ filter->doidx = -1; } /* output message, if necessary */ if( idx_debug ){ fprintf(stderr, "ERROR: %s", msg); if( !strcmp(msg, "syntax error") ){ fprintf(stderr, " (terminating index processing)"); } fprintf(stderr, "\n"); } yyterminate(); } #ifdef YY_USE_PROTOS int yywrap(void) #else int yywrap() #endif { return 1; } funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/filter/regions.h000066400000000000000000000347441256243640000236160ustar00rootroot00000000000000#if MINIMIZE_INCLUDES #include int sscanf(const char *s, const char *format, ...); typedef unsigned long size_t; size_t strlen(); char *strcpy(), *strdup(), *strstr(), *getenv(); void *calloc(), *malloc(), *memset(), *memmove(); void exit(); #else #include #include #include #include #include #ifdef __STDC__ #include #include #else #include #endif #endif #if MINIMIZE_INCLUDES /* lots of math functions from math.h */ extern double acos(double); extern double asin(double); extern double atan(double); extern double atan2(double, double); extern double cos(double); extern double sin(double); extern double tan(double); extern double acosh(double); extern double asinh(double); extern double atanh(double); extern double cosh(double); extern double sinh(double); extern double tanh(double); extern double exp (double); extern double exp2 (double); extern double expm1 (double); extern double log (double); extern double log10 (double); extern double log2 (double); extern double log1p (double); extern double logb (double); extern double modf (double, double *); extern double ldexp (double, int); extern double frexp (double, int *); extern int ilogb (double); extern double scalbn (double, int); extern double scalbln (double, long int); extern double fabs(double); extern double cbrt(double); extern double hypot (double, double); extern double pow (double, double); extern double sqrt(double); extern double erf(double); extern double erfc(double); extern double lgamma(double); extern double tgamma(double); extern double ceil (double); extern double floor (double); extern double nearbyint (double); extern double rint (double); extern long int lrint (double); extern double round (double); extern long int lround (double); extern double trunc (double); extern double fmod (double, double); extern double remainder (double, double); extern double remquo (double, double, int *); extern double copysign (double, double); extern double nan(const char *); extern double nextafter (double, double); extern double fdim (double, double); extern double fmax (double, double); extern double fmin (double, double); extern double fma (double, double, double); /* and math constants */ #define M_E 2.71828182845904523536028747135266250 /* e */ #define M_LOG2E 1.44269504088896340735992468100189214 /* log 2e */ #define M_LOG10E 0.434294481903251827651128918916605082 /* log 10e */ #define M_LN2 0.693147180559945309417232121458176568 /* log e2 */ #define M_LN10 2.30258509299404568401799145468436421 /* log e10 */ #define M_PI 3.14159265358979323846264338327950288 /* pi */ #define M_PI_2 1.57079632679489661923132169163975144 /* pi/2 */ #define M_PI_4 0.785398163397448309615660845819875721 /* pi/4 */ #define M_1_PI 0.318309886183790671537767526745028724 /* 1/pi */ #define M_2_PI 0.636619772367581343075535053490057448 /* 2/pi */ #define M_2_SQRTPI 1.12837916709551257389615890312154517 /* 2/sqrt(pi) */ #define M_SQRT2 1.41421356237309504880168872420969808 /* sqrt(2) */ #define M_SQRT1_2 0.707106781186547524400844362104849039 /* 1/sqrt(2) */ #endif #define MASKINC 10000 #ifndef M_PI #define M_PI 3.14159265358979323846 #endif #define SMALL_NUMBER 1.0E-24 #define LARGE_NUMBER 65535 #define PSTOP -142857.142857 #ifndef SZ_LINE #define SZ_LINE 4096 #endif #ifndef min #define min(x,y) (((x)<(y))?(x):(y)) #endif #ifndef max #define max(x,y) (((x)>(y))?(x):(y)) #endif #ifndef abs #define abs(x) ((x)<0?(-x):(x)) #endif #ifndef feq #define feq(x,y) (fabs((double)x-(double)y)<=(double)1.0E-15) #endif #ifndef NULL #define NULL (void *)0 #endif #ifndef TOK_EREG #define TOK_EREG 1 #endif #ifndef TOK_NREG #define TOK_NREG 2 #endif #ifndef TOK_IREG #define TOK_IREG 4 #endif #define PIXCEN(a) (double)(a) #define PIXNUM(a) (int)((a)+0.5) #define PIXSTART(a) ((int)(a)+1) #define PIXSTOP(a) (((int)(a))==(a)?((int)(a)-1):((int)(a))) /* to assure that geometrically adjoining regions touch but don't overlap */ /* when edge is exactly on a pixel center it goes to right or upper region. */ /* used for non-radially symetric regions instead of PIXSTART, PIXSTOP */ #define PIXINCL(a) (int)((a)+1.0) /* this is the filter string for field only */ #define EVFIELDONLY "(evfield(g,1,1,1,(double)x,(double)y))" #define XSNO 3 /* NB: these MUST match the definition in filter.h */ #ifndef __filter_h typedef struct filtmaskrec { int region; int y; int xstart, xstop; } *FilterMask, FilterMaskRec; /* parameter structure for a scan entry */ typedef struct scanrec{ struct scanrec *next; int x; } *Scan, ScanRec; typedef struct shaperec { int init; double ystart, ystop; Scan *scanlist; /* varargs */ int nv; double *xv; /* circle, annulus */ double r1sq, r2sq; /* ellipse */ double angl, sinangl, cosangl; double cossq, sinsq; double xradsq, yradsq; double a; /* polygon-style shapes */ int npt; double *pts; /* line */ int xonly; double x1, x2, y1; double invslope; } *Shape, ShapeRec; /* these are global for use with special region routines */ typedef struct gfiltrec { int nshapes; /* number of shapes */ int maxshapes; /* number of shape records we allocate */ Shape shapes; /* array holding range limits for one shape */ int rid; /* first valid region for current pixel */ int usebinsiz; /* whether bindizx,binsizy are used */ char *evsect; /* value of event section */ double tlminx, tlminy; /* tlmin for event section */ double binsizx, binsizy; /* bin sizes for event section */ double tloff; /* offset for quick p2i conversion */ int xmin, xmax, ymin, ymax; /* section limits in original image coords */ int block; /* block factor */ int x0, x1, y0, y1; /* section limits in section coords */ int *ybuf; /* valid y row flags */ int *x0s; /* valid x start values */ int *x1s; /* valid x stop values */ int nmask; /* number of image mask record */ int maskdim; /* size of mask image */ FilterMask masks; /* mask records */ } *GFilt, GFiltRec; #endif /* declare image init routines */ void imannulusi(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, double iradius, double oradius); void imboxi(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, double xwidth, double yheight, double angle); void imcirclei(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, double radius); void imellipsei(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, double xrad, double yrad, double angle); void imfieldi(GFilt g, int rno, int sno, int flag, int type, double x, double y); void imlinei(GFilt g, int rno, int sno, int flag, int type, double x, double y, double x0, double y0, double x1, double y1); void impiei(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, double angle1, double angle2); void imqtpiei(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, double angle1, double angle2); void impointi(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen); void impandai(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, double anglo, double anghi, double angn, double radlo, double radhi, double radn); void imnannulusi(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, double lo, double hi, int n); void imnboxi(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, double lox, double loy, double hix, double hiy, int n, double angle); void imnellipsei(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, double lox, double loy, double hix, double hiy, int n, double angle); void imnpiei(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, double lo, double hi, int n); #ifdef __STDC__ void impolygoni(GFilt g, int rno, int sno, int flag, int type, double x, double y, ...); void imvannulusi(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, ...); void imvboxi(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, ...); void imvellipsei(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, ...); void imvpiei(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, ...); void imvpointi(GFilt g, int rno, int sno, int flag, int type, double x, double y, ...); #endif /* declare image region routines */ int imannulus(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, double iradius, double oradius); int imbox(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, double xwidth, double yheight, double angle); int imcircle(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, double radius); int imellipse(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, double xrad, double yrad, double angle); int imfield(GFilt g, int rno, int sno, int flag, int type, double x, double y); int imline(GFilt g, int rno, int sno, int flag, int type, double x, double y, double x1, double y1, double x2, double y2); int impie(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, double angle1, double angle2); int imqtpie(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, double angle1, double angle2); int impoint(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen); int impanda(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, double anglo, double anghi, double angn, double radlo, double radhi, double radn); int imnannulus(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, double lo, double hi, int n); int imnbox(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, double lox, double loy, double hix, double hiy, int n, double angle); int imnellipse(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, double lox, double loy, double hix, double hiy, int n, double angle); int imnpie(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, double lo, double hi, int n); #ifdef __STDC__ int impolygon(GFilt g, int rno, int sno, int flag, int type, double x, double y, ...); int imvannulus(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, ...); int imvbox(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, ...); int imvellipse(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, ...); int imvpie(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, ...); int imvpoint(GFilt g, int rno, int sno, int flag, int type, double x, double y, ...); #endif /* declare event region routines */ int evannulus(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, double iradius, double oradius); int evbox(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, double xwidth, double yheight, double angle); int evcircle(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, double radius); int evellipse(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, double xrad, double yrad, double angle); int evfield(GFilt g, int rno, int sno, int flag, int type, double x, double y); int evline(GFilt g, int rno, int sno, int flag, int type, double x, double y, double x1, double y1, double x2, double y2); int evpie(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, double angle1, double angle2); int evqtpie(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, double angle1, double angle2); int evpoint(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen); int evnannulus(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, double lo, double hi, int n); int evnbox(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, double lox, double loy, double hix, double hiy, int n, double angle); int evnellipse(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, double lox, double loy, double hix, double hiy, int n, double angle); int evnpie(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, double lo, double hi, int n); int evpanda(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, double anglo, double anghi, double angn, double radlo, double radhi, double radn); #ifdef __STDC__ int evpolygon(GFilt g, int rno, int sno, int flag, int type, double x, double y, ...); int evvannulus(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, ...); int evvbox(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, ...); int evvellipse(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, ...); int evvpie(GFilt g, int rno, int sno, int flag, int type, double x, double y, double xcen, double ycen, ...); int evvpoint(GFilt g, int rno, int sno, int flag, int type, double x, double y, ...); #endif funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/filter/regions_h.h000066400000000000000000000330531256243640000241150ustar00rootroot00000000000000static char *REGIONS_H="\n#if MINIMIZE_INCLUDES\n#include \nint sscanf(const char *s, const char *format, ...);\ntypedef unsigned long size_t;\nsize_t strlen();\nchar *strcpy(), *strdup(), *strstr(), *getenv();\nvoid *calloc(), *malloc(), *memset(), *memmove();\nvoid exit();\n#else\n#include \n#include \n#include \n#include \n#include \n#ifdef __STDC__\n#include \n#include \n#else\n#include \n#endif\n#endif\n\n#if MINIMIZE_INCLUDES\n\nextern double acos(double);\nextern double asin(double);\nextern double atan(double);\nextern double atan2(double, double);\nextern double cos(double);\nextern double sin(double);\nextern double tan(double);\nextern double acosh(double);\nextern double asinh(double);\nextern double atanh(double);\nextern double cosh(double);\nextern double sinh(double);\nextern double tanh(double);\nextern double exp (double);\nextern double exp2 (double); \nextern double expm1 (double); \nextern double log (double);\nextern double log10 (double);\nextern double log2 (double);\nextern double log1p (double);\nextern double logb (double);\nextern double modf (double, double *);\nextern double ldexp (double, int);\nextern double frexp (double, int *);\nextern int ilogb (double);\nextern double scalbn (double, int);\nextern double scalbln (double, long int);\nextern double fabs(double);\nextern double cbrt(double);\nextern double hypot (double, double);\nextern double pow (double, double);\nextern double sqrt(double);\nextern double erf(double);\nextern double erfc(double);\nextern double lgamma(double);\nextern double tgamma(double);\nextern double ceil (double);\nextern double floor (double);\nextern double nearbyint (double);\nextern double rint (double);\nextern long int lrint (double);\nextern double round (double);\nextern long int lround (double);\nextern double trunc (double);\nextern double fmod (double, double);\nextern double remainder (double, double);\nextern double remquo (double, double, int *);\nextern double copysign (double, double);\nextern double nan(const char *);\nextern double nextafter (double, double);\nextern double fdim (double, double);\nextern double fmax (double, double);\nextern double fmin (double, double);\nextern double fma (double, double, double);\n\n#define M_E 2.71828182845904523536028747135266250 \n#define M_LOG2E 1.44269504088896340735992468100189214 \n#define M_LOG10E 0.434294481903251827651128918916605082 \n#define M_LN2 0.693147180559945309417232121458176568 \n#define M_LN10 2.30258509299404568401799145468436421 \n#define M_PI 3.14159265358979323846264338327950288 \n#define M_PI_2 1.57079632679489661923132169163975144 \n#define M_PI_4 0.785398163397448309615660845819875721 \n#define M_1_PI 0.318309886183790671537767526745028724 \n#define M_2_PI 0.636619772367581343075535053490057448 \n#define M_2_SQRTPI 1.12837916709551257389615890312154517 \n#define M_SQRT2 1.41421356237309504880168872420969808 \n#define M_SQRT1_2 0.707106781186547524400844362104849039 \n#endif\n\n#define MASKINC 10000\n#ifndef M_PI\n#define M_PI 3.14159265358979323846\n#endif\n#define SMALL_NUMBER 1.0E-24\n#define LARGE_NUMBER 65535\n#define PSTOP -142857.142857\n\n#ifndef SZ_LINE\n#define SZ_LINE 4096\n#endif\n#ifndef min\n#define min(x,y) (((x)<(y))?(x):(y))\n#endif\n#ifndef max\n#define max(x,y) (((x)>(y))?(x):(y))\n#endif\n#ifndef abs\n#define abs(x) ((x)<0?(-x):(x))\n#endif\n#ifndef feq\n#define feq(x,y) (fabs((double)x-(double)y)<=(double)1.0E-15)\n#endif\n#ifndef NULL\n#define NULL (void *)0\n#endif\n\n#ifndef TOK_EREG\n#define TOK_EREG 1\n#endif\n#ifndef TOK_NREG\n#define TOK_NREG 2\n#endif\n#ifndef TOK_IREG\n#define TOK_IREG 4\n#endif\n\n#define PIXCEN(a) (double)(a)\n#define PIXNUM(a) (int)((a)+0.5) \n#define PIXSTART(a) ((int)(a)+1)\n#define PIXSTOP(a) (((int)(a))==(a)?((int)(a)-1):((int)(a)))\n\n\n\n#define PIXINCL(a) (int)((a)+1.0) \n\n\n#define EVFIELDONLY \"(evfield(g,1,1,1,(double)x,(double)y))\"\n\n#define XSNO 3\n\n\n#ifndef __filter_h\ntypedef struct filtmaskrec {\n int region;\n int y;\n int xstart, xstop;\n} *FilterMask, FilterMaskRec;\n\n\ntypedef struct scanrec{\n struct scanrec *next;\n int x;\n} *Scan, ScanRec;\n\ntypedef struct shaperec {\n int init;\n double ystart, ystop;\n Scan *scanlist;\n \n int nv;\n double *xv;\n \n double r1sq, r2sq;\n \n double angl, sinangl, cosangl;\n double cossq, sinsq;\n double xradsq, yradsq;\n double a;\n \n int npt;\n double *pts;\n \n int xonly;\n double x1, x2, y1;\n double invslope;\n} *Shape, ShapeRec;\n\n\ntypedef struct gfiltrec {\n int nshapes; \n int maxshapes; \n Shape shapes; \n int rid; \n int usebinsiz; \n char *evsect; \n double tlminx, tlminy; \n double binsizx, binsizy; \n double tloff; \n int xmin, xmax, ymin, ymax; \n int block; \n int x0, x1, y0, y1; \n int *ybuf; \n int *x0s; \n int *x1s; \n int nmask; \n int maskdim; \n FilterMask masks; \n} *GFilt, GFiltRec;\n#endif\n\n\nvoid imannulusi(GFilt g, int rno, int sno, int flag, int type, \n double x, double y,\n double xcen, double ycen, double iradius, double oradius);\nvoid imboxi(GFilt g, int rno, int sno, int flag, int type,\n double x, double y,\n double xcen, double ycen, double xwidth, double yheight,\n double angle);\nvoid imcirclei(GFilt g, int rno, int sno, int flag, int type,\n double x, double y,\n double xcen, double ycen, double radius);\nvoid imellipsei(GFilt g, int rno, int sno, int flag, int type,\n double x, double y,\n double xcen, double ycen, double xrad, double yrad,\n double angle);\nvoid imfieldi(GFilt g, int rno, int sno, int flag, int type,\n double x, double y);\nvoid imlinei(GFilt g, int rno, int sno, int flag, int type,\n double x, double y,\n double x0, double y0, double x1, double y1);\nvoid impiei(GFilt g, int rno, int sno, int flag, int type,\n double x, double y,\n double xcen, double ycen, double angle1, double angle2);\nvoid imqtpiei(GFilt g, int rno, int sno, int flag, int type,\n double x, double y,\n double xcen, double ycen, double angle1, double angle2);\nvoid impointi(GFilt g, int rno, int sno, int flag, int type,\n double x, double y,\n double xcen, double ycen);\nvoid impandai(GFilt g, int rno, int sno, int flag, int type,\n double x, double y,\n double xcen, double ycen,\n double anglo, double anghi, double angn,\n double radlo, double radhi, double radn);\nvoid imnannulusi(GFilt g, int rno, int sno, int flag, int type,\n double x, double y,\n double xcen, double ycen,\n double lo, double hi, int n);\nvoid imnboxi(GFilt g, int rno, int sno, int flag, int type,\n double x, double y,\n double xcen, double ycen,\n double lox, double loy, double hix, double hiy, int n,\n double angle);\nvoid imnellipsei(GFilt g, int rno, int sno, int flag, int type,\n double x, double y,\n double xcen, double ycen,\n double lox, double loy, double hix, double hiy, int n,\n double angle);\nvoid imnpiei(GFilt g, int rno, int sno, int flag, int type,\n double x, double y,\n double xcen, double ycen,\n double lo, double hi, int n);\n\n#ifdef __STDC__\nvoid impolygoni(GFilt g, int rno, int sno, int flag, int type,\n double x, double y, ...);\nvoid imvannulusi(GFilt g, int rno, int sno, int flag, int type,\n double x, double y, double xcen, double ycen, ...);\nvoid imvboxi(GFilt g, int rno, int sno, int flag, int type,\n double x, double y, double xcen, double ycen, ...);\nvoid imvellipsei(GFilt g, int rno, int sno, int flag, int type,\n double x, double y, double xcen, double ycen, ...);\nvoid imvpiei(GFilt g, int rno, int sno, int flag, int type,\n double x, double y, double xcen, double ycen, ...);\nvoid imvpointi(GFilt g, int rno, int sno, int flag, int type, \n double x, double y, ...);\n#endif\n\n\n\nint imannulus(GFilt g, int rno, int sno, int flag, int type,\n double x, double y,\n double xcen, double ycen, double iradius, double oradius);\nint imbox(GFilt g, int rno, int sno, int flag, int type,\n double x, double y,\n double xcen, double ycen, double xwidth, double yheight,\n double angle);\nint imcircle(GFilt g, int rno, int sno, int flag, int type,\n double x, double y,\n double xcen, double ycen, double radius);\nint imellipse(GFilt g, int rno, int sno, int flag, int type,\n double x, double y,\n double xcen, double ycen, double xrad, double yrad,\n double angle);\nint imfield(GFilt g, int rno, int sno, int flag, int type,\n double x, double y);\nint imline(GFilt g, int rno, int sno, int flag, int type,\n double x, double y,\n double x1, double y1, double x2, double y2);\nint impie(GFilt g, int rno, int sno, int flag, int type,\n double x, double y,\n double xcen, double ycen, double angle1, double angle2);\nint imqtpie(GFilt g, int rno, int sno, int flag, int type,\n double x, double y,\n double xcen, double ycen, double angle1, double angle2);\nint impoint(GFilt g, int rno, int sno, int flag, int type,\n double x, double y,\n double xcen, double ycen);\nint impanda(GFilt g, int rno, int sno, int flag, int type,\n double x, double y,\n double xcen, double ycen,\n double anglo, double anghi, double angn,\n double radlo, double radhi, double radn);\nint imnannulus(GFilt g, int rno, int sno, int flag, int type,\n double x, double y,\n double xcen, double ycen,\n double lo, double hi, int n);\nint imnbox(GFilt g, int rno, int sno, int flag, int type,\n double x, double y,\n double xcen, double ycen,\n double lox, double loy, double hix, double hiy, int n,\n double angle);\nint imnellipse(GFilt g, int rno, int sno, int flag, int type,\n double x, double y,\n double xcen, double ycen,\n double lox, double loy, double hix, double hiy, int n,\n double angle);\nint imnpie(GFilt g, int rno, int sno, int flag, int type,\n double x, double y,\n double xcen, double ycen,\n double lo, double hi, int n);\n#ifdef __STDC__\nint impolygon(GFilt g, int rno, int sno, int flag, int type,\n double x, double y, ...);\nint imvannulus(GFilt g, int rno, int sno, int flag, int type,\n double x, double y, double xcen, double ycen, ...);\nint imvbox(GFilt g, int rno, int sno, int flag, int type,\n double x, double y, double xcen, double ycen, ...);\nint imvellipse(GFilt g, int rno, int sno, int flag, int type,\n double x, double y, double xcen, double ycen, ...);\nint imvpie(GFilt g, int rno, int sno, int flag, int type,\n double x, double y, double xcen, double ycen, ...);\nint imvpoint(GFilt g, int rno, int sno, int flag, int type,\n double x, double y, ...);\n#endif\n\n\nint evannulus(GFilt g, int rno, int sno, int flag, int type,\n double x, double y,\n double xcen, double ycen, double iradius, double oradius);\nint evbox(GFilt g, int rno, int sno, int flag, int type,\n double x, double y,\n double xcen, double ycen, double xwidth, double yheight,\n double angle);\nint evcircle(GFilt g, int rno, int sno, int flag, int type,\n double x, double y,\n double xcen, double ycen, double radius);\nint evellipse(GFilt g, int rno, int sno, int flag, int type,\n double x, double y,\n double xcen, double ycen, double xrad, double yrad,\n double angle);\nint evfield(GFilt g, int rno, int sno, int flag, int type,\n double x, double y);\nint evline(GFilt g, int rno, int sno, int flag, int type,\n double x, double y,\n double x1, double y1, double x2, double y2);\nint evpie(GFilt g, int rno, int sno, int flag, int type,\n double x, double y,\n double xcen, double ycen, double angle1, double angle2);\nint evqtpie(GFilt g, int rno, int sno, int flag, int type,\n double x, double y,\n double xcen, double ycen, double angle1, double angle2);\nint evpoint(GFilt g, int rno, int sno, int flag, int type,\n double x, double y,\n double xcen, double ycen);\nint evnannulus(GFilt g, int rno, int sno, int flag, int type,\n double x, double y,\n double xcen, double ycen,\n double lo, double hi, int n);\nint evnbox(GFilt g, int rno, int sno, int flag, int type,\n double x, double y,\n double xcen, double ycen,\n double lox, double loy, double hix, double hiy, int n,\n double angle);\nint evnellipse(GFilt g, int rno, int sno, int flag, int type,\n double x, double y,\n double xcen, double ycen,\n double lox, double loy, double hix, double hiy, int n,\n double angle);\nint evnpie(GFilt g, int rno, int sno, int flag, int type,\n double x, double y,\n double xcen, double ycen,\n double lo, double hi, int n);\nint evpanda(GFilt g, int rno, int sno, int flag, int type,\n double x, double y,\n double xcen, double ycen,\n double anglo, double anghi, double angn,\n double radlo, double radhi, double radn);\n#ifdef __STDC__\nint evpolygon(GFilt g, int rno, int sno, int flag, int type,\n double x, double y, ...);\nint evvannulus(GFilt g, int rno, int sno, int flag, int type,\n double x, double y, double xcen, double ycen, ...);\nint evvbox(GFilt g, int rno, int sno, int flag, int type,\n double x, double y, double xcen, double ycen, ...);\nint evvellipse(GFilt g, int rno, int sno, int flag, int type,\n double x, double y, double xcen, double ycen, ...);\nint evvpie(GFilt g, int rno, int sno, int flag, int type,\n double x, double y, double xcen, double ycen, ...);\nint evvpoint(GFilt g, int rno, int sno, int flag, int type,\n double x, double y, ...);\n#endif\n\n"; funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/filter/sample.c000066400000000000000000000042501256243640000234110ustar00rootroot00000000000000 #define min(x,y) (((x)<(y))?(x):(y)) #define max(x,y) (((x)>(y))?(x):(y)) #define CONVERT 0 #define FILTER (pha==1&&pi>3) #define ESIZE 20 #define GET_pha LoadColumn(eptr+4,2,1,CONVERT,&pha) #define GET_pi LoadColumn(eptr+6,2,1,CONVERT,&pi) #define GET GET_pha;GET_pi; short pha; short pi; #define RADIAN 57.295779513082320877 #define RADTODEG(r) ((r)*RADIAN) #define DEGTORAD(d) ((d)/RADIAN) #define INSIDE(a,r1,r2) (((a)>(r1))&&((a)<=((r2)<(r1)?(r2+360.0):(r2)))) static double d; #define Annulus(X,Y,x,y,ri,ro) ((((X-x)*(X-x))+((Y-y)*(Y-y))<=(ro*ro))&& (((X-x)*(X-x))+((Y-y)*(Y-y))>(ri*ri))) #define annulus(x,y,ri,ro) Annulus(_X_,_Y_,x,y,ri,ro) #define Circle(X,Y,x,y,r) (((X-x)*(X-x))+((Y-y)*(Y-y))<=(r*r)) #define circle(x,y,r) Circle(_X_,_Y_,x,y,r) #define Ellipse(X,Y,x,y,a,b) (((X-x)*(X-x))/(double)(a*a))+(((Y-y)*(Y-y))/(double)(b*b))<=1.0) #define ellipse(x,y,a,b) Ellipse(_X_,_Y_,x,y,a,b) #define Pie(X,Y,x,y,r1,r2) ((X==x)&&(Y==y)?1:(INSIDE(((d=RADTODEG(atan2(Y-y,X-x)))<90?d+270.0:d-90.0),r1,r2))) #define pie(x,y,r1,r2) Pie(_X_,_Y_,x,y,r1,r2) #define Point(X,Y,x,y) ((X==x)&&(Y==y)) #define point(x,y) Point(_X_,_Y_,x,y) #define Box(X,Y,x,y,w,h) ((X>(x-(double)(w/2)))&&(X<=(x+(double)(w/2)))&&(Y>(y-(double)(h/2)))&&(Y<=(y+(double)(h/2)))) #define box(x,y,w,h) Box(_X_,_Y_,x,y,w,h) LoadColumn(eptr, bytes, iter, convert, obuf) char *eptr; int bytes, iter, convert; char *obuf; { char *optr=obuf; int i, j; for(i=0; i0 ){ ebuf = (char *)malloc(get); for(etop=ebuf; get>0; etop += got, get -= got){ if( (got=read(0, etop, get)) <=0 ) break; } for(rptr=ebuf, eptr=ebuf; eptr #define SYMINC 100 /* increment for allocating symbols */ static char *bincols=NULL; static char xbin[SZ_LINE]; static char ybin[SZ_LINE]; extern char *filtinchar; /* * * Public Routines * */ /* * * FilterSymbolInit -- init the symbol table * */ #ifdef ANSI_FUNC int FilterSymbolInit(Filter filter) #else int FilterSymbolInit(filter) Filter filter; #endif { /* make sure we are init'ed */ if( filter == NULL ){ gerror(stderr, "symbol table not initialized\n"); return(0); } filter->symtab = (FilterSymbols)xcalloc(SYMINC, sizeof(FilterSymRec)); filter->nsyms = 0; filter->maxsyms = SYMINC; return(SYMINC); } /* * * FilterSymbolEnter -- enter a new symbol in the symbol table * The symbol will either be a column name, or * a parameter in the table header, or * a parameter in the primary header * */ #ifdef ANSI_FUNC char * FilterSymbolEnter(Filter filter, char *s, int *got) #else char *FilterSymbolEnter(filter, s, got) Filter filter; char *s; int *got; #endif { int brack=0; int i, j; char *t; FilterSymbols sp; char name[SZ_LINE]; FITSCard card; FITSHead fhd; /* see return value */ if( got ) *got =-3; /* make sure we are init'ed */ if( filter == NULL ){ gerror(stderr, "symbol table not initialized\n"); return(NULL); } /* make sure we are init'ed */ if( filter->fhd == NULL ){ gerror(stderr, "symbol table not initialized\n"); return(NULL); } fhd = filter->fhd; /* make sure we have something */ if( !s || !*s ) return(NULL); /* this is the name of the variable in the filter program */ nowhite(s, name); /* but strip off brackets */ if( (t=strchr(name, '[')) != NULL ){ brack=1; *t = '\0'; } /* loop through the symbol table and look for existing symbol */ for(i=0; insyms; i++){ sp = &(filter->symtab[i]); /* skip accidentally empty ones */ if( (sp->name == NULL) || (*sp->name == '\0') ) continue; /* is this name already entered? */ if( !strcasecmp(sp->name, name) ){ if( got ) *got = 1; return (char *)sp->name; } } /* make sure there is room for a new symbol */ if( i >= filter->maxsyms ){ filter->maxsyms += SYMINC; filter->symtab = (FilterSymbols)xrealloc(filter->symtab, filter->maxsyms*sizeof(FilterSymRec)); } /* this is where the next symbol will be entered */ sp = &(filter->symtab[i]); /* look for name in the list of columns */ if( fhd->table ){ for(j=0; jtable->tfields; j++){ if( !strcasecmp(name, fhd->table->col[j].name) ){ if( brack && (fhd->table->col[j].n==1) ){ if( got ) *got = -2; return(NULL); } sp->type = SYM_COL; sp->name = (char *)xstrdup(name); sp->idx = j; filter->size += fhd->table->col[j].size; filter->nsyms++; if( got ) *got = 1; return (char *)sp->name; } } } /* look for name in the table header */ if( (t=ft_headgets(fhd, name, 0, NULL, &card)) ){ sp->type = SYM_PAR; sp->name = xstrdup(name); sp->value = t; sp->idx = -1; filter->nsyms++; if( got ) *got = 2; return (char *)sp->name; } /* look for name in the primary header */ else if( fhd->primary && (t=ft_headgets(fhd->primary, name, 0, NULL, &card)) ){ sp->type = SYM_PAR; sp->name = xstrdup(name); sp->value = t; sp->idx = -1; filter->nsyms++; if( got ) *got = 2; return (char *)sp->name; } /* did not find the symbol anywhere */ else{ gerror(stderr, "can't find '%s' in table\n", s); if( got ) *got = -1; return(NULL); } } /* EnterSymbol */ /* * * FilterSymbolLookup -- lookup a symbol in the symbol table * */ #ifdef ANSI_FUNC FilterSymbols FilterSymbolLookup(Filter filter, char *name) #else FilterSymbols FilterSymbolLookup(filter, name) Filter filter; char *s; #endif { int i; /* sanity check */ if( !name || !*name ) return NULL; /* loop through the symbol table and look for existing symbol */ for(i=0; insyms; i++){ /* skip accidentally empty ones */ if( (filter->symtab[i].name == NULL) || (*filter->symtab[i].name == '\0') ) continue; /* look for name */ if( !strcasecmp(filter->symtab[i].name, name) ){ /* return symbol table record if found */ return &filter->symtab[i]; } } return NULL; } /* * * FilterSymbolDefaults -- enter default symbols for X and Y columns * */ #ifdef ANSI_FUNC int FilterSymbolDefaults(Filter filter, int enter) #else int FilterSymbolDefaults(filter, enter) Filter filter; int enter; #endif { int ip=0; char tbuf[SZ_LINE]; char *mbuf; char *k; char *s; /* this is only for events */ if( !filter || !filter->fhd || !filter->fhd->table ) return 0; /* parse bincols variable */ if( !bincols ){ mbuf = xstrdup(filter->mode); if( !keyword(mbuf, "bincols", tbuf, SZ_LINE) ) return 0; if( mbuf ) xfree(mbuf); s = tbuf; /* parse the bincols string and add the symbols */ newdtable(",:)"); bincols = xstrdup(s); k = bincols; /* point past first paren */ if( *bincols == '(' ) k++; if( !word(k, xbin, &ip) || !word(k, ybin, &ip) ){ freedtable(); return 0; } freedtable(); /* set the filter bin strings */ if( filter->xbin ) xfree(filter->xbin); filter->xbin = xstrdup(xbin); if( filter->ybin ) xfree(filter->ybin); filter->ybin = xstrdup(ybin); } else if( !filter->xbin || !filter->ybin ){ /* set the filter bin strings */ if( filter->xbin ) xfree(filter->xbin); filter->xbin = xstrdup(xbin); if( filter->ybin ) xfree(filter->ybin); filter->ybin = xstrdup(ybin); } /* enter symbols if necessary */ if( enter ){ if( !FilterSymbolEnter(filter, xbin, NULL) || !FilterSymbolEnter(filter, ybin, NULL) ) return 0; } return 1; } /* * * FilterSymbolFree -- free space from symbol table * */ #ifdef ANSI_FUNC void FilterSymbolFree(Filter filter) #else void FilterSymbolFree(filter) Filter filter; #endif { int i; FilterSymbols sp; /* if we have no symbols, just return */ if( !filter || !filter->nsyms ) return; /* loop through the symbol table and free up records */ for(i=0; insyms; i++){ sp = &(filter->symtab[i]); /* skip accidentally empty ones */ if( (sp->name == NULL) || (*sp->name == '\0') ) continue; /* process this type of symbol */ switch(sp->type){ case SYM_COL: xfree(sp->name); sp->name = NULL; break; case SYM_PAR: xfree(sp->name); xfree(sp->value); sp->name = NULL; break; } } /* no symbols */ filter->nsyms = 0; if( bincols != NULL ){ xfree(bincols); bincols = NULL; *xbin = '\0'; *ybin = '\0'; } } funtools-1b0fa6f8188a89da7fd6d591d13d94e2a44b698f/filter/tfilt.c000066400000000000000000000313231256243640000232530ustar00rootroot00000000000000/* * Copyright (c) 1999-2003 Smithsonian Astrophysical Observatory */ /* * * tfilt.c -- test program for filtering tables * */ #if HAVE_CONFIG_H #include #endif #include #ifdef HAVE_UNISTD_H #include #endif #ifdef HAVE_MALLOC_H #include #endif #ifdef HAVE_STDLIB_H #include #endif #ifdef HAVE_STRING_H #include #endif #include #include #include #include #include extern char *optarg; extern int optind; char bincols[SZ_LINE]; int debug=0; #define NEVENTS 10240 /* from Harbison&Steele by way of GNU cinfigure ... returns 1 for bigendian, 0 for littleendian */ #ifdef ANSI_FUNC int is_bigendian(void) #else int is_bigendian() #endif { union { long l; char c[sizeof (long)]; } u; u.l = 1; return(u.c[sizeof (long) - 1] == 1); } /* * * ListEvents -- list events in a binary table * */ #ifdef ANSI_FUNC static int ListEvents(GIO gio, FILE *ofd, FITSHead header, char *s, int iformat, char *mode) #else static int ListEvents(gio, ofd, header, s, iformat, mode) GIO gio; /* input FITS file handle */ FILE *ofd; /* output file handle */ FITSHead header; /* fitsy header */ char *s; /* filter for events */ int iformat; /* input format of data: 0=native, 1=fits */ char *mode /* filteropen mode */ #endif { int i, j; /* loop counters */ int get; /* number of events to read */ int got; /* number of events read */ int left; /* number of events left to read */ int total; /* total number of events in file */ int convert; /* whether we have to convert to native */ int nev; /* max number of events to read at once */ int evsize; /* size of an event record */ int ototal; /* output total events */ int *vbuf; /* valid event flags */ char *ebuf; /* event buffer */ char *eptr; /* current pointer into ebuf */ char tbuf[SZ_LINE]; /* ever-present temp buf */ unsigned char bval; /* byte value */ short sval; /* short value */ unsigned short usval; /* short value */ int ival; /* int value */ long long lval; /* 64-bit int value */ unsigned int uival; /* unsigned int value */ float fval; /* float value */ double dval; /* double value */ int dofilt=0; /* true if we can filter */ Filter filter=NULL; /* we have to convert to native if the data is not the same as the big-endian-ness of the machine */ convert = (iformat != is_bigendian()); /* create the mode string */ if( convert ) strcpy(tbuf, "convert=true"); else strcpy(tbuf, "convert=false"); strcat(tbuf, bincols); if( debug ) strcat(tbuf, ",debug=2"); /* now add the input mode */ if( mode && *mode ){ strcat(tbuf, ","); strcat(tbuf, mode); } /* init some convenience variables */ evsize = header->basic->naxis[0]; total = header->basic->naxis[1]; ototal = 0; /* open the filter */ if( (filter = FilterOpen(header, s, tbuf)) == NULL ){ fprintf(stderr, "ERROR: tfilt could not open filter: %s\n", s ? s : "no filter"); return(0); } else if( filter == NOFILTER ){ fprintf(stderr, "no valid filter specified\n"); return(0); } /* allocate space for a pile of event records */ for(nev=NEVENTS; nev>0; nev /=2){ if( ((ebuf = (char *)xmalloc(evsize*nev))!= NULL) && ((vbuf = (int *)xmalloc(sizeof(int)*nev))!= NULL) ) break; } /* print out header */ for(j=0; jtable->tfields; j++){ switch(header->table->col[j].type){ case 'B': case 'L': fprintf(ofd, "%6s", header->table->col[j].name); break; case 'I': case 'U': fprintf(ofd, "%6s", header->table->col[j].name); break; case 'J': case 'V': fprintf(ofd, "%11s", header->table->col[j].name); break; case 'K': fprintf(ofd, "%20s", header->table->col[j].name); break; case 'E': fprintf(ofd, "%11s", header->table->col[j].name); break; case 'D': fprintf(ofd, "%17s", header->table->col[j].name); break; default: break; } } fprintf(ofd, "\n"); for(j=0; jtable->tfields; j++){ switch(header->table->col[j].type){ case 'B': case 'L': fprintf(ofd, " -----"); break; case 'I': case 'U': fprintf(ofd, " -----"); break; case 'J': case 'V': fprintf(ofd, " ----------"); break; case 'K': fprintf(ofd, " -------------------"); break; case 'E': fprintf(ofd, " ----------"); break; case 'D': fprintf(ofd, " ----------------"); break; default: break; } } fprintf(ofd, "\n"); /* set the total number of events or 'read til eof' */ left = total; /* read all event records */ while( left != 0 ){ /* figure out how many to read this time */ get = MIN(nev, left); /* read in a pile of events */ got=gread(gio, ebuf, evsize, get); /* check for eof */ if( got != get ){ fprintf(stderr, "Warning: events ends at %d (expected %d)\n", total-left, total); /* we must be done */ left = 0; } else{ left -= got; } /* filter the events through the co-process */ if( filter ){ dofilt = FilterEvents(filter, ebuf, evsize, got, vbuf); } /* process each event in the pile */ for(eptr=ebuf, i=0; itable->tfields; j++){ switch(header->table->col[j].type){ case 'B': case 'L': ColumnLoad(eptr+header->table->col[j].offset, header->table->col[j].size, 1, convert, (char *)&bval); fprintf(ofd, "%6d", (int)bval); break; case 'I': ColumnLoad(eptr+header->table->col[j].offset, header->table->col[j].size, 1, convert, (char *)&sval); fprintf(ofd, "%6d", (int)sval); break; case 'U': ColumnLoad(eptr+header->table->col[j].offset, header->table->col[j].size, 1, convert, (char *)&usval); fprintf(ofd, "%6d", (int)usval); break; case 'J': ColumnLoad(eptr+header->table->col[j].offset, header->table->col[j].size, 1, convert, (char *)&ival); fprintf(ofd, "%11d", ival); break; case 'V': ColumnLoad(eptr+header->table->col[j].offset, header->table->col[j].size, 1, convert, (char *)&uival); fprintf(ofd, "%11d", uival); break; case 'K': ColumnLoad(eptr+header->table->col[j].offset, header->table->col[j].size, 1, convert, (char *)&lval); fprintf(ofd, "%20lld", lval); break; case 'E': ColumnLoad(eptr+header->table->col[j].offset, header->table->col[j].size, 1, convert, (char *)&fval); fprintf(ofd, "%11.2f", fval); break; case 'D': ColumnLoad(eptr+header->table->col[j].offset, header->table->col[j].size, 1, convert, (char *)&dval); fprintf(ofd, "%17.4f", dval); break; default: break; } } fprintf(ofd, "\n"); } } /* free up allocated space */ if( ebuf ) xfree(ebuf); if( vbuf ) xfree(vbuf); /* done with the filter process */ if( filter ) FilterClose(filter); /* final tally */ fprintf(ofd, "\nTotal events: %d\n", ototal); /* that's good news */ return(ototal); } #ifdef ANSI_FUNC int main (int argc, char **argv) #else main(argc, argv) int argc; char **argv; #endif { int c; int type; int x, y, n; int nmask; int x0, x1, y0, y1, block; int listev = 0; int dispim = 0; int dispfilt = 1; int doidx = 0; char *s; char *iname; /* input file name ptr */ char fname[SZ_LINE]; /* input file name */ char tail[SZ_LINE]; /* tail of file name */ char tbuf[SZ_LINE]; /* ever-present temp buffer */ char mode[SZ_LINE]; /* mode for FilterOpen */ char evsect[SZ_LINE]; /* event section for image filters */ long save_pos; /* save position in FITS file */ GIO gio; /* input FITS file handle */ FITSHead header; /* global fitsy header struct */ Filter filter; FilterMask masks; /* we want the args in the same order in which they arrived, and gnu getopt sometimes changes things without this */ putenv("POSIXLY_CORRECT=true"); /* assume events */ type = 'e'; /* process switch arguments */ while ((c = getopt(argc, argv, "d:efilxz")) != -1){ switch(c){ case 'd': dispim = 1; strcpy(evsect, optarg); if(sscanf(optarg, "%d %d %d %d %d", &x0, &x1, &y0, &y1, &block)!=5){ fprintf(stderr, "-d requires x0, x1, y0, y1, block\n"); exit(1); } break; case 'e': type = 'e'; break; case 'f': dispfilt = 1; break; case 'i': type = 'i'; break; case 'l': listev = 1; break; case 'x': doidx = 1; break; case 'z': putenv("FILTER_PAINT=true"); break; } } if( type == 'e' ){ strcpy(mode, "type=events"); if( dispim ){ snprintf(tbuf, SZ_LINE, ",evsect=\"%s\"", evsect); strcat(mode, tbuf); } } else{ strcpy(mode, "type=image"); } /* get file name or use a default */ if( optind >= argc ){ iname = "../funtest/test.ev[EVENTS]"; } else{ strncpy(fname, argv[optind], SZ_LINE); if( !strchr(fname, '[') ) strncat(fname, "[EVENTS]", SZ_LINE); iname = fname; optind++; } /* if we do not list or display, we are in debug mode */ if( !listev && !dispim && !dispfilt ){ debug = 2; } /* open the binary table extension */ if( (gio=ft_fitsheadopen(iname, &header, tail, SZ_LINE, "r")) == NULL ){ fprintf(stderr, "ERROR: can't read FITS binary table: %s\n", iname); exit(1); } if( header == NULL ){ fprintf(stderr, "ERROR: can't access FITS data: %s\n", iname); exit(1); } if( keyword(tail, "bincols", tbuf, SZ_LINE) ){ snprintf(bincols, SZ_LINE, ",bincols=(%s)", tbuf); strcat(mode, bincols); } else{ strcpy(bincols, ",bincols=(x,y)"); strcat(mode, bincols); } if( debug ) strcat(mode, ",debug=2"); strcat(mode, ",lexonly=1"); if( (s=getenv("FILTER_PAINT")) ){ if( istrue(s) ) strcat(mode, ",paint=true"); else if( isfalse(s) ) strcat(mode, ",paint=false"); } while( 1 ){ *tbuf = '\0'; if( feof(stdin) ) break; fgets(tbuf, SZ_LINE, stdin); if( *tbuf == 'q' ) exit(0); if( *tbuf ){ if( listev ){ /* list out events */ save_pos = gtell(gio); ListEvents(gio, stdout, header, tbuf, 1, mode); gseek(gio, save_pos, SEEK_SET); } if( dispim ){ /* display image */ if( *tbuf && (*tbuf != '\n') ){ fprintf(stdout, "input string: %s", tbuf); filter = FilterOpen(header, tbuf, mode); if( !filter ) fprintf(stderr, "Error in FilterOpen()\n"); else if( filter == NOFILTER ) fprintf(stderr, "No valid filter specified\n"); else{ nmask = FilterImage(filter, x0, x1, y0, y1, block, &masks, NULL); if( nmask ){ /* loop through mask segments */ y = 1; for(n=0; n1&&max(pi,pha)<3 min(pi,pha)*14>x max(pi,pha)==(pi+1) (pi+pha)>2+log(pi)-pha (pi<3)&&(pi==pha) pi=3:4,(pha>1) pha=1,100